All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
@ 2017-06-13 16:52 Eduardo Habkost
  2017-06-13 16:52 ` [Qemu-devel] [RFC 01/15] tests: Test cases for error API Eduardo Habkost
                   ` (16 more replies)
  0 siblings, 17 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Rationale
---------

I'm often bothered by the fact that we can't write the following:

    foo(arg, errp);
    if (*errp) {
        handle the error...
        error_propagate(errp, err);
    }

because errp can be NULL.

I understand the reason we need to support errp==NULL, as it
makes life simpler for callers that don't want any extra error
information.  However, this has the cost of making the functions
that report errors more complex and error-prone.

(Evidence of that: the 34 ERR_IS_* cases handled by the "use
ERR_IS_* macros" patches in the series.  Where existing code will
crash or behave differently if errp is NULL.)

I considered suggesting forbidding NULL errp, and just changing
all callers that use NULL to have an err variable and call
error_free(), but this would mean changing 690 function callers
that pass NULL errp as argument.

Here I'm proposing a mechanism to have the best of both worlds:
allow callers to ignore errors easily while allowing functions to
propagate errors without an intermediate local_err variable.

The Proposal
------------

I'm proposing replacing NULL errp with a special macro:
IGNORE_ERRORS.  The macro will trigger special behavior in the
error API that will make it not save any error information in the
error pointer, but still keep track of boolean error state in
*errp.

This will allow us to simplify the documented method to propagate errors
from:

    Error *err = NULL;
    foo(arg, &err);
    if (err) {
        handle the error...
        error_propagate(errp, err);
    }

to:

    foo(arg, errp);
    if (ERR_IS_SET(errp)) {
        handle the error...
    }

This will allow us to stop using local_err variables and
error_propagate() on hundreds of cases.

Implementation
--------------

This replaces NULL errp arguments on function calls with a
IGNORE_ERRORS macro.  Checks for (!errp) are replaced by
ERR_IS_IGNORED(errp).  Checks for (*errp) are replaced by
ERR_IS_SET(errp).  No extra changes are required on function
callers.

Then IGNORE_ERRORS is implemend as:

  (& { &ignored_error_unset })

When error_set() is called and IGNORE_ERRORS was used, we set
error state using:

  *errp = &ignored_error_set;

This way, we can make ERR_IS_SET work even if errp was
IGNORE_ERRORS.  The ERR_IS_* macros are reimplemented as:

  #define ERR_IS_SET(e) (*(e) && *(e) != &ignored_error_unset)
  #define ERR_IS_IGNORED(e) (!(e) || *(e) == &ignored_error_unset || *(e) == &ignored_error_set)

Ensuring errp is never NULL
---------------------------

The last patch on this series changes the (Error **errp)
parameters in functions to (Error *errp[static 1]), just to help
validate the existing code, as clang warns about NULL arguments
on that case.  I don't think we should apply that patch, though,
because the "[static 1]" syntax confuses Coccinelle.

I have a branch where I experimented with the idea of replacing
(Error **errp) parameters with an opaque type (void*, or a struct
type).  I gave up when I noticed it would require touching all
callers to replace &err with a wrapper macro to convert to the
right type.  Suggestions to make NULL errp easier to detect at
build time are welcome.

(Probably the easiest solution for that is to add assert(errp)
lines to the ERR_IS_*() macros.)

Desirable side-effects
----------------------

Some of additional benefits from parts of this series:

* Making code that ignore error information more visible and
  greppable (using IGNORE_ERRORS).  I believe many of those cases
  are actually bugs and should use &error_abort or &error_fatal
  instead.

* Making code that depends on errp more visible and
  greppable (using ERR_IS_* macros).  Some of those cases are
  also likely to be bugs, and need to be investigated.

TODO
----

* Simplify more cases of local_error/error_propagate() to use
  errp directly.
* Update API documentation and code examples.
* Add a mechanism to ensure errp is never NULL.

Git branch
----------

This series depend on a few extra cleanups that I didn't submit
to qemu-devel yet.  A git branch including this series is
available at:

  git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1

Eduardo Habkost (15):
  tests: Test cases for error API
  error: New IGNORE_ERRORS macro
  Add qapi/error.h includes on files that will need it
  [coccinelle] Use IGNORE_ERRORS instead of NULL as errp argument
  qapi: Use IGNORE_ERRORS instead of NULL on generated code
  test-qapi-util: Use IGNORE_ERRORS instead of NULL
  Manual changes to use IGNORE_ERRORS instead of NULL
  error: New ERR_IS_* macros for checking Error** values
  [coccinelle] Use ERR_IS_* macros
  test-qapi-util: Use ERR_IS_* macros
  Manual changes to use ERR_IS_* macros
  error: Make IGNORED_ERRORS not a NULL pointer
  rdma: Simplify var declaration to avoid confusing Coccinelle
  [coccinelle] Eliminate unnecessary local_err/error_propagate() usage
  [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to
    catch NULL errp arguments

 include/qapi/visitor.h                  |  47 ++++---
 scripts/qapi-commands.py                |   6 +-
 scripts/qapi-types.py                   |   3 +-
 block/nbd-client.h                      |   2 +-
 block/qcow2.h                           |   8 +-
 block/vhdx.h                            |   2 +-
 crypto/blockpriv.h                      |   4 +-
 crypto/hmac.h                           |  10 +-
 crypto/tlscredspriv.h                   |   4 +-
 hw/9pfs/9p.h                            |   4 +-
 hw/block/dataplane/virtio-blk.h         |   2 +-
 hw/s390x/s390-virtio.h                  |   2 +-
 hw/timer/m48t59-internal.h              |   2 +-
 hw/usb/hcd-ehci.h                       |   4 +-
 hw/vfio/pci.h                           |   4 +-
 hw/xen/xen-host-pci-device.h            |   2 +-
 hw/xen/xen_pt.h                         |   4 +-
 include/block/aio.h                     |   4 +-
 include/block/block.h                   |  69 ++++++----
 include/block/block_backup.h            |   2 +-
 include/block/block_int.h               |  19 +--
 include/block/blockjob.h                |  11 +-
 include/block/blockjob_int.h            |   3 +-
 include/block/dirty-bitmap.h            |   8 +-
 include/block/nbd.h                     |  13 +-
 include/block/qapi.h                    |   7 +-
 include/block/snapshot.h                |  12 +-
 include/chardev/char-fd.h               |   2 +-
 include/chardev/char-fe.h               |   4 +-
 include/chardev/char-win.h              |   3 +-
 include/chardev/char.h                  |   9 +-
 include/crypto/afsplit.h                |   4 +-
 include/crypto/block.h                  |  10 +-
 include/crypto/cipher.h                 |   8 +-
 include/crypto/hash.h                   |  12 +-
 include/crypto/init.h                   |   2 +-
 include/crypto/ivgen.h                  |   2 +-
 include/crypto/pbkdf.h                  |   4 +-
 include/crypto/random.h                 |   4 +-
 include/crypto/secret.h                 |   6 +-
 include/crypto/tlssession.h             |   6 +-
 include/exec/memory.h                   |  12 +-
 include/exec/ram_addr.h                 |  12 +-
 include/hw/acpi/acpi.h                  |   4 +-
 include/hw/acpi/cpu.h                   |   7 +-
 include/hw/acpi/cpu_hotplug.h           |   3 +-
 include/hw/acpi/ich9.h                  |   9 +-
 include/hw/acpi/memory_hotplug.h        |   6 +-
 include/hw/acpi/pcihp.h                 |   4 +-
 include/hw/audio/pcspk.h                |   3 +-
 include/hw/block/block.h                |   4 +-
 include/hw/boards.h                     |   2 +-
 include/hw/char/serial.h                |   2 +-
 include/hw/hotplug.h                    |   8 +-
 include/hw/i386/pc.h                    |   2 +-
 include/hw/isa/isa.h                    |   6 +-
 include/hw/loader.h                     |   3 +-
 include/hw/mem/pc-dimm.h                |  10 +-
 include/hw/nmi.h                        |   2 +-
 include/hw/pci/msi.h                    |   2 +-
 include/hw/pci/msix.h                   |   4 +-
 include/hw/pci/pci.h                    |   2 +-
 include/hw/pci/pcie.h                   |   5 +-
 include/hw/pci/pcie_aer.h               |   2 +-
 include/hw/pci/shpc.h                   |   5 +-
 include/hw/ppc/pnv_xscom.h              |   2 +-
 include/hw/ppc/xics.h                   |   7 +-
 include/hw/qdev-core.h                  |   8 +-
 include/hw/qdev-properties.h            |  10 +-
 include/hw/s390x/css.h                  |   4 +-
 include/hw/scsi/scsi.h                  |   3 +-
 include/hw/smbios/smbios.h              |   2 +-
 include/hw/usb.h                        |   8 +-
 include/hw/vfio/vfio-common.h           |   5 +-
 include/hw/virtio/vhost-scsi-common.h   |   2 +-
 include/hw/virtio/virtio-bus.h          |   2 +-
 include/hw/virtio/virtio-scsi.h         |   6 +-
 include/hw/xen/xen.h                    |   2 +-
 include/io/channel-command.h            |   2 +-
 include/io/channel-file.h               |   2 +-
 include/io/channel-socket.h             |  14 +-
 include/io/channel-tls.h                |   4 +-
 include/io/channel-util.h               |   2 +-
 include/io/channel.h                    |  20 +--
 include/io/dns-resolver.h               |   2 +-
 include/io/task.h                       |   2 +-
 include/migration/blocker.h             |   2 +-
 include/migration/failover.h            |   2 +-
 include/migration/migration.h           |   4 +-
 include/migration/snapshot.h            |   4 +-
 include/migration/vmstate.h             |   5 +-
 include/monitor/monitor.h               |   6 +-
 include/monitor/qdev.h                  |   4 +-
 include/net/net.h                       |   6 +-
 include/qapi/error.h                    |  23 +++-
 include/qapi/qmp/json-parser.h          |   3 +-
 include/qapi/qmp/qdict.h                |   2 +-
 include/qapi/qmp/qjson.h                |   5 +-
 include/qapi/qobject-input-visitor.h    |   2 +-
 include/qapi/util.h                     |   2 +-
 include/qemu/base64.h                   |   2 +-
 include/qemu/config-file.h              |   4 +-
 include/qemu/log.h                      |   4 +-
 include/qemu/main-loop.h                |   2 +-
 include/qemu/option.h                   |  30 ++--
 include/qemu/sockets.h                  |  33 +++--
 include/qemu/throttle.h                 |   2 +-
 include/qom/cpu.h                       |   4 +-
 include/qom/object.h                    |  89 ++++++------
 include/qom/object_interfaces.h         |  12 +-
 include/qom/qom-qobject.h               |   4 +-
 include/sysemu/arch_init.h              |   8 +-
 include/sysemu/block-backend.h          |  19 +--
 include/sysemu/cpus.h                   |   4 +-
 include/sysemu/cryptodev.h              |   8 +-
 include/sysemu/device_tree.h            |   6 +-
 include/sysemu/hostmem.h                |   2 +-
 include/sysemu/memory_mapping.h         |   2 +-
 include/sysemu/numa.h                   |   5 +-
 include/sysemu/qtest.h                  |   3 +-
 include/sysemu/sysemu.h                 |  10 +-
 include/sysemu/tpm_backend.h            |   2 +-
 include/ui/console.h                    |  14 +-
 include/ui/input.h                      |   2 +-
 include/ui/qemu-spice.h                 |   2 +-
 migration/block.h                       |   2 +-
 migration/exec.h                        |   5 +-
 migration/fd.h                          |   4 +-
 migration/rdma.h                        |   5 +-
 migration/savevm.h                      |   2 +-
 migration/socket.h                      |   9 +-
 migration/tls.h                         |   4 +-
 nbd/nbd-internal.h                      |   6 +-
 net/clients.h                           |  20 +--
 net/tap_int.h                           |   5 +-
 qga/guest-agent-core.h                  |   4 +-
 qga/vss-win32.h                         |   2 +-
 replication.h                           |   8 +-
 target/i386/cpu.h                       |   2 +-
 target/ppc/cpu.h                        |   5 +-
 target/s390x/cpu.h                      |  10 +-
 target/s390x/cpu_models.h               |   9 +-
 qapi/qapi-visit-core.c                  |  64 +++++----
 arch_init.c                             |   2 +-
 backends/cryptodev-builtin.c            |  15 +-
 backends/cryptodev.c                    |  24 ++--
 backends/hostmem-file.c                 |  11 +-
 backends/hostmem-ram.c                  |   2 +-
 backends/hostmem.c                      |  45 +++---
 backends/rng-egd.c                      |   9 +-
 backends/rng-random.c                   |   8 +-
 backends/rng.c                          |  15 +-
 backends/tpm.c                          |  15 +-
 balloon.c                               |   6 +-
 block.c                                 | 150 ++++++++++----------
 block/backup.c                          |  13 +-
 block/blkdebug.c                        |  33 +++--
 block/blkreplay.c                       |   2 +-
 block/blkverify.c                       |   4 +-
 block/block-backend.c                   |  31 +++--
 block/bochs.c                           |   4 +-
 block/cloop.c                           |   4 +-
 block/commit.c                          |  35 +++--
 block/crypto.c                          |  32 ++---
 block/curl.c                            |  10 +-
 block/dirty-bitmap.c                    |   9 +-
 block/dmg.c                             |   6 +-
 block/file-posix.c                      |  52 +++----
 block/file-win32.c                      |  18 +--
 block/gluster.c                         |  23 ++--
 block/io.c                              |  13 +-
 block/iscsi.c                           |  58 ++++----
 block/mirror.c                          |  30 ++--
 block/nbd-client.c                      |  12 +-
 block/nbd.c                             |  36 +++--
 block/nfs.c                             |  37 ++---
 block/null.c                            |   4 +-
 block/parallels.c                       |  12 +-
 block/qapi.c                            |  19 ++-
 block/qcow.c                            |  15 +-
 block/qcow2-cluster.c                   |   2 +-
 block/qcow2-refcount.c                  |   8 +-
 block/qcow2-snapshot.c                  |   4 +-
 block/qcow2.c                           |  44 +++---
 block/qed.c                             |  21 +--
 block/quorum.c                          |  11 +-
 block/raw-format.c                      |  20 +--
 block/rbd.c                             |  29 ++--
 block/replication.c                     |  46 +++----
 block/sheepdog.c                        |  65 ++++-----
 block/snapshot.c                        |  14 +-
 block/ssh.c                             |  43 +++---
 block/stream.c                          |  10 +-
 block/vdi.c                             |   7 +-
 block/vhdx-log.c                        |   4 +-
 block/vhdx.c                            |  13 +-
 block/vmdk.c                            |  33 +++--
 block/vpc.c                             |  11 +-
 block/vvfat.c                           |  12 +-
 block/vxhs.c                            |   6 +-
 block/write-threshold.c                 |   2 +-
 blockdev-nbd.c                          |  13 +-
 blockdev.c                              | 184 ++++++++++++-------------
 blockjob.c                              |  35 +++--
 bootdevice.c                            |  27 ++--
 bsd-user/elfload.c                      |   4 +-
 chardev/baum.c                          |   2 +-
 chardev/char-console.c                  |   2 +-
 chardev/char-fd.c                       |   4 +-
 chardev/char-fe.c                       |   4 +-
 chardev/char-file.c                     |   4 +-
 chardev/char-io.c                       |   3 +-
 chardev/char-mux.c                      |   4 +-
 chardev/char-null.c                     |   2 +-
 chardev/char-parallel.c                 |   8 +-
 chardev/char-pipe.c                     |   8 +-
 chardev/char-pty.c                      |   4 +-
 chardev/char-ringbuf.c                  |   8 +-
 chardev/char-serial.c                   |   6 +-
 chardev/char-socket.c                   |  30 ++--
 chardev/char-stdio.c                    |   4 +-
 chardev/char-udp.c                      |   8 +-
 chardev/char-win-stdio.c                |   2 +-
 chardev/char-win.c                      |   3 +-
 chardev/char.c                          |  25 ++--
 chardev/msmouse.c                       |   2 +-
 chardev/spice.c                         |   8 +-
 chardev/wctablet.c                      |   2 +-
 cpus.c                                  |  12 +-
 crypto/afsplit.c                        |   6 +-
 crypto/block-luks.c                     |  22 +--
 crypto/block-qcow.c                     |  10 +-
 crypto/block.c                          |  14 +-
 crypto/cipher-builtin.c                 |  24 ++--
 crypto/cipher-gcrypt.c                  |   8 +-
 crypto/cipher-nettle.c                  |   8 +-
 crypto/cipher.c                         |   2 +-
 crypto/hash-gcrypt.c                    |   2 +-
 crypto/hash-glib.c                      |   2 +-
 crypto/hash-nettle.c                    |   2 +-
 crypto/hash.c                           |  10 +-
 crypto/hmac-gcrypt.c                    |   4 +-
 crypto/hmac-glib.c                      |   8 +-
 crypto/hmac-nettle.c                    |   4 +-
 crypto/hmac.c                           |   6 +-
 crypto/init.c                           |   2 +-
 crypto/ivgen-essiv.c                    |   4 +-
 crypto/ivgen-plain.c                    |   4 +-
 crypto/ivgen-plain64.c                  |   4 +-
 crypto/ivgen.c                          |   4 +-
 crypto/pbkdf-gcrypt.c                   |   2 +-
 crypto/pbkdf-nettle.c                   |   2 +-
 crypto/pbkdf-stub.c                     |   2 +-
 crypto/pbkdf.c                          |   4 +-
 crypto/random-gcrypt.c                  |   4 +-
 crypto/random-gnutls.c                  |   4 +-
 crypto/random-platform.c                |   4 +-
 crypto/secret.c                         |  50 +++----
 crypto/tlscreds.c                       |  28 ++--
 crypto/tlscredsanon.c                   |  14 +-
 crypto/tlscredsx509.c                   |  44 +++---
 crypto/tlssession.c                     |  18 +--
 device_tree.c                           |   8 +-
 dump.c                                  | 207 ++++++++++------------------
 exec.c                                  |  40 +++---
 fsdev/qemu-fsdev-throttle.c             |   3 +-
 gdbstub.c                               |   2 +-
 hmp.c                                   |  68 ++++-----
 hw/9pfs/9p.c                            |   4 +-
 hw/9pfs/virtio-9p-device.c              |   7 +-
 hw/9pfs/xen-9p-backend.c                |  12 +-
 hw/acpi/acpi-stub.c                     |   2 +-
 hw/acpi/core.c                          |   6 +-
 hw/acpi/cpu.c                           |   9 +-
 hw/acpi/cpu_hotplug.c                   |   7 +-
 hw/acpi/ich9.c                          |  51 +++----
 hw/acpi/memory_hotplug.c                |  19 +--
 hw/acpi/nvdimm.c                        |  17 +--
 hw/acpi/pcihp.c                         |   4 +-
 hw/acpi/piix4.c                         |  28 ++--
 hw/acpi/vmgenid.c                       |  12 +-
 hw/arm/allwinner-a10.c                  |  30 ++--
 hw/arm/armv7m.c                         |  30 ++--
 hw/arm/aspeed.c                         |   4 +-
 hw/arm/aspeed_soc.c                     |  25 ++--
 hw/arm/bcm2835_peripherals.c            |  33 +++--
 hw/arm/bcm2836.c                        |   5 +-
 hw/arm/digic.c                          |  30 ++--
 hw/arm/exynos4210.c                     |   2 +-
 hw/arm/fsl-imx25.c                      |  63 ++++-----
 hw/arm/fsl-imx31.c                      |  58 ++++----
 hw/arm/fsl-imx6.c                       | 110 +++++++--------
 hw/arm/highbank.c                       |   2 +-
 hw/arm/integratorcp.c                   |   4 +-
 hw/arm/musicpal.c                       |   4 +-
 hw/arm/pxa2xx.c                         |   2 +-
 hw/arm/pxa2xx_gpio.c                    |   2 +-
 hw/arm/realview.c                       |   2 +-
 hw/arm/spitz.c                          |   4 +-
 hw/arm/stm32f205_soc.c                  |   2 +-
 hw/arm/strongarm.c                      |   2 +-
 hw/arm/tosa.c                           |   2 +-
 hw/arm/versatilepb.c                    |   2 +-
 hw/arm/vexpress.c                       |  13 +-
 hw/arm/virt.c                           |  62 +++++----
 hw/arm/xilinx_zynq.c                    |   2 +-
 hw/arm/xlnx-zynqmp.c                    |  14 +-
 hw/arm/z2.c                             |   2 +-
 hw/audio/ac97.c                         |   2 +-
 hw/audio/adlib.c                        |   2 +-
 hw/audio/cs4231a.c                      |   2 +-
 hw/audio/es1370.c                       |   2 +-
 hw/audio/gus.c                          |   2 +-
 hw/audio/intel-hda.c                    |   6 +-
 hw/audio/marvell_88w8618.c              |   2 +-
 hw/audio/milkymist-ac97.c               |   2 +-
 hw/audio/pcspk.c                        |   2 +-
 hw/audio/pl041.c                        |   2 +-
 hw/audio/sb16.c                         |   2 +-
 hw/block/block.c                        |   4 +-
 hw/block/dataplane/virtio-blk.c         |   2 +-
 hw/block/fdc.c                          |  37 ++---
 hw/block/m25p80.c                       |   2 +-
 hw/block/nand.c                         |   2 +-
 hw/block/nvme.c                         |   2 +-
 hw/block/pflash_cfi01.c                 |   8 +-
 hw/block/pflash_cfi02.c                 |   8 +-
 hw/block/virtio-blk.c                   |  27 ++--
 hw/bt/hci-csr.c                         |   2 +-
 hw/char/bcm2835_aux.c                   |   2 +-
 hw/char/cadence_uart.c                  |   2 +-
 hw/char/debugcon.c                      |  10 +-
 hw/char/digic-uart.c                    |   2 +-
 hw/char/escc.c                          |   2 +-
 hw/char/etraxfs_ser.c                   |   2 +-
 hw/char/exynos4210_uart.c               |   2 +-
 hw/char/imx_serial.c                    |   2 +-
 hw/char/ipoctal232.c                    |   2 +-
 hw/char/lm32_juart.c                    |   2 +-
 hw/char/lm32_uart.c                     |   2 +-
 hw/char/mcf_uart.c                      |   2 +-
 hw/char/milkymist-uart.c                |   2 +-
 hw/char/parallel.c                      |   2 +-
 hw/char/pl011.c                         |   2 +-
 hw/char/serial-isa.c                    |   2 +-
 hw/char/serial-pci.c                    |  16 +--
 hw/char/serial.c                        |   2 +-
 hw/char/spapr_vty.c                     |   2 +-
 hw/char/stm32f2xx_usart.c               |   2 +-
 hw/char/terminal3270.c                  |   2 +-
 hw/char/virtio-console.c                |   4 +-
 hw/char/virtio-serial-bus.c             |  22 +--
 hw/char/xilinx_uartlite.c               |   2 +-
 hw/core/bus.c                           |  19 +--
 hw/core/generic-loader.c                |   4 +-
 hw/core/hotplug.c                       |   8 +-
 hw/core/loader.c                        |   3 +-
 hw/core/machine.c                       |  99 +++++++------
 hw/core/nmi.c                           |   2 +-
 hw/core/or-irq.c                        |   2 +-
 hw/core/platform-bus.c                  |   8 +-
 hw/core/qdev-properties-system.c        |  52 +++----
 hw/core/qdev-properties.c               | 112 +++++++--------
 hw/core/qdev.c                          |  61 ++++----
 hw/core/sysbus.c                        |   6 +-
 hw/cpu/a15mpcore.c                      |  10 +-
 hw/cpu/a9mpcore.c                       |  30 ++--
 hw/cpu/arm11mpcore.c                    |  23 ++--
 hw/cpu/core.c                           |  24 ++--
 hw/cpu/realview_mpcore.c                |  13 +-
 hw/display/ads7846.c                    |   2 +-
 hw/display/bcm2835_fb.c                 |   2 +-
 hw/display/cg3.c                        |   2 +-
 hw/display/cirrus_vga.c                 |   4 +-
 hw/display/exynos4210_fimd.c            |   2 +-
 hw/display/jazz_led.c                   |   2 +-
 hw/display/milkymist-tmu2.c             |   2 +-
 hw/display/milkymist-vgafb.c            |   2 +-
 hw/display/pl110.c                      |   2 +-
 hw/display/qxl.c                        |  12 +-
 hw/display/sm501.c                      |   4 +-
 hw/display/ssd0323.c                    |   2 +-
 hw/display/tcx.c                        |   2 +-
 hw/display/vga-isa.c                    |   2 +-
 hw/display/vga-pci.c                    |  16 ++-
 hw/display/virtio-gpu-pci.c             |   3 +-
 hw/display/virtio-gpu.c                 |  14 +-
 hw/display/virtio-vga.c                 |   9 +-
 hw/display/vmware_vga.c                 |   2 +-
 hw/display/xlnx_dp.c                    |   4 +-
 hw/dma/bcm2835_dma.c                    |   2 +-
 hw/dma/i82374.c                         |   2 +-
 hw/dma/i8257.c                          |   2 +-
 hw/dma/pl330.c                          |   2 +-
 hw/dma/pxa2xx_dma.c                     |   2 +-
 hw/dma/rc4030.c                         |   4 +-
 hw/dma/sparc32_dma.c                    |   2 +-
 hw/dma/xilinx_axidma.c                  |   2 +-
 hw/gpio/bcm2835_gpio.c                  |   2 +-
 hw/gpio/gpio_key.c                      |   2 +-
 hw/gpio/imx_gpio.c                      |   2 +-
 hw/gpio/omap_gpio.c                     |   4 +-
 hw/i2c/aspeed_i2c.c                     |   2 +-
 hw/i2c/imx_i2c.c                        |   2 +-
 hw/i2c/omap_i2c.c                       |   2 +-
 hw/i2c/smbus_ich9.c                     |   2 +-
 hw/i386/acpi-build.c                    |  51 ++++---
 hw/i386/amd_iommu.c                     |   2 +-
 hw/i386/intel_iommu.c                   |   4 +-
 hw/i386/kvm/apic.c                      |   4 +-
 hw/i386/kvm/clock.c                     |   2 +-
 hw/i386/kvm/i8254.c                     |   2 +-
 hw/i386/kvm/i8259.c                     |   2 +-
 hw/i386/kvm/ioapic.c                    |   2 +-
 hw/i386/kvm/pci-assign.c                |  29 ++--
 hw/i386/kvmvapic.c                      |   2 +-
 hw/i386/pc.c                            |  84 ++++++-----
 hw/i386/pc_q35.c                        |  16 ++-
 hw/i386/x86-iommu.c                     |   2 +-
 hw/i386/xen/xen-hvm.c                   |   4 +-
 hw/i386/xen/xen_apic.c                  |   2 +-
 hw/i386/xen/xen_platform.c              |   2 +-
 hw/i386/xen/xen_pvdevice.c              |   2 +-
 hw/ide/ahci.c                           |   2 +-
 hw/ide/cmd646.c                         |   2 +-
 hw/ide/core.c                           |   2 +-
 hw/ide/ich.c                            |   5 +-
 hw/ide/isa.c                            |   2 +-
 hw/ide/macio.c                          |   2 +-
 hw/ide/microdrive.c                     |   2 +-
 hw/ide/mmio.c                           |   2 +-
 hw/ide/piix.c                           |   2 +-
 hw/ide/qdev.c                           |  12 +-
 hw/ide/via.c                            |   2 +-
 hw/input/adb.c                          |   6 +-
 hw/input/pckbd.c                        |   2 +-
 hw/input/virtio-input-hid.c             |   9 +-
 hw/input/virtio-input-host.c            |   5 +-
 hw/input/virtio-input.c                 |  20 ++-
 hw/input/vmmouse.c                      |   2 +-
 hw/intc/apic.c                          |   4 +-
 hw/intc/apic_common.c                   |  18 ++-
 hw/intc/arm_gic.c                       |   8 +-
 hw/intc/arm_gic_common.c                |   2 +-
 hw/intc/arm_gic_kvm.c                   |  13 +-
 hw/intc/arm_gicv2m.c                    |   2 +-
 hw/intc/arm_gicv3.c                     |   8 +-
 hw/intc/arm_gicv3_common.c              |   5 +-
 hw/intc/arm_gicv3_its_kvm.c             |   8 +-
 hw/intc/arm_gicv3_kvm.c                 |  13 +-
 hw/intc/armv7m_nvic.c                   |   8 +-
 hw/intc/aspeed_vic.c                    |   2 +-
 hw/intc/exynos4210_gic.c                |   3 +-
 hw/intc/grlib_irqmp.c                   |   2 +-
 hw/intc/i8259.c                         |   2 +-
 hw/intc/i8259_common.c                  |   2 +-
 hw/intc/ioapic.c                        |   2 +-
 hw/intc/ioapic_common.c                 |   2 +-
 hw/intc/mips_gic.c                      |   2 +-
 hw/intc/nios2_iic.c                     |   2 +-
 hw/intc/omap_intc.c                     |   4 +-
 hw/intc/openpic.c                       |   2 +-
 hw/intc/openpic_kvm.c                   |   2 +-
 hw/intc/realview_gic.c                  |   8 +-
 hw/intc/s390_flic.c                     |   4 +-
 hw/intc/s390_flic_kvm.c                 |   5 +-
 hw/intc/xics.c                          |   8 +-
 hw/intc/xics_kvm.c                      |   8 +-
 hw/intc/xics_pnv.c                      |   2 +-
 hw/intc/xics_spapr.c                    |   5 +-
 hw/ipack/ipack.c                        |   8 +-
 hw/ipack/tpci200.c                      |   2 +-
 hw/ipmi/ipmi.c                          |   5 +-
 hw/ipmi/ipmi_bmc_extern.c               |   2 +-
 hw/ipmi/ipmi_bmc_sim.c                  |   2 +-
 hw/ipmi/isa_ipmi_bt.c                   |   6 +-
 hw/ipmi/isa_ipmi_kcs.c                  |   4 +-
 hw/isa/i82378.c                         |   2 +-
 hw/isa/isa-bus.c                        |   2 +-
 hw/isa/lpc_ich9.c                       |  13 +-
 hw/isa/pc87312.c                        |   2 +-
 hw/isa/piix4.c                          |   2 +-
 hw/isa/vt82c686.c                       |   8 +-
 hw/mem/nvdimm.c                         |   8 +-
 hw/mem/pc-dimm.c                        |  24 ++--
 hw/microblaze/petalogix_ml605_mmu.c     |  14 +-
 hw/mips/boston.c                        |   2 +-
 hw/mips/cps.c                           |   2 +-
 hw/mips/gt64xxx_pci.c                   |   2 +-
 hw/mips/mips_malta.c                    |   3 +-
 hw/misc/applesmc.c                      |   2 +-
 hw/misc/arm11scu.c                      |   2 +-
 hw/misc/arm_sysctl.c                    |   2 +-
 hw/misc/aspeed_scu.c                    |   2 +-
 hw/misc/aspeed_sdmc.c                   |   2 +-
 hw/misc/auxbus.c                        |   3 +-
 hw/misc/bcm2835_mbox.c                  |   2 +-
 hw/misc/bcm2835_property.c              |   2 +-
 hw/misc/debugexit.c                     |   2 +-
 hw/misc/eccmemctl.c                     |   2 +-
 hw/misc/edu.c                           |   7 +-
 hw/misc/hyperv_testdev.c                |   2 +-
 hw/misc/imx6_src.c                      |   2 +-
 hw/misc/ivshmem.c                       |  49 ++++---
 hw/misc/macio/cuda.c                    |   2 +-
 hw/misc/macio/macio.c                   |  45 +++---
 hw/misc/max111x.c                       |   4 +-
 hw/misc/mips_cmgcr.c                    |   2 +-
 hw/misc/mips_cpc.c                      |   2 +-
 hw/misc/mips_itu.c                      |   2 +-
 hw/misc/pc-testdev.c                    |   2 +-
 hw/misc/pci-testdev.c                   |   2 +-
 hw/misc/pvpanic.c                       |   5 +-
 hw/misc/sga.c                           |   2 +-
 hw/misc/tmp105.c                        |  12 +-
 hw/misc/unimp.c                         |   2 +-
 hw/misc/vmport.c                        |   2 +-
 hw/net/allwinner_emac.c                 |   2 +-
 hw/net/cadence_gem.c                    |   2 +-
 hw/net/dp8393x.c                        |   8 +-
 hw/net/e1000.c                          |   5 +-
 hw/net/e1000e.c                         |  11 +-
 hw/net/eepro100.c                       |   5 +-
 hw/net/fsl_etsec/etsec.c                |   2 +-
 hw/net/ftgmac100.c                      |   2 +-
 hw/net/imx_fec.c                        |   2 +-
 hw/net/lance.c                          |   3 +-
 hw/net/mcf_fec.c                        |   2 +-
 hw/net/ne2000-isa.c                     |  10 +-
 hw/net/ne2000.c                         |   5 +-
 hw/net/pcnet-pci.c                      |   5 +-
 hw/net/rocker/qmp-norocker.c            |   9 +-
 hw/net/rocker/rocker.c                  |   5 +-
 hw/net/rocker/rocker_of_dpa.c           |   2 +-
 hw/net/rtl8139.c                        |   5 +-
 hw/net/spapr_llan.c                     |   5 +-
 hw/net/virtio-net.c                     |  10 +-
 hw/net/vmxnet3.c                        |  11 +-
 hw/net/xilinx_axienet.c                 |   2 +-
 hw/net/xilinx_ethlite.c                 |   2 +-
 hw/nvram/fw_cfg.c                       |  21 ++-
 hw/nvram/mac_nvram.c                    |   4 +-
 hw/nvram/spapr_nvram.c                  |   2 +-
 hw/pci-bridge/dec.c                     |   4 +-
 hw/pci-bridge/gen_pcie_root_port.c      |   2 +-
 hw/pci-bridge/ioh3420.c                 |   2 +-
 hw/pci-bridge/pci_bridge_dev.c          |   4 +-
 hw/pci-bridge/pci_expander_bridge.c     |  16 +--
 hw/pci-bridge/pcie_root_port.c          |   2 +-
 hw/pci-host/apb.c                       |   4 +-
 hw/pci-host/bonito.c                    |   2 +-
 hw/pci-host/gpex.c                      |   5 +-
 hw/pci-host/grackle.c                   |   2 +-
 hw/pci-host/piix.c                      |  28 ++--
 hw/pci-host/ppce500.c                   |   2 +-
 hw/pci-host/prep.c                      |   6 +-
 hw/pci-host/q35.c                       |  39 +++---
 hw/pci-host/uninorth.c                  |   9 +-
 hw/pci-host/versatile.c                 |   4 +-
 hw/pci-host/xilinx-pcie.c               |   7 +-
 hw/pci/msi.c                            |   2 +-
 hw/pci/msix.c                           |   4 +-
 hw/pci/pci-stub.c                       |   2 +-
 hw/pci/pci.c                            |  44 +++---
 hw/pci/pcie.c                           |  10 +-
 hw/pci/pcie_aer.c                       |   2 +-
 hw/pci/shpc.c                           |  22 ++-
 hw/pcmcia/pxa2xx.c                      |   3 +-
 hw/ppc/e500.c                           |  11 +-
 hw/ppc/mac_newworld.c                   |   2 +-
 hw/ppc/mac_oldworld.c                   |   2 +-
 hw/ppc/pnv.c                            |  52 +++----
 hw/ppc/pnv_core.c                       |  25 ++--
 hw/ppc/pnv_lpc.c                        |   2 +-
 hw/ppc/pnv_occ.c                        |   2 +-
 hw/ppc/pnv_psi.c                        |   5 +-
 hw/ppc/pnv_xscom.c                      |   2 +-
 hw/ppc/prep.c                           |   9 +-
 hw/ppc/prep_systemio.c                  |   2 +-
 hw/ppc/rs6000_mc.c                      |   2 +-
 hw/ppc/spapr.c                          |  89 ++++++------
 hw/ppc/spapr_cpu_core.c                 |   9 +-
 hw/ppc/spapr_drc.c                      |  66 +++++----
 hw/ppc/spapr_hcall.c                    |   2 +-
 hw/ppc/spapr_iommu.c                    |   7 +-
 hw/ppc/spapr_pci.c                      |  30 ++--
 hw/ppc/spapr_rng.c                      |   6 +-
 hw/ppc/spapr_rtc.c                      |   9 +-
 hw/ppc/spapr_vio.c                      |   2 +-
 hw/s390x/3270-ccw.c                     |   2 +-
 hw/s390x/ccw-device.c                   |   2 +-
 hw/s390x/css-bridge.c                   |   8 +-
 hw/s390x/css.c                          |  18 ++-
 hw/s390x/event-facility.c               |  12 +-
 hw/s390x/ipl.c                          |   7 +-
 hw/s390x/s390-ccw.c                     |   7 +-
 hw/s390x/s390-pci-bus.c                 |  20 +--
 hw/s390x/s390-skeys.c                   |  16 ++-
 hw/s390x/s390-virtio-ccw.c              |  49 +++----
 hw/s390x/s390-virtio.c                  |   4 +-
 hw/s390x/sclp.c                         |   9 +-
 hw/s390x/virtio-ccw.c                   |  61 ++++----
 hw/scsi/esp-pci.c                       |  10 +-
 hw/scsi/esp.c                           |   2 +-
 hw/scsi/lsi53c895a.c                    |   4 +-
 hw/scsi/megasas.c                       |   4 +-
 hw/scsi/mptsas.c                        |   2 +-
 hw/scsi/scsi-bus.c                      |  34 ++---
 hw/scsi/scsi-disk.c                     |  24 ++--
 hw/scsi/scsi-generic.c                  |   2 +-
 hw/scsi/spapr_vscsi.c                   |   2 +-
 hw/scsi/vhost-scsi-common.c             |   2 +-
 hw/scsi/vhost-scsi.c                    |  17 +--
 hw/scsi/virtio-scsi-dataplane.c         |   2 +-
 hw/scsi/virtio-scsi.c                   |  22 +--
 hw/scsi/vmw_pvscsi.c                    |  10 +-
 hw/sd/pl181.c                           |   2 +-
 hw/sd/sd.c                              |   4 +-
 hw/sd/sdhci.c                           |   4 +-
 hw/sd/ssi-sd.c                          |   2 +-
 hw/sh4/sh_pci.c                         |   2 +-
 hw/smbios/smbios-stub.c                 |   2 +-
 hw/smbios/smbios.c                      |   2 +-
 hw/sparc/sun4m.c                        |   4 +-
 hw/sparc64/sun4u.c                      |   6 +-
 hw/ssi/aspeed_smc.c                     |   2 +-
 hw/ssi/imx_spi.c                        |   2 +-
 hw/ssi/ssi.c                            |   2 +-
 hw/ssi/xilinx_spips.c                   |   4 +-
 hw/timer/a9gtimer.c                     |   2 +-
 hw/timer/altera_timer.c                 |   2 +-
 hw/timer/arm_mptimer.c                  |   2 +-
 hw/timer/arm_timer.c                    |   2 +-
 hw/timer/aspeed_timer.c                 |   2 +-
 hw/timer/hpet.c                         |   2 +-
 hw/timer/i8254.c                        |   2 +-
 hw/timer/i8254_common.c                 |   2 +-
 hw/timer/imx_epit.c                     |   2 +-
 hw/timer/imx_gpt.c                      |   2 +-
 hw/timer/lm32_timer.c                   |   2 +-
 hw/timer/m48t59-isa.c                   |   2 +-
 hw/timer/m48t59.c                       |   4 +-
 hw/timer/mc146818rtc.c                  |  14 +-
 hw/timer/milkymist-sysctl.c             |   2 +-
 hw/timer/pxa2xx_timer.c                 |   2 +-
 hw/timer/xilinx_timer.c                 |   2 +-
 hw/tpm/tpm_tis.c                        |   2 +-
 hw/usb/bus.c                            |  64 ++++-----
 hw/usb/dev-audio.c                      |   4 +-
 hw/usb/dev-bluetooth.c                  |   4 +-
 hw/usb/dev-hid.c                        |  13 +-
 hw/usb/dev-hub.c                        |   4 +-
 hw/usb/dev-mtp.c                        |   2 +-
 hw/usb/dev-network.c                    |   6 +-
 hw/usb/dev-serial.c                     |   8 +-
 hw/usb/dev-smartcard-reader.c           |   4 +-
 hw/usb/dev-storage.c                    |  18 +--
 hw/usb/dev-uas.c                        |   4 +-
 hw/usb/dev-wacom.c                      |   4 +-
 hw/usb/hcd-ehci-pci.c                   |   7 +-
 hw/usb/hcd-ehci-sysbus.c                |   2 +-
 hw/usb/hcd-ehci.c                       |   6 +-
 hw/usb/hcd-ohci.c                       |  18 +--
 hw/usb/hcd-uhci.c                       |  10 +-
 hw/usb/hcd-xhci.c                       |   4 +-
 hw/usb/host-libusb.c                    |   6 +-
 hw/usb/redirect.c                       |   6 +-
 hw/vfio/amd-xgbe.c                      |   2 +-
 hw/vfio/calxeda-xgmac.c                 |   2 +-
 hw/vfio/ccw.c                           |  14 +-
 hw/vfio/common.c                        |   7 +-
 hw/vfio/pci-quirks.c                    |   6 +-
 hw/vfio/pci.c                           |  35 +++--
 hw/vfio/platform.c                      |   9 +-
 hw/virtio/vhost-vsock.c                 |   8 +-
 hw/virtio/virtio-balloon.c              |  25 ++--
 hw/virtio/virtio-bus.c                  |   2 +-
 hw/virtio/virtio-crypto-pci.c           |   5 +-
 hw/virtio/virtio-crypto.c               |  12 +-
 hw/virtio/virtio-mmio.c                 |   2 +-
 hw/virtio/virtio-pci.c                  |  48 ++++---
 hw/virtio/virtio-rng.c                  |  20 +--
 hw/virtio/virtio.c                      |  24 ++--
 hw/watchdog/watchdog.c                  |   3 +-
 hw/watchdog/wdt_aspeed.c                |   2 +-
 hw/watchdog/wdt_diag288.c               |   4 +-
 hw/watchdog/wdt_i6300esb.c              |   2 +-
 hw/watchdog/wdt_ib700.c                 |   2 +-
 hw/xen/xen-host-pci-device.c            |  12 +-
 hw/xen/xen_backend.c                    |   4 +-
 hw/xen/xen_pt.c                         |   2 +-
 hw/xen/xen_pt_config_init.c             |   4 +-
 hw/xen/xen_pt_graphics.c                |   2 +-
 hw/xen/xen_pvdev.c                      |   3 +-
 io/channel-buffer.c                     |  10 +-
 io/channel-command.c                    |  16 +--
 io/channel-file.c                       |  12 +-
 io/channel-socket.c                     |  30 ++--
 io/channel-tls.c                        |  18 +--
 io/channel-util.c                       |   2 +-
 io/channel-websock.c                    |  26 ++--
 io/channel.c                            |  20 +--
 io/dns-resolver.c                       |   6 +-
 io/task.c                               |   2 +-
 iothread.c                              |   8 +-
 linux-user/elfload.c                    |   4 +-
 linux-user/uname.c                      |   3 +-
 memory.c                                |  21 +--
 memory_mapping.c                        |   2 +-
 migration/block.c                       |   3 +-
 migration/colo-failover.c               |   4 +-
 migration/colo.c                        |  38 +++--
 migration/exec.c                        |   5 +-
 migration/fd.c                          |   5 +-
 migration/migration.c                   |  43 +++---
 migration/qemu-file-channel.c           |  11 +-
 migration/ram.c                         |   4 +-
 migration/rdma.c                        |  40 +++---
 migration/savevm.c                      |  14 +-
 migration/socket.c                      |  18 +--
 migration/tls.c                         |   6 +-
 monitor.c                               |  57 ++++----
 nbd/client.c                            |  29 ++--
 nbd/common.c                            |   2 +-
 nbd/server.c                            |  22 +--
 net/colo-compare.c                      |  25 ++--
 net/dump.c                              |  19 +--
 net/filter-buffer.c                     |  11 +-
 net/filter-mirror.c                     |  22 +--
 net/filter-rewriter.c                   |   2 +-
 net/filter.c                            |  30 ++--
 net/hub.c                               |   2 +-
 net/l2tpv3.c                            |   2 +-
 net/net.c                               |  31 +++--
 net/netmap.c                            |   5 +-
 net/slirp.c                             |   2 +-
 net/socket.c                            |   2 +-
 net/tap-bsd.c                           |  10 +-
 net/tap-linux.c                         |   5 +-
 net/tap-solaris.c                       |   7 +-
 net/tap-stub.c                          |   5 +-
 net/tap-win32.c                         |   2 +-
 net/tap.c                               |  21 ++-
 net/vde.c                               |   2 +-
 net/vhost-user.c                        |   7 +-
 numa.c                                  |  21 +--
 qapi/opts-visitor.c                     |  28 ++--
 qapi/qapi-clone-visitor.c               |  20 +--
 qapi/qapi-dealloc-visitor.c             |  22 +--
 qapi/qapi-util.c                        |   2 +-
 qapi/qmp-dispatch.c                     |   5 +-
 qapi/qobject-input-visitor.c            |  50 ++++---
 qapi/qobject-output-visitor.c           |  20 +--
 qapi/string-input-visitor.c             |  25 ++--
 qapi/string-output-visitor.c            |  14 +-
 qdev-monitor.c                          |  35 +++--
 qemu-img.c                              |  28 ++--
 qemu-io.c                               |   2 +-
 qemu-nbd.c                              |   7 +-
 qga/commands-posix.c                    | 222 ++++++++++++++----------------
 qga/commands-win32.c                    | 101 +++++++-------
 qga/commands.c                          |  16 +--
 qga/main.c                              |   4 +-
 qga/vss-win32.c                         |   2 +-
 qmp.c                                   |  87 ++++++------
 qobject/json-parser.c                   |   5 +-
 qobject/qdict.c                         |   4 +-
 qobject/qjson.c                         |   5 +-
 qom/container.c                         |   3 +-
 qom/cpu.c                               |  10 +-
 qom/object.c                            | 237 +++++++++++++++-----------------
 qom/object_interfaces.c                 |  15 +-
 qom/qom-qobject.c                       |   4 +-
 qtest.c                                 |   3 +-
 replication.c                           |  32 ++---
 stubs/arch-query-cpu-def.c              |   2 +-
 stubs/arch-query-cpu-model-baseline.c   |   2 +-
 stubs/arch-query-cpu-model-comparison.c |   2 +-
 stubs/arch-query-cpu-model-expansion.c  |   2 +-
 stubs/migr-blocker.c                    |   2 +-
 stubs/monitor.c                         |   2 +-
 stubs/uuid.c                            |   2 +-
 stubs/vmgenid.c                         |   2 +-
 stubs/vmstate.c                         |   2 +-
 stubs/xen-hvm.c                         |   4 +-
 target/alpha/cpu.c                      |  10 +-
 target/arm/cpu.c                        |   8 +-
 target/arm/cpu64.c                      |   9 +-
 target/arm/helper.c                     |   2 +-
 target/arm/monitor.c                    |   2 +-
 target/cris/cpu.c                       |   8 +-
 target/hppa/cpu.c                       |  10 +-
 target/i386/arch_memory_mapping.c       |   2 +-
 target/i386/cpu.c                       | 133 +++++++++---------
 target/lm32/cpu.c                       |   8 +-
 target/m68k/cpu.c                       |   8 +-
 target/m68k/helper.c                    |   3 +-
 target/microblaze/cpu.c                 |   8 +-
 target/microblaze/translate.c           |   3 +-
 target/mips/cpu.c                       |   8 +-
 target/mips/translate.c                 |   3 +-
 target/moxie/cpu.c                      |   8 +-
 target/nios2/cpu.c                      |  10 +-
 target/openrisc/cpu.c                   |   8 +-
 target/ppc/compat.c                     |   5 +-
 target/ppc/kvm.c                        |   4 +-
 target/ppc/translate_init.c             |  35 ++---
 target/s390x/cpu.c                      |  14 +-
 target/s390x/cpu_models.c               |  79 ++++++-----
 target/s390x/helper.c                   |   7 +-
 target/s390x/kvm.c                      |  10 +-
 target/sh4/cpu.c                        |   8 +-
 target/sparc/cpu.c                      |  14 +-
 target/tilegx/cpu.c                     |  10 +-
 target/tricore/cpu.c                    |   8 +-
 target/unicore32/cpu.c                  |   8 +-
 target/xtensa/cpu.c                     |   8 +-
 target/xtensa/helper.c                  |   3 +-
 tests/check-qom-proplist.c              |  29 ++--
 tests/io-channel-helpers.c              |   4 +-
 tests/test-char.c                       |   2 +-
 tests/test-crypto-block.c               |   6 +-
 tests/test-crypto-hash.c                |   3 +-
 tests/test-crypto-tlscredsx509.c        |   4 +-
 tests/test-crypto-tlssession.c          |   2 +-
 tests/test-io-channel-socket.c          |   2 +-
 tests/test-io-channel-tls.c             |  13 +-
 tests/test-logging.c                    |   3 +-
 tests/test-qapi-util.c                  | 101 +++++++++++++-
 tests/test-qdev-global-props.c          |   9 +-
 tests/test-qemu-opts.c                  |   6 +-
 tests/test-qmp-commands.c               |  17 +--
 tests/test-qmp-event.c                  |   3 +-
 tests/test-string-input-visitor.c       |  12 +-
 tests/test-visitor-serialization.c      |  25 ++--
 tpm.c                                   |  10 +-
 trace/qmp.c                             |   8 +-
 ui/console.c                            |  12 +-
 ui/gtk.c                                |  15 +-
 ui/input-legacy.c                       |   2 +-
 ui/input-linux.c                        |  20 +--
 ui/input.c                              |   6 +-
 ui/spice-core.c                         |   7 +-
 ui/vnc-auth-sasl.c                      |   6 +-
 ui/vnc.c                                |  38 ++---
 util/aio-posix.c                        |   3 +-
 util/aio-win32.c                        |   3 +-
 util/async.c                            |   2 +-
 util/base64.c                           |   2 +-
 util/error.c                            |  29 ++--
 util/keyval.c                           |   9 +-
 util/log.c                              |   4 +-
 util/main-loop.c                        |   2 +-
 util/qemu-config.c                      |  28 ++--
 util/qemu-option.c                      |  68 +++++----
 util/qemu-sockets.c                     |  79 ++++++-----
 util/throttle.c                         |   2 +-
 vl.c                                    |  99 +++++++------
 tests/Makefile.include                  |   2 +-
 859 files changed, 5107 insertions(+), 4988 deletions(-)

-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 01/15] tests: Test cases for error API
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
@ 2017-06-13 16:52 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 02/15] error: New IGNORE_ERRORS macro Eduardo Habkost
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 tests/test-qapi-util.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/Makefile.include |  2 +-
 2 files changed, 100 insertions(+), 1 deletion(-)

diff --git a/tests/test-qapi-util.c b/tests/test-qapi-util.c
index e8697577a5..3695034c32 100644
--- a/tests/test-qapi-util.c
+++ b/tests/test-qapi-util.c
@@ -75,11 +75,110 @@ static void test_parse_qapi_name(void)
     g_assert(ret == -1);
 }
 
+static void successfn(Error **errp)
+{
+    g_assert(!errp || !*errp);
+}
+
+static void fail1(Error **errp)
+{
+    g_assert(!errp || !*errp);
+
+    error_setg(errp, "error1");
+
+    g_assert(!errp || *errp);
+}
+
+static void fail2(Error **errp)
+{
+    g_assert(!errp || !*errp);
+
+    error_setg(errp, "error2");
+
+    g_assert(!errp || *errp);
+}
+
+static void multifn(Error **errp)
+{
+    Error *err1 = NULL, *err2 = NULL;
+    successfn(&err1);
+    g_assert(!err1);
+
+    fail1(&err1);
+    g_assert(err1);
+    g_assert_cmpstr(error_get_pretty(err1), ==, "error1");
+
+    fail2(&err2);
+    g_assert(err2);
+    g_assert_cmpstr(error_get_pretty(err2), ==, "error2");
+
+    error_propagate(&err1, err2);
+    g_assert(err1);
+    g_assert_cmpstr(error_get_pretty(err1), ==, "error1");
+
+    error_propagate(errp, err1);
+}
+
+static void test_propagate(void (*fn)(Error **), Error **errp)
+{
+    bool failed;
+    Error *local_err = NULL;
+
+    g_assert(!errp || !*errp);
+
+    fn(&local_err);
+    failed = !!local_err;
+    error_propagate(errp, local_err);
+
+    g_assert(!errp || (failed == !!*errp));
+}
+
+static void test_error_api(void)
+{
+    Error *err = NULL;
+
+    successfn(NULL);
+    test_propagate(successfn, NULL);
+
+    fail1(NULL);
+    test_propagate(fail1, NULL);
+
+    multifn(NULL);
+    test_propagate(multifn, NULL);
+
+    successfn(&err);
+    g_assert(!err);
+
+    test_propagate(successfn, &err);
+    g_assert(!err);
+
+    fail1(&err);
+    g_assert(err);
+    g_assert_cmpstr(error_get_pretty(err), ==, "error1");
+    error_free_or_abort(&err);
+
+    test_propagate(fail1, &err);
+    g_assert(err);
+    g_assert_cmpstr(error_get_pretty(err), ==, "error1");
+    error_free_or_abort(&err);
+
+    multifn(&err);
+    g_assert(err);
+    g_assert_cmpstr(error_get_pretty(err), ==, "error1");
+    error_free_or_abort(&err);
+
+    test_propagate(multifn, &err);
+    g_assert(err);
+    g_assert_cmpstr(error_get_pretty(err), ==, "error1");
+    error_free_or_abort(&err);
+}
+
 int main(int argc, char *argv[])
 {
     g_test_init(&argc, &argv, NULL);
     g_test_add_func("/qapi/util/qapi_enum_parse", test_qapi_enum_parse);
     g_test_add_func("/qapi/util/parse_qapi_name", test_parse_qapi_name);
+    g_test_add_func("/qapi/util/error", test_error_api);
     g_test_run();
     return 0;
 }
diff --git a/tests/Makefile.include b/tests/Makefile.include
index f42f3dfa72..e38abfabeb 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -129,7 +129,7 @@ check-unit-y += tests/test-uuid$(EXESUF)
 check-unit-y += tests/ptimer-test$(EXESUF)
 gcov-files-ptimer-test-y = hw/core/ptimer.c
 check-unit-y += tests/test-qapi-util$(EXESUF)
-gcov-files-test-qapi-util-y = qapi/qapi-util.c
+gcov-files-test-qapi-util-y = qapi/qapi-util.c qapi/error.c
 
 check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh
 
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 02/15] error: New IGNORE_ERRORS macro
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
  2017-06-13 16:52 ` [Qemu-devel] [RFC 01/15] tests: Test cases for error API Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 03/15] Add qapi/error.h includes on files that will need it Eduardo Habkost
                   ` (14 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Define new IGNORE_ERRORS macro that should be used when errors will be
ignored.

NULL will still work by now, but will break once we implement
IGNORE_ERRORS in a different way later.  Other patches will convert
existing code to use IGNORE_ERRORS.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qapi/error.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/include/qapi/error.h b/include/qapi/error.h
index 7e532d00e9..38f7afba2e 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -66,7 +66,7 @@
  *     }
  *
  * Call a function ignoring errors:
- *     foo(arg, NULL);
+ *     foo(arg, IGNORE_ERRORS);
  *
  * Call a function aborting on errors:
  *     foo(arg, &error_abort);
@@ -117,6 +117,8 @@
 
 #include "qapi-types.h"
 
+#define IGNORE_ERRORS (NULL)
+
 /*
  * Overall category of an error.
  * Based on the qapi type QapiErrorClass, but reproduced here for nicer
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 03/15] Add qapi/error.h includes on files that will need it
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
  2017-06-13 16:52 ` [Qemu-devel] [RFC 01/15] tests: Test cases for error API Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 02/15] error: New IGNORE_ERRORS macro Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 04/15] [coccinelle] Use IGNORE_ERRORS instead of NULL as errp argument Eduardo Habkost
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Some files will be changed by scripts to use macros defined in
qapi/error.h.  This patch adds the #include lines manually because it
would be harder to do it in the Coccinelle scripts.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 scripts/qapi-types.py          | 1 +
 include/hw/audio/pcspk.h       | 1 +
 include/hw/isa/isa.h           | 1 +
 include/migration/vmstate.h    | 1 +
 target/s390x/cpu.h             | 1 +
 block/block-backend.c          | 1 +
 block/iscsi.c                  | 1 +
 bsd-user/elfload.c             | 1 +
 chardev/char-io.c              | 1 +
 hw/9pfs/xen-9p-backend.c       | 1 +
 hw/acpi/memory_hotplug.c       | 1 +
 hw/acpi/nvdimm.c               | 1 +
 hw/acpi/vmgenid.c              | 1 +
 hw/core/platform-bus.c         | 1 +
 hw/core/sysbus.c               | 1 +
 hw/display/vga-pci.c           | 1 +
 hw/i386/pc.c                   | 1 +
 hw/i386/pc_q35.c               | 1 +
 hw/ide/ich.c                   | 1 +
 hw/input/virtio-input-hid.c    | 1 +
 hw/intc/s390_flic_kvm.c        | 1 +
 hw/ipmi/ipmi.c                 | 1 +
 hw/isa/lpc_ich9.c              | 1 +
 hw/mips/mips_malta.c           | 1 +
 hw/misc/auxbus.c               | 1 +
 hw/misc/edu.c                  | 1 +
 hw/misc/pvpanic.c              | 1 +
 hw/net/e1000.c                 | 1 +
 hw/net/e1000e.c                | 1 +
 hw/net/eepro100.c              | 1 +
 hw/net/lance.c                 | 1 +
 hw/net/ne2000.c                | 1 +
 hw/net/pcnet-pci.c             | 1 +
 hw/net/rtl8139.c               | 1 +
 hw/net/spapr_llan.c            | 1 +
 hw/net/virtio-net.c            | 1 +
 hw/net/vmxnet3.c               | 1 +
 hw/pci-host/gpex.c             | 1 +
 hw/pci-host/xilinx-pcie.c      | 1 +
 hw/pci/pci.c                   | 1 +
 hw/pcmcia/pxa2xx.c             | 1 +
 hw/ppc/prep.c                  | 1 +
 hw/ppc/spapr_iommu.c           | 1 +
 hw/ppc/spapr_rtc.c             | 1 +
 hw/s390x/s390-skeys.c          | 1 +
 hw/timer/mc146818rtc.c         | 1 +
 hw/usb/hcd-ehci-pci.c          | 1 +
 hw/virtio/virtio-balloon.c     | 1 +
 hw/watchdog/watchdog.c         | 1 +
 hw/xen/xen_pvdev.c             | 1 +
 linux-user/elfload.c           | 1 +
 linux-user/uname.c             | 1 +
 migration/qemu-file-channel.c  | 1 +
 migration/ram.c                | 1 +
 numa.c                         | 1 +
 qom/container.c                | 1 +
 target/m68k/helper.c           | 1 +
 target/microblaze/translate.c  | 1 +
 target/mips/translate.c        | 1 +
 target/ppc/kvm.c               | 1 +
 target/s390x/kvm.c             | 1 +
 target/xtensa/helper.c         | 1 +
 tests/test-crypto-hash.c       | 1 +
 tests/test-io-channel-tls.c    | 1 +
 tests/test-qdev-global-props.c | 1 +
 ui/gtk.c                       | 1 +
 ui/spice-core.c                | 1 +
 util/qemu-config.c             | 1 +
 68 files changed, 68 insertions(+)

diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index b45e7b5634..814ac672be 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -287,6 +287,7 @@ h_comment = '''
 fdef.write(mcgen('''
 #include "qemu/osdep.h"
 #include "qapi/dealloc-visitor.h"
+#include "qapi/error.h"
 #include "%(prefix)sqapi-types.h"
 #include "%(prefix)sqapi-visit.h"
 ''',
diff --git a/include/hw/audio/pcspk.h b/include/hw/audio/pcspk.h
index 172afbf146..1a626d718d 100644
--- a/include/hw/audio/pcspk.h
+++ b/include/hw/audio/pcspk.h
@@ -25,6 +25,7 @@
 #ifndef HW_PCSPK_H
 #define HW_PCSPK_H
 
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/isa/isa.h"
 
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index c2fdd70cdc..f0574a04e2 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -3,6 +3,7 @@
 
 /* ISA bus */
 
+#include "qapi/error.h"
 #include "exec/memory.h"
 #include "exec/ioport.h"
 #include "hw/qdev.h"
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 8a3e9e6088..26ab616c8a 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -27,6 +27,7 @@
 #ifndef QEMU_VMSTATE_H
 #define QEMU_VMSTATE_H
 
+#include "qapi/error.h"
 #include "migration/qjson.h"
 
 typedef void SaveStateHandler(QEMUFile *f, void *opaque);
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index a4d31df2b5..c1aa087e8d 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -24,6 +24,7 @@
 #define S390X_CPU_H
 
 #include "qemu-common.h"
+#include "qapi/error.h"
 #include "cpu-qom.h"
 
 #define TARGET_LONG_BITS 64
diff --git a/block/block-backend.c b/block/block-backend.c
index 7d7f3697d1..7a885031e2 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -11,6 +11,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "sysemu/block-backend.h"
 #include "block/block_int.h"
 #include "block/blockjob.h"
diff --git a/block/iscsi.c b/block/iscsi.c
index 5daa201181..9f1d94f7f1 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -24,6 +24,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 
 #include <poll.h>
 #include <math.h>
diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c
index 41a1309296..0d626a418a 100644
--- a/bsd-user/elfload.c
+++ b/bsd-user/elfload.c
@@ -1,6 +1,7 @@
 /* This is the Linux kernel elf-loading code, ported into user space */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 
 #include "qemu.h"
 #include "disas/disas.h"
diff --git a/chardev/char-io.c b/chardev/char-io.c
index f81052481a..a017af784d 100644
--- a/chardev/char-io.c
+++ b/chardev/char-io.c
@@ -22,6 +22,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "chardev/char-io.h"
 
 typedef struct IOWatchPoll {
diff --git a/hw/9pfs/xen-9p-backend.c b/hw/9pfs/xen-9p-backend.c
index 922cc967be..6ab999d2ce 100644
--- a/hw/9pfs/xen-9p-backend.c
+++ b/hw/9pfs/xen-9p-backend.c
@@ -9,6 +9,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 
 #include "hw/hw.h"
 #include "hw/9pfs/9p.h"
diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c
index 210073d283..f28c6766e5 100644
--- a/hw/acpi/memory_hotplug.c
+++ b/hw/acpi/memory_hotplug.c
@@ -1,4 +1,5 @@
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/acpi/memory_hotplug.h"
 #include "hw/acpi/pc-hotplug.h"
 #include "hw/mem/pc-dimm.h"
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index 8e7d6ec034..c691a1de5b 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -27,6 +27,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/acpi/acpi.h"
 #include "hw/acpi/aml-build.h"
 #include "hw/acpi/bios-linker-loader.h"
diff --git a/hw/acpi/vmgenid.c b/hw/acpi/vmgenid.c
index a32b847fe0..780637028e 100644
--- a/hw/acpi/vmgenid.c
+++ b/hw/acpi/vmgenid.c
@@ -11,6 +11,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qmp-commands.h"
 #include "hw/acpi/acpi.h"
 #include "hw/acpi/aml-build.h"
diff --git a/hw/core/platform-bus.c b/hw/core/platform-bus.c
index 329ac670c0..e3d69b61f3 100644
--- a/hw/core/platform-bus.c
+++ b/hw/core/platform-bus.c
@@ -20,6 +20,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/platform-bus.h"
 #include "exec/address-spaces.h"
 #include "qemu/error-report.h"
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 5d0887f499..c6dfd9ae0c 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -18,6 +18,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/sysbus.h"
 #include "monitor/monitor.h"
 #include "exec/address-spaces.h"
diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c
index ac9a76499e..0f6a836b77 100644
--- a/hw/display/vga-pci.c
+++ b/hw/display/vga-pci.c
@@ -24,6 +24,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "ui/console.h"
 #include "hw/pci/pci.h"
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 5b8c6fbbea..742b5507e3 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -22,6 +22,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/i386/pc.h"
 #include "hw/char/serial.h"
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 1523ef39e1..9179fb31de 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -28,6 +28,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/loader.h"
 #include "sysemu/arch_init.h"
diff --git a/hw/ide/ich.c b/hw/ide/ich.c
index 459916977e..092f16c2d7 100644
--- a/hw/ide/ich.c
+++ b/hw/ide/ich.c
@@ -61,6 +61,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/pci/msi.h"
 #include "hw/i386/pc.h"
diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
index 46c038110c..8666234554 100644
--- a/hw/input/virtio-input-hid.c
+++ b/hw/input/virtio-input-hid.c
@@ -5,6 +5,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/iov.h"
 
 #include "hw/qdev.h"
diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c
index b4c61d8300..7ee9b77399 100644
--- a/hw/intc/s390_flic_kvm.c
+++ b/hw/intc/s390_flic_kvm.c
@@ -11,6 +11,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu-common.h"
 #include "cpu.h"
 #include <sys/ioctl.h>
diff --git a/hw/ipmi/ipmi.c b/hw/ipmi/ipmi.c
index afafe1400f..a51cbca6f7 100644
--- a/hw/ipmi/ipmi.c
+++ b/hw/ipmi/ipmi.c
@@ -23,6 +23,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/ipmi/ipmi.h"
 #include "sysemu/sysemu.h"
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index ac8416d42b..28c0fedb5d 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -28,6 +28,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu-common.h"
 #include "cpu.h"
 #include "hw/hw.h"
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 95cdabb2dd..4b6ccb575e 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -23,6 +23,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu-common.h"
 #include "cpu.h"
 #include "hw/hw.h"
diff --git a/hw/misc/auxbus.c b/hw/misc/auxbus.c
index e4a7ba41de..3342b65f15 100644
--- a/hw/misc/auxbus.c
+++ b/hw/misc/auxbus.c
@@ -27,6 +27,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/log.h"
 #include "hw/misc/auxbus.h"
 #include "hw/i2c/i2c.h"
diff --git a/hw/misc/edu.c b/hw/misc/edu.c
index 01acacf142..eb814df82d 100644
--- a/hw/misc/edu.c
+++ b/hw/misc/edu.c
@@ -23,6 +23,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/pci/pci.h"
 #include "hw/pci/msi.h"
 #include "qemu/timer.h"
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index 57da7f2199..5cd5a92614 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -13,6 +13,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qapi/qmp/qobject.h"
 #include "qapi/qmp/qjson.h"
 #include "sysemu/sysemu.h"
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index f2e5072d27..4353f91cff 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -26,6 +26,7 @@
 
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/pci/pci.h"
 #include "net/net.h"
diff --git a/hw/net/e1000e.c b/hw/net/e1000e.c
index 6e234938db..664554f33c 100644
--- a/hw/net/e1000e.c
+++ b/hw/net/e1000e.c
@@ -34,6 +34,7 @@
 */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "net/net.h"
 #include "net/tap.h"
 #include "qemu/range.h"
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
index 4bf71f2d85..5e03c9fb24 100644
--- a/hw/net/eepro100.c
+++ b/hw/net/eepro100.c
@@ -41,6 +41,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/pci/pci.h"
 #include "net/net.h"
diff --git a/hw/net/lance.c b/hw/net/lance.c
index 92b0c68274..7ac795d4b2 100644
--- a/hw/net/lance.c
+++ b/hw/net/lance.c
@@ -36,6 +36,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/sysbus.h"
 #include "net/net.h"
 #include "qemu/timer.h"
diff --git a/hw/net/ne2000.c b/hw/net/ne2000.c
index 798d681e25..f8e86f5184 100644
--- a/hw/net/ne2000.c
+++ b/hw/net/ne2000.c
@@ -22,6 +22,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/pci/pci.h"
 #include "net/net.h"
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
index 0acf8a4879..e08aee92b1 100644
--- a/hw/net/pcnet-pci.c
+++ b/hw/net/pcnet-pci.c
@@ -28,6 +28,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/pci/pci.h"
 #include "net/net.h"
 #include "hw/loader.h"
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
index 671c7e48c6..36cd99e3fc 100644
--- a/hw/net/rtl8139.c
+++ b/hw/net/rtl8139.c
@@ -50,6 +50,7 @@
 
 /* For crc32 */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include <zlib.h>
 
 #include "hw/hw.h"
diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index d239e4bd7d..54ac4f4f44 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -25,6 +25,7 @@
  *
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu-common.h"
 #include "cpu.h"
 #include "hw/hw.h"
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 9a3d769aa2..3aa2af14e5 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -12,6 +12,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/iov.h"
 #include "hw/virtio/virtio.h"
 #include "net/net.h"
diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index 4df31101ec..7ebb32e664 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -16,6 +16,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/pci/pci.h"
 #include "net/net.h"
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
index e2629ce70d..77f64b4ae7 100644
--- a/hw/pci-host/gpex.c
+++ b/hw/pci-host/gpex.c
@@ -29,6 +29,7 @@
  * http://www.firmware.org/1275/practice/imap/imap0_9d.pdf
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/pci-host/gpex.h"
 
diff --git a/hw/pci-host/xilinx-pcie.c b/hw/pci-host/xilinx-pcie.c
index a968cea2af..c7ff5fb277 100644
--- a/hw/pci-host/xilinx-pcie.c
+++ b/hw/pci-host/xilinx-pcie.c
@@ -18,6 +18,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/pci/pci_bridge.h"
 #include "hw/pci-host/xilinx-pcie.h"
 
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 98ccc27533..84d63728e1 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -22,6 +22,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/pci/pci.h"
 #include "hw/pci/pci_bridge.h"
diff --git a/hw/pcmcia/pxa2xx.c b/hw/pcmcia/pxa2xx.c
index 20c9c753d2..5833358f87 100644
--- a/hw/pcmcia/pxa2xx.c
+++ b/hw/pcmcia/pxa2xx.c
@@ -11,6 +11,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/hw.h"
 #include "hw/sysbus.h"
 #include "hw/pcmcia.h"
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index d16646c95d..a917be6ca3 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -23,6 +23,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "cpu.h"
 #include "hw/hw.h"
 #include "hw/timer/m48t59.h"
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index 0341bc069d..d587772b9c 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -17,6 +17,7 @@
  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/error-report.h"
 #include "hw/hw.h"
 #include "qemu/log.h"
diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
index 00a4e4c717..7e250dcbaf 100644
--- a/hw/ppc/spapr_rtc.c
+++ b/hw/ppc/spapr_rtc.c
@@ -26,6 +26,7 @@
  *
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "cpu.h"
 #include "qemu/timer.h"
 #include "sysemu/sysemu.h"
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index 35e7f6316f..2db2f9c8a8 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -10,6 +10,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/boards.h"
 #include "qmp-commands.h"
 #include "hw/s390x/storage-keys.h"
diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
index 1b8d3d7d4c..4c1986b97f 100644
--- a/hw/timer/mc146818rtc.c
+++ b/hw/timer/mc146818rtc.c
@@ -22,6 +22,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/cutils.h"
 #include "qemu/bcd.h"
 #include "hw/hw.h"
diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
index 6dedcb8989..63491111e5 100644
--- a/hw/usb/hcd-ehci-pci.c
+++ b/hw/usb/hcd-ehci-pci.c
@@ -16,6 +16,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "hw/usb/hcd-ehci.h"
 #include "qemu/range.h"
 
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index a705e0ec55..f9939baa45 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -14,6 +14,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/iov.h"
 #include "qemu/timer.h"
 #include "qemu-common.h"
diff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c
index 0c5c9cde1c..2c3b2bb418 100644
--- a/hw/watchdog/watchdog.c
+++ b/hw/watchdog/watchdog.c
@@ -20,6 +20,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/option.h"
 #include "qemu/config-file.h"
 #include "qemu/queue.h"
diff --git a/hw/xen/xen_pvdev.c b/hw/xen/xen_pvdev.c
index aed783e844..5048430177 100644
--- a/hw/xen/xen_pvdev.c
+++ b/hw/xen/xen_pvdev.c
@@ -18,6 +18,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/log.h"
 #include "hw/qdev-core.h"
 #include "hw/xen/xen_backend.h"
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index ce77317e09..b54bdffd8c 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1,5 +1,6 @@
 /* This is the Linux kernel elf-loading code, ported into user space */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include <sys/param.h>
 
 #include <sys/resource.h>
diff --git a/linux-user/uname.c b/linux-user/uname.c
index 313b79dbad..5199380d85 100644
--- a/linux-user/uname.c
+++ b/linux-user/uname.c
@@ -18,6 +18,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 
 #include "qemu.h"
 //#include "qemu-common.h"
diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c
index e202d73834..a597c5f948 100644
--- a/migration/qemu-file-channel.c
+++ b/migration/qemu-file-channel.c
@@ -23,6 +23,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu-file-channel.h"
 #include "exec/cpu-common.h"
 #include "qemu-file.h"
diff --git a/migration/ram.c b/migration/ram.c
index 9ffd0a5479..b2ca242a3a 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -26,6 +26,7 @@
  * THE SOFTWARE.
  */
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu-common.h"
 #include "cpu.h"
 #include <zlib.h>
diff --git a/numa.c b/numa.c
index 65701cb6c8..2b5cb7b5c7 100644
--- a/numa.c
+++ b/numa.c
@@ -23,6 +23,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "sysemu/numa.h"
 #include "exec/cpu-common.h"
 #include "exec/ramlist.h"
diff --git a/qom/container.c b/qom/container.c
index f6ccaf7ea7..2dbabd15ab 100644
--- a/qom/container.c
+++ b/qom/container.c
@@ -11,6 +11,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qom/object.h"
 #include "qemu/module.h"
 
diff --git a/target/m68k/helper.c b/target/m68k/helper.c
index f750d3dbaa..ea1872cae5 100644
--- a/target/m68k/helper.c
+++ b/target/m68k/helper.c
@@ -19,6 +19,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "cpu.h"
 #include "exec/exec-all.h"
 #include "exec/gdbstub.h"
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
index 0bb609513c..83f6d96a71 100644
--- a/target/microblaze/translate.c
+++ b/target/microblaze/translate.c
@@ -19,6 +19,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "cpu.h"
 #include "disas/disas.h"
 #include "exec/exec-all.h"
diff --git a/target/mips/translate.c b/target/mips/translate.c
index 559f8fed89..7dedfd6632 100644
--- a/target/mips/translate.c
+++ b/target/mips/translate.c
@@ -22,6 +22,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "cpu.h"
 #include "disas/disas.h"
 #include "exec/exec-all.h"
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 51249ce79e..670edde79e 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -15,6 +15,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include <dirent.h>
 #include <sys/ioctl.h>
 #include <sys/vfs.h>
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index ba1e60f8a6..3383c49039 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -22,6 +22,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include <sys/ioctl.h>
 
 #include <linux/kvm.h>
diff --git a/target/xtensa/helper.c b/target/xtensa/helper.c
index bcd0b7738d..263990d621 100644
--- a/target/xtensa/helper.c
+++ b/target/xtensa/helper.c
@@ -26,6 +26,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "cpu.h"
 #include "exec/exec-all.h"
 #include "exec/gdbstub.h"
diff --git a/tests/test-crypto-hash.c b/tests/test-crypto-hash.c
index 214a9f72c3..f58eeb4409 100644
--- a/tests/test-crypto-hash.c
+++ b/tests/test-crypto-hash.c
@@ -19,6 +19,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 
 #include "crypto/init.h"
 #include "crypto/hash.h"
diff --git a/tests/test-io-channel-tls.c b/tests/test-io-channel-tls.c
index 8eaa208e1b..b55f5c81ff 100644
--- a/tests/test-io-channel-tls.c
+++ b/tests/test-io-channel-tls.c
@@ -22,6 +22,7 @@
 
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 
 #include "crypto-tls-x509-helpers.h"
 #include "io/channel-tls.h"
diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c
index 48e5b7315f..d5bfcac37d 100644
--- a/tests/test-qdev-global-props.c
+++ b/tests/test-qdev-global-props.c
@@ -23,6 +23,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 
 #include "hw/qdev.h"
 #include "qom/object.h"
diff --git a/ui/gtk.c b/ui/gtk.c
index 5bd87c265a..18c325f8d4 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -35,6 +35,7 @@
 #define LOCALEDIR "po"
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu-common.h"
 #include "qemu/cutils.h"
 
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 804abc5c0f..801e5c864a 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -16,6 +16,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include <spice.h>
 
 #include <netdb.h>
diff --git a/util/qemu-config.c b/util/qemu-config.c
index 405dd1a1d7..c74f15c42d 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -1,4 +1,5 @@
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu-common.h"
 #include "qemu/error-report.h"
 #include "qemu/option.h"
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 04/15] [coccinelle] Use IGNORE_ERRORS instead of NULL as errp argument
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (2 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 03/15] Add qapi/error.h includes on files that will need it Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 05/15] qapi: Use IGNORE_ERRORS instead of NULL on generated code Eduardo Habkost
                   ` (12 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

This was generated by the following Coccinelle script with hardcoded
function names.  Probably there's a better way to catch calls to
functions that accept an Error** argument, but I didn't find a reliable
way to do that.

(Script can't be copied verbatim.  The huge regexp below was split in
multiple lines to make Git happy.)

  @@
  identifier F =~ "object(|_class)_property_(add|get|set|del|find).*|\
                   device_add_bootindex_property|memory_region_init_.*|\
                   object_property_find|qemu_chr_fe_init|numa_get_node|\
                   qbus_set_hotplug_handler|qdev_unplug|\
                   vmstate_register_with_alias_id|bdrv_refresh_limits|\
                   bdrv_create_dirty_bitmap|bdrv_reclaim_dirty_bitmap|\
                   blk_dev_change_media_cb|bdrv_lookup_bs|reopen_backing_file|\
                   bdrv_find_protocol|sd_truncate|qio_channel_socket_accept|\
                   block_job_finish_sync|qio_channel_(read|write)(|v)(|_full)|\
                   qio_channel_close|qio_channel_io_seek|qio_channel_command_abort|\
                   qio_channel_websock_(read|write)_wire|qio_task_propagate_error|\
                   qio_channel_socket_listen_sync|qio_channel_socket_new_fd|\
                   bdrv_reopen|blk_truncate|bdrv_truncate|bdrv_op_is_blocked|\
                   qcrypto_block_decrypt|qcrypto_block_get_info|raw_handle_perm_lock|\
                   qapi_enum_parse|qmp_(qom_list|query_.*|quit|stop|cont|system_.*|\
                   migrate_.*|change_vnc_password|nbd_server_stop|inject_nmi|\
                   guest_fsfreeze_thaw|marshal_.*)|qio_channel_shutdown|\
                   qio_channel_set_blocking|cryptodev_backend_cleanup|\
                   bdrv_dirty_bitmap_abdicate|qcrypto_block_decrypt|\
                   qcrypto_block_encrypt|iscsi_open|qcow2_read_extensions|\
                   qcrypto_hash_bytesv|replication_stop|visit_type_.*|\
                   qemu_opt(|s)_(set|create|foreach)$|v9fs_device_realize_common|\
                   msix_init_exclusive_bar|msi_init|qemu_input_handler_bind|\
                   pcie_aer_init|pci_qdev_unrealize|msix_init|usb_qdev_unrealize|\
                   usb_try_create_simple|usb_ehci_realize|.*_(|un)realize(|_common)|\
                   qdev_unplug|qapi_event_send_migration_pass|nbd_send_option_request|\
                   blk_invalidate_cache|socket_local_address|json_parser_parse_err|\
                   object_set_propv|vnc_socket_ip_addr_string|inet_connect_addr|\
                   opts_parse|migrate_add_blocker|nbd_wr_syncv|(read|write)_sync";
  @@
   F(...,
  -           NULL
  +           IGNORE_ERRORS
             )

  @@
  expression T, P, ID, ERR;
  @@
   object_new_with_props(T, P, ID,
  -           NULL
  +           IGNORE_ERRORS
             )

  @@
  expression O, ERR;
  @@
   object_set_propv(O,
  -           NULL
  +           IGNORE_ERRORS
             )

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/hw/audio/pcspk.h            |  2 +-
 include/hw/isa/isa.h                |  3 +-
 include/migration/vmstate.h         |  2 +-
 target/s390x/cpu.h                  |  2 +-
 backends/cryptodev.c                |  6 ++--
 backends/rng-egd.c                  |  2 +-
 backends/rng-random.c               |  2 +-
 backends/rng.c                      |  2 +-
 backends/tpm.c                      |  2 +-
 block.c                             |  4 +--
 block/backup.c                      |  6 ++--
 block/block-backend.c               |  2 +-
 block/commit.c                      | 14 ++++----
 block/crypto.c                      |  2 +-
 block/file-posix.c                  |  4 +--
 block/gluster.c                     |  2 +-
 block/iscsi.c                       |  4 +--
 block/mirror.c                      |  6 ++--
 block/nbd-client.c                  | 10 +++---
 block/parallels.c                   |  7 ++--
 block/qcow.c                        |  6 ++--
 block/qcow2.c                       |  2 +-
 block/quorum.c                      |  2 +-
 block/replication.c                 | 10 +++---
 block/sheepdog.c                    |  4 +--
 block/stream.c                      |  4 +--
 block/vhdx-log.c                    |  2 +-
 block/vhdx.c                        |  2 +-
 blockdev-nbd.c                      |  2 +-
 blockdev.c                          | 10 +++---
 blockjob.c                          |  4 +--
 bootdevice.c                        |  2 +-
 bsd-user/elfload.c                  |  3 +-
 chardev/char-fd.c                   |  2 +-
 chardev/char-io.c                   |  2 +-
 chardev/char-pty.c                  |  2 +-
 chardev/char-socket.c               | 20 ++++++-----
 chardev/char-udp.c                  |  4 +--
 crypto/secret.c                     | 12 +++----
 crypto/tlscreds.c                   |  8 ++---
 crypto/tlscredsanon.c               |  2 +-
 crypto/tlscredsx509.c               |  6 ++--
 dump.c                              |  2 +-
 exec.c                              |  2 +-
 hmp.c                               | 68 ++++++++++++++++++-------------------
 hw/9pfs/xen-9p-backend.c            | 11 +++---
 hw/acpi/ich9.c                      | 14 ++++----
 hw/acpi/memory_hotplug.c            | 10 +++---
 hw/acpi/nvdimm.c                    | 16 ++++-----
 hw/acpi/piix4.c                     | 14 ++++----
 hw/acpi/vmgenid.c                   |  4 +--
 hw/arm/allwinner-a10.c              |  2 +-
 hw/arm/aspeed_soc.c                 | 23 +++++++------
 hw/arm/bcm2835_peripherals.c        | 30 +++++++++-------
 hw/arm/bcm2836.c                    |  3 +-
 hw/arm/digic.c                      |  7 ++--
 hw/arm/exynos4210.c                 |  2 +-
 hw/arm/fsl-imx6.c                   | 32 ++++++++++-------
 hw/arm/highbank.c                   |  2 +-
 hw/arm/integratorcp.c               |  2 +-
 hw/arm/realview.c                   |  2 +-
 hw/arm/versatilepb.c                |  2 +-
 hw/arm/vexpress.c                   |  8 ++---
 hw/arm/virt.c                       | 41 +++++++++++-----------
 hw/arm/xilinx_zynq.c                |  2 +-
 hw/arm/xlnx-zynqmp.c                |  4 +--
 hw/block/fdc.c                      |  4 +--
 hw/block/nvme.c                     |  2 +-
 hw/block/virtio-blk.c               |  4 +--
 hw/core/bus.c                       |  8 +++--
 hw/core/platform-bus.c              |  5 +--
 hw/core/qdev-properties-system.c    |  4 +--
 hw/core/qdev.c                      | 24 +++++++------
 hw/core/sysbus.c                    |  5 +--
 hw/cpu/a15mpcore.c                  |  2 +-
 hw/cpu/a9mpcore.c                   |  2 +-
 hw/cpu/core.c                       |  4 +--
 hw/display/vga-pci.c                |  6 ++--
 hw/i386/acpi-build.c                | 51 ++++++++++++++++------------
 hw/i386/kvm/pci-assign.c            |  2 +-
 hw/i386/pc.c                        |  4 +--
 hw/i386/pc_q35.c                    | 15 ++++----
 hw/ide/ich.c                        |  2 +-
 hw/ide/qdev.c                       |  4 +--
 hw/input/virtio-input-hid.c         |  3 +-
 hw/intc/apic_common.c               |  4 +--
 hw/intc/arm_gicv3_common.c          |  3 +-
 hw/intc/s390_flic.c                 |  2 +-
 hw/intc/s390_flic_kvm.c             |  2 +-
 hw/ipmi/ipmi.c                      |  2 +-
 hw/isa/lpc_ich9.c                   |  6 ++--
 hw/mem/nvdimm.c                     |  2 +-
 hw/mem/pc-dimm.c                    |  2 +-
 hw/microblaze/petalogix_ml605_mmu.c | 14 ++++----
 hw/mips/boston.c                    |  2 +-
 hw/mips/mips_malta.c                |  2 +-
 hw/misc/auxbus.c                    |  2 +-
 hw/misc/edu.c                       |  2 +-
 hw/misc/macio/macio.c               |  4 +--
 hw/misc/pvpanic.c                   |  2 +-
 hw/misc/tmp105.c                    |  2 +-
 hw/net/e1000.c                      |  2 +-
 hw/net/e1000e.c                     |  8 ++---
 hw/net/eepro100.c                   |  2 +-
 hw/net/lance.c                      |  2 +-
 hw/net/ne2000-isa.c                 |  4 +--
 hw/net/ne2000.c                     |  2 +-
 hw/net/pcnet-pci.c                  |  2 +-
 hw/net/rtl8139.c                    |  2 +-
 hw/net/spapr_llan.c                 |  2 +-
 hw/net/virtio-net.c                 |  2 +-
 hw/net/vmxnet3.c                    |  6 ++--
 hw/nvram/fw_cfg.c                   |  3 +-
 hw/pci-host/gpex.c                  |  2 +-
 hw/pci-host/piix.c                  | 13 +++----
 hw/pci-host/prep.c                  |  2 +-
 hw/pci-host/q35.c                   | 25 ++++++++------
 hw/pci-host/xilinx-pcie.c           |  4 +--
 hw/pci/pci.c                        |  2 +-
 hw/pci/pcie.c                       |  2 +-
 hw/pci/shpc.c                       |  2 +-
 hw/pcmcia/pxa2xx.c                  |  2 +-
 hw/ppc/e500.c                       |  2 +-
 hw/ppc/pnv.c                        | 10 +++---
 hw/ppc/pnv_core.c                   |  2 +-
 hw/ppc/pnv_psi.c                    |  3 +-
 hw/ppc/prep.c                       |  6 ++--
 hw/ppc/spapr.c                      | 14 ++++----
 hw/ppc/spapr_drc.c                  | 19 ++++++-----
 hw/ppc/spapr_iommu.c                |  4 +--
 hw/ppc/spapr_pci.c                  |  4 +--
 hw/ppc/spapr_rng.c                  |  4 +--
 hw/ppc/spapr_rtc.c                  |  3 +-
 hw/s390x/event-facility.c           |  4 +--
 hw/s390x/ipl.c                      |  3 +-
 hw/s390x/s390-pci-bus.c             |  8 ++---
 hw/s390x/s390-skeys.c               |  6 ++--
 hw/s390x/s390-virtio-ccw.c          | 24 ++++++-------
 hw/s390x/s390-virtio.c              |  2 +-
 hw/s390x/sclp.c                     |  7 ++--
 hw/s390x/virtio-ccw.c               |  4 +--
 hw/scsi/megasas.c                   |  2 +-
 hw/scsi/scsi-bus.c                  |  8 ++---
 hw/scsi/vhost-scsi.c                |  2 +-
 hw/scsi/vmw_pvscsi.c                |  2 +-
 hw/timer/mc146818rtc.c              |  6 ++--
 hw/usb/bus.c                        |  8 ++---
 hw/usb/dev-hid.c                    |  3 +-
 hw/usb/dev-network.c                |  2 +-
 hw/usb/dev-storage.c                |  6 ++--
 hw/usb/hcd-ehci-pci.c               |  4 +--
 hw/usb/hcd-xhci.c                   |  2 +-
 hw/usb/host-libusb.c                |  2 +-
 hw/usb/redirect.c                   |  2 +-
 hw/vfio/pci.c                       |  2 +-
 hw/virtio/virtio-balloon.c          |  4 +--
 hw/virtio/virtio-crypto-pci.c       |  2 +-
 hw/virtio/virtio-crypto.c           |  2 +-
 hw/virtio/virtio-pci.c              |  4 +--
 hw/virtio/virtio-rng.c              |  6 ++--
 hw/virtio/virtio.c                  |  3 +-
 hw/xen/xen_pvdev.c                  |  2 +-
 io/channel-command.c                |  2 +-
 io/channel-tls.c                    |  4 +--
 linux-user/elfload.c                |  3 +-
 linux-user/uname.c                  |  2 +-
 migration/block.c                   |  3 +-
 migration/colo.c                    |  4 +--
 migration/qemu-file-channel.c       | 10 +++---
 migration/ram.c                     |  3 +-
 migration/socket.c                  |  2 +-
 monitor.c                           | 10 +++---
 nbd/client.c                        |  4 +--
 nbd/server.c                        | 18 +++++-----
 net/colo-compare.c                  |  6 ++--
 net/dump.c                          |  4 +--
 net/filter-buffer.c                 |  2 +-
 net/filter-mirror.c                 |  6 ++--
 net/filter.c                        |  6 ++--
 net/net.c                           |  6 ++--
 numa.c                              |  7 ++--
 qdev-monitor.c                      |  6 ++--
 qemu-img.c                          | 24 ++++++-------
 qemu-io.c                           |  2 +-
 qemu-nbd.c                          |  4 +--
 qga/commands-posix.c                |  2 +-
 qga/main.c                          |  2 +-
 qobject/json-parser.c               |  2 +-
 qom/container.c                     |  2 +-
 qom/object.c                        | 18 +++++-----
 qom/object_interfaces.c             |  2 +-
 target/alpha/cpu.c                  |  2 +-
 target/arm/cpu64.c                  |  4 +--
 target/hppa/cpu.c                   |  2 +-
 target/i386/cpu.c                   | 25 ++++++++------
 target/m68k/helper.c                |  2 +-
 target/microblaze/translate.c       |  2 +-
 target/mips/translate.c             |  2 +-
 target/nios2/cpu.c                  |  2 +-
 target/ppc/kvm.c                    |  3 +-
 target/s390x/cpu.c                  |  2 +-
 target/s390x/cpu_models.c           | 17 ++++++----
 target/s390x/kvm.c                  |  4 +--
 target/sparc/cpu.c                  |  2 +-
 target/tilegx/cpu.c                 |  2 +-
 target/xtensa/helper.c              |  2 +-
 tests/check-qom-proplist.c          | 17 +++++-----
 tests/io-channel-helpers.c          |  4 +--
 tests/test-char.c                   |  2 +-
 tests/test-crypto-hash.c            |  2 +-
 tests/test-io-channel-socket.c      |  2 +-
 tests/test-io-channel-tls.c         |  8 +++--
 tests/test-qdev-global-props.c      |  4 +--
 tests/test-qemu-opts.c              |  4 +--
 tests/test-string-input-visitor.c   | 12 +++----
 tpm.c                               |  2 +-
 ui/gtk.c                            | 12 +++----
 ui/input-linux.c                    |  6 ++--
 ui/spice-core.c                     |  2 +-
 ui/vnc-auth-sasl.c                  |  4 +--
 ui/vnc.c                            |  8 ++---
 util/qemu-config.c                  |  6 ++--
 util/qemu-option.c                  |  2 +-
 util/qemu-sockets.c                 |  3 +-
 vl.c                                |  5 +--
 225 files changed, 712 insertions(+), 628 deletions(-)

diff --git a/include/hw/audio/pcspk.h b/include/hw/audio/pcspk.h
index 1a626d718d..fe9a738a49 100644
--- a/include/hw/audio/pcspk.h
+++ b/include/hw/audio/pcspk.h
@@ -39,7 +39,7 @@ static inline ISADevice *pcspk_init(ISABus *bus, ISADevice *pit)
     isadev = isa_create(bus, TYPE_PC_SPEAKER);
     dev = DEVICE(isadev);
     qdev_prop_set_uint32(dev, "iobase", 0x61);
-    object_property_set_link(OBJECT(dev), OBJECT(pit), "pit", NULL);
+    object_property_set_link(OBJECT(dev), OBJECT(pit), "pit", IGNORE_ERRORS);
     qdev_init_nofail(dev);
 
     return isadev;
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index f0574a04e2..4b8c13532c 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -30,7 +30,8 @@ static inline uint16_t applesmc_port(void)
     Object *obj = object_resolve_path_type("", TYPE_APPLE_SMC, NULL);
 
     if (obj) {
-        return object_property_get_int(obj, APPLESMC_PROP_IO_BASE, NULL);
+        return object_property_get_int(obj, APPLESMC_PROP_IO_BASE,
+                                       IGNORE_ERRORS);
     }
     return 0;
 }
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 26ab616c8a..13fb10797a 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -1033,7 +1033,7 @@ static inline int vmstate_register(DeviceState *dev, int instance_id,
                                    void *opaque)
 {
     return vmstate_register_with_alias_id(dev, instance_id, vmsd,
-                                          opaque, -1, 0, NULL);
+                                          opaque, -1, 0, IGNORE_ERRORS);
 }
 
 void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index c1aa087e8d..2ce509f601 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -1267,7 +1267,7 @@ static inline void s390_crypto_reset(void)
 static inline bool s390_get_squash_mcss(void)
 {
     if (object_property_get_bool(OBJECT(qdev_get_machine()), "s390-squash-mcss",
-                                 NULL)) {
+                                 IGNORE_ERRORS)) {
         return true;
     }
 
diff --git a/backends/cryptodev.c b/backends/cryptodev.c
index 832f056266..03a78f269f 100644
--- a/backends/cryptodev.c
+++ b/backends/cryptodev.c
@@ -225,16 +225,16 @@ static void cryptodev_backend_instance_init(Object *obj)
     object_property_add(obj, "queues", "int",
                           cryptodev_backend_get_queues,
                           cryptodev_backend_set_queues,
-                          NULL, NULL, NULL);
+                          NULL, NULL, IGNORE_ERRORS);
     /* Initialize devices' queues property to 1 */
-    object_property_set_int(obj, 1, "queues", NULL);
+    object_property_set_int(obj, 1, "queues", IGNORE_ERRORS);
 }
 
 static void cryptodev_backend_finalize(Object *obj)
 {
     CryptoDevBackend *backend = CRYPTODEV_BACKEND(obj);
 
-    cryptodev_backend_cleanup(backend, NULL);
+    cryptodev_backend_cleanup(backend, IGNORE_ERRORS);
 }
 
 static void
diff --git a/backends/rng-egd.c b/backends/rng-egd.c
index e7ce2cac80..8c2acae177 100644
--- a/backends/rng-egd.c
+++ b/backends/rng-egd.c
@@ -138,7 +138,7 @@ static void rng_egd_init(Object *obj)
 {
     object_property_add_str(obj, "chardev",
                             rng_egd_get_chardev, rng_egd_set_chardev,
-                            NULL);
+                            IGNORE_ERRORS);
 }
 
 static void rng_egd_finalize(Object *obj)
diff --git a/backends/rng-random.c b/backends/rng-random.c
index e2a49b0571..029f6b9b01 100644
--- a/backends/rng-random.c
+++ b/backends/rng-random.c
@@ -110,7 +110,7 @@ static void rng_random_init(Object *obj)
     object_property_add_str(obj, "filename",
                             rng_random_get_filename,
                             rng_random_set_filename,
-                            NULL);
+                            IGNORE_ERRORS);
 
     s->filename = g_strdup("/dev/random");
     s->fd = -1;
diff --git a/backends/rng.c b/backends/rng.c
index 398ebe4a7d..59b7503efb 100644
--- a/backends/rng.c
+++ b/backends/rng.c
@@ -108,7 +108,7 @@ static void rng_backend_init(Object *obj)
     object_property_add_bool(obj, "opened",
                              rng_backend_prop_get_opened,
                              rng_backend_prop_set_opened,
-                             NULL);
+                             IGNORE_ERRORS);
 }
 
 static void rng_backend_finalize(Object *obj)
diff --git a/backends/tpm.c b/backends/tpm.c
index 536f262bb7..ef3e20a3cb 100644
--- a/backends/tpm.c
+++ b/backends/tpm.c
@@ -155,7 +155,7 @@ static void tpm_backend_instance_init(Object *obj)
     object_property_add_bool(obj, "opened",
                              tpm_backend_prop_get_opened,
                              tpm_backend_prop_set_opened,
-                             NULL);
+                             IGNORE_ERRORS);
 }
 
 void tpm_backend_thread_deliver_request(TPMBackendThread *tbt)
diff --git a/block.c b/block.c
index 1750a1838e..ecb5be9a32 100644
--- a/block.c
+++ b/block.c
@@ -2096,7 +2096,7 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
     bdrv_refresh_filename(bs);
 
 out:
-    bdrv_refresh_limits(bs, NULL);
+    bdrv_refresh_limits(bs, IGNORE_ERRORS);
 }
 
 /*
@@ -3002,7 +3002,7 @@ void bdrv_reopen_commit(BDRVReopenState *reopen_state)
     reopen_state->bs->open_flags         = reopen_state->flags;
     reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
 
-    bdrv_refresh_limits(reopen_state->bs, NULL);
+    bdrv_refresh_limits(reopen_state->bs, IGNORE_ERRORS);
 }
 
 /*
diff --git a/block/backup.c b/block/backup.c
index 5387fbd84e..6976129e7d 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -218,11 +218,11 @@ static void backup_cleanup_sync_bitmap(BackupBlockJob *job, int ret)
 
     if (ret < 0 || block_job_is_cancelled(&job->common)) {
         /* Merge the successor back into the parent, delete nothing. */
-        bm = bdrv_reclaim_dirty_bitmap(bs, job->sync_bitmap, NULL);
+        bm = bdrv_reclaim_dirty_bitmap(bs, job->sync_bitmap, IGNORE_ERRORS);
         assert(bm);
     } else {
         /* Everything is fine, delete this bitmap and install the backup. */
-        bm = bdrv_dirty_bitmap_abdicate(bs, job->sync_bitmap, NULL);
+        bm = bdrv_dirty_bitmap_abdicate(bs, job->sync_bitmap, IGNORE_ERRORS);
         assert(bm);
     }
 }
@@ -688,7 +688,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
 
  error:
     if (sync_bitmap) {
-        bdrv_reclaim_dirty_bitmap(bs, sync_bitmap, NULL);
+        bdrv_reclaim_dirty_bitmap(bs, sync_bitmap, IGNORE_ERRORS);
     }
     if (job) {
         backup_clean(&job->common);
diff --git a/block/block-backend.c b/block/block-backend.c
index 7a885031e2..9b9ca2eb35 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -819,7 +819,7 @@ void blk_dev_change_media_cb(BlockBackend *blk, bool load, Error **errp)
 
 static void blk_root_change_media(BdrvChild *child, bool load)
 {
-    blk_dev_change_media_cb(child->opaque, load, NULL);
+    blk_dev_change_media_cb(child->opaque, load, IGNORE_ERRORS);
 }
 
 /*
diff --git a/block/commit.c b/block/commit.c
index af6fa68cf3..264495177e 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -112,10 +112,10 @@ static void commit_complete(BlockJob *job, void *opaque)
      * to r/o). These reopens do not need to be atomic, since we won't abort
      * even on failure here */
     if (s->base_flags != bdrv_get_flags(base)) {
-        bdrv_reopen(base, s->base_flags, NULL);
+        bdrv_reopen(base, s->base_flags, IGNORE_ERRORS);
     }
     if (overlay_bs && s->orig_overlay_flags != bdrv_get_flags(overlay_bs)) {
-        bdrv_reopen(overlay_bs, s->orig_overlay_flags, NULL);
+        bdrv_reopen(overlay_bs, s->orig_overlay_flags, IGNORE_ERRORS);
     }
     g_free(s->backing_file_str);
     blk_unref(s->top);
@@ -158,7 +158,7 @@ static void coroutine_fn commit_run(void *opaque)
     }
 
     if (base_len < s->common.len) {
-        ret = blk_truncate(s->base, s->common.len, NULL);
+        ret = blk_truncate(s->base, s->common.len, IGNORE_ERRORS);
         if (ret) {
             goto out;
         }
@@ -459,8 +459,8 @@ int bdrv_commit(BlockDriverState *bs)
         return -ENOTSUP;
     }
 
-    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, NULL) ||
-        bdrv_op_is_blocked(bs->backing->bs, BLOCK_OP_TYPE_COMMIT_TARGET, NULL)) {
+    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, IGNORE_ERRORS) ||
+        bdrv_op_is_blocked(bs->backing->bs, BLOCK_OP_TYPE_COMMIT_TARGET, IGNORE_ERRORS)) {
         return -EBUSY;
     }
 
@@ -468,7 +468,7 @@ int bdrv_commit(BlockDriverState *bs)
     open_flags =  bs->backing->bs->open_flags;
 
     if (ro) {
-        if (bdrv_reopen(bs->backing->bs, open_flags | BDRV_O_RDWR, NULL)) {
+        if (bdrv_reopen(bs->backing->bs, open_flags | BDRV_O_RDWR, IGNORE_ERRORS)) {
             return -EACCES;
         }
     }
@@ -582,7 +582,7 @@ ro_cleanup:
 
     if (ro) {
         /* ignoring error return here */
-        bdrv_reopen(bs->backing->bs, open_flags & ~BDRV_O_RDWR, NULL);
+        bdrv_reopen(bs->backing->bs, open_flags & ~BDRV_O_RDWR, IGNORE_ERRORS);
     }
 
     return ret;
diff --git a/block/crypto.c b/block/crypto.c
index 10e5ddccaa..f317eda83f 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -601,7 +601,7 @@ block_crypto_get_specific_info_luks(BlockDriverState *bs)
     ImageInfoSpecific *spec_info;
     QCryptoBlockInfo *info;
 
-    info = qcrypto_block_get_info(crypto->block, NULL);
+    info = qcrypto_block_get_info(crypto->block, IGNORE_ERRORS);
     if (!info) {
         return NULL;
     }
diff --git a/block/file-posix.c b/block/file-posix.c
index de2d3a2e3c..5e30164be3 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -2175,14 +2175,14 @@ static int raw_check_perm(BlockDriverState *bs, uint64_t perm, uint64_t shared,
 static void raw_set_perm(BlockDriverState *bs, uint64_t perm, uint64_t shared)
 {
     BDRVRawState *s = bs->opaque;
-    raw_handle_perm_lock(bs, RAW_PL_COMMIT, perm, shared, NULL);
+    raw_handle_perm_lock(bs, RAW_PL_COMMIT, perm, shared, IGNORE_ERRORS);
     s->perm = perm;
     s->shared_perm = shared;
 }
 
 static void raw_abort_perm_update(BlockDriverState *bs)
 {
-    raw_handle_perm_lock(bs, RAW_PL_ABORT, 0, 0, NULL);
+    raw_handle_perm_lock(bs, RAW_PL_ABORT, 0, 0, IGNORE_ERRORS);
 }
 
 BlockDriver bdrv_file = {
diff --git a/block/gluster.c b/block/gluster.c
index 031596adbc..6179195620 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -547,7 +547,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
             ptr = "inet";       /* accept legacy "tcp" */
         }
         type = qapi_enum_parse(SocketAddressType_lookup, ptr,
-                               SOCKET_ADDRESS_TYPE__MAX, -1, NULL);
+                               SOCKET_ADDRESS_TYPE__MAX, -1, IGNORE_ERRORS);
         if (type != SOCKET_ADDRESS_TYPE_INET
             && type != SOCKET_ADDRESS_TYPE_UNIX) {
             error_setg(&local_err,
diff --git a/block/iscsi.c b/block/iscsi.c
index 9f1d94f7f1..0116fe97ce 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1362,7 +1362,7 @@ static char *get_initiator_name(QemuOpts *opts)
         return g_strdup(name);
     }
 
-    uuid_info = qmp_query_uuid(NULL);
+    uuid_info = qmp_query_uuid(IGNORE_ERRORS);
     if (strcmp(uuid_info->UUID, UUID_NONE) == 0) {
         name = qemu_get_vm_name();
     } else {
@@ -2111,7 +2111,7 @@ static int iscsi_create(const char *filename, QemuOpts *opts, Error **errp)
         error_propagate(errp, local_err);
         ret = -EINVAL;
     } else {
-        ret = iscsi_open(bs, bs_options, 0, NULL);
+        ret = iscsi_open(bs, bs_options, 0, IGNORE_ERRORS);
     }
     QDECREF(bs_options);
 
diff --git a/block/mirror.c b/block/mirror.c
index a2a970301c..2d5d7dbbc2 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -550,7 +550,7 @@ static void mirror_exit(BlockJob *job, void *opaque)
         }
 
         if (bdrv_get_flags(target_bs) != bdrv_get_flags(to_replace)) {
-            bdrv_reopen(target_bs, bdrv_get_flags(to_replace), NULL);
+            bdrv_reopen(target_bs, bdrv_get_flags(to_replace), IGNORE_ERRORS);
         }
 
         /* The mirror job has no requests in flight any more, but we need to
@@ -729,7 +729,7 @@ static void coroutine_fn mirror_run(void *opaque)
         }
 
         if (s->bdev_length > base_length) {
-            ret = blk_truncate(s->target, s->bdev_length, NULL);
+            ret = blk_truncate(s->target, s->bdev_length, IGNORE_ERRORS);
             if (ret < 0) {
                 goto immediate_exit;
             }
@@ -1322,6 +1322,6 @@ void commit_active_start(const char *job_id, BlockDriverState *bs,
 error_restore_flags:
     /* ignore error and errp for bdrv_reopen, because we want to propagate
      * the original error */
-    bdrv_reopen(base, orig_base_flags, NULL);
+    bdrv_reopen(base, orig_base_flags, IGNORE_ERRORS);
     return;
 }
diff --git a/block/nbd-client.c b/block/nbd-client.c
index 87d19c7253..ac3f735d27 100644
--- a/block/nbd-client.c
+++ b/block/nbd-client.c
@@ -56,7 +56,7 @@ static void nbd_teardown_connection(BlockDriverState *bs)
     /* finish any pending coroutines */
     qio_channel_shutdown(client->ioc,
                          QIO_CHANNEL_SHUTDOWN_BOTH,
-                         NULL);
+                         IGNORE_ERRORS);
     BDRV_POLL_WHILE(bs, client->read_reply_co);
 
     nbd_client_detach_aio_context(bs);
@@ -145,7 +145,7 @@ static int nbd_co_send_request(BlockDriverState *bs,
         rc = nbd_send_request(s->ioc, request);
         if (rc >= 0) {
             ret = nbd_wr_syncv(s->ioc, qiov->iov, qiov->niov, request->len,
-                               false, NULL);
+                               false, IGNORE_ERRORS);
             if (ret != request->len) {
                 rc = -EIO;
             }
@@ -174,7 +174,7 @@ static void nbd_co_receive_reply(NBDClientSession *s,
     } else {
         if (qiov && reply->error == 0) {
             ret = nbd_wr_syncv(s->ioc, qiov->iov, qiov->niov, request->len,
-                               true, NULL);
+                               true, IGNORE_ERRORS);
             if (ret != request->len) {
                 reply->error = EIO;
             }
@@ -382,7 +382,7 @@ int nbd_client_init(BlockDriverState *bs,
 
     /* NBD handshake */
     logout("session init %s\n", export);
-    qio_channel_set_blocking(QIO_CHANNEL(sioc), true, NULL);
+    qio_channel_set_blocking(QIO_CHANNEL(sioc), true, IGNORE_ERRORS);
 
     ret = nbd_receive_negotiate(QIO_CHANNEL(sioc), export,
                                 &client->nbdflags,
@@ -413,7 +413,7 @@ int nbd_client_init(BlockDriverState *bs,
 
     /* Now that we're connected, set the socket to be non-blocking and
      * kick the reply mechanism.  */
-    qio_channel_set_blocking(QIO_CHANNEL(sioc), false, NULL);
+    qio_channel_set_blocking(QIO_CHANNEL(sioc), false, IGNORE_ERRORS);
     client->read_reply_co = qemu_coroutine_create(nbd_read_reply_entry, client);
     nbd_client_attach_aio_context(bs, bdrv_get_aio_context(bs));
 
diff --git a/block/parallels.c b/block/parallels.c
index 8be46a7d48..d4125a6220 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -224,7 +224,7 @@ static int64_t allocate_clusters(BlockDriverState *bs, int64_t sector_num,
         } else {
             ret = bdrv_truncate(bs->file,
                                 (s->data_end + space) << BDRV_SECTOR_BITS,
-                                NULL);
+                                IGNORE_ERRORS);
         }
         if (ret < 0) {
             return ret;
@@ -699,7 +699,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     if (!(flags & BDRV_O_RESIZE) || !bdrv_has_zero_init(bs->file->bs) ||
-            bdrv_truncate(bs->file, bdrv_getlength(bs->file->bs), NULL) != 0) {
+            bdrv_truncate(bs->file, bdrv_getlength(bs->file->bs), IGNORE_ERRORS) != 0) {
         s->prealloc_mode = PRL_PREALLOC_MODE_FALLOCATE;
     }
 
@@ -742,7 +742,8 @@ static void parallels_close(BlockDriverState *bs)
     }
 
     if (bs->open_flags & BDRV_O_RDWR) {
-        bdrv_truncate(bs->file, s->data_end << BDRV_SECTOR_BITS, NULL);
+        bdrv_truncate(bs->file, s->data_end << BDRV_SECTOR_BITS,
+                      IGNORE_ERRORS);
     }
 
     g_free(s->bat_dirty_bmap);
diff --git a/block/qcow.c b/block/qcow.c
index 7bd94dcd46..13d7842db3 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -473,7 +473,8 @@ static uint64_t get_cluster_offset(BlockDriverState *bs,
                 /* round to cluster size */
                 cluster_offset = (cluster_offset + s->cluster_size - 1) &
                     ~(s->cluster_size - 1);
-                bdrv_truncate(bs->file, cluster_offset + s->cluster_size, NULL);
+                bdrv_truncate(bs->file, cluster_offset + s->cluster_size,
+                              IGNORE_ERRORS);
                 /* if encrypted, we must initialize the cluster
                    content which won't be written */
                 if (bs->encrypted &&
@@ -917,7 +918,8 @@ static int qcow_make_empty(BlockDriverState *bs)
     if (bdrv_pwrite_sync(bs->file, s->l1_table_offset, s->l1_table,
             l1_length) < 0)
         return -1;
-    ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length, NULL);
+    ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length,
+                        IGNORE_ERRORS);
     if (ret < 0)
         return ret;
 
diff --git a/block/qcow2.c b/block/qcow2.c
index b3ba5daa93..aa0dc46162 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -929,7 +929,7 @@ static int qcow2_do_open(BlockDriverState *bs, QDict *options, int flags,
     if (s->incompatible_features & ~QCOW2_INCOMPAT_MASK) {
         void *feature_table = NULL;
         qcow2_read_extensions(bs, header.header_length, ext_end,
-                              &feature_table, NULL);
+                              &feature_table, IGNORE_ERRORS);
         report_unsupported_feature(errp, feature_table,
                                    s->incompatible_features &
                                    ~QCOW2_INCOMPAT_MASK);
diff --git a/block/quorum.c b/block/quorum.c
index 1b2a8c3937..ab9f253c96 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -385,7 +385,7 @@ static int quorum_compute_hash(QuorumAIOCB *acb, int i, QuorumVoteValue *hash)
     if (qcrypto_hash_bytesv(QCRYPTO_HASH_ALG_SHA256,
                             qiov->iov, qiov->niov,
                             &data, &len,
-                            NULL) < 0) {
+                            IGNORE_ERRORS) < 0) {
         return -EINVAL;
     }
 
diff --git a/block/replication.c b/block/replication.c
index 3885f04c31..c4ac17201a 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -142,7 +142,7 @@ static void replication_close(BlockDriverState *bs)
     BDRVReplicationState *s = bs->opaque;
 
     if (s->stage == BLOCK_REPLICATION_RUNNING) {
-        replication_stop(s->rs, false, NULL);
+        replication_stop(s->rs, false, IGNORE_ERRORS);
     }
     if (s->stage == BLOCK_REPLICATION_FAILOVER) {
         block_job_cancel_sync(s->active_disk->bs->job);
@@ -389,13 +389,13 @@ static void backup_job_cleanup(BlockDriverState *bs)
     BDRVReplicationState *s = bs->opaque;
     BlockDriverState *top_bs;
 
-    top_bs = bdrv_lookup_bs(s->top_id, s->top_id, NULL);
+    top_bs = bdrv_lookup_bs(s->top_id, s->top_id, IGNORE_ERRORS);
     if (!top_bs) {
         return;
     }
     bdrv_op_unblock_all(top_bs, s->blocker);
     error_free(s->blocker);
-    reopen_backing_file(bs, false, NULL);
+    reopen_backing_file(bs, false, IGNORE_ERRORS);
 }
 
 static void backup_job_completed(void *opaque, int ret)
@@ -516,11 +516,11 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
         error_setg(&s->blocker,
                    "Block device is in use by internal backup job");
 
-        top_bs = bdrv_lookup_bs(s->top_id, s->top_id, NULL);
+        top_bs = bdrv_lookup_bs(s->top_id, s->top_id, IGNORE_ERRORS);
         if (!top_bs || !bdrv_is_root_node(top_bs) ||
             !check_top_bs(top_bs, bs)) {
             error_setg(errp, "No top_bs or it is invalid");
-            reopen_backing_file(bs, false, NULL);
+            reopen_backing_file(bs, false, IGNORE_ERRORS);
             aio_context_release(aio_context);
             return;
         }
diff --git a/block/sheepdog.c b/block/sheepdog.c
index a18315a1ca..dd75571435 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -2020,7 +2020,7 @@ static int sd_create(const char *filename, QemuOpts *opts,
         BlockDriver *drv;
 
         /* Currently, only Sheepdog backing image is supported. */
-        drv = bdrv_find_protocol(backing_file, true, NULL);
+        drv = bdrv_find_protocol(backing_file, true, IGNORE_ERRORS);
         if (!drv || strcmp(drv->protocol_name, "sheepdog") != 0) {
             error_setg(errp, "backing_file must be a sheepdog image");
             ret = -EINVAL;
@@ -2448,7 +2448,7 @@ static coroutine_fn int sd_co_writev(BlockDriverState *bs, int64_t sector_num,
     BDRVSheepdogState *s = bs->opaque;
 
     if (offset > s->inode.vdi_size) {
-        ret = sd_truncate(bs, offset, NULL);
+        ret = sd_truncate(bs, offset, IGNORE_ERRORS);
         if (ret < 0) {
             return ret;
         }
diff --git a/block/stream.c b/block/stream.c
index 52d329f5c6..826783635a 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -93,7 +93,7 @@ out:
     if (s->bs_flags != bdrv_get_flags(bs)) {
         /* Give up write permissions before making it read-only */
         blk_set_perm(job->blk, 0, BLK_PERM_ALL, &error_abort);
-        bdrv_reopen(bs, s->bs_flags, NULL);
+        bdrv_reopen(bs, s->bs_flags, IGNORE_ERRORS);
     }
 
     g_free(s->backing_file_str);
@@ -280,6 +280,6 @@ void stream_start(const char *job_id, BlockDriverState *bs,
 
 fail:
     if (orig_bs_flags != bdrv_get_flags(bs)) {
-        bdrv_reopen(bs, orig_bs_flags, NULL);
+        bdrv_reopen(bs, orig_bs_flags, IGNORE_ERRORS);
     }
 }
diff --git a/block/vhdx-log.c b/block/vhdx-log.c
index 3f4c2aa095..906d5439fb 100644
--- a/block/vhdx-log.c
+++ b/block/vhdx-log.c
@@ -548,7 +548,7 @@ static int vhdx_log_flush(BlockDriverState *bs, BDRVVHDXState *s,
             if (new_file_size % (1024*1024)) {
                 /* round up to nearest 1MB boundary */
                 new_file_size = ((new_file_size >> 20) + 1) << 20;
-                bdrv_truncate(bs->file, new_file_size, NULL);
+                bdrv_truncate(bs->file, new_file_size, IGNORE_ERRORS);
             }
         }
         qemu_vfree(desc_entries);
diff --git a/block/vhdx.c b/block/vhdx.c
index 8b270b57c9..890afe064b 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -1171,7 +1171,7 @@ static int vhdx_allocate_block(BlockDriverState *bs, BDRVVHDXState *s,
     /* per the spec, the address for a block is in units of 1MB */
     *new_offset = ROUND_UP(*new_offset, 1024 * 1024);
 
-    return bdrv_truncate(bs->file, *new_offset + s->block_size, NULL);
+    return bdrv_truncate(bs->file, *new_offset + s->block_size, IGNORE_ERRORS);
 }
 
 /*
diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index dd0860f4a6..e7bf14a8ed 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -38,7 +38,7 @@ static gboolean nbd_accept(QIOChannel *ioc, GIOCondition condition,
     }
 
     cioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
-                                     NULL);
+                                     IGNORE_ERRORS);
     if (!cioc) {
         return TRUE;
     }
diff --git a/blockdev.c b/blockdev.c
index 6472548186..fdbf33aa3d 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1377,7 +1377,7 @@ static BdrvDirtyBitmap *block_dirty_bitmap_lookup(const char *node,
         error_setg(errp, "Bitmap name cannot be NULL");
         return NULL;
     }
-    bs = bdrv_lookup_bs(node, node, NULL);
+    bs = bdrv_lookup_bs(node, node, IGNORE_ERRORS);
     if (!bs) {
         error_setg(errp, "Node '%s' not found", node);
         return NULL;
@@ -1707,7 +1707,7 @@ static void external_snapshot_prepare(BlkActionState *common,
         }
 
         if (snapshot_node_name &&
-            bdrv_lookup_bs(snapshot_node_name, snapshot_node_name, NULL)) {
+            bdrv_lookup_bs(snapshot_node_name, snapshot_node_name, IGNORE_ERRORS)) {
             error_setg(errp, "New snapshot node name already in use");
             return;
         }
@@ -1793,7 +1793,7 @@ static void external_snapshot_commit(BlkActionState *common)
      * don't want to abort all of them if one of them fails the reopen */
     if (!state->old_bs->copy_on_read) {
         bdrv_reopen(state->old_bs, state->old_bs->open_flags & ~BDRV_O_RDWR,
-                    NULL);
+                    IGNORE_ERRORS);
     }
 }
 
@@ -2916,7 +2916,7 @@ void qmp_block_resize(bool has_device, const char *device,
         goto out;
     }
 
-    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_RESIZE, NULL)) {
+    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_RESIZE, IGNORE_ERRORS)) {
         error_setg(errp, QERR_DEVICE_IN_USE, device);
         goto out;
     }
@@ -3055,7 +3055,7 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device,
      *  scenario in which all optional arguments are omitted. */
     bs = qmp_get_root_bs(device, &local_err);
     if (!bs) {
-        bs = bdrv_lookup_bs(device, device, NULL);
+        bs = bdrv_lookup_bs(device, device, IGNORE_ERRORS);
         if (!bs) {
             error_free(local_err);
             error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
diff --git a/blockjob.c b/blockjob.c
index a0d7e29b83..69ad28dd65 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -419,7 +419,7 @@ static void block_job_completed_txn_abort(BlockJob *job)
         ctx = blk_get_aio_context(other_job->blk);
         if (!other_job->completed) {
             assert(other_job->cancelled);
-            block_job_finish_sync(other_job, NULL, NULL);
+            block_job_finish_sync(other_job, NULL, IGNORE_ERRORS);
         }
         block_job_completed_single(other_job);
         aio_context_release(ctx);
@@ -523,7 +523,7 @@ static void block_job_cancel_err(BlockJob *job, Error **errp)
 
 int block_job_cancel_sync(BlockJob *job)
 {
-    return block_job_finish_sync(job, &block_job_cancel_err, NULL);
+    return block_job_finish_sync(job, &block_job_cancel_err, IGNORE_ERRORS);
 }
 
 void block_job_cancel_sync_all(void)
diff --git a/bootdevice.c b/bootdevice.c
index 33e3029e40..29ebbb1c48 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -338,5 +338,5 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
         return;
     }
     /* initialize devices' bootindex property to -1 */
-    object_property_set_int(obj, -1, name, NULL);
+    object_property_set_int(obj, -1, name, IGNORE_ERRORS);
 }
diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c
index 0d626a418a..6362238dbf 100644
--- a/bsd-user/elfload.c
+++ b/bsd-user/elfload.c
@@ -93,7 +93,8 @@ enum {
 static const char *get_elf_platform(void)
 {
     static char elf_platform[] = "i386";
-    int family = object_property_get_int(OBJECT(thread_cpu), "family", NULL);
+    int family = object_property_get_int(OBJECT(thread_cpu), "family",
+                                         IGNORE_ERRORS);
     if (family > 6)
         family = 6;
     if (family >= 3)
diff --git a/chardev/char-fd.c b/chardev/char-fd.c
index 1584a3de20..b0ebccf0c6 100644
--- a/chardev/char-fd.c
+++ b/chardev/char-fd.c
@@ -56,7 +56,7 @@ static gboolean fd_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
     }
 
     ret = qio_channel_read(
-        chan, (gchar *)buf, len, NULL);
+        chan, (gchar *)buf, len, IGNORE_ERRORS);
     if (ret == 0) {
         remove_fd_in_watch(chr);
         qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
diff --git a/chardev/char-io.c b/chardev/char-io.c
index a017af784d..13a2431b34 100644
--- a/chardev/char-io.c
+++ b/chardev/char-io.c
@@ -161,7 +161,7 @@ int io_channel_send_full(QIOChannel *ioc,
 
         ret = qio_channel_writev_full(
             ioc, &iov, 1,
-            fds, nfds, NULL);
+            fds, nfds, IGNORE_ERRORS);
         if (ret == QIO_CHANNEL_ERR_BLOCK) {
             if (offset) {
                 return offset;
diff --git a/chardev/char-pty.c b/chardev/char-pty.c
index e5d20a0e6a..09609d397d 100644
--- a/chardev/char-pty.c
+++ b/chardev/char-pty.c
@@ -168,7 +168,7 @@ static gboolean pty_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
     if (len == 0) {
         return TRUE;
     }
-    ret = qio_channel_read(s->ioc, (char *)buf, len, NULL);
+    ret = qio_channel_read(s->ioc, (char *)buf, len, IGNORE_ERRORS);
     if (ret <= 0) {
         pty_chr_state(chr, 0);
         return FALSE;
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index ccc499cfa1..7ca9863631 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -276,11 +276,11 @@ static ssize_t tcp_chr_recv(Chardev *chr, char *buf, size_t len)
     if (qio_channel_has_feature(s->ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
         ret = qio_channel_readv_full(s->ioc, &iov, 1,
                                      &msgfds, &msgfds_num,
-                                     NULL);
+                                     IGNORE_ERRORS);
     } else {
         ret = qio_channel_readv_full(s->ioc, &iov, 1,
                                      NULL, NULL,
-                                     NULL);
+                                     IGNORE_ERRORS);
     }
 
     if (ret == QIO_CHANNEL_ERR_BLOCK) {
@@ -550,7 +550,7 @@ static gboolean tcp_chr_telnet_init_io(QIOChannel *ioc,
     TCPChardevTelnetInit *init = user_data;
     ssize_t ret;
 
-    ret = qio_channel_write(ioc, init->buf, init->buflen, NULL);
+    ret = qio_channel_write(ioc, init->buf, init->buflen, IGNORE_ERRORS);
     if (ret < 0) {
         if (ret == QIO_CHANNEL_ERR_BLOCK) {
             ret = 0;
@@ -620,7 +620,7 @@ static void tcp_chr_tls_handshake(QIOTask *task,
     Chardev *chr = user_data;
     SocketChardev *s = user_data;
 
-    if (qio_task_propagate_error(task, NULL)) {
+    if (qio_task_propagate_error(task, IGNORE_ERRORS)) {
         tcp_chr_disconnect(chr);
     } else {
         /* tn3270 does not support TLS yet */
@@ -697,7 +697,7 @@ static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
     s->sioc = sioc;
     object_ref(OBJECT(sioc));
 
-    qio_channel_set_blocking(s->ioc, false, NULL);
+    qio_channel_set_blocking(s->ioc, false, IGNORE_ERRORS);
 
     if (s->do_nodelay) {
         qio_channel_set_delay(s->ioc, false);
@@ -726,7 +726,7 @@ static int tcp_chr_add_client(Chardev *chr, int fd)
     int ret;
     QIOChannelSocket *sioc;
 
-    sioc = qio_channel_socket_new_fd(fd, NULL);
+    sioc = qio_channel_socket_new_fd(fd, IGNORE_ERRORS);
     if (!sioc) {
         return -1;
     }
@@ -744,7 +744,7 @@ static gboolean tcp_chr_accept(QIOChannel *channel,
     QIOChannelSocket *sioc;
 
     sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(channel),
-                                     NULL);
+                                     IGNORE_ERRORS);
     if (!sioc) {
         return TRUE;
     }
@@ -767,9 +767,11 @@ static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
         if (s->is_listen) {
             error_report("QEMU waiting for connection on: %s",
                          chr->filename);
-            qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), true, NULL);
+            qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), true,
+                                     IGNORE_ERRORS);
             tcp_chr_accept(QIO_CHANNEL(s->listen_ioc), G_IO_IN, chr);
-            qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), false, NULL);
+            qio_channel_set_blocking(QIO_CHANNEL(s->listen_ioc), false,
+                                     IGNORE_ERRORS);
         } else {
             sioc = qio_channel_socket_new();
             tcp_chr_set_client_ioc_name(chr, sioc);
diff --git a/chardev/char-udp.c b/chardev/char-udp.c
index 4ee11d3ebf..d8766b1fd0 100644
--- a/chardev/char-udp.c
+++ b/chardev/char-udp.c
@@ -48,7 +48,7 @@ static int udp_chr_write(Chardev *chr, const uint8_t *buf, int len)
     UdpChardev *s = UDP_CHARDEV(chr);
 
     return qio_channel_write(
-        s->ioc, (const char *)buf, len, NULL);
+        s->ioc, (const char *)buf, len, IGNORE_ERRORS);
 }
 
 static void udp_chr_flush_buffer(UdpChardev *s)
@@ -88,7 +88,7 @@ static gboolean udp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
         return TRUE;
     }
     ret = qio_channel_read(
-        s->ioc, (char *)s->buf, sizeof(s->buf), NULL);
+        s->ioc, (char *)s->buf, sizeof(s->buf), IGNORE_ERRORS);
     if (ret <= 0) {
         remove_fd_in_watch(chr);
         return FALSE;
diff --git a/crypto/secret.c b/crypto/secret.c
index 285ab7a63c..e5631b9dd2 100644
--- a/crypto/secret.c
+++ b/crypto/secret.c
@@ -375,29 +375,29 @@ qcrypto_secret_class_init(ObjectClass *oc, void *data)
     object_class_property_add_bool(oc, "loaded",
                                    qcrypto_secret_prop_get_loaded,
                                    qcrypto_secret_prop_set_loaded,
-                                   NULL);
+                                   IGNORE_ERRORS);
     object_class_property_add_enum(oc, "format",
                                    "QCryptoSecretFormat",
                                    QCryptoSecretFormat_lookup,
                                    qcrypto_secret_prop_get_format,
                                    qcrypto_secret_prop_set_format,
-                                   NULL);
+                                   IGNORE_ERRORS);
     object_class_property_add_str(oc, "data",
                                   qcrypto_secret_prop_get_data,
                                   qcrypto_secret_prop_set_data,
-                                  NULL);
+                                  IGNORE_ERRORS);
     object_class_property_add_str(oc, "file",
                                   qcrypto_secret_prop_get_file,
                                   qcrypto_secret_prop_set_file,
-                                  NULL);
+                                  IGNORE_ERRORS);
     object_class_property_add_str(oc, "keyid",
                                   qcrypto_secret_prop_get_keyid,
                                   qcrypto_secret_prop_set_keyid,
-                                  NULL);
+                                  IGNORE_ERRORS);
     object_class_property_add_str(oc, "iv",
                                   qcrypto_secret_prop_get_iv,
                                   qcrypto_secret_prop_set_iv,
-                                  NULL);
+                                  IGNORE_ERRORS);
 }
 
 
diff --git a/crypto/tlscreds.c b/crypto/tlscreds.c
index a8965531b6..21bd388769 100644
--- a/crypto/tlscreds.c
+++ b/crypto/tlscreds.c
@@ -226,21 +226,21 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, void *data)
     object_class_property_add_bool(oc, "verify-peer",
                                    qcrypto_tls_creds_prop_get_verify,
                                    qcrypto_tls_creds_prop_set_verify,
-                                   NULL);
+                                   IGNORE_ERRORS);
     object_class_property_add_str(oc, "dir",
                                   qcrypto_tls_creds_prop_get_dir,
                                   qcrypto_tls_creds_prop_set_dir,
-                                  NULL);
+                                  IGNORE_ERRORS);
     object_class_property_add_enum(oc, "endpoint",
                                    "QCryptoTLSCredsEndpoint",
                                    QCryptoTLSCredsEndpoint_lookup,
                                    qcrypto_tls_creds_prop_get_endpoint,
                                    qcrypto_tls_creds_prop_set_endpoint,
-                                   NULL);
+                                   IGNORE_ERRORS);
     object_class_property_add_str(oc, "priority",
                                   qcrypto_tls_creds_prop_get_priority,
                                   qcrypto_tls_creds_prop_set_priority,
-                                  NULL);
+                                  IGNORE_ERRORS);
 }
 
 
diff --git a/crypto/tlscredsanon.c b/crypto/tlscredsanon.c
index 1464220080..ad6f331aca 100644
--- a/crypto/tlscredsanon.c
+++ b/crypto/tlscredsanon.c
@@ -191,7 +191,7 @@ qcrypto_tls_creds_anon_class_init(ObjectClass *oc, void *data)
     object_class_property_add_bool(oc, "loaded",
                                    qcrypto_tls_creds_anon_prop_get_loaded,
                                    qcrypto_tls_creds_anon_prop_set_loaded,
-                                   NULL);
+                                   IGNORE_ERRORS);
 }
 
 
diff --git a/crypto/tlscredsx509.c b/crypto/tlscredsx509.c
index 50eb54f6bb..f4dc85cb75 100644
--- a/crypto/tlscredsx509.c
+++ b/crypto/tlscredsx509.c
@@ -833,15 +833,15 @@ qcrypto_tls_creds_x509_class_init(ObjectClass *oc, void *data)
     object_class_property_add_bool(oc, "loaded",
                                    qcrypto_tls_creds_x509_prop_get_loaded,
                                    qcrypto_tls_creds_x509_prop_set_loaded,
-                                   NULL);
+                                   IGNORE_ERRORS);
     object_class_property_add_bool(oc, "sanity-check",
                                    qcrypto_tls_creds_x509_prop_get_sanity,
                                    qcrypto_tls_creds_x509_prop_set_sanity,
-                                   NULL);
+                                   IGNORE_ERRORS);
     object_class_property_add_str(oc, "passwordid",
                                   qcrypto_tls_creds_x509_prop_get_passwordid,
                                   qcrypto_tls_creds_x509_prop_set_passwordid,
-                                  NULL);
+                                  IGNORE_ERRORS);
 }
 
 
diff --git a/dump.c b/dump.c
index d9090a24cc..dc78c98b23 100644
--- a/dump.c
+++ b/dump.c
@@ -1681,7 +1681,7 @@ static void dump_process(DumpState *s, Error **errp)
                (local_err ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED));
 
     /* send DUMP_COMPLETED message (unconditionally) */
-    result = qmp_query_dump(NULL);
+    result = qmp_query_dump(IGNORE_ERRORS);
     /* should never fail */
     assert(result);
     qapi_event_send_dump_completed(result, !!local_err, (local_err ? \
diff --git a/exec.c b/exec.c
index 67fc5b92b9..9d73a63f1c 100644
--- a/exec.c
+++ b/exec.c
@@ -1404,7 +1404,7 @@ static int find_max_supported_pagesize(Object *obj, void *opaque)
     long *hpsize_min = opaque;
 
     if (object_dynamic_cast(obj, TYPE_MEMORY_BACKEND)) {
-        mem_path = object_property_get_str(obj, "mem-path", NULL);
+        mem_path = object_property_get_str(obj, "mem-path", IGNORE_ERRORS);
         if (mem_path) {
             long hpsize = qemu_mempath_getpagesize(mem_path);
             if (hpsize < *hpsize_min) {
diff --git a/hmp.c b/hmp.c
index f92445827c..cd87d7dfd6 100644
--- a/hmp.c
+++ b/hmp.c
@@ -59,7 +59,7 @@ void hmp_info_name(Monitor *mon, const QDict *qdict)
 {
     NameInfo *info;
 
-    info = qmp_query_name(NULL);
+    info = qmp_query_name(IGNORE_ERRORS);
     if (info->has_name) {
         monitor_printf(mon, "%s\n", info->name);
     }
@@ -70,7 +70,7 @@ void hmp_info_version(Monitor *mon, const QDict *qdict)
 {
     VersionInfo *info;
 
-    info = qmp_query_version(NULL);
+    info = qmp_query_version(IGNORE_ERRORS);
 
     monitor_printf(mon, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
                    info->qemu->major, info->qemu->minor, info->qemu->micro,
@@ -83,7 +83,7 @@ void hmp_info_kvm(Monitor *mon, const QDict *qdict)
 {
     KvmInfo *info;
 
-    info = qmp_query_kvm(NULL);
+    info = qmp_query_kvm(IGNORE_ERRORS);
     monitor_printf(mon, "kvm support: ");
     if (info->present) {
         monitor_printf(mon, "%s\n", info->enabled ? "enabled" : "disabled");
@@ -98,7 +98,7 @@ void hmp_info_status(Monitor *mon, const QDict *qdict)
 {
     StatusInfo *info;
 
-    info = qmp_query_status(NULL);
+    info = qmp_query_status(IGNORE_ERRORS);
 
     monitor_printf(mon, "VM status: %s%s",
                    info->running ? "running" : "paused",
@@ -117,7 +117,7 @@ void hmp_info_uuid(Monitor *mon, const QDict *qdict)
 {
     UuidInfo *info;
 
-    info = qmp_query_uuid(NULL);
+    info = qmp_query_uuid(IGNORE_ERRORS);
     monitor_printf(mon, "%s\n", info->UUID);
     qapi_free_UuidInfo(info);
 }
@@ -126,7 +126,7 @@ void hmp_info_chardev(Monitor *mon, const QDict *qdict)
 {
     ChardevInfoList *char_info, *info;
 
-    char_info = qmp_query_chardev(NULL);
+    char_info = qmp_query_chardev(IGNORE_ERRORS);
     for (info = char_info; info; info = info->next) {
         monitor_printf(mon, "%s: filename=%s\n", info->value->label,
                                                  info->value->filename);
@@ -139,7 +139,7 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict)
 {
     MouseInfoList *mice_list, *mouse;
 
-    mice_list = qmp_query_mice(NULL);
+    mice_list = qmp_query_mice(IGNORE_ERRORS);
     if (!mice_list) {
         monitor_printf(mon, "No mouse devices connected\n");
         return;
@@ -160,8 +160,8 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
     MigrationInfo *info;
     MigrationCapabilityStatusList *caps, *cap;
 
-    info = qmp_query_migrate(NULL);
-    caps = qmp_query_migrate_capabilities(NULL);
+    info = qmp_query_migrate(IGNORE_ERRORS);
+    caps = qmp_query_migrate_capabilities(IGNORE_ERRORS);
 
     /* do not display parameters during setup */
     if (info->has_status && caps) {
@@ -269,7 +269,7 @@ void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
 {
     MigrationCapabilityStatusList *caps, *cap;
 
-    caps = qmp_query_migrate_capabilities(NULL);
+    caps = qmp_query_migrate_capabilities(IGNORE_ERRORS);
 
     if (caps) {
         for (cap = caps; cap; cap = cap->next) {
@@ -286,7 +286,7 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
 {
     MigrationParameters *params;
 
-    params = qmp_query_migrate_parameters(NULL);
+    params = qmp_query_migrate_parameters(IGNORE_ERRORS);
 
     if (params) {
         assert(params->has_compress_level);
@@ -339,14 +339,14 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
 void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict)
 {
     monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
-                   qmp_query_migrate_cache_size(NULL) >> 10);
+                   qmp_query_migrate_cache_size(IGNORE_ERRORS) >> 10);
 }
 
 void hmp_info_cpus(Monitor *mon, const QDict *qdict)
 {
     CpuInfoList *cpu_list, *cpu;
 
-    cpu_list = qmp_query_cpus(NULL);
+    cpu_list = qmp_query_cpus(IGNORE_ERRORS);
 
     for (cpu = cpu_list; cpu; cpu = cpu->next) {
         int active = ' ';
@@ -513,7 +513,7 @@ void hmp_info_block(Monitor *mon, const QDict *qdict)
 
     /* Print BlockBackend information */
     if (!nodes) {
-        block_list = qmp_query_block(NULL);
+        block_list = qmp_query_block(IGNORE_ERRORS);
     } else {
         block_list = NULL;
     }
@@ -540,7 +540,7 @@ void hmp_info_block(Monitor *mon, const QDict *qdict)
     }
 
     /* Print node information */
-    blockdev_list = qmp_query_named_block_nodes(NULL);
+    blockdev_list = qmp_query_named_block_nodes(IGNORE_ERRORS);
     for (blockdev = blockdev_list; blockdev; blockdev = blockdev->next) {
         assert(blockdev->value->has_node_name);
         if (device && strcmp(device, blockdev->value->node_name)) {
@@ -560,7 +560,7 @@ void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
 {
     BlockStatsList *stats_list, *stats;
 
-    stats_list = qmp_query_blockstats(false, false, NULL);
+    stats_list = qmp_query_blockstats(false, false, IGNORE_ERRORS);
 
     for (stats = stats_list; stats; stats = stats->next) {
         if (!stats->value->has_device) {
@@ -667,7 +667,7 @@ void hmp_info_spice(Monitor *mon, const QDict *qdict)
 #endif
     };
 
-    info = qmp_query_spice(NULL);
+    info = qmp_query_spice(IGNORE_ERRORS);
 
     if (!info->enabled) {
         monitor_printf(mon, "Server: disabled\n");
@@ -985,22 +985,22 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict)
 void hmp_quit(Monitor *mon, const QDict *qdict)
 {
     monitor_suspend(mon);
-    qmp_quit(NULL);
+    qmp_quit(IGNORE_ERRORS);
 }
 
 void hmp_stop(Monitor *mon, const QDict *qdict)
 {
-    qmp_stop(NULL);
+    qmp_stop(IGNORE_ERRORS);
 }
 
 void hmp_system_reset(Monitor *mon, const QDict *qdict)
 {
-    qmp_system_reset(NULL);
+    qmp_system_reset(IGNORE_ERRORS);
 }
 
 void hmp_system_powerdown(Monitor *mon, const QDict *qdict)
 {
-    qmp_system_powerdown(NULL);
+    qmp_system_powerdown(IGNORE_ERRORS);
 }
 
 void hmp_cpu(Monitor *mon, const QDict *qdict)
@@ -1087,7 +1087,7 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
 static void hmp_cont_cb(void *opaque, int err)
 {
     if (!err) {
-        qmp_cont(NULL);
+        qmp_cont(IGNORE_ERRORS);
     }
 }
 
@@ -1101,7 +1101,7 @@ void hmp_cont(Monitor *mon, const QDict *qdict)
     BlockInfoList *bdev_list, *bdev;
     Error *err = NULL;
 
-    bdev_list = qmp_query_block(NULL);
+    bdev_list = qmp_query_block(IGNORE_ERRORS);
     for (bdev = bdev_list; bdev; bdev = bdev->next) {
         if (key_is_missing(bdev->value)) {
             monitor_read_block_device_key(mon, bdev->value->device,
@@ -1119,7 +1119,7 @@ out:
 
 void hmp_system_wakeup(Monitor *mon, const QDict *qdict)
 {
-    qmp_system_wakeup(NULL);
+    qmp_system_wakeup(IGNORE_ERRORS);
 }
 
 void hmp_nmi(Monitor *mon, const QDict *qdict)
@@ -1456,7 +1456,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
 
 void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)
 {
-    qmp_migrate_cancel(NULL);
+    qmp_migrate_cancel(IGNORE_ERRORS);
 }
 
 void hmp_migrate_incoming(Monitor *mon, const QDict *qdict)
@@ -1473,7 +1473,7 @@ void hmp_migrate_incoming(Monitor *mon, const QDict *qdict)
 void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict)
 {
     double value = qdict_get_double(qdict, "value");
-    qmp_migrate_set_downtime(value, NULL);
+    qmp_migrate_set_downtime(value, IGNORE_ERRORS);
 }
 
 void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict)
@@ -1492,7 +1492,7 @@ void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict)
 void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict)
 {
     int64_t value = qdict_get_int(qdict, "value");
-    qmp_migrate_set_speed(value, NULL);
+    qmp_migrate_set_speed(value, IGNORE_ERRORS);
 }
 
 void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
@@ -1695,7 +1695,7 @@ void hmp_eject(Monitor *mon, const QDict *qdict)
 static void hmp_change_read_arg(void *opaque, const char *password,
                                 void *readline_opaque)
 {
-    qmp_change_vnc_password(password, NULL);
+    qmp_change_vnc_password(password, IGNORE_ERRORS);
     monitor_read_command(opaque, 1);
 }
 
@@ -1844,7 +1844,7 @@ static void hmp_migrate_status_cb(void *opaque)
     HMPMigrationStatus *status = opaque;
     MigrationInfo *info;
 
-    info = qmp_query_migrate(NULL);
+    info = qmp_query_migrate(IGNORE_ERRORS);
     if (!info->has_status || info->status == MIGRATION_STATUS_ACTIVE ||
         info->status == MIGRATION_STATUS_SETUP) {
         if (info->has_disk) {
@@ -2154,7 +2154,7 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
     /* Then try adding all block devices.  If one fails, close all and
      * exit.
      */
-    block_list = qmp_query_block(NULL);
+    block_list = qmp_query_block(IGNORE_ERRORS);
 
     for (info = block_list; info; info = info->next) {
         if (!info->value->has_inserted) {
@@ -2164,7 +2164,7 @@ void hmp_nbd_server_start(Monitor *mon, const QDict *qdict)
         qmp_nbd_server_add(info->value->device, true, writable, &local_err);
 
         if (local_err != NULL) {
-            qmp_nbd_server_stop(NULL);
+            qmp_nbd_server_stop(IGNORE_ERRORS);
             break;
         }
     }
@@ -2308,7 +2308,7 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
 
     while (m) {
         v = string_output_visitor_new(false, &str);
-        visit_type_uint16List(v, NULL, &m->value->host_nodes, NULL);
+        visit_type_uint16List(v, NULL, &m->value->host_nodes, IGNORE_ERRORS);
         monitor_printf(mon, "memory backend: %s\n", m->value->id);
         monitor_printf(mon, "  size:  %" PRId64 "\n", m->value->size);
         monitor_printf(mon, "  merge: %s\n",
@@ -2372,7 +2372,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
 
 void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
 {
-    IOThreadInfoList *info_list = qmp_query_iothreads(NULL);
+    IOThreadInfoList *info_list = qmp_query_iothreads(IGNORE_ERRORS);
     IOThreadInfoList *info;
     IOThreadInfo *value;
 
@@ -2740,7 +2740,7 @@ void hmp_rocker_of_dpa_groups(Monitor *mon, const QDict *qdict)
 
 void hmp_info_dump(Monitor *mon, const QDict *qdict)
 {
-    DumpQueryResult *result = qmp_query_dump(NULL);
+    DumpQueryResult *result = qmp_query_dump(IGNORE_ERRORS);
 
     assert(result && result->status < DUMP_STATUS__MAX);
     monitor_printf(mon, "Status: %s\n", DumpStatus_lookup[result->status]);
diff --git a/hw/9pfs/xen-9p-backend.c b/hw/9pfs/xen-9p-backend.c
index 6ab999d2ce..5c7dcfd61b 100644
--- a/hw/9pfs/xen-9p-backend.c
+++ b/hw/9pfs/xen-9p-backend.c
@@ -401,13 +401,14 @@ static int xen_9pfs_connect(struct XenDevice *xendev)
     v9fs_register_transport(s, &xen_9p_transport);
     fsdev = qemu_opts_create(qemu_find_opts("fsdev"),
             s->fsconf.tag,
-            1, NULL);
-    qemu_opt_set(fsdev, "fsdriver", "local", NULL);
-    qemu_opt_set(fsdev, "path", xen_9pdev->path, NULL);
-    qemu_opt_set(fsdev, "security_model", xen_9pdev->security_model, NULL);
+            1, IGNORE_ERRORS);
+    qemu_opt_set(fsdev, "fsdriver", "local", IGNORE_ERRORS);
+    qemu_opt_set(fsdev, "path", xen_9pdev->path, IGNORE_ERRORS);
+    qemu_opt_set(fsdev, "security_model", xen_9pdev->security_model,
+                 IGNORE_ERRORS);
     qemu_opts_set_id(fsdev, s->fsconf.fsdev_id);
     qemu_fsdev_add(fsdev);
-    v9fs_device_realize_common(s, NULL);
+    v9fs_device_realize_common(s, IGNORE_ERRORS);
 
     return 0;
 
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index 5c279bbaca..54e422a39f 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -455,33 +455,33 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
                                    &pm->pm_io_base, errp);
     object_property_add(obj, ACPI_PM_PROP_GPE0_BLK, "uint32",
                         ich9_pm_get_gpe0_blk,
-                        NULL, NULL, pm, NULL);
+                        NULL, NULL, pm, IGNORE_ERRORS);
     object_property_add_uint32_ptr(obj, ACPI_PM_PROP_GPE0_BLK_LEN,
                                    &gpe0_len, errp);
     object_property_add_bool(obj, "memory-hotplug-support",
                              ich9_pm_get_memory_hotplug_support,
                              ich9_pm_set_memory_hotplug_support,
-                             NULL);
+                             IGNORE_ERRORS);
     object_property_add_bool(obj, "cpu-hotplug-legacy",
                              ich9_pm_get_cpu_hotplug_legacy,
                              ich9_pm_set_cpu_hotplug_legacy,
-                             NULL);
+                             IGNORE_ERRORS);
     object_property_add(obj, ACPI_PM_PROP_S3_DISABLED, "uint8",
                         ich9_pm_get_disable_s3,
                         ich9_pm_set_disable_s3,
-                        NULL, pm, NULL);
+                        NULL, pm, IGNORE_ERRORS);
     object_property_add(obj, ACPI_PM_PROP_S4_DISABLED, "uint8",
                         ich9_pm_get_disable_s4,
                         ich9_pm_set_disable_s4,
-                        NULL, pm, NULL);
+                        NULL, pm, IGNORE_ERRORS);
     object_property_add(obj, ACPI_PM_PROP_S4_VAL, "uint8",
                         ich9_pm_get_s4_val,
                         ich9_pm_set_s4_val,
-                        NULL, pm, NULL);
+                        NULL, pm, IGNORE_ERRORS);
     object_property_add_bool(obj, ACPI_PM_PROP_TCO_ENABLED,
                              ich9_pm_get_enable_tco,
                              ich9_pm_set_enable_tco,
-                             NULL);
+                             IGNORE_ERRORS);
 }
 
 void ich9_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c
index f28c6766e5..f4b6a096c0 100644
--- a/hw/acpi/memory_hotplug.c
+++ b/hw/acpi/memory_hotplug.c
@@ -84,23 +84,23 @@ static uint64_t acpi_memory_hotplug_read(void *opaque, hwaddr addr,
     o = OBJECT(mdev->dimm);
     switch (addr) {
     case 0x0: /* Lo part of phys address where DIMM is mapped */
-        val = o ? object_property_get_int(o, PC_DIMM_ADDR_PROP, NULL) : 0;
+        val = o ? object_property_get_int(o, PC_DIMM_ADDR_PROP, IGNORE_ERRORS) : 0;
         trace_mhp_acpi_read_addr_lo(mem_st->selector, val);
         break;
     case 0x4: /* Hi part of phys address where DIMM is mapped */
-        val = o ? object_property_get_int(o, PC_DIMM_ADDR_PROP, NULL) >> 32 : 0;
+        val = o ? object_property_get_int(o, PC_DIMM_ADDR_PROP, IGNORE_ERRORS) >> 32 : 0;
         trace_mhp_acpi_read_addr_hi(mem_st->selector, val);
         break;
     case 0x8: /* Lo part of DIMM size */
-        val = o ? object_property_get_int(o, PC_DIMM_SIZE_PROP, NULL) : 0;
+        val = o ? object_property_get_int(o, PC_DIMM_SIZE_PROP, IGNORE_ERRORS) : 0;
         trace_mhp_acpi_read_size_lo(mem_st->selector, val);
         break;
     case 0xc: /* Hi part of DIMM size */
-        val = o ? object_property_get_int(o, PC_DIMM_SIZE_PROP, NULL) >> 32 : 0;
+        val = o ? object_property_get_int(o, PC_DIMM_SIZE_PROP, IGNORE_ERRORS) >> 32 : 0;
         trace_mhp_acpi_read_size_hi(mem_st->selector, val);
         break;
     case 0x10: /* node proximity for _PXM method */
-        val = o ? object_property_get_int(o, PC_DIMM_NODE_PROP, NULL) : 0;
+        val = o ? object_property_get_int(o, PC_DIMM_NODE_PROP, IGNORE_ERRORS) : 0;
         trace_mhp_acpi_read_pxm(mem_st->selector, val);
         break;
     case 0x14: /* pack and return is_* fields */
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index c691a1de5b..a8c3a9e7f0 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -220,7 +220,7 @@ static NVDIMMDevice *nvdimm_get_device_by_handle(uint32_t handle)
     for (list = device_list; list; list = list->next) {
         NVDIMMDevice *nvd = list->data;
         int slot = object_property_get_int(OBJECT(nvd), PC_DIMM_SLOT_PROP,
-                                           NULL);
+                                           IGNORE_ERRORS);
 
         if (nvdimm_slot_to_handle(slot) == handle) {
             nvdimm = nvd;
@@ -238,13 +238,13 @@ nvdimm_build_structure_spa(GArray *structures, DeviceState *dev)
 {
     NvdimmNfitSpa *nfit_spa;
     uint64_t addr = object_property_get_int(OBJECT(dev), PC_DIMM_ADDR_PROP,
-                                            NULL);
+                                            IGNORE_ERRORS);
     uint64_t size = object_property_get_int(OBJECT(dev), PC_DIMM_SIZE_PROP,
-                                            NULL);
+                                            IGNORE_ERRORS);
     uint32_t node = object_property_get_int(OBJECT(dev), PC_DIMM_NODE_PROP,
-                                            NULL);
+                                            IGNORE_ERRORS);
     int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
-                                            NULL);
+                                            IGNORE_ERRORS);
 
     nfit_spa = acpi_data_push(structures, sizeof(*nfit_spa));
 
@@ -286,9 +286,9 @@ nvdimm_build_structure_memdev(GArray *structures, DeviceState *dev)
 {
     NvdimmNfitMemDev *nfit_memdev;
     uint64_t size = object_property_get_int(OBJECT(dev), PC_DIMM_SIZE_PROP,
-                                            NULL);
+                                            IGNORE_ERRORS);
     int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
-                                            NULL);
+                                            IGNORE_ERRORS);
     uint32_t handle = nvdimm_slot_to_handle(slot);
 
     nfit_memdev = acpi_data_push(structures, sizeof(*nfit_memdev));
@@ -322,7 +322,7 @@ static void nvdimm_build_structure_dcr(GArray *structures, DeviceState *dev)
 {
     NvdimmNfitControlRegion *nfit_dcr;
     int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
-                                       NULL);
+                                       IGNORE_ERRORS);
     uint32_t sn = nvdimm_slot_to_sn(slot);
 
     nfit_dcr = acpi_data_push(structures, sizeof(*nfit_dcr));
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index f276967365..f3c5f03d35 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -480,17 +480,17 @@ static void piix4_pm_add_propeties(PIIX4PMState *s)
     static const uint16_t sci_int = 9;
 
     object_property_add_uint8_ptr(OBJECT(s), ACPI_PM_PROP_ACPI_ENABLE_CMD,
-                                  &acpi_enable_cmd, NULL);
+                                  &acpi_enable_cmd, IGNORE_ERRORS);
     object_property_add_uint8_ptr(OBJECT(s), ACPI_PM_PROP_ACPI_DISABLE_CMD,
-                                  &acpi_disable_cmd, NULL);
+                                  &acpi_disable_cmd, IGNORE_ERRORS);
     object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_GPE0_BLK,
-                                  &gpe0_blk, NULL);
+                                  &gpe0_blk, IGNORE_ERRORS);
     object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_GPE0_BLK_LEN,
-                                  &gpe0_blk_len, NULL);
+                                  &gpe0_blk_len, IGNORE_ERRORS);
     object_property_add_uint16_ptr(OBJECT(s), ACPI_PM_PROP_SCI_INT,
-                                  &sci_int, NULL);
+                                  &sci_int, IGNORE_ERRORS);
     object_property_add_uint32_ptr(OBJECT(s), ACPI_PM_PROP_PM_IO_BASE,
-                                  &s->io_base, NULL);
+                                  &s->io_base, IGNORE_ERRORS);
 }
 
 static void piix4_pm_realize(PCIDevice *dev, Error **errp)
@@ -646,7 +646,7 @@ static void piix4_acpi_system_hot_add_init(MemoryRegion *parent,
     object_property_add_bool(OBJECT(s), "cpu-hotplug-legacy",
                              piix4_get_cpu_hotplug_legacy,
                              piix4_set_cpu_hotplug_legacy,
-                             NULL);
+                             IGNORE_ERRORS);
     legacy_acpi_cpu_hotplug_init(parent, OBJECT(s), &s->gpe_cpu,
                                  PIIX4_CPU_HOTPLUG_IO_BASE);
 
diff --git a/hw/acpi/vmgenid.c b/hw/acpi/vmgenid.c
index 780637028e..5bc495960c 100644
--- a/hw/acpi/vmgenid.c
+++ b/hw/acpi/vmgenid.c
@@ -243,11 +243,11 @@ static void vmgenid_device_class_init(ObjectClass *klass, void *data)
     dc->props = vmgenid_properties;
 
     object_class_property_add_str(klass, VMGENID_GUID, NULL,
-                                  vmgenid_set_guid, NULL);
+                                  vmgenid_set_guid, IGNORE_ERRORS);
     object_class_property_set_description(klass, VMGENID_GUID,
                                     "Set Global Unique Identifier "
                                     "(big-endian) or auto for random value",
-                                    NULL);
+                                    IGNORE_ERRORS);
 }
 
 static const TypeInfo vmgenid_device_info = {
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index f62a9a3541..651409094c 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -28,7 +28,7 @@ static void aw_a10_init(Object *obj)
     AwA10State *s = AW_A10(obj);
 
     object_initialize(&s->cpu, sizeof(s->cpu), "cortex-a8-" TYPE_ARM_CPU);
-    object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL);
+    object_property_add_child(obj, "cpu", OBJECT(&s->cpu), IGNORE_ERRORS);
 
     object_initialize(&s->intc, sizeof(s->intc), TYPE_AW_A10_PIC);
     qdev_set_parent_bus(DEVICE(&s->intc), sysbus_get_default());
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index 4937e2bc83..d546b6af91 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -129,23 +129,24 @@ static void aspeed_soc_init(Object *obj)
 
     cpu_typename = g_strdup_printf("%s-" TYPE_ARM_CPU, sc->info->cpu_model);
     object_initialize(&s->cpu, sizeof(s->cpu), cpu_typename);
-    object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL);
+    object_property_add_child(obj, "cpu", OBJECT(&s->cpu), IGNORE_ERRORS);
     g_free(cpu_typename);
 
     object_initialize(&s->vic, sizeof(s->vic), TYPE_ASPEED_VIC);
-    object_property_add_child(obj, "vic", OBJECT(&s->vic), NULL);
+    object_property_add_child(obj, "vic", OBJECT(&s->vic), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->vic), sysbus_get_default());
 
     object_initialize(&s->timerctrl, sizeof(s->timerctrl), TYPE_ASPEED_TIMER);
-    object_property_add_child(obj, "timerctrl", OBJECT(&s->timerctrl), NULL);
+    object_property_add_child(obj, "timerctrl", OBJECT(&s->timerctrl),
+                              IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->timerctrl), sysbus_get_default());
 
     object_initialize(&s->i2c, sizeof(s->i2c), TYPE_ASPEED_I2C);
-    object_property_add_child(obj, "i2c", OBJECT(&s->i2c), NULL);
+    object_property_add_child(obj, "i2c", OBJECT(&s->i2c), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->i2c), sysbus_get_default());
 
     object_initialize(&s->scu, sizeof(s->scu), TYPE_ASPEED_SCU);
-    object_property_add_child(obj, "scu", OBJECT(&s->scu), NULL);
+    object_property_add_child(obj, "scu", OBJECT(&s->scu), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->scu), sysbus_get_default());
     qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev",
                          sc->info->silicon_rev);
@@ -155,7 +156,7 @@ static void aspeed_soc_init(Object *obj)
                               "hw-strap2", &error_abort);
 
     object_initialize(&s->fmc, sizeof(s->fmc), sc->info->fmc_typename);
-    object_property_add_child(obj, "fmc", OBJECT(&s->fmc), NULL);
+    object_property_add_child(obj, "fmc", OBJECT(&s->fmc), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->fmc), sysbus_get_default());
     object_property_add_alias(obj, "num-cs", OBJECT(&s->fmc), "num-cs",
                               &error_abort);
@@ -163,12 +164,13 @@ static void aspeed_soc_init(Object *obj)
     for (i = 0; i < sc->info->spis_num; i++) {
         object_initialize(&s->spi[i], sizeof(s->spi[i]),
                           sc->info->spi_typename[i]);
-        object_property_add_child(obj, "spi[*]", OBJECT(&s->spi[i]), NULL);
+        object_property_add_child(obj, "spi[*]", OBJECT(&s->spi[i]),
+                                  IGNORE_ERRORS);
         qdev_set_parent_bus(DEVICE(&s->spi[i]), sysbus_get_default());
     }
 
     object_initialize(&s->sdmc, sizeof(s->sdmc), TYPE_ASPEED_SDMC);
-    object_property_add_child(obj, "sdmc", OBJECT(&s->sdmc), NULL);
+    object_property_add_child(obj, "sdmc", OBJECT(&s->sdmc), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->sdmc), sysbus_get_default());
     qdev_prop_set_uint32(DEVICE(&s->sdmc), "silicon-rev",
                          sc->info->silicon_rev);
@@ -176,11 +178,12 @@ static void aspeed_soc_init(Object *obj)
                               "ram-size", &error_abort);
 
     object_initialize(&s->wdt, sizeof(s->wdt), TYPE_ASPEED_WDT);
-    object_property_add_child(obj, "wdt", OBJECT(&s->wdt), NULL);
+    object_property_add_child(obj, "wdt", OBJECT(&s->wdt), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->wdt), sysbus_get_default());
 
     object_initialize(&s->ftgmac100, sizeof(s->ftgmac100), TYPE_FTGMAC100);
-    object_property_add_child(obj, "ftgmac100", OBJECT(&s->ftgmac100), NULL);
+    object_property_add_child(obj, "ftgmac100", OBJECT(&s->ftgmac100),
+                              IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->ftgmac100), sysbus_get_default());
 }
 
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 502f04c02a..447870b5a7 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -27,12 +27,14 @@ static void bcm2835_peripherals_init(Object *obj)
 
     /* Memory region for peripheral devices, which we export to our parent */
     memory_region_init(&s->peri_mr, obj,"bcm2835-peripherals", 0x1000000);
-    object_property_add_child(obj, "peripheral-io", OBJECT(&s->peri_mr), NULL);
+    object_property_add_child(obj, "peripheral-io", OBJECT(&s->peri_mr),
+                              IGNORE_ERRORS);
     sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->peri_mr);
 
     /* Internal memory region for peripheral bus addresses (not exported) */
     memory_region_init(&s->gpu_bus_mr, obj, "bcm2835-gpu", (uint64_t)1 << 32);
-    object_property_add_child(obj, "gpu-bus", OBJECT(&s->gpu_bus_mr), NULL);
+    object_property_add_child(obj, "gpu-bus", OBJECT(&s->gpu_bus_mr),
+                              IGNORE_ERRORS);
 
     /* Internal memory region for request/response communication with
      * mailbox-addressable peripherals (not exported)
@@ -42,22 +44,22 @@ static void bcm2835_peripherals_init(Object *obj)
 
     /* Interrupt Controller */
     object_initialize(&s->ic, sizeof(s->ic), TYPE_BCM2835_IC);
-    object_property_add_child(obj, "ic", OBJECT(&s->ic), NULL);
+    object_property_add_child(obj, "ic", OBJECT(&s->ic), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->ic), sysbus_get_default());
 
     /* UART0 */
     s->uart0 = SYS_BUS_DEVICE(object_new("pl011"));
-    object_property_add_child(obj, "uart0", OBJECT(s->uart0), NULL);
+    object_property_add_child(obj, "uart0", OBJECT(s->uart0), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(s->uart0), sysbus_get_default());
 
     /* AUX / UART1 */
     object_initialize(&s->aux, sizeof(s->aux), TYPE_BCM2835_AUX);
-    object_property_add_child(obj, "aux", OBJECT(&s->aux), NULL);
+    object_property_add_child(obj, "aux", OBJECT(&s->aux), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->aux), sysbus_get_default());
 
     /* Mailboxes */
     object_initialize(&s->mboxes, sizeof(s->mboxes), TYPE_BCM2835_MBOX);
-    object_property_add_child(obj, "mbox", OBJECT(&s->mboxes), NULL);
+    object_property_add_child(obj, "mbox", OBJECT(&s->mboxes), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->mboxes), sysbus_get_default());
 
     object_property_add_const_link(OBJECT(&s->mboxes), "mbox-mr",
@@ -65,7 +67,7 @@ static void bcm2835_peripherals_init(Object *obj)
 
     /* Framebuffer */
     object_initialize(&s->fb, sizeof(s->fb), TYPE_BCM2835_FB);
-    object_property_add_child(obj, "fb", OBJECT(&s->fb), NULL);
+    object_property_add_child(obj, "fb", OBJECT(&s->fb), IGNORE_ERRORS);
     object_property_add_alias(obj, "vcram-size", OBJECT(&s->fb), "vcram-size",
                               &error_abort);
     qdev_set_parent_bus(DEVICE(&s->fb), sysbus_get_default());
@@ -75,7 +77,8 @@ static void bcm2835_peripherals_init(Object *obj)
 
     /* Property channel */
     object_initialize(&s->property, sizeof(s->property), TYPE_BCM2835_PROPERTY);
-    object_property_add_child(obj, "property", OBJECT(&s->property), NULL);
+    object_property_add_child(obj, "property", OBJECT(&s->property),
+                              IGNORE_ERRORS);
     object_property_add_alias(obj, "board-rev", OBJECT(&s->property),
                               "board-rev", &error_abort);
     qdev_set_parent_bus(DEVICE(&s->property), sysbus_get_default());
@@ -87,22 +90,23 @@ static void bcm2835_peripherals_init(Object *obj)
 
     /* Random Number Generator */
     object_initialize(&s->rng, sizeof(s->rng), TYPE_BCM2835_RNG);
-    object_property_add_child(obj, "rng", OBJECT(&s->rng), NULL);
+    object_property_add_child(obj, "rng", OBJECT(&s->rng), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->rng), sysbus_get_default());
 
     /* Extended Mass Media Controller */
     object_initialize(&s->sdhci, sizeof(s->sdhci), TYPE_SYSBUS_SDHCI);
-    object_property_add_child(obj, "sdhci", OBJECT(&s->sdhci), NULL);
+    object_property_add_child(obj, "sdhci", OBJECT(&s->sdhci), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->sdhci), sysbus_get_default());
 
     /* SDHOST */
     object_initialize(&s->sdhost, sizeof(s->sdhost), TYPE_BCM2835_SDHOST);
-    object_property_add_child(obj, "sdhost", OBJECT(&s->sdhost), NULL);
+    object_property_add_child(obj, "sdhost", OBJECT(&s->sdhost),
+                              IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->sdhost), sysbus_get_default());
 
     /* DMA Channels */
     object_initialize(&s->dma, sizeof(s->dma), TYPE_BCM2835_DMA);
-    object_property_add_child(obj, "dma", OBJECT(&s->dma), NULL);
+    object_property_add_child(obj, "dma", OBJECT(&s->dma), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->dma), sysbus_get_default());
 
     object_property_add_const_link(OBJECT(&s->dma), "dma-mr",
@@ -110,7 +114,7 @@ static void bcm2835_peripherals_init(Object *obj)
 
     /* GPIO */
     object_initialize(&s->gpio, sizeof(s->gpio), TYPE_BCM2835_GPIO);
-    object_property_add_child(obj, "gpio", OBJECT(&s->gpio), NULL);
+    object_property_add_child(obj, "gpio", OBJECT(&s->gpio), IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->gpio), sysbus_get_default());
 
     object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhci",
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index 8c43291112..2c6a082395 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -36,7 +36,8 @@ static void bcm2836_init(Object *obj)
     }
 
     object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
-    object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
+    object_property_add_child(obj, "control", OBJECT(&s->control),
+                              IGNORE_ERRORS);
     qdev_set_parent_bus(DEVICE(&s->control), sysbus_get_default());
 
     object_initialize(&s->peripherals, sizeof(s->peripherals),
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index 94f32637f0..f22fae73c3 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -36,7 +36,7 @@ static void digic_init(Object *obj)
     int i;
 
     object_initialize(&s->cpu, sizeof(s->cpu), "arm946-" TYPE_ARM_CPU);
-    object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL);
+    object_property_add_child(obj, "cpu", OBJECT(&s->cpu), IGNORE_ERRORS);
 
     for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
 #define DIGIC_TIMER_NAME_MLEN    11
@@ -46,13 +46,14 @@ static void digic_init(Object *obj)
         dev = DEVICE(&s->timer[i]);
         qdev_set_parent_bus(dev, sysbus_get_default());
         snprintf(name, DIGIC_TIMER_NAME_MLEN, "timer[%d]", i);
-        object_property_add_child(obj, name, OBJECT(&s->timer[i]), NULL);
+        object_property_add_child(obj, name, OBJECT(&s->timer[i]),
+                                  IGNORE_ERRORS);
     }
 
     object_initialize(&s->uart, sizeof(s->uart), TYPE_DIGIC_UART);
     dev = DEVICE(&s->uart);
     qdev_set_parent_bus(dev, sysbus_get_default());
-    object_property_add_child(obj, "uart", OBJECT(&s->uart), NULL);
+    object_property_add_child(obj, "uart", OBJECT(&s->uart), IGNORE_ERRORS);
 }
 
 static void digic_realize(DeviceState *dev, Error **errp)
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index 960f27e45a..4a712a58b0 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -180,7 +180,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
         /* By default A9 CPUs have EL3 enabled.  This board does not currently
          * support EL3 so the CPU EL3 property is disabled before realization.
          */
-        if (object_property_find(cpuobj, "has_el3", NULL)) {
+        if (object_property_find(cpuobj, "has_el3", IGNORE_ERRORS)) {
             object_property_set_bool(cpuobj, false, "has_el3", &error_fatal);
         }
 
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 27773c9c47..73610d48a5 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -45,70 +45,78 @@ static void fsl_imx6_init(Object *obj)
         object_initialize(&s->cpu[i], sizeof(s->cpu[i]),
                           "cortex-a9-" TYPE_ARM_CPU);
         snprintf(name, NAME_SIZE, "cpu%d", i);
-        object_property_add_child(obj, name, OBJECT(&s->cpu[i]), NULL);
+        object_property_add_child(obj, name, OBJECT(&s->cpu[i]),
+                                  IGNORE_ERRORS);
     }
 
     object_initialize(&s->a9mpcore, sizeof(s->a9mpcore), TYPE_A9MPCORE_PRIV);
     qdev_set_parent_bus(DEVICE(&s->a9mpcore), sysbus_get_default());
-    object_property_add_child(obj, "a9mpcore", OBJECT(&s->a9mpcore), NULL);
+    object_property_add_child(obj, "a9mpcore", OBJECT(&s->a9mpcore),
+                              IGNORE_ERRORS);
 
     object_initialize(&s->ccm, sizeof(s->ccm), TYPE_IMX6_CCM);
     qdev_set_parent_bus(DEVICE(&s->ccm), sysbus_get_default());
-    object_property_add_child(obj, "ccm", OBJECT(&s->ccm), NULL);
+    object_property_add_child(obj, "ccm", OBJECT(&s->ccm), IGNORE_ERRORS);
 
     object_initialize(&s->src, sizeof(s->src), TYPE_IMX6_SRC);
     qdev_set_parent_bus(DEVICE(&s->src), sysbus_get_default());
-    object_property_add_child(obj, "src", OBJECT(&s->src), NULL);
+    object_property_add_child(obj, "src", OBJECT(&s->src), IGNORE_ERRORS);
 
     for (i = 0; i < FSL_IMX6_NUM_UARTS; i++) {
         object_initialize(&s->uart[i], sizeof(s->uart[i]), TYPE_IMX_SERIAL);
         qdev_set_parent_bus(DEVICE(&s->uart[i]), sysbus_get_default());
         snprintf(name, NAME_SIZE, "uart%d", i + 1);
-        object_property_add_child(obj, name, OBJECT(&s->uart[i]), NULL);
+        object_property_add_child(obj, name, OBJECT(&s->uart[i]),
+                                  IGNORE_ERRORS);
     }
 
     object_initialize(&s->gpt, sizeof(s->gpt), TYPE_IMX6_GPT);
     qdev_set_parent_bus(DEVICE(&s->gpt), sysbus_get_default());
-    object_property_add_child(obj, "gpt", OBJECT(&s->gpt), NULL);
+    object_property_add_child(obj, "gpt", OBJECT(&s->gpt), IGNORE_ERRORS);
 
     for (i = 0; i < FSL_IMX6_NUM_EPITS; i++) {
         object_initialize(&s->epit[i], sizeof(s->epit[i]), TYPE_IMX_EPIT);
         qdev_set_parent_bus(DEVICE(&s->epit[i]), sysbus_get_default());
         snprintf(name, NAME_SIZE, "epit%d", i + 1);
-        object_property_add_child(obj, name, OBJECT(&s->epit[i]), NULL);
+        object_property_add_child(obj, name, OBJECT(&s->epit[i]),
+                                  IGNORE_ERRORS);
     }
 
     for (i = 0; i < FSL_IMX6_NUM_I2CS; i++) {
         object_initialize(&s->i2c[i], sizeof(s->i2c[i]), TYPE_IMX_I2C);
         qdev_set_parent_bus(DEVICE(&s->i2c[i]), sysbus_get_default());
         snprintf(name, NAME_SIZE, "i2c%d", i + 1);
-        object_property_add_child(obj, name, OBJECT(&s->i2c[i]), NULL);
+        object_property_add_child(obj, name, OBJECT(&s->i2c[i]),
+                                  IGNORE_ERRORS);
     }
 
     for (i = 0; i < FSL_IMX6_NUM_GPIOS; i++) {
         object_initialize(&s->gpio[i], sizeof(s->gpio[i]), TYPE_IMX_GPIO);
         qdev_set_parent_bus(DEVICE(&s->gpio[i]), sysbus_get_default());
         snprintf(name, NAME_SIZE, "gpio%d", i + 1);
-        object_property_add_child(obj, name, OBJECT(&s->gpio[i]), NULL);
+        object_property_add_child(obj, name, OBJECT(&s->gpio[i]),
+                                  IGNORE_ERRORS);
     }
 
     for (i = 0; i < FSL_IMX6_NUM_ESDHCS; i++) {
         object_initialize(&s->esdhc[i], sizeof(s->esdhc[i]), TYPE_SYSBUS_SDHCI);
         qdev_set_parent_bus(DEVICE(&s->esdhc[i]), sysbus_get_default());
         snprintf(name, NAME_SIZE, "sdhc%d", i + 1);
-        object_property_add_child(obj, name, OBJECT(&s->esdhc[i]), NULL);
+        object_property_add_child(obj, name, OBJECT(&s->esdhc[i]),
+                                  IGNORE_ERRORS);
     }
 
     for (i = 0; i < FSL_IMX6_NUM_ECSPIS; i++) {
         object_initialize(&s->spi[i], sizeof(s->spi[i]), TYPE_IMX_SPI);
         qdev_set_parent_bus(DEVICE(&s->spi[i]), sysbus_get_default());
         snprintf(name, NAME_SIZE, "spi%d", i + 1);
-        object_property_add_child(obj, name, OBJECT(&s->spi[i]), NULL);
+        object_property_add_child(obj, name, OBJECT(&s->spi[i]),
+                                  IGNORE_ERRORS);
     }
 
     object_initialize(&s->eth, sizeof(s->eth), TYPE_IMX_ENET);
     qdev_set_parent_bus(DEVICE(&s->eth), sysbus_get_default());
-    object_property_add_child(obj, "eth", OBJECT(&s->eth), NULL);
+    object_property_add_child(obj, "eth", OBJECT(&s->eth), IGNORE_ERRORS);
 }
 
 static void fsl_imx6_realize(DeviceState *dev, Error **errp)
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index d209b97dee..b7016c7c20 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -260,7 +260,7 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
                                      "start-powered-off", &error_abort);
         }
 
-        if (object_property_find(cpuobj, "reset-cbar", NULL)) {
+        if (object_property_find(cpuobj, "reset-cbar", IGNORE_ERRORS)) {
             object_property_set_int(cpuobj, MPCORE_PERIPHBASE,
                                     "reset-cbar", &error_abort);
         }
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index ca3eca1d16..5af0d7fe5b 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -618,7 +618,7 @@ static void integratorcp_init(MachineState *machine)
      * currently support EL3 so the CPU EL3 property is disabled before
      * realization.
      */
-    if (object_property_find(cpuobj, "has_el3", NULL)) {
+    if (object_property_find(cpuobj, "has_el3", IGNORE_ERRORS)) {
         object_property_set_bool(cpuobj, false, "has_el3", &error_fatal);
     }
 
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index b7d4753400..d5f307432b 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -109,7 +109,7 @@ static void realview_init(MachineState *machine,
          * does not currently support EL3 so the CPU EL3 property is disabled
          * before realization.
          */
-        if (object_property_find(cpuobj, "has_el3", NULL)) {
+        if (object_property_find(cpuobj, "has_el3", IGNORE_ERRORS)) {
             object_property_set_bool(cpuobj, false, "has_el3", &error_fatal);
         }
 
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index b0e9f5be65..a7385f9232 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -223,7 +223,7 @@ static void versatile_init(MachineState *machine, int board_id)
      * currently support EL3 so the CPU EL3 property is disabled before
      * realization.
      */
-    if (object_property_find(cpuobj, "has_el3", NULL)) {
+    if (object_property_find(cpuobj, "has_el3", IGNORE_ERRORS)) {
         object_property_set_bool(cpuobj, false, "has_el3", &error_fatal);
     }
 
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index c6b1e674b4..d1e294f969 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -218,10 +218,10 @@ static void init_cpus(const char *cpu_model, const char *privdev,
         Object *cpuobj = object_new(object_class_get_name(cpu_oc));
 
         if (!secure) {
-            object_property_set_bool(cpuobj, false, "has_el3", NULL);
+            object_property_set_bool(cpuobj, false, "has_el3", IGNORE_ERRORS);
         }
 
-        if (object_property_find(cpuobj, "reset-cbar", NULL)) {
+        if (object_property_find(cpuobj, "reset-cbar", IGNORE_ERRORS)) {
             object_property_set_int(cpuobj, periphbase,
                                     "reset-cbar", &error_abort);
         }
@@ -739,11 +739,11 @@ static void vexpress_instance_init(Object *obj)
     /* EL3 is enabled by default on vexpress */
     vms->secure = true;
     object_property_add_bool(obj, "secure", vexpress_get_secure,
-                             vexpress_set_secure, NULL);
+                             vexpress_set_secure, IGNORE_ERRORS);
     object_property_set_description(obj, "secure",
                                     "Set on/off to enable/disable the ARM "
                                     "Security Extensions (TrustZone)",
-                                    NULL);
+                                    IGNORE_ERRORS);
 }
 
 static void vexpress_class_init(ObjectClass *oc, void *data)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 010f7244bf..4c187bba59 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1379,7 +1379,7 @@ static void machvirt_init(MachineState *machine)
 
         cpuobj = object_new(typename);
         object_property_set_int(cpuobj, possible_cpus->cpus[n].arch_id,
-                                "mp-affinity", NULL);
+                                "mp-affinity", IGNORE_ERRORS);
 
         cs = CPU(cpuobj);
         cs->cpu_index = n;
@@ -1388,29 +1388,29 @@ static void machvirt_init(MachineState *machine)
                           &error_fatal);
 
         if (!vms->secure) {
-            object_property_set_bool(cpuobj, false, "has_el3", NULL);
+            object_property_set_bool(cpuobj, false, "has_el3", IGNORE_ERRORS);
         }
 
-        if (!vms->virt && object_property_find(cpuobj, "has_el2", NULL)) {
-            object_property_set_bool(cpuobj, false, "has_el2", NULL);
+        if (!vms->virt && object_property_find(cpuobj, "has_el2", IGNORE_ERRORS)) {
+            object_property_set_bool(cpuobj, false, "has_el2", IGNORE_ERRORS);
         }
 
         if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED) {
             object_property_set_int(cpuobj, vms->psci_conduit,
-                                    "psci-conduit", NULL);
+                                    "psci-conduit", IGNORE_ERRORS);
 
             /* Secondary CPUs start in PSCI powered-down state */
             if (n > 0) {
                 object_property_set_bool(cpuobj, true,
-                                         "start-powered-off", NULL);
+                                         "start-powered-off", IGNORE_ERRORS);
             }
         }
 
-        if (vmc->no_pmu && object_property_find(cpuobj, "pmu", NULL)) {
-            object_property_set_bool(cpuobj, false, "pmu", NULL);
+        if (vmc->no_pmu && object_property_find(cpuobj, "pmu", IGNORE_ERRORS)) {
+            object_property_set_bool(cpuobj, false, "pmu", IGNORE_ERRORS);
         }
 
-        if (object_property_find(cpuobj, "reset-cbar", NULL)) {
+        if (object_property_find(cpuobj, "reset-cbar", IGNORE_ERRORS)) {
             object_property_set_int(cpuobj, vms->memmap[VIRT_CPUPERIPHS].base,
                                     "reset-cbar", &error_abort);
         }
@@ -1422,7 +1422,7 @@ static void machvirt_init(MachineState *machine)
                                      "secure-memory", &error_abort);
         }
 
-        object_property_set_bool(cpuobj, true, "realized", NULL);
+        object_property_set_bool(cpuobj, true, "realized", IGNORE_ERRORS);
         object_unref(cpuobj);
     }
     fdt_add_timer_nodes(vms);
@@ -1650,37 +1650,38 @@ static void virt_2_9_instance_init(Object *obj)
      */
     vms->secure = false;
     object_property_add_bool(obj, "secure", virt_get_secure,
-                             virt_set_secure, NULL);
+                             virt_set_secure, IGNORE_ERRORS);
     object_property_set_description(obj, "secure",
                                     "Set on/off to enable/disable the ARM "
                                     "Security Extensions (TrustZone)",
-                                    NULL);
+                                    IGNORE_ERRORS);
 
     /* EL2 is also disabled by default, for similar reasons */
     vms->virt = false;
     object_property_add_bool(obj, "virtualization", virt_get_virt,
-                             virt_set_virt, NULL);
+                             virt_set_virt, IGNORE_ERRORS);
     object_property_set_description(obj, "virtualization",
                                     "Set on/off to enable/disable emulating a "
                                     "guest CPU which implements the ARM "
                                     "Virtualization Extensions",
-                                    NULL);
+                                    IGNORE_ERRORS);
 
     /* High memory is enabled by default */
     vms->highmem = true;
     object_property_add_bool(obj, "highmem", virt_get_highmem,
-                             virt_set_highmem, NULL);
+                             virt_set_highmem, IGNORE_ERRORS);
     object_property_set_description(obj, "highmem",
                                     "Set on/off to enable/disable using "
                                     "physical address space above 32 bits",
-                                    NULL);
+                                    IGNORE_ERRORS);
     /* Default GIC type is v2 */
     vms->gic_version = 2;
     object_property_add_str(obj, "gic-version", virt_get_gic_version,
-                        virt_set_gic_version, NULL);
+                        virt_set_gic_version, IGNORE_ERRORS);
     object_property_set_description(obj, "gic-version",
                                     "Set GIC version. "
-                                    "Valid values are 2, 3 and host", NULL);
+                                    "Valid values are 2, 3 and host",
+                                    IGNORE_ERRORS);
 
     if (vmc->no_its) {
         vms->its = false;
@@ -1688,11 +1689,11 @@ static void virt_2_9_instance_init(Object *obj)
         /* Default allows ITS instantiation */
         vms->its = true;
         object_property_add_bool(obj, "its", virt_get_its,
-                                 virt_set_its, NULL);
+                                 virt_set_its, IGNORE_ERRORS);
         object_property_set_description(obj, "its",
                                         "Set on/off to enable/disable "
                                         "ITS instantiation",
-                                        NULL);
+                                        IGNORE_ERRORS);
     }
 
     vms->memmap = a15memmap;
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 3985356fc2..623043239d 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -183,7 +183,7 @@ static void zynq_init(MachineState *machine)
      * currently support EL3 so the CPU EL3 property is disabled before
      * realization.
      */
-    if (object_property_find(OBJECT(cpu), "has_el3", NULL)) {
+    if (object_property_find(OBJECT(cpu), "has_el3", IGNORE_ERRORS)) {
         object_property_set_bool(OBJECT(cpu), false, "has_el3", &error_fatal);
     }
 
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 64f52f80a5..38f9577284 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -259,9 +259,9 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
         g_free(name);
 
         object_property_set_bool(OBJECT(&s->apu_cpu[i]),
-                                 s->secure, "has_el3", NULL);
+                                 s->secure, "has_el3", IGNORE_ERRORS);
         object_property_set_bool(OBJECT(&s->apu_cpu[i]),
-                                 false, "has_el2", NULL);
+                                 false, "has_el2", IGNORE_ERRORS);
         object_property_set_int(OBJECT(&s->apu_cpu[i]), GIC_BASE_ADDR,
                                 "reset-cbar", &error_abort);
         object_property_set_bool(OBJECT(&s->apu_cpu[i]), true, "realized",
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 2e629b398b..5fed23c774 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -2835,10 +2835,10 @@ static void isabus_fdc_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &isa->bootindexA,
                                   "bootindexA", "/floppy@0",
-                                  DEVICE(obj), NULL);
+                                  DEVICE(obj), IGNORE_ERRORS);
     device_add_bootindex_property(obj, &isa->bootindexB,
                                   "bootindexB", "/floppy@1",
-                                  DEVICE(obj), NULL);
+                                  DEVICE(obj), IGNORE_ERRORS);
 }
 
 static const TypeInfo isa_fdc_info = {
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index 381dc7c5fb..656b0f8c48 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -943,7 +943,7 @@ static int nvme_init(PCIDevice *pci_dev)
     pci_register_bar(&n->parent_obj, 0,
         PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64,
         &n->iomem);
-    msix_init_exclusive_bar(&n->parent_obj, n->num_queues, 4, NULL);
+    msix_init_exclusive_bar(&n->parent_obj, n->num_queues, 4, IGNORE_ERRORS);
 
     id->vid = cpu_to_le16(pci_get_word(pci_conf + PCI_VENDOR_ID));
     id->ssvid = cpu_to_le16(pci_get_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID));
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index 604d37dfc8..ce9cf63c3e 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -984,10 +984,10 @@ static void virtio_blk_instance_init(Object *obj)
     object_property_add_link(obj, "iothread", TYPE_IOTHREAD,
                              (Object **)&s->conf.iothread,
                              qdev_prop_allow_set_link_before_realize,
-                             OBJ_PROP_LINK_UNREF_ON_RELEASE, NULL);
+                             OBJ_PROP_LINK_UNREF_ON_RELEASE, IGNORE_ERRORS);
     device_add_bootindex_property(obj, &s->conf.conf.bootindex,
                                   "bootindex", "/disk@0,0",
-                                  DEVICE(obj), NULL);
+                                  DEVICE(obj), IGNORE_ERRORS);
 }
 
 static const VMStateDescription vmstate_virtio_blk = {
diff --git a/hw/core/bus.c b/hw/core/bus.c
index 4651f24486..ab1925bee9 100644
--- a/hw/core/bus.c
+++ b/hw/core/bus.c
@@ -101,7 +101,8 @@ static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
     if (bus->parent) {
         QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling);
         bus->parent->num_child_bus++;
-        object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL);
+        object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus),
+                                  IGNORE_ERRORS);
         object_unref(OBJECT(bus));
     } else if (bus != sysbus_get_default()) {
         /* TODO: once all bus devices are qdevified,
@@ -198,9 +199,10 @@ static void qbus_initfn(Object *obj)
                              (Object **)&bus->hotplug_handler,
                              object_property_allow_set_link,
                              0,
-                             NULL);
+                             IGNORE_ERRORS);
     object_property_add_bool(obj, "realized",
-                             bus_get_realized, bus_set_realized, NULL);
+                             bus_get_realized, bus_set_realized,
+                             IGNORE_ERRORS);
 }
 
 static char *default_bus_get_fw_dev_path(DeviceState *dev)
diff --git a/hw/core/platform-bus.c b/hw/core/platform-bus.c
index e3d69b61f3..d3286e6570 100644
--- a/hw/core/platform-bus.c
+++ b/hw/core/platform-bus.c
@@ -64,7 +64,8 @@ hwaddr platform_bus_get_mmio_addr(PlatformBusDevice *pbus, SysBusDevice *sbdev,
         return -1;
     }
 
-    parent_mr = object_property_get_link(OBJECT(sbdev_mr), "container", NULL);
+    parent_mr = object_property_get_link(OBJECT(sbdev_mr), "container",
+                                         IGNORE_ERRORS);
 
     assert(parent_mr);
     if (parent_mr != pbus_mr_obj) {
@@ -72,7 +73,7 @@ hwaddr platform_bus_get_mmio_addr(PlatformBusDevice *pbus, SysBusDevice *sbdev,
         return -1;
     }
 
-    return object_property_get_int(OBJECT(sbdev_mr), "addr", NULL);
+    return object_property_get_int(OBJECT(sbdev_mr), "addr", IGNORE_ERRORS);
 }
 
 static void platform_bus_count_irqs(SysBusDevice *sbdev, void *opaque)
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 3bef41914d..73640ee3c6 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -77,7 +77,7 @@ static void parse_drive(DeviceState *dev, const char *str, void **ptr,
 
     blk = blk_by_name(str);
     if (!blk) {
-        BlockDriverState *bs = bdrv_lookup_bs(NULL, str, NULL);
+        BlockDriverState *bs = bdrv_lookup_bs(NULL, str, IGNORE_ERRORS);
         if (bs) {
             blk = blk_new(0, BLK_PERM_ALL);
             blk_created = true;
@@ -442,7 +442,7 @@ void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
         qdev_prop_set_netdev(dev, "netdev", nd->netdev);
     }
     if (nd->nvectors != DEV_NVECTORS_UNSPECIFIED &&
-        object_property_find(OBJECT(dev), "vectors", NULL)) {
+        object_property_find(OBJECT(dev), "vectors", IGNORE_ERRORS)) {
         qdev_prop_set_uint32(dev, "vectors", nd->nvectors);
     }
     nd->instantiated = 1;
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 0ce45a2019..faa4af0dc3 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -71,7 +71,7 @@ static void bus_remove_child(BusState *bus, DeviceState *child)
             QTAILQ_REMOVE(&bus->children, kid, sibling);
 
             /* This gives back ownership of kid->child back to us.  */
-            object_property_del(OBJECT(bus), name, NULL);
+            object_property_del(OBJECT(bus), name, IGNORE_ERRORS);
             object_unref(OBJECT(kid->child));
             g_free(kid);
             return;
@@ -97,7 +97,7 @@ static void bus_add_child(BusState *bus, DeviceState *child)
                              (Object **)&kid->child,
                              NULL, /* read-only property */
                              0, /* return ownership on prop deletion */
-                             NULL);
+                             IGNORE_ERRORS);
 }
 
 void qdev_set_parent_bus(DeviceState *dev, BusState *bus)
@@ -470,7 +470,8 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
          */
         object_property_add_child(container_get(qdev_get_machine(),
                                                 "/unattached"),
-                                  "non-qdev-gpio[*]", OBJECT(pin), NULL);
+                                  "non-qdev-gpio[*]", OBJECT(pin),
+                                  IGNORE_ERRORS);
     }
     object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
     g_free(propname);
@@ -482,7 +483,7 @@ qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n)
                                      name ? name : "unnamed-gpio-out", n);
 
     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
-                                                      NULL);
+                                                      IGNORE_ERRORS);
 
     return ret;
 }
@@ -496,9 +497,9 @@ static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
                                      name ? name : "unnamed-gpio-out", n);
 
     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
-                                                      NULL);
+                                                      IGNORE_ERRORS);
     if (ret) {
-        object_property_set_link(OBJECT(dev), NULL, propname, NULL);
+        object_property_set_link(OBJECT(dev), NULL, propname, IGNORE_ERRORS);
     }
     g_free(propname);
     return ret;
@@ -838,7 +839,7 @@ static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
         return 0;
     }
 
-    if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
+    if (dev->realized && object_property_get_bool(obj, "hotpluggable", IGNORE_ERRORS)) {
         *list = g_slist_append(*list, dev);
     }
 
@@ -978,7 +979,7 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
 child_realize_fail:
     QLIST_FOREACH(bus, &dev->child_bus, sibling) {
         object_property_set_bool(OBJECT(bus), false, "realized",
-                                 NULL);
+                                 IGNORE_ERRORS);
     }
 
     if (qdev_get_vmsd(dev)) {
@@ -1029,9 +1030,10 @@ static void device_initfn(Object *obj)
     dev->realized = false;
 
     object_property_add_bool(obj, "realized",
-                             device_get_realized, device_set_realized, NULL);
+                             device_get_realized, device_set_realized,
+                             IGNORE_ERRORS);
     object_property_add_bool(obj, "hotpluggable",
-                             device_get_hotpluggable, NULL, NULL);
+                             device_get_hotpluggable, NULL, IGNORE_ERRORS);
     object_property_add_bool(obj, "hotplugged",
                              device_get_hotplugged, NULL,
                              &error_abort);
@@ -1090,7 +1092,7 @@ static void device_unparent(Object *obj)
     BusState *bus;
 
     if (dev->realized) {
-        object_property_set_bool(obj, false, "realized", NULL);
+        object_property_set_bool(obj, false, "realized", IGNORE_ERRORS);
     }
     while (dev->num_child_bus) {
         bus = QLIST_FIRST(&dev->child_bus);
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index c6dfd9ae0c..8600af9050 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -92,7 +92,7 @@ bool sysbus_has_irq(SysBusDevice *dev, int n)
     char *prop = g_strdup_printf("%s[%d]", SYSBUS_DEVICE_GPIO_IRQ, n);
     ObjectProperty *r;
 
-    r = object_property_find(OBJECT(dev), prop, NULL);
+    r = object_property_find(OBJECT(dev), prop, IGNORE_ERRORS);
     g_free(prop);
 
     return (r != NULL);
@@ -362,7 +362,8 @@ static void main_system_bus_create(void)
     OBJECT(main_system_bus)->free = g_free;
     object_property_add_child(container_get(qdev_get_machine(),
                                             "/unattached"),
-                              "sysbus", OBJECT(main_system_bus), NULL);
+                              "sysbus", OBJECT(main_system_bus),
+                              IGNORE_ERRORS);
 }
 
 BusState *sysbus_get_default(void)
diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
index bc05152fd3..6d376b978d 100644
--- a/hw/cpu/a15mpcore.c
+++ b/hw/cpu/a15mpcore.c
@@ -66,7 +66,7 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
          * either all the CPUs have TZ, or none do.
          */
         cpuobj = OBJECT(qemu_get_cpu(0));
-        has_el3 = object_property_find(cpuobj, "has_el3", NULL) &&
+        has_el3 = object_property_find(cpuobj, "has_el3", IGNORE_ERRORS) &&
             object_property_get_bool(cpuobj, "has_el3", &error_abort);
         qdev_prop_set_bit(gicdev, "has-security-extensions", has_el3);
     }
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index f17f292090..23f2c252bd 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -72,7 +72,7 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
      * either all the CPUs have TZ, or none do.
      */
     cpuobj = OBJECT(qemu_get_cpu(0));
-    has_el3 = object_property_find(cpuobj, "has_el3", NULL) &&
+    has_el3 = object_property_find(cpuobj, "has_el3", IGNORE_ERRORS) &&
         object_property_get_bool(cpuobj, "has_el3", &error_abort);
     qdev_prop_set_bit(gicdev, "has-security-extensions", has_el3);
 
diff --git a/hw/cpu/core.c b/hw/cpu/core.c
index 2bf960d6a8..b38d882432 100644
--- a/hw/cpu/core.c
+++ b/hw/cpu/core.c
@@ -66,9 +66,9 @@ static void cpu_core_instance_init(Object *obj)
     CPUCore *core = CPU_CORE(obj);
 
     object_property_add(obj, "core-id", "int", core_prop_get_core_id,
-                        core_prop_set_core_id, NULL, NULL, NULL);
+                        core_prop_set_core_id, NULL, NULL, IGNORE_ERRORS);
     object_property_add(obj, "nr-threads", "int", core_prop_get_nr_threads,
-                        core_prop_set_nr_threads, NULL, NULL, NULL);
+                        core_prop_set_nr_threads, NULL, NULL, IGNORE_ERRORS);
     core->nr_threads = smp_threads;
 }
 
diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c
index 0f6a836b77..950fa207b5 100644
--- a/hw/display/vga-pci.c
+++ b/hw/display/vga-pci.c
@@ -268,7 +268,8 @@ static void pci_std_vga_init(Object *obj)
 {
     /* Expose framebuffer byteorder via QOM */
     object_property_add_bool(obj, "big-endian-framebuffer",
-                             vga_get_big_endian_fb, vga_set_big_endian_fb, NULL);
+                             vga_get_big_endian_fb, vga_set_big_endian_fb,
+                             IGNORE_ERRORS);
 }
 
 static void pci_secondary_vga_realize(PCIDevice *dev, Error **errp)
@@ -298,7 +299,8 @@ static void pci_secondary_vga_init(Object *obj)
 {
     /* Expose framebuffer byteorder via QOM */
     object_property_add_bool(obj, "big-endian-framebuffer",
-                             vga_get_big_endian_fb, vga_set_big_endian_fb, NULL);
+                             vga_get_big_endian_fb, vga_set_big_endian_fb,
+                             IGNORE_ERRORS);
 }
 
 static void pci_secondary_vga_reset(DeviceState *dev)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index ce74c84460..0775ea65bf 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -137,9 +137,11 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
         obj = piix;
         pm->cpu_hp_io_base = PIIX4_CPU_HOTPLUG_IO_BASE;
         pm->pcihp_io_base =
-            object_property_get_int(obj, ACPI_PCIHP_IO_BASE_PROP, NULL);
+            object_property_get_int(obj, ACPI_PCIHP_IO_BASE_PROP,
+                                    IGNORE_ERRORS);
         pm->pcihp_io_len =
-            object_property_get_int(obj, ACPI_PCIHP_IO_LEN_PROP, NULL);
+            object_property_get_int(obj, ACPI_PCIHP_IO_LEN_PROP,
+                                    IGNORE_ERRORS);
     }
     if (lpc) {
         obj = lpc;
@@ -148,21 +150,23 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
     assert(obj);
 
     /* Fill in optional s3/s4 related properties */
-    o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED, NULL);
+    o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED,
+                                    IGNORE_ERRORS);
     if (o) {
         pm->s3_disabled = qint_get_int(qobject_to_qint(o));
     } else {
         pm->s3_disabled = false;
     }
     qobject_decref(o);
-    o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_DISABLED, NULL);
+    o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_DISABLED,
+                                    IGNORE_ERRORS);
     if (o) {
         pm->s4_disabled = qint_get_int(qobject_to_qint(o));
     } else {
         pm->s4_disabled = false;
     }
     qobject_decref(o);
-    o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_VAL, NULL);
+    o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_VAL, IGNORE_ERRORS);
     if (o) {
         pm->s4_val = qint_get_int(qobject_to_qint(o));
     } else {
@@ -171,23 +175,24 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
     qobject_decref(o);
 
     /* Fill in mandatory properties */
-    pm->sci_int = object_property_get_int(obj, ACPI_PM_PROP_SCI_INT, NULL);
+    pm->sci_int = object_property_get_int(obj, ACPI_PM_PROP_SCI_INT,
+                                          IGNORE_ERRORS);
 
     pm->acpi_enable_cmd = object_property_get_int(obj,
                                                   ACPI_PM_PROP_ACPI_ENABLE_CMD,
-                                                  NULL);
+                                                  IGNORE_ERRORS);
     pm->acpi_disable_cmd = object_property_get_int(obj,
                                                   ACPI_PM_PROP_ACPI_DISABLE_CMD,
-                                                  NULL);
+                                                  IGNORE_ERRORS);
     pm->io_base = object_property_get_int(obj, ACPI_PM_PROP_PM_IO_BASE,
-                                          NULL);
+                                          IGNORE_ERRORS);
     pm->gpe0_blk = object_property_get_int(obj, ACPI_PM_PROP_GPE0_BLK,
-                                           NULL);
+                                           IGNORE_ERRORS);
     pm->gpe0_blk_len = object_property_get_int(obj, ACPI_PM_PROP_GPE0_BLK_LEN,
-                                               NULL);
+                                               IGNORE_ERRORS);
     pm->pcihp_bridge_en =
         object_property_get_bool(obj, "acpi-pci-hotplug-with-bridge-support",
-                                 NULL);
+                                 IGNORE_ERRORS);
 }
 
 static void acpi_get_misc_info(AcpiMiscInfo *info)
@@ -239,17 +244,17 @@ static void acpi_get_pci_holes(Range *hole, Range *hole64)
     range_set_bounds1(hole,
                       object_property_get_int(pci_host,
                                               PCI_HOST_PROP_PCI_HOLE_START,
-                                              NULL),
+                                              IGNORE_ERRORS),
                       object_property_get_int(pci_host,
                                               PCI_HOST_PROP_PCI_HOLE_END,
-                                              NULL));
+                                              IGNORE_ERRORS));
     range_set_bounds1(hole64,
                       object_property_get_int(pci_host,
                                               PCI_HOST_PROP_PCI_HOLE64_START,
-                                              NULL),
+                                              IGNORE_ERRORS),
                       object_property_get_int(pci_host,
                                               PCI_HOST_PROP_PCI_HOLE64_END,
-                                              NULL));
+                                              IGNORE_ERRORS));
 }
 
 #define ACPI_PORT_SMI_CMD           0x00b2 /* TODO: this is APM_CNT_IOPORT */
@@ -527,7 +532,8 @@ static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus,
     PCIBus *sec;
     int i;
 
-    bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL);
+    bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL,
+                                       IGNORE_ERRORS);
     if (bsel) {
         int64_t bsel_val = qint_get_int(qobject_to_qint(bsel));
 
@@ -2138,7 +2144,8 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
          * of the i/o region used is FW_CFG_CTL_SIZE; when using DMA, the
          * DMA control register is located at FW_CFG_DMA_IO_BASE + 4 */
         uint8_t io_size = object_property_get_bool(OBJECT(pcms->fw_cfg),
-                                                   "dma_enabled", NULL) ?
+                                                   "dma_enabled",
+                                                   IGNORE_ERRORS) ?
                           ROUND_UP(FW_CFG_CTL_SIZE, 4) + sizeof(dma_addr_t) :
                           FW_CFG_CTL_SIZE;
 
@@ -2327,7 +2334,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
     PCMachineState *pcms = PC_MACHINE(machine);
     ram_addr_t hotplugabble_address_space_size =
         object_property_get_int(OBJECT(pcms), PC_MACHINE_MEMHP_REGION_SIZE,
-                                NULL);
+                                IGNORE_ERRORS);
 
     srat_start = table_data->len;
 
@@ -2610,14 +2617,16 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)
     pci_host = acpi_get_i386_pci_host();
     g_assert(pci_host);
 
-    o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_BASE, NULL);
+    o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_BASE,
+                                    IGNORE_ERRORS);
     if (!o) {
         return false;
     }
     mcfg->mcfg_base = qint_get_int(qobject_to_qint(o));
     qobject_decref(o);
 
-    o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE, NULL);
+    o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE,
+                                    IGNORE_ERRORS);
     assert(o);
     mcfg->mcfg_size = qint_get_int(qobject_to_qint(o));
     qobject_decref(o);
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index 87dcbdd51a..bc8795f7f3 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -1843,7 +1843,7 @@ static void assigned_dev_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &d->bootindex,
                                   "bootindex", NULL,
-                                  &pci_dev->qdev, NULL);
+                                  &pci_dev->qdev, IGNORE_ERRORS);
 }
 
 static Property assigned_dev_properties[] = {
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 742b5507e3..efa6c35157 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1560,7 +1560,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
              * IRQ8 and IRQ2.
              */
             uint8_t compat = object_property_get_int(OBJECT(hpet),
-                    HPET_INTCAP, NULL);
+                    HPET_INTCAP, IGNORE_ERRORS);
             if (!compat) {
                 qdev_prop_set_uint32(hpet, HPET_INTCAP, hpet_irqs);
             }
@@ -1671,7 +1671,7 @@ void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name)
     }
     if (parent_name) {
         object_property_add_child(object_resolve_path(parent_name, NULL),
-                                  "ioapic", OBJECT(dev), NULL);
+                                  "ioapic", OBJECT(dev), IGNORE_ERRORS);
     }
     qdev_init_nofail(dev);
     d = SYS_BUS_DEVICE(dev);
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 9179fb31de..0e9ad9f929 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -162,19 +162,20 @@ static void pc_q35_init(MachineState *machine)
     /* create pci host bus */
     q35_host = Q35_HOST_DEVICE(qdev_create(NULL, TYPE_Q35_HOST_DEVICE));
 
-    object_property_add_child(qdev_get_machine(), "q35", OBJECT(q35_host), NULL);
+    object_property_add_child(qdev_get_machine(), "q35", OBJECT(q35_host),
+                              IGNORE_ERRORS);
     object_property_set_link(OBJECT(q35_host), OBJECT(ram_memory),
-                             MCH_HOST_PROP_RAM_MEM, NULL);
+                             MCH_HOST_PROP_RAM_MEM, IGNORE_ERRORS);
     object_property_set_link(OBJECT(q35_host), OBJECT(pci_memory),
-                             MCH_HOST_PROP_PCI_MEM, NULL);
+                             MCH_HOST_PROP_PCI_MEM, IGNORE_ERRORS);
     object_property_set_link(OBJECT(q35_host), OBJECT(get_system_memory()),
-                             MCH_HOST_PROP_SYSTEM_MEM, NULL);
+                             MCH_HOST_PROP_SYSTEM_MEM, IGNORE_ERRORS);
     object_property_set_link(OBJECT(q35_host), OBJECT(system_io),
-                             MCH_HOST_PROP_IO_MEM, NULL);
+                             MCH_HOST_PROP_IO_MEM, IGNORE_ERRORS);
     object_property_set_int(OBJECT(q35_host), pcms->below_4g_mem_size,
-                            PCI_HOST_BELOW_4G_MEM_SIZE, NULL);
+                            PCI_HOST_BELOW_4G_MEM_SIZE, IGNORE_ERRORS);
     object_property_set_int(OBJECT(q35_host), pcms->above_4g_mem_size,
-                            PCI_HOST_ABOVE_4G_MEM_SIZE, NULL);
+                            PCI_HOST_ABOVE_4G_MEM_SIZE, IGNORE_ERRORS);
     /* pci */
     qdev_init_nofail(DEVICE(q35_host));
     phb = PCI_HOST_BRIDGE(q35_host);
diff --git a/hw/ide/ich.c b/hw/ide/ich.c
index 092f16c2d7..519d3d5e16 100644
--- a/hw/ide/ich.c
+++ b/hw/ide/ich.c
@@ -147,7 +147,7 @@ static void pci_ich9_ahci_realize(PCIDevice *dev, Error **errp)
     /* Although the AHCI 1.3 specification states that the first capability
      * should be PMCAP, the Intel ICH9 data sheet specifies that the ICH9
      * AHCI device puts the MSI capability first, pointing to 0x80. */
-    ret = msi_init(dev, ICH9_MSI_CAP_OFFSET, 1, true, false, NULL);
+    ret = msi_init(dev, ICH9_MSI_CAP_OFFSET, 1, true, false, IGNORE_ERRORS);
     /* Any error other than -ENOTSUP(board's MSI support is broken)
      * is a programming error.  Fall back to INTx silently on -ENOTSUP */
     assert(!ret || ret == -ENOTSUP);
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 299e592fa2..efa34e429a 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -263,8 +263,8 @@ static void ide_dev_instance_init(Object *obj)
 {
     object_property_add(obj, "bootindex", "int32",
                         ide_dev_get_bootindex,
-                        ide_dev_set_bootindex, NULL, NULL, NULL);
-    object_property_set_int(obj, -1, "bootindex", NULL);
+                        ide_dev_set_bootindex, NULL, NULL, IGNORE_ERRORS);
+    object_property_set_int(obj, -1, "bootindex", IGNORE_ERRORS);
 }
 
 static int ide_hd_initfn(IDEDevice *dev)
diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
index 8666234554..ad1beb3b0b 100644
--- a/hw/input/virtio-input-hid.c
+++ b/hw/input/virtio-input-hid.c
@@ -267,7 +267,8 @@ static void virtio_input_hid_realize(DeviceState *dev, Error **errp)
 
     vhid->hs = qemu_input_handler_register(dev, vhid->handler);
     if (vhid->display && vhid->hs) {
-        qemu_input_handler_bind(vhid->hs, vhid->display, vhid->head, NULL);
+        qemu_input_handler_bind(vhid->hs, vhid->display, vhid->head,
+                                IGNORE_ERRORS);
     }
 }
 
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 1ef56f8d10..09b75a3048 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -331,7 +331,7 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
         instance_id = -1;
     }
     vmstate_register_with_alias_id(NULL, instance_id, &vmstate_apic_common,
-                                   s, -1, 0, NULL);
+                                   s, -1, 0, IGNORE_ERRORS);
 }
 
 static void apic_common_unrealize(DeviceState *dev, Error **errp)
@@ -486,7 +486,7 @@ static void apic_common_initfn(Object *obj)
     s->id = s->initial_apic_id = -1;
     object_property_add(obj, "id", "int",
                         apic_common_get_id,
-                        apic_common_set_id, NULL, NULL, NULL);
+                        apic_common_set_id, NULL, NULL, IGNORE_ERRORS);
 }
 
 static void apic_common_class_init(ObjectClass *klass, void *data)
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
index c6493d6c07..3fcd6dfaa9 100644
--- a/hw/intc/arm_gicv3_common.c
+++ b/hw/intc/arm_gicv3_common.c
@@ -267,7 +267,8 @@ static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
          *  VLPIS == 0 (virtual LPIs not supported)
          *  PLPIS == 0 (physical LPIs not supported)
          */
-        cpu_affid = object_property_get_int(OBJECT(cpu), "mp-affinity", NULL);
+        cpu_affid = object_property_get_int(OBJECT(cpu), "mp-affinity",
+                                            IGNORE_ERRORS);
         last = (i == s->num_cpu - 1);
 
         /* The CPU mp-affinity property is in MPIDR register format; squash
diff --git a/hw/intc/s390_flic.c b/hw/intc/s390_flic.c
index a26e90670f..cc14ddc4bd 100644
--- a/hw/intc/s390_flic.c
+++ b/hw/intc/s390_flic.c
@@ -40,7 +40,7 @@ void s390_flic_init(void)
     if (!dev) {
         dev = qdev_create(NULL, TYPE_QEMU_S390_FLIC);
         object_property_add_child(qdev_get_machine(), TYPE_QEMU_S390_FLIC,
-                                  OBJECT(dev), NULL);
+                                  OBJECT(dev), IGNORE_ERRORS);
     }
     qdev_init_nofail(dev);
 }
diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c
index 7ee9b77399..4ee59628d0 100644
--- a/hw/intc/s390_flic_kvm.c
+++ b/hw/intc/s390_flic_kvm.c
@@ -40,7 +40,7 @@ DeviceState *s390_flic_kvm_create(void)
     if (kvm_enabled()) {
         dev = qdev_create(NULL, TYPE_KVM_S390_FLIC);
         object_property_add_child(qdev_get_machine(), TYPE_KVM_S390_FLIC,
-                                  OBJECT(dev), NULL);
+                                  OBJECT(dev), IGNORE_ERRORS);
     }
     return dev;
 }
diff --git a/hw/ipmi/ipmi.c b/hw/ipmi/ipmi.c
index a51cbca6f7..5dd057cd39 100644
--- a/hw/ipmi/ipmi.c
+++ b/hw/ipmi/ipmi.c
@@ -59,7 +59,7 @@ static int ipmi_do_hw_op(IPMIInterface *s, enum ipmi_op op, int checkonly)
         if (checkonly) {
             return 0;
         }
-        qmp_inject_nmi(NULL);
+        qmp_inject_nmi(IGNORE_ERRORS);
         return 0;
 
     case IPMI_SHUTDOWN_VIA_ACPI_OVERTEMP:
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index 28c0fedb5d..99a136d05a 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -653,11 +653,11 @@ static void ich9_lpc_add_properties(ICH9LPCState *lpc)
 
     object_property_add(OBJECT(lpc), ACPI_PM_PROP_SCI_INT, "uint32",
                         ich9_lpc_get_sci_int,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
     object_property_add_uint8_ptr(OBJECT(lpc), ACPI_PM_PROP_ACPI_ENABLE_CMD,
-                                  &acpi_enable_cmd, NULL);
+                                  &acpi_enable_cmd, IGNORE_ERRORS);
     object_property_add_uint8_ptr(OBJECT(lpc), ACPI_PM_PROP_ACPI_DISABLE_CMD,
-                                  &acpi_disable_cmd, NULL);
+                                  &acpi_disable_cmd, IGNORE_ERRORS);
 
     ich9_pm_add_properties(OBJECT(lpc), &lpc->pm, NULL);
 }
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index db896b0bb6..3843eb6110 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -68,7 +68,7 @@ static void nvdimm_init(Object *obj)
 {
     object_property_add(obj, "label-size", "int",
                         nvdimm_get_label_size, nvdimm_set_label_size, NULL,
-                        NULL, NULL);
+                        NULL, IGNORE_ERRORS);
 }
 
 static MemoryRegion *nvdimm_get_memory_region(PCDIMMDevice *dimm)
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 9e8dab0e89..92fb48255a 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -182,7 +182,7 @@ int qmp_pc_dimm_device_list(Object *obj, void *opaque)
             di->slot = dimm->slot;
             di->node = dimm->node;
             di->size = object_property_get_int(OBJECT(dimm), PC_DIMM_SIZE_PROP,
-                                               NULL);
+                                               IGNORE_ERRORS);
             di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
 
             info->u.dimm.data = di;
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index 4968bdbb28..69ba8a37d3 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -145,14 +145,15 @@ petalogix_ml605_init(MachineState *machine)
 
     /* FIXME: attach to the sysbus instead */
     object_property_add_child(qdev_get_machine(), "xilinx-eth", OBJECT(eth0),
-                              NULL);
+                              IGNORE_ERRORS);
     object_property_add_child(qdev_get_machine(), "xilinx-dma", OBJECT(dma),
-                              NULL);
+                              IGNORE_ERRORS);
 
     ds = object_property_get_link(OBJECT(dma),
-                                  "axistream-connected-target", NULL);
+                                  "axistream-connected-target", IGNORE_ERRORS);
     cs = object_property_get_link(OBJECT(dma),
-                                  "axistream-control-connected-target", NULL);
+                                  "axistream-control-connected-target",
+                                  IGNORE_ERRORS);
     qdev_set_nic_properties(eth0, &nd_table[0]);
     qdev_prop_set_uint32(eth0, "rxmem", 0x1000);
     qdev_prop_set_uint32(eth0, "txmem", 0x1000);
@@ -165,9 +166,10 @@ petalogix_ml605_init(MachineState *machine)
     sysbus_connect_irq(SYS_BUS_DEVICE(eth0), 0, irq[AXIENET_IRQ]);
 
     ds = object_property_get_link(OBJECT(eth0),
-                                  "axistream-connected-target", NULL);
+                                  "axistream-connected-target", IGNORE_ERRORS);
     cs = object_property_get_link(OBJECT(eth0),
-                                  "axistream-control-connected-target", NULL);
+                                  "axistream-control-connected-target",
+                                  IGNORE_ERRORS);
     qdev_prop_set_uint32(dma, "freqhz", 100 * 1000000);
     object_property_set_link(OBJECT(dma), OBJECT(ds),
                              "axistream-connected", &error_abort);
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index a4677f7da4..61d03e8b2a 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -531,7 +531,7 @@ static void boston_mach_init(MachineState *machine)
     memory_region_add_subregion_overlap(sys_mem, 0x17fff000, lcd, 0);
 
     chr = qemu_chr_new("lcd", "vc:320x240");
-    qemu_chr_fe_init(&s->lcd_display, chr, NULL);
+    qemu_chr_fe_init(&s->lcd_display, chr, IGNORE_ERRORS);
     qemu_chr_fe_set_handlers(&s->lcd_display, NULL, NULL,
                              boston_lcd_event, s, NULL, true);
 
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 4b6ccb575e..ef34ebd886 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -569,7 +569,7 @@ static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space,
     memory_region_add_subregion(address_space, base + 0xa00, &s->iomem_hi);
 
     chr = qemu_chr_new("fpga", "vc:320x200");
-    qemu_chr_fe_init(&s->display, chr, NULL);
+    qemu_chr_fe_init(&s->display, chr, IGNORE_ERRORS);
     qemu_chr_fe_set_handlers(&s->display, NULL, NULL,
                              malta_fgpa_display_event, s, NULL, true);
 
diff --git a/hw/misc/auxbus.c b/hw/misc/auxbus.c
index 3342b65f15..a718aa0cde 100644
--- a/hw/misc/auxbus.c
+++ b/hw/misc/auxbus.c
@@ -245,7 +245,7 @@ static void aux_slave_dev_print(Monitor *mon, DeviceState *dev, int indent)
 
     monitor_printf(mon, "%*smemory " TARGET_FMT_plx "/" TARGET_FMT_plx "\n",
                    indent, "",
-                   object_property_get_int(OBJECT(s->mmio), "addr", NULL),
+                   object_property_get_int(OBJECT(s->mmio), "addr", IGNORE_ERRORS),
                    memory_region_size(s->mmio));
 }
 
diff --git a/hw/misc/edu.c b/hw/misc/edu.c
index eb814df82d..48735517f4 100644
--- a/hw/misc/edu.c
+++ b/hw/misc/edu.c
@@ -392,7 +392,7 @@ static void edu_instance_init(Object *obj)
 
     edu->dma_mask = (1UL << 28) - 1;
     object_property_add(obj, "dma_mask", "uint64", edu_obj_uint64,
-                    edu_obj_uint64, NULL, &edu->dma_mask, NULL);
+                    edu_obj_uint64, NULL, &edu->dma_mask, IGNORE_ERRORS);
 }
 
 static void edu_class_init(ObjectClass *class, void *data)
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index 5d57f45dc6..fed0c6b269 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -214,7 +214,7 @@ static void macio_init_ide(MacIOState *s, MACIOIDEState *ide, size_t ide_size,
     memory_region_add_subregion(&s->bar, 0x1f000 + ((index + 1) * 0x1000),
                                 &ide->mem);
     name = g_strdup_printf("ide[%i]", index);
-    object_property_add_child(OBJECT(s), name, OBJECT(ide), NULL);
+    object_property_add_child(OBJECT(s), name, OBJECT(ide), IGNORE_ERRORS);
     g_free(name);
 }
 
@@ -333,7 +333,7 @@ static void macio_instance_init(Object *obj)
 
     object_initialize(&s->cuda, sizeof(s->cuda), TYPE_CUDA);
     qdev_set_parent_bus(DEVICE(&s->cuda), sysbus_get_default());
-    object_property_add_child(obj, "cuda", OBJECT(&s->cuda), NULL);
+    object_property_add_child(obj, "cuda", OBJECT(&s->cuda), IGNORE_ERRORS);
 }
 
 static const VMStateDescription vmstate_macio_oldworld = {
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index 5cd5a92614..0badd7b0a0 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -112,7 +112,7 @@ uint16_t pvpanic_port(void)
     if (!o) {
         return 0;
     }
-    return object_property_get_int(o, PVPANIC_IOPORT_PROP, NULL);
+    return object_property_get_int(o, PVPANIC_IOPORT_PROP, IGNORE_ERRORS);
 }
 
 static Property pvpanic_isa_properties[] = {
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
index 04e83787d4..82a25b91f4 100644
--- a/hw/misc/tmp105.c
+++ b/hw/misc/tmp105.c
@@ -244,7 +244,7 @@ static void tmp105_initfn(Object *obj)
 {
     object_property_add(obj, "temperature", "int",
                         tmp105_get_temperature,
-                        tmp105_set_temperature, NULL, NULL, NULL);
+                        tmp105_set_temperature, NULL, NULL, IGNORE_ERRORS);
 }
 
 static void tmp105_class_init(ObjectClass *klass, void *data)
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index 4353f91cff..4141e7e108 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -1676,7 +1676,7 @@ static void e1000_instance_init(Object *obj)
     E1000State *n = E1000(obj);
     device_add_bootindex_property(obj, &n->conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  DEVICE(n), NULL);
+                                  DEVICE(n), IGNORE_ERRORS);
 }
 
 static const TypeInfo e1000_base_info = {
diff --git a/hw/net/e1000e.c b/hw/net/e1000e.c
index 664554f33c..34167c0384 100644
--- a/hw/net/e1000e.c
+++ b/hw/net/e1000e.c
@@ -293,7 +293,7 @@ e1000e_init_msix(E1000EState *s)
                         E1000E_MSIX_IDX, E1000E_MSIX_TABLE,
                         &s->msix,
                         E1000E_MSIX_IDX, E1000E_MSIX_PBA,
-                        0xA0, NULL);
+                        0xA0, IGNORE_ERRORS);
 
     if (res < 0) {
         trace_e1000e_msix_init_fail(res);
@@ -463,7 +463,7 @@ static void e1000e_pci_realize(PCIDevice *pci_dev, Error **errp)
         hw_error("Failed to initialize PCIe capability");
     }
 
-    ret = msi_init(PCI_DEVICE(s), 0xD0, 1, true, false, NULL);
+    ret = msi_init(PCI_DEVICE(s), 0xD0, 1, true, false, IGNORE_ERRORS);
     if (ret) {
         trace_e1000e_msi_init_fail(ret);
     }
@@ -474,7 +474,7 @@ static void e1000e_pci_realize(PCIDevice *pci_dev, Error **errp)
     }
 
     if (pcie_aer_init(pci_dev, PCI_ERR_VER, e1000e_aer_offset,
-                      PCI_ERR_SIZEOF, NULL) < 0) {
+                      PCI_ERR_SIZEOF, IGNORE_ERRORS) < 0) {
         hw_error("Failed to initialize AER capability");
     }
 
@@ -694,7 +694,7 @@ static void e1000e_instance_init(Object *obj)
     E1000EState *s = E1000E(obj);
     device_add_bootindex_property(obj, &s->conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  DEVICE(obj), NULL);
+                                  DEVICE(obj), IGNORE_ERRORS);
 }
 
 static const TypeInfo e1000e_info = {
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
index 5e03c9fb24..663addc758 100644
--- a/hw/net/eepro100.c
+++ b/hw/net/eepro100.c
@@ -1906,7 +1906,7 @@ static void eepro100_instance_init(Object *obj)
     EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, PCI_DEVICE(obj));
     device_add_bootindex_property(obj, &s->conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  DEVICE(s), NULL);
+                                  DEVICE(s), IGNORE_ERRORS);
 }
 
 static E100PCIDeviceInfo e100_devices[] = {
diff --git a/hw/net/lance.c b/hw/net/lance.c
index 7ac795d4b2..a3141d7676 100644
--- a/hw/net/lance.c
+++ b/hw/net/lance.c
@@ -145,7 +145,7 @@ static void lance_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &s->conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  DEVICE(obj), NULL);
+                                  DEVICE(obj), IGNORE_ERRORS);
 }
 
 static Property lance_properties[] = {
diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
index f3455339ee..6065c80f27 100644
--- a/hw/net/ne2000-isa.c
+++ b/hw/net/ne2000-isa.c
@@ -134,8 +134,8 @@ static void isa_ne2000_instance_init(Object *obj)
 {
     object_property_add(obj, "bootindex", "int32",
                         isa_ne2000_get_bootindex,
-                        isa_ne2000_set_bootindex, NULL, NULL, NULL);
-    object_property_set_int(obj, -1, "bootindex", NULL);
+                        isa_ne2000_set_bootindex, NULL, NULL, IGNORE_ERRORS);
+    object_property_set_int(obj, -1, "bootindex", IGNORE_ERRORS);
 }
 static const TypeInfo ne2000_isa_info = {
     .name          = TYPE_ISA_NE2000,
diff --git a/hw/net/ne2000.c b/hw/net/ne2000.c
index f8e86f5184..2aec2b80b0 100644
--- a/hw/net/ne2000.c
+++ b/hw/net/ne2000.c
@@ -757,7 +757,7 @@ static void ne2000_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &s->c.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  &pci_dev->qdev, NULL);
+                                  &pci_dev->qdev, IGNORE_ERRORS);
 }
 
 static Property ne2000_properties[] = {
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
index e08aee92b1..598b60e0eb 100644
--- a/hw/net/pcnet-pci.c
+++ b/hw/net/pcnet-pci.c
@@ -334,7 +334,7 @@ static void pcnet_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &s->conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  DEVICE(obj), NULL);
+                                  DEVICE(obj), IGNORE_ERRORS);
 }
 
 static Property pcnet_properties[] = {
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
index 36cd99e3fc..04e1044cd6 100644
--- a/hw/net/rtl8139.c
+++ b/hw/net/rtl8139.c
@@ -3458,7 +3458,7 @@ static void rtl8139_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &s->conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  DEVICE(obj), NULL);
+                                  DEVICE(obj), IGNORE_ERRORS);
 }
 
 static Property rtl8139_properties[] = {
diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index 54ac4f4f44..3e2a9896eb 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -340,7 +340,7 @@ static void spapr_vlan_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &dev->nicconf.bootindex,
                                   "bootindex", "",
-                                  DEVICE(dev), NULL);
+                                  DEVICE(dev), IGNORE_ERRORS);
 
     if (dev->compat_flags & SPAPRVLAN_FLAG_RX_BUF_POOLS) {
         for (i = 0; i < RX_MAX_POOLS; i++) {
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 3aa2af14e5..b94c23e7ff 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -2036,7 +2036,7 @@ static void virtio_net_instance_init(Object *obj)
     n->config_size = sizeof(struct virtio_net_config);
     device_add_bootindex_property(obj, &n->nic_conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  DEVICE(n), NULL);
+                                  DEVICE(n), IGNORE_ERRORS);
 }
 
 static void virtio_net_pre_save(void *opaque)
diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index 7ebb32e664..5d8f150e9d 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -2192,7 +2192,7 @@ vmxnet3_init_msix(VMXNET3State *s)
                         VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_TABLE,
                         &s->msix_bar,
                         VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_PBA(s),
-                        VMXNET3_MSIX_OFFSET(s), NULL);
+                        VMXNET3_MSIX_OFFSET(s), IGNORE_ERRORS);
 
     if (0 > res) {
         VMW_WRPRN("Failed to initialize MSI-X, error %d", res);
@@ -2317,7 +2317,7 @@ static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
     pci_dev->config[PCI_INTERRUPT_PIN] = 0x01;
 
     ret = msi_init(pci_dev, VMXNET3_MSI_OFFSET(s), VMXNET3_MAX_NMSIX_INTRS,
-                   VMXNET3_USE_64BIT, VMXNET3_PER_VECTOR_MASK, NULL);
+                   VMXNET3_USE_64BIT, VMXNET3_PER_VECTOR_MASK, IGNORE_ERRORS);
     /* Any error other than -ENOTSUP(board's MSI support is broken)
      * is a programming error. Fall back to INTx silently on -ENOTSUP */
     assert(!ret || ret == -ENOTSUP);
@@ -2345,7 +2345,7 @@ static void vmxnet3_instance_init(Object *obj)
     VMXNET3State *s = VMXNET3(obj);
     device_add_bootindex_property(obj, &s->conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  DEVICE(obj), NULL);
+                                  DEVICE(obj), IGNORE_ERRORS);
 }
 
 static void vmxnet3_pci_uninit(PCIDevice *pci_dev)
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index 316fca9bc1..44da2caf51 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -917,7 +917,8 @@ static void fw_cfg_init1(DeviceState *dev)
 
     assert(!object_resolve_path(FW_CFG_PATH, NULL));
 
-    object_property_add_child(OBJECT(machine), FW_CFG_NAME, OBJECT(s), NULL);
+    object_property_add_child(OBJECT(machine), FW_CFG_NAME, OBJECT(s),
+                              IGNORE_ERRORS);
 
     qdev_init_nofail(dev);
 
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
index 77f64b4ae7..e069ba03da 100644
--- a/hw/pci-host/gpex.c
+++ b/hw/pci-host/gpex.c
@@ -94,7 +94,7 @@ static void gpex_host_initfn(Object *obj)
     GPEXRootState *root = &s->gpex_root;
 
     object_initialize(root, sizeof(*root), TYPE_GPEX_ROOT_DEVICE);
-    object_property_add_child(obj, "gpex_root", OBJECT(root), NULL);
+    object_property_add_child(obj, "gpex_root", OBJECT(root), IGNORE_ERRORS);
     qdev_prop_set_uint32(DEVICE(root), "addr", PCI_DEVFN(0, 0));
     qdev_prop_set_bit(DEVICE(root), "multifunction", false);
 }
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
index 4ce201ea65..98f3810cc6 100644
--- a/hw/pci-host/piix.c
+++ b/hw/pci-host/piix.c
@@ -275,19 +275,19 @@ static void i440fx_pcihost_initfn(Object *obj)
 
     object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "int",
                         i440fx_pcihost_get_pci_hole_start,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 
     object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "int",
                         i440fx_pcihost_get_pci_hole_end,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 
     object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "int",
                         i440fx_pcihost_get_pci_hole64_start,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 
     object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "int",
                         i440fx_pcihost_get_pci_hole64_end,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 }
 
 static void i440fx_pcihost_realize(DeviceState *dev, Error **errp)
@@ -306,7 +306,7 @@ static void i440fx_realize(PCIDevice *dev, Error **errp)
 {
     dev->config[I440FX_SMRAM] = 0x02;
 
-    if (object_property_get_bool(qdev_get_machine(), "iommu", NULL)) {
+    if (object_property_get_bool(qdev_get_machine(), "iommu", IGNORE_ERRORS)) {
         error_report("warning: i440fx doesn't support emulated iommu");
     }
 }
@@ -337,7 +337,8 @@ PCIBus *i440fx_init(const char *host_type, const char *pci_type,
     b = pci_bus_new(dev, NULL, pci_address_space,
                     address_space_io, 0, TYPE_PCI_BUS);
     s->bus = b;
-    object_property_add_child(qdev_get_machine(), "i440fx", OBJECT(dev), NULL);
+    object_property_add_child(qdev_get_machine(), "i440fx", OBJECT(dev),
+                              IGNORE_ERRORS);
     qdev_init_nofail(dev);
 
     d = pci_create_simple(b, 0, pci_type);
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
index 900a6edfcf..f3a8afcd9f 100644
--- a/hw/pci-host/prep.c
+++ b/hw/pci-host/prep.c
@@ -290,7 +290,7 @@ static void raven_pcihost_initfn(Object *obj)
     pci_dev = DEVICE(&s->pci_dev);
     qdev_set_parent_bus(pci_dev, BUS(&s->pci_bus));
     object_property_set_int(OBJECT(&s->pci_dev), PCI_DEVFN(0, 0), "addr",
-                            NULL);
+                            IGNORE_ERRORS);
     qdev_prop_set_bit(pci_dev, "multifunction", false);
 }
 
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index cd5c49616e..65eba73939 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -172,45 +172,50 @@ static void q35_host_initfn(Object *obj)
                           "pci-conf-data", 4);
 
     object_initialize(&s->mch, sizeof(s->mch), TYPE_MCH_PCI_DEVICE);
-    object_property_add_child(OBJECT(s), "mch", OBJECT(&s->mch), NULL);
+    object_property_add_child(OBJECT(s), "mch", OBJECT(&s->mch),
+                              IGNORE_ERRORS);
     qdev_prop_set_uint32(DEVICE(&s->mch), "addr", PCI_DEVFN(0, 0));
     qdev_prop_set_bit(DEVICE(&s->mch), "multifunction", false);
 
     object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "int",
                         q35_host_get_pci_hole_start,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 
     object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "int",
                         q35_host_get_pci_hole_end,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 
     object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "int",
                         q35_host_get_pci_hole64_start,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 
     object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "int",
                         q35_host_get_pci_hole64_end,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 
     object_property_add(obj, PCIE_HOST_MCFG_SIZE, "int",
                         q35_host_get_mmcfg_size,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 
     object_property_add_link(obj, MCH_HOST_PROP_RAM_MEM, TYPE_MEMORY_REGION,
                              (Object **) &s->mch.ram_memory,
-                             qdev_prop_allow_set_link_before_realize, 0, NULL);
+                             qdev_prop_allow_set_link_before_realize, 0,
+                             IGNORE_ERRORS);
 
     object_property_add_link(obj, MCH_HOST_PROP_PCI_MEM, TYPE_MEMORY_REGION,
                              (Object **) &s->mch.pci_address_space,
-                             qdev_prop_allow_set_link_before_realize, 0, NULL);
+                             qdev_prop_allow_set_link_before_realize, 0,
+                             IGNORE_ERRORS);
 
     object_property_add_link(obj, MCH_HOST_PROP_SYSTEM_MEM, TYPE_MEMORY_REGION,
                              (Object **) &s->mch.system_memory,
-                             qdev_prop_allow_set_link_before_realize, 0, NULL);
+                             qdev_prop_allow_set_link_before_realize, 0,
+                             IGNORE_ERRORS);
 
     object_property_add_link(obj, MCH_HOST_PROP_IO_MEM, TYPE_MEMORY_REGION,
                              (Object **) &s->mch.address_space_io,
-                             qdev_prop_allow_set_link_before_realize, 0, NULL);
+                             qdev_prop_allow_set_link_before_realize, 0,
+                             IGNORE_ERRORS);
 
     /* Leave enough space for the biggest MCFG BAR */
     /* TODO: this matches current bios behaviour, but
diff --git a/hw/pci-host/xilinx-pcie.c b/hw/pci-host/xilinx-pcie.c
index c7ff5fb277..0cc54f167d 100644
--- a/hw/pci-host/xilinx-pcie.c
+++ b/hw/pci-host/xilinx-pcie.c
@@ -121,7 +121,7 @@ static void xilinx_pcie_host_realize(DeviceState *dev, Error **errp)
     memory_region_set_enabled(&s->mmio, false);
 
     /* dummy I/O region */
-    memory_region_init_ram(&s->io, OBJECT(s), "io", 16, NULL);
+    memory_region_init_ram(&s->io, OBJECT(s), "io", 16, IGNORE_ERRORS);
     memory_region_set_enabled(&s->io, false);
 
     /* interrupt out */
@@ -150,7 +150,7 @@ static void xilinx_pcie_host_init(Object *obj)
     XilinxPCIERoot *root = &s->root;
 
     object_initialize(root, sizeof(*root), TYPE_XILINX_PCIE_ROOT);
-    object_property_add_child(obj, "root", OBJECT(root), NULL);
+    object_property_add_child(obj, "root", OBJECT(root), IGNORE_ERRORS);
     qdev_prop_set_uint32(DEVICE(root), "addr", PCI_DEVFN(0, 0));
     qdev_prop_set_bit(DEVICE(root), "multifunction", false);
 }
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 84d63728e1..a848d1508b 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2018,7 +2018,7 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
     pci_add_option_rom(pci_dev, is_default_rom, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
-        pci_qdev_unrealize(DEVICE(pci_dev), NULL);
+        pci_qdev_unrealize(DEVICE(pci_dev), IGNORE_ERRORS);
         return;
     }
 }
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index 18e634f577..15bd92086c 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -427,7 +427,7 @@ void pcie_cap_slot_init(PCIDevice *dev, uint16_t slot)
     dev->exp.hpev_notified = false;
 
     qbus_set_hotplug_handler(BUS(pci_bridge_get_sec_bus(PCI_BRIDGE(dev))),
-                             DEVICE(dev), NULL);
+                             DEVICE(dev), IGNORE_ERRORS);
 }
 
 void pcie_cap_slot_reset(PCIDevice *dev)
diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
index 42fafac91b..844bc97737 100644
--- a/hw/pci/shpc.c
+++ b/hw/pci/shpc.c
@@ -646,7 +646,7 @@ int shpc_init(PCIDevice *d, PCIBus *sec_bus, MemoryRegion *bar, unsigned offset)
     shpc_cap_update_dword(d);
     memory_region_add_subregion(bar, offset, &shpc->mmio);
 
-    qbus_set_hotplug_handler(BUS(sec_bus), DEVICE(d), NULL);
+    qbus_set_hotplug_handler(BUS(sec_bus), DEVICE(d), IGNORE_ERRORS);
 
     d->cap_present |= QEMU_PCI_CAP_SHPC;
     return 0;
diff --git a/hw/pcmcia/pxa2xx.c b/hw/pcmcia/pxa2xx.c
index 5833358f87..efa8bbf8ab 100644
--- a/hw/pcmcia/pxa2xx.c
+++ b/hw/pcmcia/pxa2xx.c
@@ -189,7 +189,7 @@ static void pxa2xx_pcmcia_initfn(Object *obj)
     object_property_add_link(obj, "card", TYPE_PCMCIA_CARD,
                              (Object **)&s->card,
                              NULL, /* read-only property */
-                             0, NULL);
+                             0, IGNORE_ERRORS);
 }
 
 /* Insert a new card into a slot */
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 62f1857206..04621d5534 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -872,7 +872,7 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
 
     dev = qdev_create(NULL, "e500-ccsr");
     object_property_add_child(qdev_get_machine(), "e500-ccsr",
-                              OBJECT(dev), NULL);
+                              OBJECT(dev), IGNORE_ERRORS);
     qdev_init_nofail(dev);
     ccsr = CCSR(dev);
     ccsr_addr_space = &ccsr->ccsr_space;
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 89b6801f67..655f1da14c 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -833,15 +833,15 @@ static void pnv_chip_init(Object *obj)
     chip->xscom_base = pcc->xscom_base;
 
     object_initialize(&chip->lpc, sizeof(chip->lpc), TYPE_PNV_LPC);
-    object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), NULL);
+    object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), IGNORE_ERRORS);
 
     object_initialize(&chip->psi, sizeof(chip->psi), TYPE_PNV_PSI);
-    object_property_add_child(obj, "psi", OBJECT(&chip->psi), NULL);
+    object_property_add_child(obj, "psi", OBJECT(&chip->psi), IGNORE_ERRORS);
     object_property_add_const_link(OBJECT(&chip->psi), "xics",
                                    OBJECT(qdev_get_machine()), &error_abort);
 
     object_initialize(&chip->occ, sizeof(chip->occ), TYPE_PNV_OCC);
-    object_property_add_child(obj, "occ", OBJECT(&chip->occ), NULL);
+    object_property_add_child(obj, "occ", OBJECT(&chip->occ), IGNORE_ERRORS);
     object_property_add_const_link(OBJECT(&chip->occ), "psi",
                                    OBJECT(&chip->psi), &error_abort);
 
@@ -1113,10 +1113,10 @@ static void powernv_machine_class_props_init(ObjectClass *oc)
 {
     object_class_property_add(oc, "num-chips", "uint32_t",
                               pnv_get_num_chips, pnv_set_num_chips,
-                              NULL, NULL, NULL);
+                              NULL, NULL, IGNORE_ERRORS);
     object_class_property_set_description(oc, "num-chips",
                               "Specifies the number of processor chips",
-                              NULL);
+                              IGNORE_ERRORS);
 }
 
 static void powernv_machine_class_init(ObjectClass *oc, void *data)
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 1b7ec70f03..161f7dbc62 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -119,7 +119,7 @@ static void pnv_core_realize_child(Object *child, XICSFabric *xi, Error **errp)
     Object *obj;
 
     obj = object_new(TYPE_PNV_ICP);
-    object_property_add_child(OBJECT(cpu), "icp", obj, NULL);
+    object_property_add_child(OBJECT(cpu), "icp", obj, IGNORE_ERRORS);
     object_property_add_const_link(obj, "xics", OBJECT(xi), &error_abort);
     object_property_set_bool(obj, true, "realized", &local_err);
     if (local_err) {
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 2bf5bfe3fd..5dd697bdb4 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -446,7 +446,8 @@ static void pnv_psi_init(Object *obj)
     PnvPsi *psi = PNV_PSI(obj);
 
     object_initialize(&psi->ics, sizeof(psi->ics), TYPE_ICS_SIMPLE);
-    object_property_add_child(obj, "ics-psi", OBJECT(&psi->ics), NULL);
+    object_property_add_child(obj, "ics-psi", OBJECT(&psi->ics),
+                              IGNORE_ERRORS);
 }
 
 static const uint8_t irq_to_xivr[] = {
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index a917be6ca3..bc7b2fd287 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -598,7 +598,8 @@ static void ppc_prep_init(MachineState *machine)
     qdev_prop_set_string(dev, "bios-name", bios_name);
     qdev_prop_set_uint32(dev, "elf-machine", PPC_ELF_MACHINE);
     pcihost = PCI_HOST_BRIDGE(dev);
-    object_property_add_child(qdev_get_machine(), "raven", OBJECT(dev), NULL);
+    object_property_add_child(qdev_get_machine(), "raven", OBJECT(dev),
+                              IGNORE_ERRORS);
     qdev_init_nofail(dev);
     pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci.0");
     if (pci_bus == NULL) {
@@ -755,7 +756,8 @@ static void ibm_40p_init(MachineState *machine)
     qdev_prop_set_string(dev, "bios-name", bios_name);
     qdev_prop_set_uint32(dev, "elf-machine", PPC_ELF_MACHINE);
     pcihost = SYS_BUS_DEVICE(dev);
-    object_property_add_child(qdev_get_machine(), "raven", OBJECT(dev), NULL);
+    object_property_add_child(qdev_get_machine(), "raven", OBJECT(dev),
+                              IGNORE_ERRORS);
     qdev_init_nofail(dev);
     pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0"));
     if (!pci_bus) {
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 91b4057933..e07fd88a55 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -659,7 +659,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
             dynamic_memory[1] = cpu_to_be32(addr & 0xffffffff);
             dynamic_memory[2] = cpu_to_be32(spapr_drc_index(drc));
             dynamic_memory[3] = cpu_to_be32(0); /* reserved */
-            dynamic_memory[4] = cpu_to_be32(numa_get_node(addr, NULL));
+            dynamic_memory[4] = cpu_to_be32(numa_get_node(addr, IGNORE_ERRORS));
             if (memory_region_present(get_system_memory(), addr)) {
                 dynamic_memory[5] = cpu_to_be32(SPAPR_LMB_FLAGS_ASSIGNED);
             } else {
@@ -2481,19 +2481,20 @@ static void spapr_machine_initfn(Object *obj)
     spapr->htab_fd = -1;
     spapr->use_hotplug_event_source = true;
     object_property_add_str(obj, "kvm-type",
-                            spapr_get_kvm_type, spapr_set_kvm_type, NULL);
+                            spapr_get_kvm_type, spapr_set_kvm_type,
+                            IGNORE_ERRORS);
     object_property_set_description(obj, "kvm-type",
                                     "Specifies the KVM virtualization mode (HV, PR)",
-                                    NULL);
+                                    IGNORE_ERRORS);
     object_property_add_bool(obj, "modern-hotplug-events",
                             spapr_get_modern_hotplug_events,
                             spapr_set_modern_hotplug_events,
-                            NULL);
+                            IGNORE_ERRORS);
     object_property_set_description(obj, "modern-hotplug-events",
                                     "Use dedicated hotplug event mechanism in"
                                     " place of standard EPOW events when possible"
                                     " (required for memory hot-unplug support)",
-                                    NULL);
+                                    IGNORE_ERRORS);
 }
 
 static void spapr_machine_finalizefn(Object *obj)
@@ -2611,7 +2612,8 @@ static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
         return;
     }
 
-    mem_dev = object_property_get_str(OBJECT(dimm), PC_DIMM_MEMDEV_PROP, NULL);
+    mem_dev = object_property_get_str(OBJECT(dimm), PC_DIMM_MEMDEV_PROP,
+                                      IGNORE_ERRORS);
     if (mem_dev && !kvmppc_is_mem_backend_page_size_ok(mem_dev)) {
         error_setg(errp, "Memory backend has bad page size. "
                    "Use 'memory-backend-file' with correct mem-path.");
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 39e7f3080a..d7d0c0ee8e 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -360,7 +360,7 @@ static void attach(sPAPRDRConnector *drc, DeviceState *d, void *fdt,
     object_property_add_link(OBJECT(drc), "device",
                              object_get_typename(OBJECT(drc->dev)),
                              (Object **)(&drc->dev),
-                             NULL, 0, NULL);
+                             NULL, 0, IGNORE_ERRORS);
 }
 
 static void detach(sPAPRDRConnector *drc, DeviceState *d, Error **errp)
@@ -432,7 +432,7 @@ static void detach(sPAPRDRConnector *drc, DeviceState *d, Error **errp)
     g_free(drc->fdt);
     drc->fdt = NULL;
     drc->fdt_start_offset = 0;
-    object_property_del(OBJECT(drc), "device", NULL);
+    object_property_del(OBJECT(drc), "device", IGNORE_ERRORS);
     drc->dev = NULL;
 }
 
@@ -592,8 +592,8 @@ sPAPRDRConnector *spapr_dr_connector_new(Object *owner, const char *type,
     drc->owner = owner;
     prop_name = g_strdup_printf("dr-connector[%"PRIu32"]",
                                 spapr_drc_index(drc));
-    object_property_add_child(owner, prop_name, OBJECT(drc), NULL);
-    object_property_set_bool(OBJECT(drc), true, "realized", NULL);
+    object_property_add_child(owner, prop_name, OBJECT(drc), IGNORE_ERRORS);
+    object_property_set_bool(OBJECT(drc), true, "realized", IGNORE_ERRORS);
     g_free(prop_name);
 
     /* human-readable name for a DRC to encode into the DT
@@ -647,12 +647,12 @@ static void spapr_dr_connector_instance_init(Object *obj)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
 
-    object_property_add_uint32_ptr(obj, "id", &drc->id, NULL);
+    object_property_add_uint32_ptr(obj, "id", &drc->id, IGNORE_ERRORS);
     object_property_add(obj, "index", "uint32", prop_get_index,
-                        NULL, NULL, NULL, NULL);
-    object_property_add_str(obj, "name", prop_get_name, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
+    object_property_add_str(obj, "name", prop_get_name, NULL, IGNORE_ERRORS);
     object_property_add(obj, "fdt", "struct", prop_get_fdt,
-                        NULL, NULL, NULL, NULL);
+                        NULL, NULL, NULL, IGNORE_ERRORS);
 }
 
 static void spapr_dr_connector_class_init(ObjectClass *k, void *data)
@@ -823,7 +823,8 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner,
             continue;
         }
 
-        obj = object_property_get_link(root_container, prop->name, NULL);
+        obj = object_property_get_link(root_container, prop->name,
+                                       IGNORE_ERRORS);
         drc = SPAPR_DR_CONNECTOR(obj);
         drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index d587772b9c..bee492de12 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -323,9 +323,9 @@ sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn)
     tcet->liobn = liobn;
 
     snprintf(tmp, sizeof(tmp), "tce-table-%x", liobn);
-    object_property_add_child(OBJECT(owner), tmp, OBJECT(tcet), NULL);
+    object_property_add_child(OBJECT(owner), tmp, OBJECT(tcet), IGNORE_ERRORS);
 
-    object_property_set_bool(OBJECT(tcet), true, "realized", NULL);
+    object_property_set_bool(OBJECT(tcet), true, "realized", IGNORE_ERRORS);
 
     return tcet;
 }
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 0c181bbca5..b0c58ad3f1 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -760,7 +760,7 @@ static char *spapr_phb_vfio_get_loc_code(sPAPRPHBState *sphb,  PCIDevice *pdev)
     char *path = NULL, *buf = NULL, *host = NULL;
 
     /* Get the PCI VFIO host id */
-    host = object_property_get_str(OBJECT(pdev), "host", NULL);
+    host = object_property_get_str(OBJECT(pdev), "host", IGNORE_ERRORS);
     if (!host) {
         goto err_out;
     }
@@ -1697,7 +1697,7 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
                            &sphb->memspace, &sphb->iospace,
                            PCI_DEVFN(0, 0), PCI_NUM_PINS, TYPE_PCI_BUS);
     phb->bus = bus;
-    qbus_set_hotplug_handler(BUS(phb->bus), DEVICE(sphb), NULL);
+    qbus_set_hotplug_handler(BUS(phb->bus), DEVICE(sphb), IGNORE_ERRORS);
 
     /*
      * Initialize PHB address space.
diff --git a/hw/ppc/spapr_rng.c b/hw/ppc/spapr_rng.c
index 80515eb54d..1d0968358e 100644
--- a/hw/ppc/spapr_rng.c
+++ b/hw/ppc/spapr_rng.c
@@ -106,10 +106,10 @@ static void spapr_rng_instance_init(Object *obj)
     object_property_add_link(obj, "rng", TYPE_RNG_BACKEND,
                              (Object **)&rngstate->backend,
                              object_property_allow_set_link,
-                             OBJ_PROP_LINK_UNREF_ON_RELEASE, NULL);
+                             OBJ_PROP_LINK_UNREF_ON_RELEASE, IGNORE_ERRORS);
     object_property_set_description(obj, "rng",
                                     "ID of the random number generator backend",
-                                    NULL);
+                                    IGNORE_ERRORS);
 }
 
 static void spapr_rng_realize(DeviceState *dev, Error **errp)
diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
index 7e250dcbaf..5f4489ac1b 100644
--- a/hw/ppc/spapr_rtc.c
+++ b/hw/ppc/spapr_rtc.c
@@ -146,7 +146,8 @@ static void spapr_rtc_realize(DeviceState *dev, Error **errp)
     rtc_ns = qemu_clock_get_ns(rtc_clock);
     rtc->ns_offset = host_s * NANOSECONDS_PER_SECOND - rtc_ns;
 
-    object_property_add_tm(OBJECT(rtc), "date", spapr_rtc_qom_date, NULL);
+    object_property_add_tm(OBJECT(rtc), "date", spapr_rtc_qom_date,
+                           IGNORE_ERRORS);
 }
 
 static const VMStateDescription vmstate_spapr_rtc = {
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 34b2faf013..2f2bf8b45d 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -354,12 +354,12 @@ static void init_event_facility(Object *obj)
                         TYPE_SCLP_EVENTS_BUS, sdev, NULL);
 
     new = object_new(TYPE_SCLP_QUIESCE);
-    object_property_add_child(obj, TYPE_SCLP_QUIESCE, new, NULL);
+    object_property_add_child(obj, TYPE_SCLP_QUIESCE, new, IGNORE_ERRORS);
     object_unref(new);
     qdev_set_parent_bus(DEVICE(new), &event_facility->sbus.qbus);
 
     new = object_new(TYPE_SCLP_CPU_HOTPLUG);
-    object_property_add_child(obj, TYPE_SCLP_CPU_HOTPLUG, new, NULL);
+    object_property_add_child(obj, TYPE_SCLP_CPU_HOTPLUG, new, IGNORE_ERRORS);
     object_unref(new);
     qdev_set_parent_bus(DEVICE(new), &event_facility->sbus.qbus);
     /* the facility will automatically realize the devices via the bus */
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 4e6469db0f..1a9fd04692 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -282,7 +282,8 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
 int s390_ipl_set_loadparm(uint8_t *loadparm)
 {
     MachineState *machine = MACHINE(qdev_get_machine());
-    char *lp = object_property_get_str(OBJECT(machine), "loadparm", NULL);
+    char *lp = object_property_get_str(OBJECT(machine), "loadparm",
+                                       IGNORE_ERRORS);
 
     if (lp) {
         int i;
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 5651483781..aa4d7f5aa4 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -189,7 +189,7 @@ void s390_pci_sclp_deconfigure(SCCB *sccb)
         rc = SCLP_RC_NORMAL_COMPLETION;
 
         if (pbdev->release_timer) {
-            qdev_unplug(DEVICE(pbdev->pdev), NULL);
+            qdev_unplug(DEVICE(pbdev->pdev), IGNORE_ERRORS);
         }
     }
 out:
@@ -569,11 +569,11 @@ static int s390_pcihost_init(SysBusDevice *dev)
     pci_setup_iommu(b, s390_pci_dma_iommu, s);
 
     bus = BUS(b);
-    qbus_set_hotplug_handler(bus, DEVICE(dev), NULL);
+    qbus_set_hotplug_handler(bus, DEVICE(dev), IGNORE_ERRORS);
     phb->bus = b;
 
     s->bus = S390_PCI_BUS(qbus_create(TYPE_S390_PCI_BUS, DEVICE(s), NULL));
-    qbus_set_hotplug_handler(BUS(s->bus), DEVICE(s), NULL);
+    qbus_set_hotplug_handler(BUS(s->bus), DEVICE(s), IGNORE_ERRORS);
 
     s->iommu_table = g_hash_table_new_full(g_int64_hash, g_int64_equal,
                                            NULL, g_free);
@@ -761,7 +761,7 @@ static void s390_pcihost_timer_cb(void *opaque)
     pbdev->state = ZPCI_FS_STANDBY;
     s390_pci_generate_plug_event(HP_EVENT_CONFIGURED_TO_STBRES,
                                  pbdev->fh, pbdev->fid);
-    qdev_unplug(DEVICE(pbdev), NULL);
+    qdev_unplug(DEVICE(pbdev), IGNORE_ERRORS);
 }
 
 static void s390_pcihost_hot_unplug(HotplugHandler *hotplug_dev,
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index 2db2f9c8a8..251882a9dc 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -41,7 +41,7 @@ void s390_skeys_init(void)
         obj = object_new(TYPE_QEMU_S390_SKEYS);
     }
     object_property_add_child(qdev_get_machine(), TYPE_S390_SKEYS,
-                              obj, NULL);
+                              obj, IGNORE_ERRORS);
     object_unref(obj);
 
     qdev_init_nofail(DEVICE(obj));
@@ -392,8 +392,8 @@ static void s390_skeys_instance_init(Object *obj)
 {
     object_property_add_bool(obj, "migration-enabled",
                              s390_skeys_get_migration_enabled,
-                             s390_skeys_set_migration_enabled, NULL);
-    object_property_set_bool(obj, true, "migration-enabled", NULL);
+                             s390_skeys_set_migration_enabled, IGNORE_ERRORS);
+    object_property_set_bool(obj, true, "migration-enabled", IGNORE_ERRORS);
 }
 
 static void s390_skeys_class_init(ObjectClass *oc, void *data)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index a806345276..ae81723914 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -128,7 +128,7 @@ static void ccw_init(MachineState *machine)
 
     dev = qdev_create(NULL, TYPE_S390_PCI_HOST_BRIDGE);
     object_property_add_child(qdev_get_machine(), TYPE_S390_PCI_HOST_BRIDGE,
-                              OBJECT(dev), NULL);
+                              OBJECT(dev), IGNORE_ERRORS);
     qdev_init_nofail(dev);
 
     /* register hypercalls */
@@ -331,33 +331,33 @@ static inline void s390_machine_initfn(Object *obj)
 {
     object_property_add_bool(obj, "aes-key-wrap",
                              machine_get_aes_key_wrap,
-                             machine_set_aes_key_wrap, NULL);
+                             machine_set_aes_key_wrap, IGNORE_ERRORS);
     object_property_set_description(obj, "aes-key-wrap",
             "enable/disable AES key wrapping using the CPACF wrapping key",
-            NULL);
-    object_property_set_bool(obj, true, "aes-key-wrap", NULL);
+            IGNORE_ERRORS);
+    object_property_set_bool(obj, true, "aes-key-wrap", IGNORE_ERRORS);
 
     object_property_add_bool(obj, "dea-key-wrap",
                              machine_get_dea_key_wrap,
-                             machine_set_dea_key_wrap, NULL);
+                             machine_set_dea_key_wrap, IGNORE_ERRORS);
     object_property_set_description(obj, "dea-key-wrap",
             "enable/disable DEA key wrapping using the CPACF wrapping key",
-            NULL);
-    object_property_set_bool(obj, true, "dea-key-wrap", NULL);
+            IGNORE_ERRORS);
+    object_property_set_bool(obj, true, "dea-key-wrap", IGNORE_ERRORS);
     object_property_add_str(obj, "loadparm",
-            machine_get_loadparm, machine_set_loadparm, NULL);
+            machine_get_loadparm, machine_set_loadparm, IGNORE_ERRORS);
     object_property_set_description(obj, "loadparm",
             "Up to 8 chars in set of [A-Za-z0-9. ] (lower case chars converted"
             " to upper case) to pass to machine loader, boot manager,"
             " and guest kernel",
-            NULL);
+            IGNORE_ERRORS);
     object_property_add_bool(obj, "s390-squash-mcss",
                              machine_get_squash_mcss,
-                             machine_set_squash_mcss, NULL);
+                             machine_set_squash_mcss, IGNORE_ERRORS);
     object_property_set_description(obj, "s390-squash-mcss",
             "enable/disable squashing subchannels into the default css",
-            NULL);
-    object_property_set_bool(obj, false, "s390-squash-mcss", NULL);
+            IGNORE_ERRORS);
+    object_property_set_bool(obj, false, "s390-squash-mcss", IGNORE_ERRORS);
 }
 
 static const TypeInfo ccw_machine_info = {
diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
index afa4148e6b..79a1fa3b49 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -82,7 +82,7 @@ void s390_init_ipl_dev(const char *kernel_filename,
     qdev_prop_set_string(dev, "netboot_fw", netboot_fw);
     qdev_prop_set_bit(dev, "enforce_bios", enforce_bios);
     object_property_add_child(qdev_get_machine(), TYPE_S390_IPL,
-                              new, NULL);
+                              new, IGNORE_ERRORS);
     object_unref(new);
     qdev_init_nofail(dev);
 }
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index 83d6023894..1bd6b568f4 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -478,7 +478,7 @@ void s390_sclp_init(void)
     Object *new = object_new(TYPE_SCLP);
 
     object_property_add_child(qdev_get_machine(), TYPE_SCLP, new,
-                              NULL);
+                              IGNORE_ERRORS);
     object_unref(OBJECT(new));
     qdev_init_nofail(DEVICE(new));
 }
@@ -569,7 +569,8 @@ static void sclp_init(Object *obj)
     Object *new;
 
     new = object_new(TYPE_SCLP_EVENT_FACILITY);
-    object_property_add_child(obj, TYPE_SCLP_EVENT_FACILITY, new, NULL);
+    object_property_add_child(obj, TYPE_SCLP_EVENT_FACILITY, new,
+                              IGNORE_ERRORS);
     object_unref(new);
     sclp->event_facility = EVENT_FACILITY(new);
 
@@ -612,7 +613,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void)
     dev = qdev_create(NULL, TYPE_SCLP_MEMORY_HOTPLUG_DEV);
     object_property_add_child(qdev_get_machine(),
                               TYPE_SCLP_MEMORY_HOTPLUG_DEV,
-                              OBJECT(dev), NULL);
+                              OBJECT(dev), IGNORE_ERRORS);
     qdev_init_nofail(dev);
     return SCLP_MEMORY_HOTPLUG_DEV(object_resolve_path(
                                    TYPE_SCLP_MEMORY_HOTPLUG_DEV, NULL));
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index e6a6f74be3..9c56e17196 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -912,7 +912,7 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 
     object_property_set_link(OBJECT(dev),
                              OBJECT(dev->vdev.conf.rng), "rng",
-                             NULL);
+                             IGNORE_ERRORS);
 }
 
 static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
@@ -930,7 +930,7 @@ static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 
     object_property_set_link(OBJECT(vdev),
                              OBJECT(dev->vdev.conf.cryptodev), "cryptodev",
-                             NULL);
+                             IGNORE_ERRORS);
 }
 
 /* DeviceState to VirtioCcwDevice. Note: used on datapath,
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
index 804122ab05..e5a3e20a69 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
@@ -2366,7 +2366,7 @@ static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
 
     if (megasas_use_msix(s) &&
         msix_init(dev, 15, &s->mmio_io, b->mmio_bar, 0x2000,
-                  &s->mmio_io, b->mmio_bar, 0x3800, 0x68, NULL)) {
+                  &s->mmio_io, b->mmio_bar, 0x3800, 0x68, IGNORE_ERRORS)) {
         /* TODO: check msix_init's error, and should fail on msix=on */
         s->msix = ON_OFF_AUTO_OFF;
     }
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index f5574469c8..796ae562bf 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -234,7 +234,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
     driver = blk_is_sg(blk) ? "scsi-generic" : "scsi-disk";
     dev = qdev_create(&bus->qbus, driver);
     name = g_strdup_printf("legacy[%d]", unit);
-    object_property_add_child(OBJECT(bus), name, OBJECT(dev), NULL);
+    object_property_add_child(OBJECT(bus), name, OBJECT(dev), IGNORE_ERRORS);
     g_free(name);
 
     qdev_prop_set_uint32(dev, "scsi-id", unit);
@@ -242,10 +242,10 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
         object_property_set_int(OBJECT(dev), bootindex, "bootindex",
                                 &error_abort);
     }
-    if (object_property_find(OBJECT(dev), "removable", NULL)) {
+    if (object_property_find(OBJECT(dev), "removable", IGNORE_ERRORS)) {
         qdev_prop_set_bit(dev, "removable", removable);
     }
-    if (serial && object_property_find(OBJECT(dev), "serial", NULL)) {
+    if (serial && object_property_find(OBJECT(dev), "serial", IGNORE_ERRORS)) {
         qdev_prop_set_string(dev, "serial", serial);
     }
     qdev_prop_set_drive(dev, "drive", blk, &err);
@@ -2127,7 +2127,7 @@ static void scsi_dev_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &s->conf.bootindex,
                                   "bootindex", NULL,
-                                  &s->qdev, NULL);
+                                  &s->qdev, IGNORE_ERRORS);
 }
 
 static const TypeInfo scsi_device_type_info = {
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index cd4ab05233..c44d1045b6 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -262,7 +262,7 @@ static void vhost_scsi_instance_init(Object *obj)
     vsc->feature_bits = kernel_feature_bits;
 
     device_add_bootindex_property(obj, &vsc->bootindex, "bootindex", NULL,
-                                  DEVICE(vsc), NULL);
+                                  DEVICE(vsc), IGNORE_ERRORS);
 }
 
 static const TypeInfo vhost_scsi_info = {
diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
index 4a106da856..e5133595dc 100644
--- a/hw/scsi/vmw_pvscsi.c
+++ b/hw/scsi/vmw_pvscsi.c
@@ -1065,7 +1065,7 @@ pvscsi_init_msi(PVSCSIState *s)
     PCIDevice *d = PCI_DEVICE(s);
 
     res = msi_init(d, PVSCSI_MSI_OFFSET(s), PVSCSI_MSIX_NUM_VECTORS,
-                   PVSCSI_USE_64BIT, PVSCSI_PER_VECTOR_MASK, NULL);
+                   PVSCSI_USE_64BIT, PVSCSI_PER_VECTOR_MASK, IGNORE_ERRORS);
     if (res < 0) {
         trace_pvscsi_init_msi_fail(res);
         s->msi_used = false;
diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
index 4c1986b97f..b7b9e0f754 100644
--- a/hw/timer/mc146818rtc.c
+++ b/hw/timer/mc146818rtc.c
@@ -989,10 +989,10 @@ static void rtc_realizefn(DeviceState *dev, Error **errp)
     qdev_set_legacy_instance_id(dev, base, 3);
     qemu_register_reset(rtc_reset, s);
 
-    object_property_add_tm(OBJECT(s), "date", rtc_get_date, NULL);
+    object_property_add_tm(OBJECT(s), "date", rtc_get_date, IGNORE_ERRORS);
 
     object_property_add_alias(qdev_get_machine(), "rtc-time",
-                              OBJECT(s), "date", NULL);
+                              OBJECT(s), "date", IGNORE_ERRORS);
 
     qdev_init_gpio_out(dev, &s->irq, 1);
 }
@@ -1050,7 +1050,7 @@ static void rtc_class_initfn(ObjectClass *klass, void *data)
 
 static void rtc_finalize(Object *obj)
 {
-    object_property_del(qdev_get_machine(), "rtc", NULL);
+    object_property_del(qdev_get_machine(), "rtc", IGNORE_ERRORS);
 }
 
 static const TypeInfo mc146818rtc_info = {
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 5939b273b9..c25247e3cb 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -270,7 +270,7 @@ static void usb_qdev_realize(DeviceState *qdev, Error **errp)
     if (dev->auto_attach) {
         usb_device_attach(dev, &local_err);
         if (local_err) {
-            usb_qdev_unrealize(qdev, NULL);
+            usb_qdev_unrealize(qdev, IGNORE_ERRORS);
             error_propagate(errp, local_err);
             return;
         }
@@ -446,7 +446,7 @@ void usb_claim_port(USBDevice *dev, Error **errp)
     } else {
         if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
             /* Create a new hub and chain it on */
-            usb_try_create_simple(bus, "usb-hub", NULL);
+            usb_try_create_simple(bus, "usb-hub", IGNORE_ERRORS);
         }
         if (bus->nfree == 0) {
             error_setg(errp, "tried to attach usb device %s to a bus "
@@ -776,11 +776,11 @@ static void usb_device_instance_init(Object *obj)
     if (klass->attached_settable) {
         object_property_add_bool(obj, "attached",
                                  usb_get_attached, usb_set_attached,
-                                 NULL);
+                                 IGNORE_ERRORS);
     } else {
         object_property_add_bool(obj, "attached",
                                  usb_get_attached, NULL,
-                                 NULL);
+                                 IGNORE_ERRORS);
     }
 }
 
diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c
index c40019df96..5b31791392 100644
--- a/hw/usb/dev-hid.c
+++ b/hw/usb/dev-hid.c
@@ -725,7 +725,8 @@ static void usb_hid_initfn(USBDevice *dev, int kind,
     us->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
     hid_init(&us->hid, kind, usb_hid_changed);
     if (us->display && us->hid.s) {
-        qemu_input_handler_bind(us->hid.s, us->display, us->head, NULL);
+        qemu_input_handler_bind(us->hid.s, us->display, us->head,
+                                IGNORE_ERRORS);
     }
 }
 
diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c
index 85fc81bf43..4c2536ed8c 100644
--- a/hw/usb/dev-network.c
+++ b/hw/usb/dev-network.c
@@ -1379,7 +1379,7 @@ static void usb_net_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &s->conf.bootindex,
                                   "bootindex", "/ethernet-phy@0",
-                                  &dev->qdev, NULL);
+                                  &dev->qdev, IGNORE_ERRORS);
 }
 
 static USBDevice *usb_net_init(USBBus *bus, const char *cmdline)
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index 8a61ec94c8..b3173553c5 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -683,7 +683,7 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename)
     /* parse -usbdevice disk: syntax into drive opts */
     do {
         snprintf(id, sizeof(id), "usb%d", nr++);
-        opts = qemu_opts_create(qemu_find_opts("drive"), id, 1, NULL);
+        opts = qemu_opts_create(qemu_find_opts("drive"), id, 1, IGNORE_ERRORS);
     } while (!opts);
 
     p1 = strchr(filename, ':');
@@ -827,8 +827,8 @@ static void usb_msd_instance_init(Object *obj)
 {
     object_property_add(obj, "bootindex", "int32",
                         usb_msd_get_bootindex,
-                        usb_msd_set_bootindex, NULL, NULL, NULL);
-    object_property_set_int(obj, -1, "bootindex", NULL);
+                        usb_msd_set_bootindex, NULL, NULL, IGNORE_ERRORS);
+    object_property_set_int(obj, -1, "bootindex", IGNORE_ERRORS);
 }
 
 static void usb_msd_class_initfn_bot(ObjectClass *klass, void *data)
diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
index 63491111e5..6a19b23ebe 100644
--- a/hw/usb/hcd-ehci-pci.c
+++ b/hw/usb/hcd-ehci-pci.c
@@ -66,7 +66,7 @@ static void usb_ehci_pci_realize(PCIDevice *dev, Error **errp)
     s->irq = pci_allocate_irq(dev);
     s->as = pci_get_address_space(dev);
 
-    usb_ehci_realize(s, DEVICE(dev), NULL);
+    usb_ehci_realize(s, DEVICE(dev), IGNORE_ERRORS);
     pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mem);
 }
 
@@ -103,7 +103,7 @@ static void usb_ehci_pci_exit(PCIDevice *dev)
     EHCIPCIState *i = PCI_EHCI(dev);
     EHCIState *s = &i->ehci;
 
-    usb_ehci_unrealize(s, DEVICE(dev), NULL);
+    usb_ehci_unrealize(s, DEVICE(dev), IGNORE_ERRORS);
 
     g_free(s->irq);
     s->irq = NULL;
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index a0c7960a7b..05364b6955 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -3425,7 +3425,7 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
         msix_init(dev, xhci->numintrs,
                   &xhci->mem, 0, OFF_MSIX_TABLE,
                   &xhci->mem, 0, OFF_MSIX_PBA,
-                  0x90, NULL);
+                  0x90, IGNORE_ERRORS);
     }
 }
 
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index f9c8eafe06..c32ee8864c 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -1065,7 +1065,7 @@ static void usb_host_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &s->bootindex,
                                   "bootindex", NULL,
-                                  &udev->qdev, NULL);
+                                  &udev->qdev, IGNORE_ERRORS);
 }
 
 static void usb_host_unrealize(USBDevice *udev, Error **errp)
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
index aa22d69216..d50239e588 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -2521,7 +2521,7 @@ static void usbredir_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &dev->bootindex,
                                   "bootindex", NULL,
-                                  &udev->qdev, NULL);
+                                  &udev->qdev, IGNORE_ERRORS);
 }
 
 static const TypeInfo usbredir_dev_info = {
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 32aca77701..2d3bad68fc 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2936,7 +2936,7 @@ static void vfio_instance_init(Object *obj)
 
     device_add_bootindex_property(obj, &vdev->bootindex,
                                   "bootindex", NULL,
-                                  &pci_dev->qdev, NULL);
+                                  &pci_dev->qdev, IGNORE_ERRORS);
     vdev->host.domain = ~0U;
     vdev->host.bus = ~0U;
     vdev->host.slot = ~0U;
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index f9939baa45..c2ba3f991b 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -485,12 +485,12 @@ static void virtio_balloon_instance_init(Object *obj)
     VirtIOBalloon *s = VIRTIO_BALLOON(obj);
 
     object_property_add(obj, "guest-stats", "guest statistics",
-                        balloon_stats_get_all, NULL, NULL, s, NULL);
+                        balloon_stats_get_all, NULL, NULL, s, IGNORE_ERRORS);
 
     object_property_add(obj, "guest-stats-polling-interval", "int",
                         balloon_stats_get_poll_interval,
                         balloon_stats_set_poll_interval,
-                        NULL, s, NULL);
+                        NULL, s, IGNORE_ERRORS);
 }
 
 static const VMStateDescription vmstate_virtio_balloon = {
diff --git a/hw/virtio/virtio-crypto-pci.c b/hw/virtio/virtio-crypto-pci.c
index 422aca3a98..fe66425540 100644
--- a/hw/virtio/virtio-crypto-pci.c
+++ b/hw/virtio/virtio-crypto-pci.c
@@ -41,7 +41,7 @@ static void virtio_crypto_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     object_property_set_bool(OBJECT(vdev), true, "realized", errp);
     object_property_set_link(OBJECT(vcrypto),
                  OBJECT(vcrypto->vdev.conf.cryptodev), "cryptodev",
-                 NULL);
+                 IGNORE_ERRORS);
 }
 
 static void virtio_crypto_pci_class_init(ObjectClass *klass, void *data)
diff --git a/hw/virtio/virtio-crypto.c b/hw/virtio/virtio-crypto.c
index 0353eb6d5d..a4714af54a 100644
--- a/hw/virtio/virtio-crypto.c
+++ b/hw/virtio/virtio-crypto.c
@@ -916,7 +916,7 @@ static void virtio_crypto_instance_init(Object *obj)
                              TYPE_CRYPTODEV_BACKEND,
                              (Object **)&vcrypto->conf.cryptodev,
                              virtio_crypto_check_cryptodev_is_used,
-                             OBJ_PROP_LINK_UNREF_ON_RELEASE, NULL);
+                             OBJ_PROP_LINK_UNREF_ON_RELEASE, IGNORE_ERRORS);
 }
 
 static const TypeInfo virtio_crypto_info = {
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index f9b7244808..20b2fef683 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1686,7 +1686,7 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
 
     if (proxy->nvectors) {
         int err = msix_init_exclusive_bar(&proxy->pci_dev, proxy->nvectors,
-                                          proxy->msix_bar_idx, NULL);
+                                          proxy->msix_bar_idx, IGNORE_ERRORS);
         if (err) {
             /* Notice when a system that supports MSIx can't initialize it */
             if (err != -ENOTSUP) {
@@ -2384,7 +2384,7 @@ static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
 
     object_property_set_link(OBJECT(vrng),
                              OBJECT(vrng->vdev.conf.rng), "rng",
-                             NULL);
+                             IGNORE_ERRORS);
 }
 
 static void virtio_rng_pci_class_init(ObjectClass *klass, void *data)
diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c
index a6ee501051..e564e3b291 100644
--- a/hw/virtio/virtio-rng.c
+++ b/hw/virtio/virtio-rng.c
@@ -189,14 +189,14 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
         object_property_add_child(OBJECT(dev),
                                   "default-backend",
                                   OBJECT(vrng->conf.default_backend),
-                                  NULL);
+                                  IGNORE_ERRORS);
 
         /* The child property took a reference, we can safely drop ours now */
         object_unref(OBJECT(vrng->conf.default_backend));
 
         object_property_set_link(OBJECT(dev),
                                  OBJECT(vrng->conf.default_backend),
-                                 "rng", NULL);
+                                 "rng", IGNORE_ERRORS);
     }
 
     vrng->rng = vrng->conf.rng;
@@ -269,7 +269,7 @@ static void virtio_rng_initfn(Object *obj)
     object_property_add_link(obj, "rng", TYPE_RNG_BACKEND,
                              (Object **)&vrng->conf.rng,
                              qdev_prop_allow_set_link_before_realize,
-                             OBJ_PROP_LINK_UNREF_ON_RELEASE, NULL);
+                             OBJ_PROP_LINK_UNREF_ON_RELEASE, IGNORE_ERRORS);
 }
 
 static const TypeInfo virtio_rng_info = {
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 464947f76d..fd16ff7d9d 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -2223,7 +2223,8 @@ void virtio_instance_init_common(Object *proxy_obj, void *data,
     DeviceState *vdev = data;
 
     object_initialize(vdev, vdev_size, vdev_name);
-    object_property_add_child(proxy_obj, "virtio-backend", OBJECT(vdev), NULL);
+    object_property_add_child(proxy_obj, "virtio-backend", OBJECT(vdev),
+                              IGNORE_ERRORS);
     object_unref(OBJECT(vdev));
     qdev_alias_all_properties(vdev, proxy_obj);
 }
diff --git a/hw/xen/xen_pvdev.c b/hw/xen/xen_pvdev.c
index 5048430177..56e5a49923 100644
--- a/hw/xen/xen_pvdev.c
+++ b/hw/xen/xen_pvdev.c
@@ -310,7 +310,7 @@ void xen_pv_del_xendev(struct XenDevice *xendev)
 
     QTAILQ_REMOVE(&xendevs, xendev, next);
 
-    qdev_unplug(&xendev->qdev, NULL);
+    qdev_unplug(&xendev->qdev, IGNORE_ERRORS);
 }
 
 void xen_pv_insert_xendev(struct XenDevice *xendev)
diff --git a/io/channel-command.c b/io/channel-command.c
index 319c5ed50c..2eea0135b0 100644
--- a/io/channel-command.c
+++ b/io/channel-command.c
@@ -218,7 +218,7 @@ static void qio_channel_command_finalize(Object *obj)
     ioc->writefd = ioc->readfd = -1;
     if (ioc->pid > 0) {
 #ifndef WIN32
-        qio_channel_command_abort(ioc, NULL);
+        qio_channel_command_abort(ioc, IGNORE_ERRORS);
 #endif
     }
 }
diff --git a/io/channel-tls.c b/io/channel-tls.c
index 6182702dab..6350f5b25f 100644
--- a/io/channel-tls.c
+++ b/io/channel-tls.c
@@ -31,7 +31,7 @@ static ssize_t qio_channel_tls_write_handler(const char *buf,
     QIOChannelTLS *tioc = QIO_CHANNEL_TLS(opaque);
     ssize_t ret;
 
-    ret = qio_channel_write(tioc->master, buf, len, NULL);
+    ret = qio_channel_write(tioc->master, buf, len, IGNORE_ERRORS);
     if (ret == QIO_CHANNEL_ERR_BLOCK) {
         errno = EAGAIN;
         return -1;
@@ -49,7 +49,7 @@ static ssize_t qio_channel_tls_read_handler(char *buf,
     QIOChannelTLS *tioc = QIO_CHANNEL_TLS(opaque);
     ssize_t ret;
 
-    ret = qio_channel_read(tioc->master, buf, len, NULL);
+    ret = qio_channel_read(tioc->master, buf, len, IGNORE_ERRORS);
     if (ret == QIO_CHANNEL_ERR_BLOCK) {
         errno = EAGAIN;
         return -1;
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index b54bdffd8c..f46bd88274 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -119,7 +119,8 @@ typedef abi_int         target_pid_t;
 static const char *get_elf_platform(void)
 {
     static char elf_platform[] = "i386";
-    int family = object_property_get_int(OBJECT(thread_cpu), "family", NULL);
+    int family = object_property_get_int(OBJECT(thread_cpu), "family",
+                                         IGNORE_ERRORS);
     if (family > 6)
         family = 6;
     if (family >= 3)
diff --git a/linux-user/uname.c b/linux-user/uname.c
index 5199380d85..7c13669a32 100644
--- a/linux-user/uname.c
+++ b/linux-user/uname.c
@@ -56,7 +56,7 @@ const char *cpu_to_uname_machine(void *cpu_env)
 #elif defined(TARGET_I386) && !defined(TARGET_X86_64)
     /* see arch/x86/kernel/cpu/bugs.c: check_bugs(), 386, 486, 586, 686 */
     CPUState *cpu = ENV_GET_CPU((CPUX86State *)cpu_env);
-    int family = object_property_get_int(OBJECT(cpu), "family", NULL);
+    int family = object_property_get_int(OBJECT(cpu), "family", IGNORE_ERRORS);
     if (family == 4) {
         return "i486";
     }
diff --git a/migration/block.c b/migration/block.c
index 114cedbfd0..31ea6ec7c1 100644
--- a/migration/block.c
+++ b/migration/block.c
@@ -348,7 +348,8 @@ static int set_dirty_tracking(void)
     QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
         aio_context_acquire(blk_get_aio_context(bmds->blk));
         bmds->dirty_bitmap = bdrv_create_dirty_bitmap(blk_bs(bmds->blk),
-                                                      BLOCK_SIZE, NULL, NULL);
+                                                      BLOCK_SIZE, NULL,
+                                                      IGNORE_ERRORS);
         aio_context_release(blk_get_aio_context(bmds->blk));
         if (!bmds->dirty_bitmap) {
             ret = -errno;
diff --git a/migration/colo.c b/migration/colo.c
index 111b715546..d623d801e7 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -330,7 +330,7 @@ static int colo_do_checkpoint_transaction(MigrationState *s,
         goto out;
     }
     /* Reset channel-buffer directly */
-    qio_channel_io_seek(QIO_CHANNEL(bioc), 0, 0, NULL);
+    qio_channel_io_seek(QIO_CHANNEL(bioc), 0, 0, IGNORE_ERRORS);
     bioc->usage = 0;
 
     qemu_mutex_lock_iothread();
@@ -618,7 +618,7 @@ void *colo_process_incoming_thread(void *opaque)
             goto out;
         }
         bioc->usage = total_size;
-        qio_channel_io_seek(QIO_CHANNEL(bioc), 0, 0, NULL);
+        qio_channel_io_seek(QIO_CHANNEL(bioc), 0, 0, IGNORE_ERRORS);
 
         colo_send_message(mis->to_src_file, COLO_MESSAGE_VMSTATE_RECEIVED,
                      &local_err);
diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c
index a597c5f948..63b96c82c2 100644
--- a/migration/qemu-file-channel.c
+++ b/migration/qemu-file-channel.c
@@ -48,7 +48,7 @@ static ssize_t channel_writev_buffer(void *opaque,
 
     while (nlocal_iov > 0) {
         ssize_t len;
-        len = qio_channel_writev(ioc, local_iov, nlocal_iov, NULL);
+        len = qio_channel_writev(ioc, local_iov, nlocal_iov, IGNORE_ERRORS);
         if (len == QIO_CHANNEL_ERR_BLOCK) {
             qio_channel_wait(ioc, G_IO_OUT);
             continue;
@@ -78,7 +78,7 @@ static ssize_t channel_get_buffer(void *opaque,
     ssize_t ret;
 
     do {
-        ret = qio_channel_read(ioc, (char *)buf, size, NULL);
+        ret = qio_channel_read(ioc, (char *)buf, size, IGNORE_ERRORS);
         if (ret < 0) {
             if (ret == QIO_CHANNEL_ERR_BLOCK) {
                 qio_channel_yield(ioc, G_IO_IN);
@@ -96,7 +96,7 @@ static ssize_t channel_get_buffer(void *opaque,
 static int channel_close(void *opaque)
 {
     QIOChannel *ioc = QIO_CHANNEL(opaque);
-    qio_channel_close(ioc, NULL);
+    qio_channel_close(ioc, IGNORE_ERRORS);
     object_unref(OBJECT(ioc));
     return 0;
 }
@@ -118,7 +118,7 @@ static int channel_shutdown(void *opaque,
         } else {
             mode = QIO_CHANNEL_SHUTDOWN_WRITE;
         }
-        if (qio_channel_shutdown(ioc, mode, NULL) < 0) {
+        if (qio_channel_shutdown(ioc, mode, IGNORE_ERRORS) < 0) {
             /* XXX handler Error * object */
             return -EIO;
         }
@@ -132,7 +132,7 @@ static int channel_set_blocking(void *opaque,
 {
     QIOChannel *ioc = QIO_CHANNEL(opaque);
 
-    if (qio_channel_set_blocking(ioc, enabled, NULL) < 0) {
+    if (qio_channel_set_blocking(ioc, enabled, IGNORE_ERRORS) < 0) {
         return -1;
     }
     return 0;
diff --git a/migration/ram.c b/migration/ram.c
index b2ca242a3a..e210263f41 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -661,7 +661,8 @@ static void migration_bitmap_sync(RAMState *rs)
         rs->bytes_xfer_prev = bytes_xfer_now;
     }
     if (migrate_use_events()) {
-        qapi_event_send_migration_pass(ram_counters.dirty_sync_count, NULL);
+        qapi_event_send_migration_pass(ram_counters.dirty_sync_count,
+                                       IGNORE_ERRORS);
     }
 }
 
diff --git a/migration/socket.c b/migration/socket.c
index 85bfdccae1..018e1d1191 100644
--- a/migration/socket.c
+++ b/migration/socket.c
@@ -154,7 +154,7 @@ static gboolean socket_accept_incoming_migration(QIOChannel *ioc,
 
 out:
     /* Close listening socket as its no longer needed */
-    qio_channel_close(ioc, NULL);
+    qio_channel_close(ioc, IGNORE_ERRORS);
     return FALSE; /* unregister */
 }
 
diff --git a/monitor.c b/monitor.c
index 1e63ace2d4..c262311fdd 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3211,7 +3211,7 @@ void chardev_add_completion(ReadLineState *rs, int nb_args, const char *str)
     len = strlen(str);
     readline_set_completion_index(rs, len);
 
-    start = list = qmp_query_chardev_backends(NULL);
+    start = list = qmp_query_chardev_backends(IGNORE_ERRORS);
     while (list) {
         const char *chr_name = list->value->name;
 
@@ -3322,7 +3322,7 @@ void chardev_remove_completion(ReadLineState *rs, int nb_args, const char *str)
     len = strlen(str);
     readline_set_completion_index(rs, len);
 
-    start = list = qmp_query_chardev(NULL);
+    start = list = qmp_query_chardev(IGNORE_ERRORS);
     while (list) {
         ChardevInfo *chr = list->value;
 
@@ -3342,7 +3342,7 @@ static void ringbuf_completion(ReadLineState *rs, const char *str)
     len = strlen(str);
     readline_set_completion_index(rs, len);
 
-    start = list = qmp_query_chardev(NULL);
+    start = list = qmp_query_chardev(IGNORE_ERRORS);
     while (list) {
         ChardevInfo *chr_info = list->value;
 
@@ -3389,7 +3389,7 @@ void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
     len = strlen(str);
     readline_set_completion_index(rs, len);
 
-    start = list = qmp_qom_list("/objects", NULL);
+    start = list = qmp_qom_list("/objects", IGNORE_ERRORS);
     while (list) {
         ObjectPropertyInfo *info = list->value;
 
@@ -3921,7 +3921,7 @@ static QObject *get_qmp_greeting(void)
 {
     QObject *ver = NULL;
 
-    qmp_marshal_query_version(NULL, &ver, NULL);
+    qmp_marshal_query_version(NULL, &ver, IGNORE_ERRORS);
 
     return qobject_from_jsonf("{'QMP': {'version': %p, 'capabilities': []}}",
                               ver);
diff --git a/nbd/client.c b/nbd/client.c
index 595d99ed30..8541e109a7 100644
--- a/nbd/client.c
+++ b/nbd/client.c
@@ -157,7 +157,7 @@ static void nbd_send_opt_abort(QIOChannel *ioc)
      * to disconnect without waiting for the server reply, so we don't
      * even care if the request makes it to the server, let alone
      * waiting around for whether the server replies. */
-    nbd_send_option_request(ioc, NBD_OPT_ABORT, 0, NULL, NULL);
+    nbd_send_option_request(ioc, NBD_OPT_ABORT, 0, NULL, IGNORE_ERRORS);
 }
 
 
@@ -759,7 +759,7 @@ ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *request)
     stq_be_p(buf + 16, request->from);
     stl_be_p(buf + 24, request->len);
 
-    return write_sync(ioc, buf, sizeof(buf), NULL);
+    return write_sync(ioc, buf, sizeof(buf), IGNORE_ERRORS);
 }
 
 ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply, Error **errp)
diff --git a/nbd/server.c b/nbd/server.c
index 49b55f6ede..8631fa55a3 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -124,7 +124,7 @@ static int nbd_negotiate_read(QIOChannel *ioc, void *buffer, size_t size)
                                   nbd_negotiate_continue,
                                   qemu_coroutine_self(),
                                   NULL);
-    ret = read_sync(ioc, buffer, size, NULL);
+    ret = read_sync(ioc, buffer, size, IGNORE_ERRORS);
     g_source_remove(watch);
     return ret;
 
@@ -142,7 +142,7 @@ static int nbd_negotiate_write(QIOChannel *ioc, const void *buffer, size_t size)
                                   nbd_negotiate_continue,
                                   qemu_coroutine_self(),
                                   NULL);
-    ret = write_sync(ioc, buffer, size, NULL);
+    ret = write_sync(ioc, buffer, size, IGNORE_ERRORS);
     g_source_remove(watch);
     return ret;
 }
@@ -632,7 +632,7 @@ static coroutine_fn int nbd_negotiate(NBDClientNewData *data)
         [28 .. 151]   reserved     (0, omit if no_zeroes)
      */
 
-    qio_channel_set_blocking(client->ioc, false, NULL);
+    qio_channel_set_blocking(client->ioc, false, IGNORE_ERRORS);
     rc = -EINVAL;
 
     TRACE("Beginning negotiation.");
@@ -694,7 +694,7 @@ static ssize_t nbd_receive_request(QIOChannel *ioc, NBDRequest *request)
     uint32_t magic;
     ssize_t ret;
 
-    ret = read_sync(ioc, buf, sizeof(buf), NULL);
+    ret = read_sync(ioc, buf, sizeof(buf), IGNORE_ERRORS);
     if (ret < 0) {
         return ret;
     }
@@ -745,7 +745,7 @@ static ssize_t nbd_send_reply(QIOChannel *ioc, NBDReply *reply)
     stl_be_p(buf + 4, reply->error);
     stq_be_p(buf + 8, reply->handle);
 
-    return write_sync(ioc, buf, sizeof(buf), NULL);
+    return write_sync(ioc, buf, sizeof(buf), IGNORE_ERRORS);
 }
 
 #define MAX_NBD_REQUESTS 16
@@ -790,7 +790,7 @@ static void client_close(NBDClient *client)
      * then we'll close the socket and free the NBDClient.
      */
     qio_channel_shutdown(client->ioc, QIO_CHANNEL_SHUTDOWN_BOTH,
-                         NULL);
+                         IGNORE_ERRORS);
 
     /* Also tell the client, so that they release their reference.  */
     if (client->close) {
@@ -920,7 +920,7 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset, off_t size,
      * access since the export could be available before migration handover.
      */
     aio_context_acquire(exp->ctx);
-    blk_invalidate_cache(blk, NULL);
+    blk_invalidate_cache(blk, IGNORE_ERRORS);
     aio_context_release(exp->ctx);
     return exp;
 
@@ -1048,7 +1048,7 @@ static ssize_t nbd_co_send_reply(NBDRequestData *req, NBDReply *reply,
         qio_channel_set_cork(client->ioc, true);
         rc = nbd_send_reply(client->ioc, reply);
         if (rc >= 0) {
-            ret = write_sync(client->ioc, req->data, len, NULL);
+            ret = write_sync(client->ioc, req->data, len, IGNORE_ERRORS);
             if (ret < 0) {
                 rc = -EIO;
             }
@@ -1123,7 +1123,7 @@ static ssize_t nbd_co_receive_request(NBDRequestData *req,
     if (request->type == NBD_CMD_WRITE) {
         TRACE("Reading %" PRIu32 " byte(s)", request->len);
 
-        if (read_sync(client->ioc, req->data, request->len, NULL) < 0) {
+        if (read_sync(client->ioc, req->data, request->len, IGNORE_ERRORS) < 0) {
             LOG("reading from socket failed");
             rc = -EIO;
             goto out;
diff --git a/net/colo-compare.c b/net/colo-compare.c
index 6d500e1dc4..16e46c3a6c 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -788,13 +788,13 @@ static void colo_compare_init(Object *obj)
 {
     object_property_add_str(obj, "primary_in",
                             compare_get_pri_indev, compare_set_pri_indev,
-                            NULL);
+                            IGNORE_ERRORS);
     object_property_add_str(obj, "secondary_in",
                             compare_get_sec_indev, compare_set_sec_indev,
-                            NULL);
+                            IGNORE_ERRORS);
     object_property_add_str(obj, "outdev",
                             compare_get_outdev, compare_set_outdev,
-                            NULL);
+                            IGNORE_ERRORS);
 }
 
 static void colo_compare_finalize(Object *obj)
diff --git a/net/dump.c b/net/dump.c
index 442eb532f9..b66d56e06c 100644
--- a/net/dump.c
+++ b/net/dump.c
@@ -329,9 +329,9 @@ static void filter_dump_instance_init(Object *obj)
     nfds->maxlen = 65536;
 
     object_property_add(obj, "maxlen", "int", filter_dump_get_maxlen,
-                        filter_dump_set_maxlen, NULL, NULL, NULL);
+                        filter_dump_set_maxlen, NULL, NULL, IGNORE_ERRORS);
     object_property_add_str(obj, "file", file_dump_get_filename,
-                            file_dump_set_filename, NULL);
+                            file_dump_set_filename, IGNORE_ERRORS);
 }
 
 static void filter_dump_instance_finalize(Object *obj)
diff --git a/net/filter-buffer.c b/net/filter-buffer.c
index cc6bd94445..0a9c12aa1a 100644
--- a/net/filter-buffer.c
+++ b/net/filter-buffer.c
@@ -193,7 +193,7 @@ static void filter_buffer_init(Object *obj)
 {
     object_property_add(obj, "interval", "int",
                         filter_buffer_get_interval,
-                        filter_buffer_set_interval, NULL, NULL, NULL);
+                        filter_buffer_set_interval, NULL, NULL, IGNORE_ERRORS);
 }
 
 static const TypeInfo filter_buffer_info = {
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
index 52d978fce2..c86d355c93 100644
--- a/net/filter-mirror.c
+++ b/net/filter-mirror.c
@@ -338,15 +338,15 @@ static void filter_redirector_set_outdev(Object *obj,
 static void filter_mirror_init(Object *obj)
 {
     object_property_add_str(obj, "outdev", filter_mirror_get_outdev,
-                            filter_mirror_set_outdev, NULL);
+                            filter_mirror_set_outdev, IGNORE_ERRORS);
 }
 
 static void filter_redirector_init(Object *obj)
 {
     object_property_add_str(obj, "indev", filter_redirector_get_indev,
-                            filter_redirector_set_indev, NULL);
+                            filter_redirector_set_indev, IGNORE_ERRORS);
     object_property_add_str(obj, "outdev", filter_redirector_get_outdev,
-                            filter_redirector_set_outdev, NULL);
+                            filter_redirector_set_outdev, IGNORE_ERRORS);
 }
 
 static void filter_mirror_fini(Object *obj)
diff --git a/net/filter.c b/net/filter.c
index 1dfd2caa23..ee7ab8e443 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -177,14 +177,14 @@ static void netfilter_init(Object *obj)
 
     object_property_add_str(obj, "netdev",
                             netfilter_get_netdev_id, netfilter_set_netdev_id,
-                            NULL);
+                            IGNORE_ERRORS);
     object_property_add_enum(obj, "queue", "NetFilterDirection",
                              NetFilterDirection_lookup,
                              netfilter_get_direction, netfilter_set_direction,
-                             NULL);
+                             IGNORE_ERRORS);
     object_property_add_str(obj, "status",
                             netfilter_get_status, netfilter_set_status,
-                            NULL);
+                            IGNORE_ERRORS);
 }
 
 static void netfilter_complete(UserCreatable *uc, Error **errp)
diff --git a/net/net.c b/net/net.c
index 6235aabed8..9d0f1119cc 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1272,7 +1272,7 @@ static void netfilter_print_info(Monitor *mon, NetFilterState *nf)
             continue;
         }
         v = string_output_visitor_new(false, &str);
-        object_property_get(OBJECT(nf), v, prop->name, NULL);
+        object_property_get(OBJECT(nf), v, prop->name, IGNORE_ERRORS);
         visit_complete(v, &str);
         visit_free(v);
         monitor_printf(mon, ",%s=%s", prop->name, str);
@@ -1538,11 +1538,11 @@ int net_init_clients(void)
     QTAILQ_INIT(&net_clients);
 
     if (qemu_opts_foreach(qemu_find_opts("netdev"),
-                          net_init_netdev, NULL, NULL)) {
+                          net_init_netdev, NULL, IGNORE_ERRORS)) {
         return -1;
     }
 
-    if (qemu_opts_foreach(net, net_init_client, NULL, NULL)) {
+    if (qemu_opts_foreach(net, net_init_client, NULL, IGNORE_ERRORS)) {
         return -1;
     }
 
diff --git a/numa.c b/numa.c
index 2b5cb7b5c7..7886d31e09 100644
--- a/numa.c
+++ b/numa.c
@@ -217,7 +217,8 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
         }
 
         object_ref(o);
-        numa_info[nodenr].node_mem = object_property_get_int(o, "size", NULL);
+        numa_info[nodenr].node_mem = object_property_get_int(o, "size",
+                                                             IGNORE_ERRORS);
         numa_info[nodenr].node_memdev = MEMORY_BACKEND(o);
     }
     numa_info[nodenr].present = true;
@@ -429,7 +430,7 @@ void parse_numa_opts(MachineState *ms)
     int i;
     MachineClass *mc = MACHINE_GET_CLASS(ms);
 
-    if (qemu_opts_foreach(qemu_find_opts("numa"), parse_numa, ms, NULL)) {
+    if (qemu_opts_foreach(qemu_find_opts("numa"), parse_numa, ms, IGNORE_ERRORS)) {
         exit(1);
     }
 
@@ -639,7 +640,7 @@ static int query_memdev(Object *obj, void *opaque)
 
         m->value = g_malloc0(sizeof(*m->value));
 
-        m->value->id = object_property_get_str(obj, "id", NULL);
+        m->value->id = object_property_get_str(obj, "id", IGNORE_ERRORS);
         m->value->has_id = !!m->value->id;
 
         m->value->size = object_property_get_int(obj, "size",
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 3ecbf0bd25..37302305c5 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -549,12 +549,12 @@ void qdev_set_id(DeviceState *dev, const char *id)
 
     if (dev->id) {
         object_property_add_child(qdev_get_peripheral(), dev->id,
-                                  OBJECT(dev), NULL);
+                                  OBJECT(dev), IGNORE_ERRORS);
     } else {
         static int anon_count;
         gchar *name = g_strdup_printf("device[%d]", anon_count++);
         object_property_add_child(qdev_get_peripheral_anon(), name,
-                                  OBJECT(dev), NULL);
+                                  OBJECT(dev), IGNORE_ERRORS);
         g_free(name);
     }
 }
@@ -651,7 +651,7 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
         Error *err = NULL;
         char *value;
         char *legacy_name = g_strdup_printf("legacy-%s", props->name);
-        if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) {
+        if (object_property_get_type(OBJECT(dev), legacy_name, IGNORE_ERRORS)) {
             value = object_property_get_str(OBJECT(dev), legacy_name, &err);
         } else {
             value = object_property_print(OBJECT(dev), props->name, true, &err);
diff --git a/qemu-img.c b/qemu-img.c
index 0ad698d7f1..d0ab3af44b 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -537,7 +537,7 @@ static int img_create(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         goto fail;
     }
 
@@ -787,7 +787,7 @@ static int img_check(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         return 1;
     }
 
@@ -990,7 +990,7 @@ static int img_commit(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         return 1;
     }
 
@@ -1337,7 +1337,7 @@ static int img_compare(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         ret = 2;
         goto out4;
     }
@@ -2109,7 +2109,7 @@ static int img_convert(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         goto fail_getopt;
     }
 
@@ -2626,7 +2626,7 @@ static int img_info(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         return 1;
     }
 
@@ -2845,7 +2845,7 @@ static int img_map(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         return 1;
     }
 
@@ -2998,7 +2998,7 @@ static int img_snapshot(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         return 1;
     }
 
@@ -3158,7 +3158,7 @@ static int img_rebase(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         return 1;
     }
 
@@ -3512,7 +3512,7 @@ static int img_resize(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         return 1;
     }
 
@@ -3668,7 +3668,7 @@ static int img_amend(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         ret = -1;
         goto out_no_progress;
     }
@@ -4305,7 +4305,7 @@ static int img_dd(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         ret = -1;
         goto out;
     }
diff --git a/qemu-io.c b/qemu-io.c
index 8e38b288b7..2a98cd0d1f 100644
--- a/qemu-io.c
+++ b/qemu-io.c
@@ -583,7 +583,7 @@ int main(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 651f85ecc1..6ff0b0c070 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -351,7 +351,7 @@ static gboolean nbd_accept(QIOChannel *ioc, GIOCondition cond, gpointer opaque)
     QIOChannelSocket *cioc;
 
     cioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
-                                     NULL);
+                                     IGNORE_ERRORS);
     if (!cioc) {
         return TRUE;
     }
@@ -780,7 +780,7 @@ int main(int argc, char **argv)
 
     if (qemu_opts_foreach(&qemu_object_opts,
                           user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
+                          NULL, IGNORE_ERRORS)) {
         exit(EXIT_FAILURE);
     }
 
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index d8e412275e..220a50ad7c 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -1273,7 +1273,7 @@ int64_t qmp_guest_fsfreeze_freeze_list(bool has_mountpoints,
 
 error:
     free_fs_mount_list(&mounts);
-    qmp_guest_fsfreeze_thaw(NULL);
+    qmp_guest_fsfreeze_thaw(IGNORE_ERRORS);
     return 0;
 }
 
diff --git a/qga/main.c b/qga/main.c
index cc58d2b53d..00b064d1e0 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -1386,7 +1386,7 @@ int main(int argc, char **argv)
         config->method = NULL;
         config->channel_path = NULL;
 
-        addr = socket_local_address(FIRST_SOCKET_ACTIVATION_FD, NULL);
+        addr = socket_local_address(FIRST_SOCKET_ACTIVATION_FD, IGNORE_ERRORS);
         if (addr) {
             if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
                 config->method = g_strdup("unix-listen");
diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index c18e48ab94..506514100c 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -553,7 +553,7 @@ static QObject *parse_value(JSONParserContext *ctxt, va_list *ap)
 
 QObject *json_parser_parse(GQueue *tokens, va_list *ap)
 {
-    return json_parser_parse_err(tokens, ap, NULL);
+    return json_parser_parse_err(tokens, ap, IGNORE_ERRORS);
 }
 
 QObject *json_parser_parse_err(GQueue *tokens, va_list *ap, Error **errp)
diff --git a/qom/container.c b/qom/container.c
index 2dbabd15ab..6cf53d9be7 100644
--- a/qom/container.c
+++ b/qom/container.c
@@ -40,7 +40,7 @@ Object *container_get(Object *root, const char *path)
         child = object_resolve_path_component(obj, parts[i]);
         if (!child) {
             child = object_new("container");
-            object_property_add_child(obj, parts[i], child, NULL);
+            object_property_add_child(obj, parts[i], child, IGNORE_ERRORS);
             object_unref(child);
         }
     }
diff --git a/qom/object.c b/qom/object.c
index eb4bc924ff..8b2f2ef8ac 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -444,7 +444,7 @@ static void object_property_del_child(Object *obj, Object *child, Error **errp)
 void object_unparent(Object *obj)
 {
     if (obj->parent) {
-        object_property_del_child(obj->parent, obj, NULL);
+        object_property_del_child(obj->parent, obj, IGNORE_ERRORS);
     }
 }
 
@@ -924,7 +924,7 @@ object_property_add(Object *obj, const char *name, const char *type,
             char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);
 
             ret = object_property_add(obj, full_name, type, get, set,
-                                      release, opaque, NULL);
+                                      release, opaque, IGNORE_ERRORS);
             g_free(full_name);
             if (ret) {
                 break;
@@ -934,7 +934,7 @@ object_property_add(Object *obj, const char *name, const char *type,
         return ret;
     }
 
-    if (object_property_find(obj, name, NULL) != NULL) {
+    if (object_property_find(obj, name, IGNORE_ERRORS) != NULL) {
         error_setg(errp, "attempt to add duplicate property '%s'"
                    " to object (type '%s')", name,
                    object_get_typename(obj));
@@ -967,7 +967,7 @@ object_class_property_add(ObjectClass *klass,
 {
     ObjectProperty *prop;
 
-    if (object_class_property_find(klass, name, NULL) != NULL) {
+    if (object_class_property_find(klass, name, IGNORE_ERRORS) != NULL) {
         error_setg(errp, "attempt to add duplicate property '%s'"
                    " to object (type '%s')", name,
                    object_class_get_name(klass));
@@ -995,7 +995,7 @@ ObjectProperty *object_property_find(Object *obj, const char *name,
     ObjectProperty *prop;
     ObjectClass *klass = object_get_class(obj);
 
-    prop = object_class_property_find(klass, name, NULL);
+    prop = object_class_property_find(klass, name, IGNORE_ERRORS);
     if (prop) {
         return prop;
     }
@@ -1037,7 +1037,7 @@ ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
 
     parent_klass = object_class_get_parent(klass);
     if (parent_klass) {
-        prop = object_class_property_find(parent_klass, name, NULL);
+        prop = object_class_property_find(parent_klass, name, IGNORE_ERRORS);
         if (prop) {
             return prop;
         }
@@ -1449,7 +1449,7 @@ static Object *object_resolve_link(Object *obj, const char *name,
     Object *target;
 
     /* Go from link<FOO> to FOO.  */
-    type = object_property_get_type(obj, name, NULL);
+    type = object_property_get_type(obj, name, IGNORE_ERRORS);
     target_type = g_strndup(&type[5], strlen(type) - 6);
     target = object_resolve_path_type(path, target_type, &ambiguous);
 
@@ -1627,7 +1627,7 @@ gchar *object_get_canonical_path(Object *obj)
 
 Object *object_resolve_path_component(Object *parent, const gchar *part)
 {
-    ObjectProperty *prop = object_property_find(parent, part, NULL);
+    ObjectProperty *prop = object_property_find(parent, part, IGNORE_ERRORS);
     if (prop == NULL) {
         return NULL;
     }
@@ -2301,7 +2301,7 @@ void object_class_property_set_description(ObjectClass *klass,
 
 static void object_instance_init(Object *obj)
 {
-    object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
+    object_property_add_str(obj, "type", qdev_get_type, NULL, IGNORE_ERRORS);
 }
 
 static void register_types(void)
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index ff27e0669e..e8f0fa9b8d 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -63,7 +63,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
 
     assert(qdict);
     obj = object_new(type);
-    if (object_property_find(obj, "id", NULL)) {
+    if (object_property_find(obj, "id", IGNORE_ERRORS)) {
         object_property_set_str(obj, id, "id", &local_err);
         if (local_err) {
             goto out;
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index 8186c9d379..a863a1bf4d 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -170,7 +170,7 @@ AlphaCPU *cpu_alpha_init(const char *cpu_model)
     }
     cpu = ALPHA_CPU(object_new(object_class_get_name(cpu_class)));
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 670c07ab6e..7d6055bb63 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -277,11 +277,11 @@ static void aarch64_cpu_set_aarch64(Object *obj, bool value, Error **errp)
 static void aarch64_cpu_initfn(Object *obj)
 {
     object_property_add_bool(obj, "aarch64", aarch64_cpu_get_aarch64,
-                             aarch64_cpu_set_aarch64, NULL);
+                             aarch64_cpu_set_aarch64, IGNORE_ERRORS);
     object_property_set_description(obj, "aarch64",
                                     "Set on/off to enable/disable aarch64 "
                                     "execution state ",
-                                    NULL);
+                                    IGNORE_ERRORS);
 }
 
 static void aarch64_cpu_finalizefn(Object *obj)
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
index 30299e990d..6a05445e0e 100644
--- a/target/hppa/cpu.c
+++ b/target/hppa/cpu.c
@@ -118,7 +118,7 @@ HPPACPU *cpu_hppa_init(const char *cpu_model)
 
     cpu = HPPA_CPU(object_new(TYPE_HPPA_CPU));
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index b2b1d20cee..ae7abdade5 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -3768,7 +3768,7 @@ static void x86_cpu_register_bit_prop(X86CPU *cpu,
     ObjectProperty *op;
     uint32_t mask = (1UL << bitnr);
 
-    op = object_property_find(OBJECT(cpu), prop_name, NULL);
+    op = object_property_find(OBJECT(cpu), prop_name, IGNORE_ERRORS);
     if (op) {
         fp = op->opaque;
         assert(fp->w == w);
@@ -3862,31 +3862,36 @@ static void x86_cpu_initfn(Object *obj)
 
     object_property_add(obj, "family", "int",
                         x86_cpuid_version_get_family,
-                        x86_cpuid_version_set_family, NULL, NULL, NULL);
+                        x86_cpuid_version_set_family, NULL, NULL,
+                        IGNORE_ERRORS);
     object_property_add(obj, "model", "int",
                         x86_cpuid_version_get_model,
-                        x86_cpuid_version_set_model, NULL, NULL, NULL);
+                        x86_cpuid_version_set_model, NULL, NULL,
+                        IGNORE_ERRORS);
     object_property_add(obj, "stepping", "int",
                         x86_cpuid_version_get_stepping,
-                        x86_cpuid_version_set_stepping, NULL, NULL, NULL);
+                        x86_cpuid_version_set_stepping, NULL, NULL,
+                        IGNORE_ERRORS);
     object_property_add_str(obj, "vendor",
                             x86_cpuid_get_vendor,
-                            x86_cpuid_set_vendor, NULL);
+                            x86_cpuid_set_vendor, IGNORE_ERRORS);
     object_property_add_str(obj, "model-id",
                             x86_cpuid_get_model_id,
-                            x86_cpuid_set_model_id, NULL);
+                            x86_cpuid_set_model_id, IGNORE_ERRORS);
     object_property_add(obj, "tsc-frequency", "int",
                         x86_cpuid_get_tsc_freq,
-                        x86_cpuid_set_tsc_freq, NULL, NULL, NULL);
+                        x86_cpuid_set_tsc_freq, NULL, NULL, IGNORE_ERRORS);
     object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
                         x86_cpu_get_feature_words,
-                        NULL, NULL, (void *)env->features, NULL);
+                        NULL, NULL, (void *)env->features, IGNORE_ERRORS);
     object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
                         x86_cpu_get_feature_words,
-                        NULL, NULL, (void *)cpu->filtered_features, NULL);
+                        NULL, NULL, (void *)cpu->filtered_features,
+                        IGNORE_ERRORS);
 
     object_property_add(obj, "crash-information", "GuestPanicInformation",
-                        x86_cpu_get_crash_info_qom, NULL, NULL, NULL, NULL);
+                        x86_cpu_get_crash_info_qom, NULL, NULL, NULL,
+                        IGNORE_ERRORS);
 
     cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
 
diff --git a/target/m68k/helper.c b/target/m68k/helper.c
index ea1872cae5..c0a36e61b3 100644
--- a/target/m68k/helper.c
+++ b/target/m68k/helper.c
@@ -116,7 +116,7 @@ M68kCPU *cpu_m68k_init(const char *cpu_model)
 
     register_m68k_insns(env);
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
index 83f6d96a71..9174818c0a 100644
--- a/target/microblaze/translate.c
+++ b/target/microblaze/translate.c
@@ -1821,7 +1821,7 @@ MicroBlazeCPU *cpu_mb_init(const char *cpu_model)
 
     cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/target/mips/translate.c b/target/mips/translate.c
index 7dedfd6632..b752c0faed 100644
--- a/target/mips/translate.c
+++ b/target/mips/translate.c
@@ -20212,7 +20212,7 @@ MIPSCPU *cpu_mips_init(const char *cpu_model)
     fpu_init(env, def);
     mvp_init(env, def);
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
index d56bb7245a..7015cdefe6 100644
--- a/target/nios2/cpu.c
+++ b/target/nios2/cpu.c
@@ -87,7 +87,7 @@ Nios2CPU *cpu_nios2_init(const char *cpu_model)
 {
     Nios2CPU *cpu = NIOS2_CPU(object_new(TYPE_NIOS2_CPU));
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 670edde79e..bfa6b47b51 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -482,7 +482,8 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
 bool kvmppc_is_mem_backend_page_size_ok(char *obj_path)
 {
     Object *mem_obj = object_resolve_path(obj_path, NULL);
-    char *mempath = object_property_get_str(mem_obj, "mem-path", NULL);
+    char *mempath = object_property_get_str(mem_obj, "mem-path",
+                                            IGNORE_ERRORS);
     long pagesize;
 
     if (mempath) {
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index accef03234..75e5966749 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -287,7 +287,7 @@ static void s390_cpu_initfn(Object *obj)
     cs->halted = 1;
     cs->exception_index = EXCP_HLT;
     object_property_add(OBJECT(cpu), "id", "int64_t", s390x_cpu_get_id,
-                        s390x_cpu_set_id, NULL, NULL, NULL);
+                        s390x_cpu_set_id, NULL, NULL, IGNORE_ERRORS);
     s390_cpu_model_register_props(obj);
 #if !defined(CONFIG_USER_ONLY)
     qemu_get_timedate(&tm, 0);
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index fc3cb25cc3..5206a10134 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -899,14 +899,17 @@ void s390_cpu_model_register_props(Object *obj)
     for (feat = 0; feat < S390_FEAT_MAX; feat++) {
         const S390FeatDef *def = s390_feat_def(feat);
         object_property_add(obj, def->name, "bool", get_feature,
-                            set_feature, NULL, (void *) feat, NULL);
-        object_property_set_description(obj, def->name, def->desc , NULL);
+                            set_feature, NULL, (void *) feat, IGNORE_ERRORS);
+        object_property_set_description(obj, def->name, def->desc ,
+                                        IGNORE_ERRORS);
     }
     for (group = 0; group < S390_FEAT_GROUP_MAX; group++) {
         const S390FeatGroupDef *def = s390_feat_group_def(group);
         object_property_add(obj, def->name, "bool", get_feature_group,
-                            set_feature_group, NULL, (void *) group, NULL);
-        object_property_set_description(obj, def->name, def->desc , NULL);
+                            set_feature_group, NULL, (void *) group,
+                            IGNORE_ERRORS);
+        object_property_set_description(obj, def->name, def->desc ,
+                                        IGNORE_ERRORS);
     }
 }
 
@@ -990,11 +993,11 @@ static char *get_description(Object *obj, Error **errp)
 void s390_cpu_model_class_register_props(ObjectClass *oc)
 {
     object_class_property_add_bool(oc, "migration-safe", get_is_migration_safe,
-                                   NULL, NULL);
+                                   NULL, IGNORE_ERRORS);
     object_class_property_add_bool(oc, "static", get_is_static,
-                                   NULL, NULL);
+                                   NULL, IGNORE_ERRORS);
     object_class_property_add_str(oc, "description", get_description, NULL,
-                                  NULL);
+                                  IGNORE_ERRORS);
 }
 
 #ifdef CONFIG_KVM
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 3383c49039..0979c1fc27 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -238,7 +238,7 @@ static void kvm_s390_init_aes_kw(void)
     uint64_t attr = KVM_S390_VM_CRYPTO_DISABLE_AES_KW;
 
     if (object_property_get_bool(OBJECT(qdev_get_machine()), "aes-key-wrap",
-                                 NULL)) {
+                                 IGNORE_ERRORS)) {
             attr = KVM_S390_VM_CRYPTO_ENABLE_AES_KW;
     }
 
@@ -252,7 +252,7 @@ static void kvm_s390_init_dea_kw(void)
     uint64_t attr = KVM_S390_VM_CRYPTO_DISABLE_DEA_KW;
 
     if (object_property_get_bool(OBJECT(qdev_get_machine()), "dea-key-wrap",
-                                 NULL)) {
+                                 IGNORE_ERRORS)) {
             attr = KVM_S390_VM_CRYPTO_ENABLE_DEA_KW;
     }
 
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index d606eb53f4..4d6f0c4f66 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -157,7 +157,7 @@ SPARCCPU *cpu_sparc_init(const char *cpu_model)
         return NULL;
     }
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/target/tilegx/cpu.c b/target/tilegx/cpu.c
index 45326398cc..f8c479e1d7 100644
--- a/target/tilegx/cpu.c
+++ b/target/tilegx/cpu.c
@@ -58,7 +58,7 @@ TileGXCPU *cpu_tilegx_init(const char *cpu_model)
 
     cpu = TILEGX_CPU(object_new(TYPE_TILEGX_CPU));
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/target/xtensa/helper.c b/target/xtensa/helper.c
index 263990d621..ff7a3df05b 100644
--- a/target/xtensa/helper.c
+++ b/target/xtensa/helper.c
@@ -130,7 +130,7 @@ XtensaCPU *cpu_xtensa_init(const char *cpu_model)
 
     xtensa_irq_init(env);
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
+    object_property_set_bool(OBJECT(cpu), true, "realized", IGNORE_ERRORS);
 
     return cpu;
 }
diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
index 8e432e9ab6..6145fcbab6 100644
--- a/tests/check-qom-proplist.c
+++ b/tests/check-qom-proplist.c
@@ -126,7 +126,7 @@ static void dummy_init(Object *obj)
     object_property_add_bool(obj, "bv",
                              dummy_get_bv,
                              dummy_set_bv,
-                             NULL);
+                             IGNORE_ERRORS);
 }
 
 
@@ -135,17 +135,17 @@ static void dummy_class_init(ObjectClass *cls, void *data)
     object_class_property_add_bool(cls, "bv",
                                    dummy_get_bv,
                                    dummy_set_bv,
-                                   NULL);
+                                   IGNORE_ERRORS);
     object_class_property_add_str(cls, "sv",
                                   dummy_get_sv,
                                   dummy_set_sv,
-                                  NULL);
+                                  IGNORE_ERRORS);
     object_class_property_add_enum(cls, "av",
                                    "DummyAnimal",
                                    dummy_animal_map,
                                    dummy_get_av,
                                    dummy_set_av,
-                                   NULL);
+                                   IGNORE_ERRORS);
 }
 
 
@@ -250,13 +250,14 @@ static void dummy_dev_init(Object *obj)
     DummyBus *bus = DUMMY_BUS(object_new(TYPE_DUMMY_BUS));
     DummyBackend *backend = DUMMY_BACKEND(object_new(TYPE_DUMMY_BACKEND));
 
-    object_property_add_child(obj, "bus", OBJECT(bus), NULL);
+    object_property_add_child(obj, "bus", OBJECT(bus), IGNORE_ERRORS);
     dev->bus = bus;
-    object_property_add_child(OBJECT(bus), "backend", OBJECT(backend), NULL);
+    object_property_add_child(OBJECT(bus), "backend", OBJECT(backend),
+                              IGNORE_ERRORS);
     bus->backend = backend;
 
     object_property_add_link(obj, "backend", TYPE_DUMMY_BACKEND,
-                             (Object **)&bus->backend, NULL, 0, NULL);
+                             (Object **)&bus->backend, NULL, 0, IGNORE_ERRORS);
 }
 
 static void dummy_dev_unparent(Object *obj)
@@ -285,7 +286,7 @@ static void dummy_bus_init(Object *obj)
 static void dummy_bus_unparent(Object *obj)
 {
     DummyBus *bus = DUMMY_BUS(obj);
-    object_property_del(obj->parent, "backend", NULL);
+    object_property_del(obj->parent, "backend", IGNORE_ERRORS);
     object_unparent(OBJECT(bus->backend));
 }
 
diff --git a/tests/io-channel-helpers.c b/tests/io-channel-helpers.c
index 05e5579cf8..ccab10bfa9 100644
--- a/tests/io-channel-helpers.c
+++ b/tests/io-channel-helpers.c
@@ -80,7 +80,7 @@ static gpointer test_io_thread_writer(gpointer opaque)
     size_t niov = data->niov;
     struct iovec old = { 0 };
 
-    qio_channel_set_blocking(data->src, data->blocking, NULL);
+    qio_channel_set_blocking(data->src, data->blocking, IGNORE_ERRORS);
 
     while (niov) {
         ssize_t ret;
@@ -121,7 +121,7 @@ static gpointer test_io_thread_reader(gpointer opaque)
     size_t niov = data->niov;
     struct iovec old = { 0 };
 
-    qio_channel_set_blocking(data->dst, data->blocking, NULL);
+    qio_channel_set_blocking(data->dst, data->blocking, IGNORE_ERRORS);
 
     while (niov) {
         ssize_t ret;
diff --git a/tests/test-char.c b/tests/test-char.c
index dfe856cb85..5a9804bd92 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -245,7 +245,7 @@ static gboolean char_socket_test_idle(gpointer user_data)
 {
     SocketIdleData *data = user_data;
 
-    if (object_property_get_bool(OBJECT(data->chr), "connected", NULL)
+    if (object_property_get_bool(OBJECT(data->chr), "connected", IGNORE_ERRORS)
         == data->conn_expected) {
         quit = true;
         return FALSE;
diff --git a/tests/test-crypto-hash.c b/tests/test-crypto-hash.c
index f58eeb4409..7a163e5714 100644
--- a/tests/test-crypto-hash.c
+++ b/tests/test-crypto-hash.c
@@ -177,7 +177,7 @@ static void test_hash_iov(void)
                                   iov, 3,
                                   &result,
                                   &resultlen,
-                                  NULL);
+                                  IGNORE_ERRORS);
         g_assert(ret == 0);
         g_assert(resultlen == expected_lens[i]);
         for (j = 0; j < resultlen; j++) {
diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c
index d357cd2a8e..25c9487656 100644
--- a/tests/test-io-channel-socket.c
+++ b/tests/test-io-channel-socket.c
@@ -160,7 +160,7 @@ static void test_io_channel_complete(QIOTask *task,
                                      gpointer opaque)
 {
     struct TestIOChannelData *data = opaque;
-    data->err = qio_task_propagate_error(task, NULL);
+    data->err = qio_task_propagate_error(task, IGNORE_ERRORS);
     g_main_loop_quit(data->loop);
 }
 
diff --git a/tests/test-io-channel-tls.c b/tests/test-io-channel-tls.c
index b55f5c81ff..fae2906060 100644
--- a/tests/test-io-channel-tls.c
+++ b/tests/test-io-channel-tls.c
@@ -60,7 +60,7 @@ static void test_tls_handshake_done(QIOTask *task,
     struct QIOChannelTLSHandshakeData *data = opaque;
 
     data->finished = true;
-    data->failed = qio_task_propagate_error(task, NULL);
+    data->failed = qio_task_propagate_error(task, IGNORE_ERRORS);
 }
 
 
@@ -187,8 +187,10 @@ static void test_io_channel_tls(const void *opaque)
      * thread, so we need these non-blocking to avoid deadlock
      * of ourselves
      */
-    qio_channel_set_blocking(QIO_CHANNEL(clientChanSock), false, NULL);
-    qio_channel_set_blocking(QIO_CHANNEL(serverChanSock), false, NULL);
+    qio_channel_set_blocking(QIO_CHANNEL(clientChanSock), false,
+                             IGNORE_ERRORS);
+    qio_channel_set_blocking(QIO_CHANNEL(serverChanSock), false,
+                             IGNORE_ERRORS);
 
     /* Now the real part of the test, setup the sessions */
     clientChanTLS = qio_channel_tls_new_client(
diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c
index d5bfcac37d..91ea932869 100644
--- a/tests/test-qdev-global-props.c
+++ b/tests/test-qdev-global-props.c
@@ -135,9 +135,9 @@ static void prop2_accessor(Object *obj, Visitor *v, const char *name,
 static void dynamic_instance_init(Object *obj)
 {
     object_property_add(obj, "prop1", "uint32", prop1_accessor, prop1_accessor,
-                        NULL, NULL, NULL);
+                        NULL, NULL, IGNORE_ERRORS);
     object_property_add(obj, "prop2", "uint32", prop2_accessor, prop2_accessor,
-                        NULL, NULL, NULL);
+                        NULL, NULL, IGNORE_ERRORS);
 }
 
 static void dynamic_class_init(ObjectClass *oc, void *data)
diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c
index cc1bb1afdf..5a596a6e7b 100644
--- a/tests/test-qemu-opts.c
+++ b/tests/test-qemu-opts.c
@@ -335,7 +335,7 @@ static void test_qemu_opt_unset(void)
     int ret;
 
     /* dynamically initialized (parsed) opts */
-    opts = qemu_opts_parse(&opts_list_03, "key=value", false, NULL);
+    opts = qemu_opts_parse(&opts_list_03, "key=value", false, IGNORE_ERRORS);
     g_assert(opts != NULL);
 
     /* check default/parsed value */
@@ -445,7 +445,7 @@ static size_t opts_count(QemuOpts *opts)
 {
     size_t n = 0;
 
-    qemu_opt_foreach(opts, opts_count_iter, &n, NULL);
+    qemu_opt_foreach(opts, opts_count_iter, &n, IGNORE_ERRORS);
     return n;
 }
 
diff --git a/tests/test-string-input-visitor.c b/tests/test-string-input-visitor.c
index 79313a7f7a..f44bfee8aa 100644
--- a/tests/test-string-input-visitor.c
+++ b/tests/test-string-input-visitor.c
@@ -318,25 +318,25 @@ static void test_visitor_in_fuzz(TestInputVisitorData *data,
         }
 
         v = visitor_input_test_init(data, buf);
-        visit_type_int(v, NULL, &ires, NULL);
+        visit_type_int(v, NULL, &ires, IGNORE_ERRORS);
 
         v = visitor_input_test_init(data, buf);
-        visit_type_intList(v, NULL, &ilres, NULL);
+        visit_type_intList(v, NULL, &ilres, IGNORE_ERRORS);
         qapi_free_intList(ilres);
 
         v = visitor_input_test_init(data, buf);
-        visit_type_bool(v, NULL, &bres, NULL);
+        visit_type_bool(v, NULL, &bres, IGNORE_ERRORS);
 
         v = visitor_input_test_init(data, buf);
-        visit_type_number(v, NULL, &nres, NULL);
+        visit_type_number(v, NULL, &nres, IGNORE_ERRORS);
 
         v = visitor_input_test_init(data, buf);
         sres = NULL;
-        visit_type_str(v, NULL, &sres, NULL);
+        visit_type_str(v, NULL, &sres, IGNORE_ERRORS);
         g_free(sres);
 
         v = visitor_input_test_init(data, buf);
-        visit_type_EnumOne(v, NULL, &eres, NULL);
+        visit_type_EnumOne(v, NULL, &eres, IGNORE_ERRORS);
     }
 }
 
diff --git a/tpm.c b/tpm.c
index 9a7c7114d3..d89b1e6cd6 100644
--- a/tpm.c
+++ b/tpm.c
@@ -208,7 +208,7 @@ void tpm_cleanup(void)
 int tpm_init(void)
 {
     if (qemu_opts_foreach(qemu_find_opts("tpmdev"),
-                          tpm_init_tpmdev, NULL, NULL)) {
+                          tpm_init_tpmdev, NULL, IGNORE_ERRORS)) {
         return -1;
     }
 
diff --git a/ui/gtk.c b/ui/gtk.c
index 18c325f8d4..49921fa5a5 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -738,7 +738,7 @@ static gboolean gd_window_close(GtkWidget *widget, GdkEvent *event,
             }
             unregister_displaychangelistener(&s->vc[i].gfx.dcl);
         }
-        qmp_quit(NULL);
+        qmp_quit(IGNORE_ERRORS);
         return FALSE;
     }
 
@@ -1175,25 +1175,25 @@ static void gd_menu_pause(GtkMenuItem *item, void *opaque)
         return;
     }
     if (runstate_is_running()) {
-        qmp_stop(NULL);
+        qmp_stop(IGNORE_ERRORS);
     } else {
-        qmp_cont(NULL);
+        qmp_cont(IGNORE_ERRORS);
     }
 }
 
 static void gd_menu_reset(GtkMenuItem *item, void *opaque)
 {
-    qmp_system_reset(NULL);
+    qmp_system_reset(IGNORE_ERRORS);
 }
 
 static void gd_menu_powerdown(GtkMenuItem *item, void *opaque)
 {
-    qmp_system_powerdown(NULL);
+    qmp_system_powerdown(IGNORE_ERRORS);
 }
 
 static void gd_menu_quit(GtkMenuItem *item, void *opaque)
 {
-    qmp_quit(NULL);
+    qmp_quit(IGNORE_ERRORS);
 }
 
 static void gd_menu_switch_vc(GtkMenuItem *item, void *opaque)
diff --git a/ui/input-linux.c b/ui/input-linux.c
index 49d52a69cc..6783ac1e5d 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -527,13 +527,13 @@ static void input_linux_instance_init(Object *obj)
 {
     object_property_add_str(obj, "evdev",
                             input_linux_get_evdev,
-                            input_linux_set_evdev, NULL);
+                            input_linux_set_evdev, IGNORE_ERRORS);
     object_property_add_bool(obj, "grab_all",
                              input_linux_get_grab_all,
-                             input_linux_set_grab_all, NULL);
+                             input_linux_set_grab_all, IGNORE_ERRORS);
     object_property_add_bool(obj, "repeat",
                              input_linux_get_repeat,
-                             input_linux_set_repeat, NULL);
+                             input_linux_set_repeat, IGNORE_ERRORS);
 }
 
 static void input_linux_class_init(ObjectClass *oc, void *data)
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 801e5c864a..88d6d16faf 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -803,7 +803,7 @@ void qemu_spice_init(void)
     spice_server_set_playback_compression
         (spice_server, qemu_opt_get_bool(opts, "playback-compression", 1));
 
-    qemu_opt_foreach(opts, add_channel, &tls_port, NULL);
+    qemu_opt_foreach(opts, add_channel, &tls_port, IGNORE_ERRORS);
 
     spice_server_set_name(spice_server, qemu_name);
     spice_server_set_uuid(spice_server, (unsigned char *)&qemu_uuid);
diff --git a/ui/vnc-auth-sasl.c b/ui/vnc-auth-sasl.c
index 3ade4a4918..4b6f0e5d5a 100644
--- a/ui/vnc-auth-sasl.c
+++ b/ui/vnc-auth-sasl.c
@@ -530,12 +530,12 @@ void start_auth_sasl(VncState *vs)
     VNC_DEBUG("Initialize SASL auth %p\n", vs->ioc);
 
     /* Get local & remote client addresses in form  IPADDR;PORT */
-    localAddr = vnc_socket_ip_addr_string(vs->sioc, true, NULL);
+    localAddr = vnc_socket_ip_addr_string(vs->sioc, true, IGNORE_ERRORS);
     if (!localAddr) {
         goto authabort;
     }
 
-    remoteAddr = vnc_socket_ip_addr_string(vs->sioc, false, NULL);
+    remoteAddr = vnc_socket_ip_addr_string(vs->sioc, false, IGNORE_ERRORS);
     if (!remoteAddr) {
         g_free(localAddr);
         goto authabort;
diff --git a/ui/vnc.c b/ui/vnc.c
index cb55554210..7acd3fe225 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -568,7 +568,7 @@ VncInfo2List *qmp_query_vnc_servers(Error **errp)
                        &info->vencrypt, &info->has_vencrypt);
         if (vd->dcl.con) {
             dev = DEVICE(object_property_get_link(OBJECT(vd->dcl.con),
-                                                  "device", NULL));
+                                                  "device", IGNORE_ERRORS));
             info->has_display = true;
             info->display = g_strdup(dev->id);
         }
@@ -1123,7 +1123,7 @@ static void vnc_disconnect_start(VncState *vs)
     if (vs->ioc_tag) {
         g_source_remove(vs->ioc_tag);
     }
-    qio_channel_close(vs->ioc, NULL);
+    qio_channel_close(vs->ioc, IGNORE_ERRORS);
     vs->disconnecting = TRUE;
 }
 
@@ -2937,7 +2937,7 @@ static void vnc_connect(VncDisplay *vd, QIOChannelSocket *sioc,
 
     VNC_DEBUG("New client on socket %p\n", vs->sioc);
     update_displaychangelistener(&vd->dcl, VNC_REFRESH_INTERVAL_BASE);
-    qio_channel_set_blocking(vs->ioc, false, NULL);
+    qio_channel_set_blocking(vs->ioc, false, IGNORE_ERRORS);
     if (websocket) {
         vs->websocket = 1;
         if (vd->tlscreds) {
@@ -4022,7 +4022,7 @@ void vnc_display_add_client(const char *id, int csock, bool skipauth)
         return;
     }
 
-    sioc = qio_channel_socket_new_fd(csock, NULL);
+    sioc = qio_channel_socket_new_fd(csock, IGNORE_ERRORS);
     if (sioc) {
         qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-server");
         vnc_connect(vd, sioc, skipauth, false);
diff --git a/util/qemu-config.c b/util/qemu-config.c
index c74f15c42d..be9ffb5872 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -368,7 +368,7 @@ static int config_write_opts(void *opaque, QemuOpts *opts, Error **errp)
     } else {
         fprintf(data->fp, "[%s]\n", data->list->name);
     }
-    qemu_opt_foreach(opts, config_write_opt, data, NULL);
+    qemu_opt_foreach(opts, config_write_opt, data, IGNORE_ERRORS);
     fprintf(data->fp, "\n");
     return 0;
 }
@@ -382,7 +382,7 @@ void qemu_config_write(FILE *fp)
     fprintf(fp, "# qemu config file\n\n");
     for (i = 0; lists[i] != NULL; i++) {
         data.list = lists[i];
-        qemu_opts_foreach(data.list, config_write_opts, &data, NULL);
+        qemu_opts_foreach(data.list, config_write_opts, &data, IGNORE_ERRORS);
     }
 }
 
@@ -413,7 +413,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
                 error_report_err(local_err);
                 goto out;
             }
-            opts = qemu_opts_create(list, id, 1, NULL);
+            opts = qemu_opts_create(list, id, 1, IGNORE_ERRORS);
             continue;
         }
         if (sscanf(line, "[%63[^]]]", group) == 1) {
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 5977bfc3e9..a7e62593b1 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -929,7 +929,7 @@ void qemu_opts_set_defaults(QemuOptsList *list, const char *params,
 {
     QemuOpts *opts;
 
-    opts = opts_parse(list, params, permit_abbrev, true, NULL);
+    opts = opts_parse(list, params, permit_abbrev, true, IGNORE_ERRORS);
     assert(opts);
 }
 
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 82290cb687..d2ea5377dc 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -306,7 +306,8 @@ static void wait_for_connect(void *opaque)
     if (s->current_addr) {
         while (s->current_addr->ai_next != NULL && s->fd < 0) {
             s->current_addr = s->current_addr->ai_next;
-            s->fd = inet_connect_addr(s->current_addr, &in_progress, s, NULL);
+            s->fd = inet_connect_addr(s->current_addr, &in_progress, s,
+                                      IGNORE_ERRORS);
             if (s->fd < 0) {
                 error_free(err);
                 err = NULL;
diff --git a/vl.c b/vl.c
index be4dcf25ba..a7ad0cbd0c 100644
--- a/vl.c
+++ b/vl.c
@@ -2566,7 +2566,7 @@ static int sclp_parse(const char *devname)
 
     assert(arch_type == QEMU_ARCH_S390X);
 
-    dev_opts = qemu_opts_create(device, NULL, 0, NULL);
+    dev_opts = qemu_opts_create(device, NULL, 0, IGNORE_ERRORS);
     qemu_opt_set(dev_opts, "driver", "sclpconsole", &error_abort);
 
     snprintf(label, sizeof(label), "sclpcon%d", index);
@@ -2589,7 +2589,8 @@ static int debugcon_parse(const char *devname)
     if (!qemu_chr_new("debugcon", devname)) {
         exit(1);
     }
-    opts = qemu_opts_create(qemu_find_opts("device"), "debugcon", 1, NULL);
+    opts = qemu_opts_create(qemu_find_opts("device"), "debugcon", 1,
+                            IGNORE_ERRORS);
     if (!opts) {
         error_report("already have a debugcon device");
         exit(1);
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 05/15] qapi: Use IGNORE_ERRORS instead of NULL on generated code
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (3 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 04/15] [coccinelle] Use IGNORE_ERRORS instead of NULL as errp argument Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 06/15] test-qapi-util: Use IGNORE_ERRORS instead of NULL Eduardo Habkost
                   ` (11 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 scripts/qapi-commands.py | 6 +++---
 scripts/qapi-types.py    | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index 1943de4852..afa58915ba 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -75,7 +75,7 @@ static void qmp_marshal_output_%(c_name)s(%(c_type)s ret_in, QObject **ret_out,
     error_propagate(errp, err);
     visit_free(v);
     v = qapi_dealloc_visitor_new();
-    visit_type_%(c_name)s(v, "unused", &ret_in, NULL);
+    visit_type_%(c_name)s(v, "unused", &ret_in, IGNORE_ERRORS);
     visit_free(v);
 }
 ''',
@@ -162,7 +162,7 @@ out:
 ''')
 
     if have_args:
-        visit_members = ('visit_type_%s_members(v, &arg, NULL);'
+        visit_members = ('visit_type_%s_members(v, &arg, IGNORE_ERRORS);'
                          % arg_type.c_name())
     else:
         visit_members = ''
@@ -173,7 +173,7 @@ out:
 
     ret += mcgen('''
     v = qapi_dealloc_visitor_new();
-    visit_start_struct(v, NULL, NULL, 0, NULL);
+    visit_start_struct(v, NULL, NULL, 0, IGNORE_ERRORS);
     %(visit_members)s
     visit_end_struct(v, NULL);
     visit_free(v);
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 814ac672be..ab78fa56e9 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -157,7 +157,7 @@ void qapi_free_%(c_name)s(%(c_name)s *obj)
     }
 
     v = qapi_dealloc_visitor_new();
-    visit_type_%(c_name)s(v, NULL, &obj, NULL);
+    visit_type_%(c_name)s(v, NULL, &obj, IGNORE_ERRORS);
     visit_free(v);
 }
 ''',
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 06/15] test-qapi-util: Use IGNORE_ERRORS instead of NULL
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (4 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 05/15] qapi: Use IGNORE_ERRORS instead of NULL on generated code Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 07/15] Manual changes to use " Eduardo Habkost
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 tests/test-qapi-util.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/tests/test-qapi-util.c b/tests/test-qapi-util.c
index 3695034c32..374fa30078 100644
--- a/tests/test-qapi-util.c
+++ b/tests/test-qapi-util.c
@@ -25,7 +25,7 @@ static void test_qapi_enum_parse(void)
     g_assert_cmpint(ret, ==, QTYPE_NONE);
 
     ret = qapi_enum_parse(QType_lookup, "junk", QTYPE__MAX, -1,
-                          NULL);
+                          IGNORE_ERRORS);
     g_assert_cmpint(ret, ==, -1);
 
     ret = qapi_enum_parse(QType_lookup, "junk", QTYPE__MAX, -1,
@@ -137,14 +137,14 @@ static void test_error_api(void)
 {
     Error *err = NULL;
 
-    successfn(NULL);
-    test_propagate(successfn, NULL);
+    successfn(IGNORE_ERRORS);
+    test_propagate(successfn, IGNORE_ERRORS);
 
-    fail1(NULL);
-    test_propagate(fail1, NULL);
+    fail1(IGNORE_ERRORS);
+    test_propagate(fail1, IGNORE_ERRORS);
 
-    multifn(NULL);
-    test_propagate(multifn, NULL);
+    multifn(IGNORE_ERRORS);
+    test_propagate(multifn, IGNORE_ERRORS);
 
     successfn(&err);
     g_assert(!err);
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 07/15] Manual changes to use IGNORE_ERRORS instead of NULL
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (5 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 06/15] test-qapi-util: Use IGNORE_ERRORS instead of NULL Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 08/15] error: New ERR_IS_* macros for checking Error** values Eduardo Habkost
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

These cases were missed by the Coccinelle script for some, reason, so I
fixed them manually.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 block/crypto.c         |  4 ++--
 block/qcow2.c          |  2 +-
 block/snapshot.c       |  2 +-
 hw/acpi/cpu.c          |  2 +-
 hw/core/qdev.c         |  8 ++++----
 hw/isa/lpc_ich9.c      |  2 +-
 hw/ppc/spapr_drc.c     |  6 +++---
 hw/s390x/css.c         |  2 +-
 hw/vfio/ccw.c          |  2 +-
 hw/watchdog/watchdog.c |  2 +-
 hw/xen/xen_backend.c   |  4 ++--
 migration/colo.c       |  4 ++--
 migration/rdma.c       |  2 +-
 monitor.c              |  4 ++--
 nbd/server.c           |  2 +-
 net/net.c              |  2 +-
 qapi/opts-visitor.c    |  2 +-
 vl.c                   | 50 +++++++++++++++++++++++++-------------------------
 18 files changed, 51 insertions(+), 51 deletions(-)

diff --git a/block/crypto.c b/block/crypto.c
index f317eda83f..5c2687d271 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -449,7 +449,7 @@ block_crypto_co_readv(BlockDriverState *bs, int64_t sector_num,
         if (qcrypto_block_decrypt(crypto->block,
                                   sector_num,
                                   cipher_data, cur_nr_sectors * 512,
-                                  NULL) < 0) {
+                                  IGNORE_ERRORS) < 0) {
             ret = -EIO;
             goto cleanup;
         }
@@ -510,7 +510,7 @@ block_crypto_co_writev(BlockDriverState *bs, int64_t sector_num,
         if (qcrypto_block_encrypt(crypto->block,
                                   sector_num,
                                   cipher_data, cur_nr_sectors * 512,
-                                  NULL) < 0) {
+                                  IGNORE_ERRORS) < 0) {
             ret = -EIO;
             goto cleanup;
         }
diff --git a/block/qcow2.c b/block/qcow2.c
index aa0dc46162..53920a83b5 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2602,7 +2602,7 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uint64_t offset,
         /* align end of file to a sector boundary to ease reading with
            sector based I/Os */
         cluster_offset = bdrv_getlength(bs->file->bs);
-        return bdrv_truncate(bs->file, cluster_offset, NULL);
+        return bdrv_truncate(bs->file, cluster_offset, IGNORE_ERRORS);
     }
 
     buf = qemu_blockalign(bs, s->cluster_size);
diff --git a/block/snapshot.c b/block/snapshot.c
index a46564e7b7..244fdc2bb6 100644
--- a/block/snapshot.c
+++ b/block/snapshot.c
@@ -207,7 +207,7 @@ int bdrv_snapshot_goto(BlockDriverState *bs,
         bs->file = NULL;
 
         ret = bdrv_snapshot_goto(file, snapshot_id);
-        open_ret = drv->bdrv_open(bs, options, bs->open_flags, NULL);
+        open_ret = drv->bdrv_open(bs, options, bs->open_flags, IGNORE_ERRORS);
         QDECREF(options);
         if (open_ret < 0) {
             bdrv_unref(file);
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
index a233fe17cf..6dc138db89 100644
--- a/hw/acpi/cpu.c
+++ b/hw/acpi/cpu.c
@@ -125,7 +125,7 @@ static void cpu_hotplug_wr(void *opaque, hwaddr addr, uint64_t data,
             trace_cpuhp_acpi_ejecting_cpu(cpu_st->selector);
             dev = DEVICE(cdev->cpu);
             hotplug_ctrl = qdev_get_hotplug_handler(dev);
-            hotplug_handler_unplug(hotplug_ctrl, dev, NULL);
+            hotplug_handler_unplug(hotplug_ctrl, dev, IGNORE_ERRORS);
         }
         break;
     case ACPI_CPU_CMD_OFFSET_WR:
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index faa4af0dc3..163e827e01 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -952,9 +952,9 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
         }
         dev->pending_deleted_event = false;
     } else if (!value && dev->realized) {
-        Error **local_errp = NULL;
+        Error **local_errp = IGNORE_ERRORS;
         QLIST_FOREACH(bus, &dev->child_bus, sibling) {
-            local_errp = local_err ? NULL : &local_err;
+            local_errp = local_err ? IGNORE_ERRORS : &local_err;
             object_property_set_bool(OBJECT(bus), false, "realized",
                                      local_errp);
         }
@@ -962,7 +962,7 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
             vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
         }
         if (dc->unrealize) {
-            local_errp = local_err ? NULL : &local_err;
+            local_errp = local_err ? IGNORE_ERRORS : &local_err;
             dc->unrealize(dev, local_errp);
         }
         dev->pending_deleted_event = true;
@@ -988,7 +988,7 @@ child_realize_fail:
 
 post_realize_fail:
     if (dc->unrealize) {
-        dc->unrealize(dev, NULL);
+        dc->unrealize(dev, IGNORE_ERRORS);
     }
 
 fail:
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index 99a136d05a..ffa8f3ba03 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -659,7 +659,7 @@ static void ich9_lpc_add_properties(ICH9LPCState *lpc)
     object_property_add_uint8_ptr(OBJECT(lpc), ACPI_PM_PROP_ACPI_DISABLE_CMD,
                                   &acpi_disable_cmd, IGNORE_ERRORS);
 
-    ich9_pm_add_properties(OBJECT(lpc), &lpc->pm, NULL);
+    ich9_pm_add_properties(OBJECT(lpc), &lpc->pm, IGNORE_ERRORS);
 }
 
 static void ich9_lpc_initfn(Object *obj)
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index d7d0c0ee8e..1b0a7546fb 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -105,7 +105,7 @@ static uint32_t set_isolation_state(sPAPRDRConnector *drc,
             uint32_t drc_index = spapr_drc_index(drc);
             if (drc->configured) {
                 trace_spapr_drc_set_isolation_state_finalizing(drc_index);
-                drck->detach(drc, DEVICE(drc->dev), NULL);
+                drck->detach(drc, DEVICE(drc->dev), IGNORE_ERRORS);
             } else {
                 trace_spapr_drc_set_isolation_state_deferring(drc_index);
             }
@@ -159,7 +159,7 @@ static uint32_t set_allocation_state(sPAPRDRConnector *drc,
             drc->allocation_state == SPAPR_DR_ALLOCATION_STATE_UNUSABLE) {
             uint32_t drc_index = spapr_drc_index(drc);
             trace_spapr_drc_set_allocation_state_finalizing(drc_index);
-            drck->detach(drc, DEVICE(drc->dev), NULL);
+            drck->detach(drc, DEVICE(drc->dev), IGNORE_ERRORS);
         } else if (drc->allocation_state == SPAPR_DR_ALLOCATION_STATE_USABLE) {
             drc->awaiting_allocation = false;
         }
@@ -467,7 +467,7 @@ static void reset(DeviceState *d)
          * force removal if we are
          */
         if (drc->awaiting_release) {
-            drck->detach(drc, DEVICE(drc->dev), NULL);
+            drck->detach(drc, DEVICE(drc->dev), IGNORE_ERRORS);
         }
 
         /* non-PCI devices may be awaiting a transition to UNUSABLE */
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index 1e2f26b65a..c39e65f206 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -2070,7 +2070,7 @@ SubchDev *css_create_sch(CssDevId bus_id, bool is_virtual, bool squash_mcss,
 
             if   (css_find_free_subch_and_devno(bus_id.cssid, &bus_id.ssid,
                                                 &bus_id.devid, &schid,
-                                                NULL)) {
+                                                IGNORE_ERRORS)) {
                 break;
             }
             if (bus_id.cssid == MAX_CSSID) {
diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
index 12d0262336..d8dfbe321a 100644
--- a/hw/vfio/ccw.c
+++ b/hw/vfio/ccw.c
@@ -370,7 +370,7 @@ out_device_err:
     vfio_put_group(group);
 out_group_err:
     if (cdc->unrealize) {
-        cdc->unrealize(cdev, NULL);
+        cdc->unrealize(cdev, IGNORE_ERRORS);
     }
 out_err_propagate:
     error_propagate(errp, err);
diff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c
index 2c3b2bb418..60ad3fe113 100644
--- a/hw/watchdog/watchdog.c
+++ b/hw/watchdog/watchdog.c
@@ -144,7 +144,7 @@ void watchdog_perform_action(void)
     case WDT_NMI:
         qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_INJECT_NMI,
                                  &error_abort);
-        nmi_monitor_handle(0, NULL);
+        nmi_monitor_handle(0, IGNORE_ERRORS);
         break;
     }
 }
diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c
index c46cbb0759..b3450e01e0 100644
--- a/hw/xen/xen_backend.c
+++ b/hw/xen/xen_backend.c
@@ -143,7 +143,7 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
     xendev->evtchndev = xenevtchn_open(NULL, 0);
     if (xendev->evtchndev == NULL) {
         xen_pv_printf(NULL, 0, "can't open evtchn device\n");
-        qdev_unplug(DEVICE(xendev), NULL);
+        qdev_unplug(DEVICE(xendev), IGNORE_ERRORS);
         return NULL;
     }
     qemu_set_cloexec(xenevtchn_fd(xendev->evtchndev));
@@ -153,7 +153,7 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
         if (xendev->gnttabdev == NULL) {
             xen_pv_printf(NULL, 0, "can't open gnttab device\n");
             xenevtchn_close(xendev->evtchndev);
-            qdev_unplug(DEVICE(xendev), NULL);
+            qdev_unplug(DEVICE(xendev), IGNORE_ERRORS);
             return NULL;
         }
     } else {
diff --git a/migration/colo.c b/migration/colo.c
index d623d801e7..a68e6e9cdf 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -175,7 +175,7 @@ void qmp_xen_set_replication(bool enable, bool primary,
         if (!has_failover) {
             failover = NULL;
         }
-        replication_stop_all(failover, failover ? NULL : errp);
+        replication_stop_all(failover, failover ? IGNORE_ERRORS : errp);
     }
 #else
     abort();
@@ -641,7 +641,7 @@ void *colo_process_incoming_thread(void *opaque)
         if (failover_get_state() == FAILOVER_STATUS_RELAUNCH) {
             failover_set_state(FAILOVER_STATUS_RELAUNCH,
                             FAILOVER_STATUS_NONE);
-            failover_request_active(NULL);
+            failover_request_active(IGNORE_ERRORS);
             goto out;
         }
 
diff --git a/migration/rdma.c b/migration/rdma.c
index e446c6fd6a..a33edbf29b 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -2509,7 +2509,7 @@ static void *qemu_rdma_data_init(const char *host_port, Error **errp)
         rdma->current_chunk = -1;
 
         addr = g_new(InetSocketAddress, 1);
-        if (!inet_parse(addr, host_port, NULL)) {
+        if (!inet_parse(addr, host_port, IGNORE_ERRORS)) {
             rdma->port = atoi(addr->port);
             rdma->host = g_strdup(addr->host);
         } else {
diff --git a/monitor.c b/monitor.c
index c262311fdd..7c4327a175 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3467,7 +3467,7 @@ void netdev_del_completion(ReadLineState *rs, int nb_args, const char *str)
         if (strncmp(str, name, len)) {
             continue;
         }
-        opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), name);
+        opts = qemu_opts_find(qemu_find_opts_err("netdev", IGNORE_ERRORS), name);
         if (opts) {
             readline_add_completion(rs, name);
         }
@@ -3642,7 +3642,7 @@ static void vm_completion(ReadLineState *rs, const char *str)
 
         aio_context_acquire(ctx);
         if (bdrv_can_snapshot(bs)) {
-            ok = bdrv_query_snapshot_info_list(bs, &snapshots, NULL) == 0;
+            ok = bdrv_query_snapshot_info_list(bs, &snapshots, IGNORE_ERRORS) == 0;
         }
         aio_context_release(ctx);
         if (!ok) {
diff --git a/nbd/server.c b/nbd/server.c
index 8631fa55a3..b617ad5a4b 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -388,7 +388,7 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDClient *client,
     tioc = qio_channel_tls_new_server(ioc,
                                       client->tlscreds,
                                       client->tlsaclname,
-                                      NULL);
+                                      IGNORE_ERRORS);
     if (!tioc) {
         return NULL;
     }
diff --git a/net/net.c b/net/net.c
index 9d0f1119cc..b7f5459b33 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1248,7 +1248,7 @@ void qmp_netdev_del(const char *id, Error **errp)
         return;
     }
 
-    opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), id);
+    opts = qemu_opts_find(qemu_find_opts_err("netdev", IGNORE_ERRORS), id);
     if (!opts) {
         error_setg(errp, "Device '%s' is not a netdev", id);
         return;
diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c
index 324b197495..3e408e4bf0 100644
--- a/qapi/opts-visitor.c
+++ b/qapi/opts-visitor.c
@@ -516,7 +516,7 @@ opts_optional(Visitor *v, const char *name, bool *present)
 
     /* we only support a single mandatory scalar field in a list node */
     assert(ov->list_mode == LM_NONE);
-    *present = (lookup_distinct(ov, name, NULL) != NULL);
+    *present = (lookup_distinct(ov, name, IGNORE_ERRORS) != NULL);
 }
 
 
diff --git a/vl.c b/vl.c
index a7ad0cbd0c..32068db274 100644
--- a/vl.c
+++ b/vl.c
@@ -1176,7 +1176,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
 
     opts = drive_add(type, index, NULL, optstr);
     if (snapshot) {
-        drive_enable_snapshot(NULL, opts, NULL);
+        drive_enable_snapshot(NULL, opts, IGNORE_ERRORS);
     }
 
     dinfo = drive_new(opts, type);
@@ -1352,12 +1352,12 @@ static inline void semihosting_arg_fallback(const char *file, const char *cmd)
     char *cmd_token;
 
     /* argv[0] */
-    add_semihosting_arg(&semihosting, "arg", file, NULL);
+    add_semihosting_arg(&semihosting, "arg", file, IGNORE_ERRORS);
 
     /* split -append and initialize argv[1..n] */
     cmd_token = strtok(g_strdup(cmd), " ");
     while (cmd_token) {
-        add_semihosting_arg(&semihosting, "arg", cmd_token, NULL);
+        add_semihosting_arg(&semihosting, "arg", cmd_token, IGNORE_ERRORS);
         cmd_token = strtok(NULL, " ");
     }
 }
@@ -3556,7 +3556,7 @@ int main(int argc, char **argv, char **envp)
                 fsdev = qemu_opts_create(qemu_find_opts("fsdev"),
                                          qemu_opts_id(opts) ?:
                                          qemu_opt_get(opts, "mount_tag"),
-                                         1, NULL);
+                                         1, IGNORE_ERRORS);
                 if (!fsdev) {
                     error_report("duplicate or invalid fsdev id: %s",
                                  qemu_opt_get(opts, "mount_tag"));
@@ -3606,7 +3606,7 @@ int main(int argc, char **argv, char **envp)
                 QemuOpts *device;
 
                 fsdev = qemu_opts_create(qemu_find_opts("fsdev"), "v_synth",
-                                         1, NULL);
+                                         1, IGNORE_ERRORS);
                 if (!fsdev) {
                     error_report("duplicate option: %s", "virtfs_synth");
                     exit(1);
@@ -3875,7 +3875,7 @@ int main(int argc, char **argv, char **envp)
                     }
                     /* Set semihosting argument count and vector */
                     qemu_opt_foreach(opts, add_semihosting_arg,
-                                     &semihosting, NULL);
+                                     &semihosting, IGNORE_ERRORS);
                 } else {
                     error_report("unsupported semihosting-config %s", optarg);
                     exit(1);
@@ -4107,23 +4107,23 @@ int main(int argc, char **argv, char **envp)
     }
 
     if (qemu_opts_foreach(qemu_find_opts("sandbox"),
-                          parse_sandbox, NULL, NULL)) {
+                          parse_sandbox, NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 
     if (qemu_opts_foreach(qemu_find_opts("name"),
-                          parse_name, NULL, NULL)) {
+                          parse_name, NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 
 #ifndef _WIN32
     if (qemu_opts_foreach(qemu_find_opts("add-fd"),
-                          parse_add_fd, NULL, NULL)) {
+                          parse_add_fd, NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 
     if (qemu_opts_foreach(qemu_find_opts("add-fd"),
-                          cleanup_add_fd, NULL, NULL)) {
+                          cleanup_add_fd, NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 #endif
@@ -4220,9 +4220,9 @@ int main(int argc, char **argv, char **envp)
     }
 
     qemu_opts_foreach(qemu_find_opts("device"),
-                      default_driver_check, NULL, NULL);
+                      default_driver_check, NULL, IGNORE_ERRORS);
     qemu_opts_foreach(qemu_find_opts("global"),
-                      default_driver_check, NULL, NULL);
+                      default_driver_check, NULL, IGNORE_ERRORS);
 
     if (!vga_model && !default_vga) {
         vga_interface_type = VGA_DEVICE;
@@ -4364,30 +4364,30 @@ int main(int argc, char **argv, char **envp)
 
     if (qemu_opts_foreach(qemu_find_opts("object"),
                           user_creatable_add_opts_foreach,
-                          object_create_initial, NULL)) {
+                          object_create_initial, IGNORE_ERRORS)) {
         exit(1);
     }
 
     if (qemu_opts_foreach(qemu_find_opts("chardev"),
-                          chardev_init_func, NULL, NULL)) {
+                          chardev_init_func, NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 
 #ifdef CONFIG_VIRTFS
     if (qemu_opts_foreach(qemu_find_opts("fsdev"),
-                          fsdev_init_func, NULL, NULL)) {
+                          fsdev_init_func, NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 #endif
 
     if (qemu_opts_foreach(qemu_find_opts("device"),
-                          device_help_func, NULL, NULL)) {
+                          device_help_func, NULL, IGNORE_ERRORS)) {
         exit(0);
     }
 
     machine_opts = qemu_get_machine_opts();
     if (qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
-                         NULL)) {
+                         IGNORE_ERRORS)) {
         object_unref(OBJECT(current_machine));
         exit(1);
     }
@@ -4479,7 +4479,7 @@ int main(int argc, char **argv, char **envp)
 
     if (qemu_opts_foreach(qemu_find_opts("object"),
                           user_creatable_add_opts_foreach,
-                          object_create_delayed, NULL)) {
+                          object_create_delayed, IGNORE_ERRORS)) {
         exit(1);
     }
 
@@ -4524,10 +4524,10 @@ int main(int argc, char **argv, char **envp)
     }
     if (snapshot || replay_mode != REPLAY_MODE_NONE) {
         qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
-                          NULL, NULL);
+                          NULL, IGNORE_ERRORS);
     }
     if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
-                          &machine_class->block_default_type, NULL)) {
+                          &machine_class->block_default_type, IGNORE_ERRORS)) {
         exit(1);
     }
 
@@ -4539,7 +4539,7 @@ int main(int argc, char **argv, char **envp)
     parse_numa_opts(current_machine);
 
     if (qemu_opts_foreach(qemu_find_opts("mon"),
-                          mon_init_func, NULL, NULL)) {
+                          mon_init_func, NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 
@@ -4578,7 +4578,7 @@ int main(int argc, char **argv, char **envp)
     machine_register_compat_props(current_machine);
 
     qemu_opts_foreach(qemu_find_opts("global"),
-                      global_init_func, NULL, NULL);
+                      global_init_func, NULL, IGNORE_ERRORS);
 
     /* This checkpoint is required by replay to separate prior clock
        reading from the other reads, because timer polling functions query
@@ -4603,7 +4603,7 @@ int main(int argc, char **argv, char **envp)
     }
 
     if (qemu_opts_foreach(qemu_find_opts("fw_cfg"),
-                          parse_fw_cfg, fw_cfg_find(), NULL) != 0) {
+                          parse_fw_cfg, fw_cfg_find(), IGNORE_ERRORS) != 0) {
         exit(1);
     }
 
@@ -4619,7 +4619,7 @@ int main(int argc, char **argv, char **envp)
     /* init generic devices */
     rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
     if (qemu_opts_foreach(qemu_find_opts("device"),
-                          device_init_func, NULL, NULL)) {
+                          device_init_func, NULL, IGNORE_ERRORS)) {
         exit(1);
     }
 
@@ -4683,7 +4683,7 @@ int main(int argc, char **argv, char **envp)
     /* init remote displays */
 #ifdef CONFIG_VNC
     qemu_opts_foreach(qemu_find_opts("vnc"),
-                      vnc_init_func, NULL, NULL);
+                      vnc_init_func, NULL, IGNORE_ERRORS);
 #endif
 
     if (using_spice) {
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 08/15] error: New ERR_IS_* macros for checking Error** values
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (6 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 07/15] Manual changes to use " Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 09/15] [coccinelle] Use ERR_IS_* macros Eduardo Habkost
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Define new macros that should be used when checking errp values.
Existing methods will still work by now, but will break once we
implement IGNORE_ERRORS in a different way later.  Other patches will
convert existing code to use the new macros.

TODO: write more detailed API documentation

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

diff --git a/include/qapi/error.h b/include/qapi/error.h
index 38f7afba2e..1000853051 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -119,6 +119,9 @@
 
 #define IGNORE_ERRORS (NULL)
 
+#define ERR_IS_SET(e) (!!*(e))
+#define ERR_IS_IGNORED(e) (!(e))
+
 /*
  * Overall category of an error.
  * Based on the qapi type QapiErrorClass, but reproduced here for nicer
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 09/15] [coccinelle] Use ERR_IS_* macros
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (7 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 08/15] error: New ERR_IS_* macros for checking Error** values Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 10/15] test-qapi-util: " Eduardo Habkost
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Generated by the following Coccinelle patch:

  @@
  typedef Error;
  idexpression Error ** errp;
  statement ST;
  @@
  -if (*errp)
  +if (ERR_IS_SET(errp))
       ST

  @@
  typedef Error;
  idexpression Error ** errp;
  statement ST;
  @@
  -if (!*errp)
  +if (!ERR_IS_SET(errp))
       ST

  @@
  typedef Error;
  idexpression Error ** errp;
  @@
  -assert(!*errp)
  +assert(!ERR_IS_SET(errp))

  @@
  typedef Error;
  idexpression Error ** errp;
  @@
  -    assert(errp && *errp);
  +    assert(!ERR_IS_IGNORED(errp) && ERR_IS_SET(errp));

  @@
  typedef Error;
  idexpression Error ** errp;
  @@
  -    assert(errp && !*errp);
  +    assert(!ERR_IS_IGNORED(errp) && !ERR_IS_SET(errp));

  @@
  typedef Error;
  idexpression Error ** errp;
  @@
  -    assert(!errp || !*errp);
  +    assert(!ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));

  @@
  typedef Error;
  idexpression Error ** errp;
  statement ST;
  @@
  -if (errp)
  +if (!ERR_IS_IGNORED(errp))
       ST

  @@
  typedef Error;
  idexpression Error ** errp;
  statement ST;
  @@
  -if (!errp)
  +if (ERR_IS_IGNORED(errp))
       ST

  @@
  typedef Error;
  idexpression Error ** errp;
  statement ST;
  @@
  -if (errp && *errp)
  +if (!ERR_IS_IGNORED(errp) && ERR_IS_SET(errp))
       ST

  @@
  typedef Error;
  idexpression Error ** errp;
  statement ST;
  @@
  -if (errp && *errp != NULL)
  +if (!ERR_IS_IGNORED(errp) && ERR_IS_SET(errp))
       ST

  @@
  typedef Error;
  idexpression Error ** errp;
  statement ST;
  @@
  -if (errp && !*errp)
  +if (!ERR_IS_IGNORED(errp) && !ERR_IS_SET(errp))
       ST

  @@
  typedef Error;
  idexpression Error ** errp;
  statement ST;
  @@
  -if (errp && *errp == NULL)
  +if (!ERR_IS_IGNORED(errp) && !ERR_IS_SET(errp))
       ST

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 block.c                          |  2 +-
 hw/acpi/cpu_hotplug.c            |  2 +-
 hw/ipmi/isa_ipmi_bt.c            |  2 +-
 hw/mem/pc-dimm.c                 |  2 +-
 hw/ppc/spapr.c                   |  2 +-
 hw/ppc/spapr_pci.c               |  2 +-
 hw/s390x/event-facility.c        |  2 +-
 net/net.c                        |  2 +-
 qapi/qobject-input-visitor.c     |  2 +-
 qga/commands-posix.c             |  2 +-
 target/s390x/cpu_models.c        | 30 +++++++++++++++---------------
 target/s390x/helper.c            |  2 +-
 tests/test-crypto-tlscredsx509.c |  2 +-
 tests/test-io-channel-tls.c      |  2 +-
 util/error.c                     | 12 ++++++------
 15 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/block.c b/block.c
index ecb5be9a32..b08d95a62a 100644
--- a/block.c
+++ b/block.c
@@ -1383,7 +1383,7 @@ static QDict *parse_json_filename(const char *filename, Error **errp)
     options_obj = qobject_from_json(filename, errp);
     if (!options_obj) {
         /* Work around qobject_from_json() lossage TODO fix that */
-        if (errp && !*errp) {
+        if (!ERR_IS_IGNORED(errp) && !ERR_IS_SET(errp)) {
             error_setg(errp, "Could not parse the JSON options");
             return NULL;
         }
diff --git a/hw/acpi/cpu_hotplug.c b/hw/acpi/cpu_hotplug.c
index 5243918125..c72a748bb3 100644
--- a/hw/acpi/cpu_hotplug.c
+++ b/hw/acpi/cpu_hotplug.c
@@ -76,7 +76,7 @@ void legacy_acpi_cpu_plug_cb(HotplugHandler *hotplug_dev,
                              AcpiCpuHotplug *g, DeviceState *dev, Error **errp)
 {
     acpi_set_cpu_present_bit(g, CPU(dev), errp);
-    if (*errp != NULL) {
+    if (ERR_IS_SET(errp)) {
         return;
     }
     acpi_send_event(DEVICE(hotplug_dev), ACPI_CPU_HOTPLUG_STATUS);
diff --git a/hw/ipmi/isa_ipmi_bt.c b/hw/ipmi/isa_ipmi_bt.c
index 2fcc3d2e7c..c7480f5f78 100644
--- a/hw/ipmi/isa_ipmi_bt.c
+++ b/hw/ipmi/isa_ipmi_bt.c
@@ -438,7 +438,7 @@ static void isa_ipmi_bt_realize(DeviceState *dev, Error **errp)
     iib->bt.bmc->intf = ii;
 
     iic->init(ii, errp);
-    if (*errp)
+    if (ERR_IS_SET(errp))
         return;
 
     if (iib->isairq > 0) {
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 92fb48255a..4e5e2c9339 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -316,7 +316,7 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
         uint64_t dimm_size = object_property_get_int(OBJECT(dimm),
                                                      PC_DIMM_SIZE_PROP,
                                                      errp);
-        if (errp && *errp) {
+        if (!ERR_IS_IGNORED(errp) && ERR_IS_SET(errp)) {
             goto out;
         }
 
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index e07fd88a55..af33297e0f 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2983,7 +2983,7 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
             return;
         }
         node = object_property_get_int(OBJECT(dev), PC_DIMM_NODE_PROP, errp);
-        if (*errp) {
+        if (ERR_IS_SET(errp)) {
             return;
         }
         if (node < 0 || node >= MAX_NODES) {
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index b0c58ad3f1..5b3660b674 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -1364,7 +1364,7 @@ static void spapr_phb_add_pci_device(sPAPRDRConnector *drc,
     drck->attach(drc, DEVICE(pdev),
                  fdt, fdt_start_offset, !dev->hotplugged, errp);
 out:
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         g_free(fdt);
     }
 }
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 2f2bf8b45d..6eac626212 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -296,7 +296,7 @@ static void sclp_events_bus_realize(BusState *bus, Error **errp)
         DeviceState *dev = kid->child;
 
         object_property_set_bool(OBJECT(dev), true, "realized", errp);
-        if (*errp) {
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/net/net.c b/net/net.c
index b7f5459b33..5c09301692 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1061,7 +1061,7 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
 
     if (net_client_init_fun[netdev->type](netdev, name, peer, errp) < 0) {
         /* FIXME drop when all init functions store an Error */
-        if (errp && !*errp) {
+        if (!ERR_IS_IGNORED(errp) && !ERR_IS_SET(errp)) {
             error_setg(errp, QERR_DEVICE_INIT_FAILED,
                        NetClientDriver_lookup[netdev->type]);
         }
diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c
index eac40f618a..7da822b3a2 100644
--- a/qapi/qobject-input-visitor.c
+++ b/qapi/qobject-input-visitor.c
@@ -723,7 +723,7 @@ Visitor *qobject_input_visitor_new_str(const char *str,
         obj = qobject_from_json(str, errp);
         if (!obj) {
             /* Work around qobject_from_json() lossage TODO fix that */
-            if (errp && !*errp) {
+            if (!ERR_IS_IGNORED(errp) && !ERR_IS_SET(errp)) {
                 error_setg(errp, "JSON parse error");
                 return NULL;
             }
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 220a50ad7c..623a32a7d8 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -1025,7 +1025,7 @@ static void build_guest_fsinfo_for_virtual_device(char const *syspath,
             build_guest_fsinfo_for_device(path, fs, errp);
             g_free(path);
 
-            if (*errp) {
+            if (ERR_IS_SET(errp)) {
                 break;
             }
         }
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 5206a10134..4fde8f41fd 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -348,22 +348,22 @@ static void cpu_model_from_info(S390CPUModel *model, const CpuModelInfo *info,
     if (qdict) {
         visitor = qobject_input_visitor_new(info->props);
         visit_start_struct(visitor, NULL, NULL, 0, errp);
-        if (*errp) {
+        if (ERR_IS_SET(errp)) {
             object_unref(obj);
             return;
         }
         for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
             object_property_set(obj, visitor, e->key, errp);
-            if (*errp) {
+            if (ERR_IS_SET(errp)) {
                 break;
             }
         }
-        if (!*errp) {
+        if (!ERR_IS_SET(errp)) {
             visit_check_struct(visitor, errp);
         }
         visit_end_struct(visitor, NULL);
         visit_free(visitor);
-        if (*errp) {
+        if (ERR_IS_SET(errp)) {
             object_unref(obj);
             return;
         }
@@ -434,7 +434,7 @@ CpuModelExpansionInfo *arch_query_cpu_model_expansion(CpuModelExpansionType type
 
     /* convert it to our internal representation */
     cpu_model_from_info(&s390_model, model, errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
 
@@ -474,11 +474,11 @@ CpuModelCompareInfo *arch_query_cpu_model_comparison(CpuModelInfo *infoa,
 
     /* convert both models to our internal representation */
     cpu_model_from_info(&modela, infoa, errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
     cpu_model_from_info(&modelb, infob, errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
     compare_info = g_malloc0(sizeof(*compare_info));
@@ -548,12 +548,12 @@ CpuModelBaselineInfo *arch_query_cpu_model_baseline(CpuModelInfo *infoa,
 
     /* convert both models to our internal representation */
     cpu_model_from_info(&modela, infoa, errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
 
     cpu_model_from_info(&modelb, infob, errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
 
@@ -702,7 +702,7 @@ static S390CPUModel *get_max_cpu_model(Error **errp)
                     S390_FEAT_MAX);
         add_qemu_cpu_model_features(max_model.features);
     }
-    if (!*errp) {
+    if (!ERR_IS_SET(errp)) {
         cached = true;
         return &max_model;
     }
@@ -732,7 +732,7 @@ static inline void apply_cpu_model(const S390CPUModel *model, Error **errp)
         /* FIXME TCG - use data for stdip/stfl */
     }
 
-    if (!*errp) {
+    if (!ERR_IS_SET(errp)) {
         applied = true;
         if (model) {
             applied_model = *model;
@@ -759,7 +759,7 @@ void s390_realize_cpu_model(CPUState *cs, Error **errp)
     }
 
     max_model = get_max_cpu_model(errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         error_prepend(errp, "CPU models are not available: ");
         return;
     }
@@ -771,7 +771,7 @@ void s390_realize_cpu_model(CPUState *cs, Error **errp)
 
     check_consistency(cpu->model);
     check_compatibility(max_model, cpu->model, errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -814,7 +814,7 @@ static void set_feature(Object *obj, Visitor *v, const char *name,
     }
 
     visit_type_bool(v, name, &value, errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (value) {
@@ -871,7 +871,7 @@ static void set_feature_group(Object *obj, Visitor *v, const char *name,
     }
 
     visit_type_bool(v, name, &value, errp);
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (value) {
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index a8d20c51fa..1408ce2b4a 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -98,7 +98,7 @@ S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp)
     }
     g_free(name);
 
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
     return S390_CPU(CPU(object_new(typename)));
diff --git a/tests/test-crypto-tlscredsx509.c b/tests/test-crypto-tlscredsx509.c
index af2f80e89c..a14b4b1cad 100644
--- a/tests/test-crypto-tlscredsx509.c
+++ b/tests/test-crypto-tlscredsx509.c
@@ -54,7 +54,7 @@ static QCryptoTLSCreds *test_tls_creds_create(QCryptoTLSCredsEndpoint endpoint,
         "sanity-check", "yes",
         NULL);
 
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
     return QCRYPTO_TLS_CREDS(creds);
diff --git a/tests/test-io-channel-tls.c b/tests/test-io-channel-tls.c
index fae2906060..6509ab1045 100644
--- a/tests/test-io-channel-tls.c
+++ b/tests/test-io-channel-tls.c
@@ -89,7 +89,7 @@ static QCryptoTLSCreds *test_tls_creds_create(QCryptoTLSCredsEndpoint endpoint,
         NULL
         );
 
-    if (*errp) {
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
     return QCRYPTO_TLS_CREDS(creds);
diff --git a/util/error.c b/util/error.c
index 020b86b9f0..a1d998646a 100644
--- a/util/error.c
+++ b/util/error.c
@@ -51,10 +51,10 @@ static void error_setv(Error **errp,
     Error *err;
     int saved_errno = errno;
 
-    if (errp == NULL) {
+    if (ERR_IS_IGNORED(errp)) {
         return;
     }
-    assert(*errp == NULL);
+    assert(!ERR_IS_SET(errp));
 
     err = g_malloc0(sizeof(*err));
     err->msg = g_strdup_vprintf(fmt, ap);
@@ -103,7 +103,7 @@ void error_setg_errno_internal(Error **errp,
     va_list ap;
     int saved_errno = errno;
 
-    if (errp == NULL) {
+    if (ERR_IS_IGNORED(errp)) {
         return;
     }
 
@@ -127,7 +127,7 @@ void error_vprepend(Error **errp, const char *fmt, va_list ap)
 {
     GString *newmsg;
 
-    if (!errp) {
+    if (ERR_IS_IGNORED(errp)) {
         return;
     }
 
@@ -153,7 +153,7 @@ void error_append_hint(Error **errp, const char *fmt, ...)
     int saved_errno = errno;
     Error *err;
 
-    if (!errp) {
+    if (ERR_IS_IGNORED(errp)) {
         return;
     }
     err = *errp;
@@ -178,7 +178,7 @@ void error_setg_win32_internal(Error **errp,
     va_list ap;
     char *suffix = NULL;
 
-    if (errp == NULL) {
+    if (ERR_IS_IGNORED(errp)) {
         return;
     }
 
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 10/15] test-qapi-util: Use ERR_IS_* macros
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (8 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 09/15] [coccinelle] Use ERR_IS_* macros Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 11/15] Manual changes to use " Eduardo Habkost
                   ` (6 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 tests/test-qapi-util.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/tests/test-qapi-util.c b/tests/test-qapi-util.c
index 374fa30078..fe232ef9ed 100644
--- a/tests/test-qapi-util.c
+++ b/tests/test-qapi-util.c
@@ -77,25 +77,25 @@ static void test_parse_qapi_name(void)
 
 static void successfn(Error **errp)
 {
-    g_assert(!errp || !*errp);
+    g_assert(ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));
 }
 
 static void fail1(Error **errp)
 {
-    g_assert(!errp || !*errp);
+    g_assert(ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));
 
     error_setg(errp, "error1");
 
-    g_assert(!errp || *errp);
+    g_assert(ERR_IS_IGNORED(errp) || ERR_IS_SET(errp));
 }
 
 static void fail2(Error **errp)
 {
-    g_assert(!errp || !*errp);
+    g_assert(ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));
 
     error_setg(errp, "error2");
 
-    g_assert(!errp || *errp);
+    g_assert(ERR_IS_IGNORED(errp) || ERR_IS_SET(errp));
 }
 
 static void multifn(Error **errp)
@@ -124,13 +124,13 @@ static void test_propagate(void (*fn)(Error **), Error **errp)
     bool failed;
     Error *local_err = NULL;
 
-    g_assert(!errp || !*errp);
+    g_assert(ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));
 
     fn(&local_err);
     failed = !!local_err;
     error_propagate(errp, local_err);
 
-    g_assert(!errp || (failed == !!*errp));
+    g_assert(ERR_IS_IGNORED(errp) || (failed == !!ERR_IS_SET(errp)));
 }
 
 static void test_error_api(void)
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 11/15] Manual changes to use ERR_IS_* macros
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (9 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 10/15] test-qapi-util: " Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 12/15] error: Make IGNORED_ERRORS not a NULL pointer Eduardo Habkost
                   ` (5 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Change code that was missed by the Coccinelle patch for some reason.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/core/qdev-properties.c | 2 +-
 hw/mem/pc-dimm.c          | 2 +-
 migration/rdma.c          | 2 +-
 util/error.c              | 4 ++--
 util/qemu-option.c        | 6 +++---
 5 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 9f1a497322..65ba36f4fb 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1107,7 +1107,7 @@ static void qdev_prop_set_globals_for_type(DeviceState *dev,
         if (err != NULL) {
             error_prepend(&err, "can't apply global %s.%s=%s: ",
                           prop->driver, prop->property, prop->value);
-            if (!dev->hotplugged && prop->errp) {
+            if (!dev->hotplugged && !ERR_IS_IGNORED(prop->errp)) {
                 error_propagate(prop->errp, err);
             } else {
                 assert(prop->user_provided);
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 4e5e2c9339..13f43ab658 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -139,7 +139,7 @@ static int pc_existing_dimms_capacity_internal(Object *obj, void *opaque)
                 cap->errp);
         }
 
-        if (cap->errp && *cap->errp) {
+        if (!ERR_IS_IGNORED(cap->errp) && ERR_IS_SET(cap->errp)) {
             return 1;
         }
     }
diff --git a/migration/rdma.c b/migration/rdma.c
index a33edbf29b..c6078bf51b 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -39,7 +39,7 @@
 #define ERROR(errp, fmt, ...) \
     do { \
         fprintf(stderr, "RDMA ERROR: " fmt "\n", ## __VA_ARGS__); \
-        if (errp && (*(errp) == NULL)) { \
+        if (!ERR_IS_IGNORED(errp) && !ERR_IS_SET(errp)) { \
             error_setg(errp, "RDMA ERROR: " fmt, ## __VA_ARGS__); \
         } \
     } while (0)
diff --git a/util/error.c b/util/error.c
index a1d998646a..4e804287eb 100644
--- a/util/error.c
+++ b/util/error.c
@@ -255,7 +255,7 @@ void error_free(Error *err)
 
 void error_free_or_abort(Error **errp)
 {
-    assert(errp && *errp);
+    assert(!ERR_IS_IGNORED(errp) && ERR_IS_SET(errp));
     error_free(*errp);
     *errp = NULL;
 }
@@ -266,7 +266,7 @@ void error_propagate(Error **dst_errp, Error *local_err)
         return;
     }
     error_handle_fatal(dst_errp, local_err);
-    if (dst_errp && !*dst_errp) {
+    if (!ERR_IS_IGNORED(dst_errp) && !ERR_IS_SET(dst_errp)) {
         *dst_errp = local_err;
     } else {
         error_free(local_err);
diff --git a/util/qemu-option.c b/util/qemu-option.c
index a7e62593b1..5f1c7af1c6 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -617,7 +617,7 @@ int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
         if (rc) {
             return rc;
         }
-        assert(!errp || !*errp);
+        assert(!ERR_IS_SET(errp));
     }
     return 0;
 }
@@ -945,7 +945,7 @@ static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
     const char *value;
     int n;
 
-    if (!strcmp(key, "id") || *state->errp) {
+    if (!strcmp(key, "id") || ERR_IS_SET(state->errp)) {
         return;
     }
 
@@ -1113,7 +1113,7 @@ int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
         if (rc) {
             break;
         }
-        assert(!errp || !*errp);
+        assert(!ERR_IS_SET(errp));
     }
     loc_pop(&loc);
     return rc;
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 12/15] error: Make IGNORED_ERRORS not a NULL pointer
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (10 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 11/15] Manual changes to use " Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 13/15] rdma: Simplify var declaration to avoid confusing Coccinelle Eduardo Habkost
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Use a trick to make we have a non-NULL errp if IGNORED_ERRORS is used:
instead of passing NULL, pass an existing pointer that points to a
special &error_ignored_unset value.  This will let the error API to flag
error state on *errp but won't require error_free() to be called later.

This will allow us to simplify the documented method to propagate errors
from:

    Error *err = NULL;
    foo(arg, &err);
    if (err) {
        handle the error...
        error_propagate(errp, err);
    }

to:

    foo(arg, errp);
    if (ERR_IS_SET(errp)) {
        handle the error...
    }

This will allow us to stop using local_err variables and
error_propagate() on hundreds of cases.

* TODO: API documentation needs to be updated.
* TODO: probably we should add assert(errp) lines to the ERR_IS_* macros,
        as err_set*() will now break if errp is NULL.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qapi/error.h   | 20 +++++++++++++++++---
 tests/test-qapi-util.c | 14 +++++++-------
 util/error.c           | 13 ++++++++++++-
 3 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/include/qapi/error.h b/include/qapi/error.h
index 1000853051..d1378396dd 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -117,10 +117,24 @@
 
 #include "qapi-types.h"
 
-#define IGNORE_ERRORS (NULL)
 
-#define ERR_IS_SET(e) (!!*(e))
-#define ERR_IS_IGNORED(e) (!(e))
+/*
+ * Special error value to indicate errors will be ignored, and no
+ * error was set.
+ */
+extern Error ignored_error_unset;
+
+/*
+ * Special error destination to indicate errors will be ignored,
+ * but an error value was set.
+ */
+extern Error ignored_error_set;
+
+
+#define IGNORE_ERRORS (& (Error *) { &ignored_error_unset })
+
+#define ERR_IS_SET(e) (*(e) && *(e) != &ignored_error_unset)
+#define ERR_IS_IGNORED(e) (!(e) || *(e) == &ignored_error_unset || *(e) == &ignored_error_set)
 
 /*
  * Overall category of an error.
diff --git a/tests/test-qapi-util.c b/tests/test-qapi-util.c
index fe232ef9ed..0305b9201b 100644
--- a/tests/test-qapi-util.c
+++ b/tests/test-qapi-util.c
@@ -77,25 +77,25 @@ static void test_parse_qapi_name(void)
 
 static void successfn(Error **errp)
 {
-    g_assert(ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));
+    g_assert(!ERR_IS_SET(errp));
 }
 
 static void fail1(Error **errp)
 {
-    g_assert(ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));
+    g_assert(!ERR_IS_SET(errp));
 
     error_setg(errp, "error1");
 
-    g_assert(ERR_IS_IGNORED(errp) || ERR_IS_SET(errp));
+    g_assert(ERR_IS_SET(errp));
 }
 
 static void fail2(Error **errp)
 {
-    g_assert(ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));
+    g_assert(!ERR_IS_SET(errp));
 
     error_setg(errp, "error2");
 
-    g_assert(ERR_IS_IGNORED(errp) || ERR_IS_SET(errp));
+    g_assert(ERR_IS_SET(errp));
 }
 
 static void multifn(Error **errp)
@@ -124,13 +124,13 @@ static void test_propagate(void (*fn)(Error **), Error **errp)
     bool failed;
     Error *local_err = NULL;
 
-    g_assert(ERR_IS_IGNORED(errp) || !ERR_IS_SET(errp));
+    g_assert(!ERR_IS_SET(errp));
 
     fn(&local_err);
     failed = !!local_err;
     error_propagate(errp, local_err);
 
-    g_assert(ERR_IS_IGNORED(errp) || (failed == !!ERR_IS_SET(errp)));
+    g_assert((failed == !!ERR_IS_SET(errp)));
 }
 
 static void test_error_api(void)
diff --git a/util/error.c b/util/error.c
index 4e804287eb..2e16ad371c 100644
--- a/util/error.c
+++ b/util/error.c
@@ -28,6 +28,8 @@ struct Error
 
 Error *error_abort;
 Error *error_fatal;
+Error ignored_error_unset;
+Error ignored_error_set;
 
 static void error_handle_fatal(Error **errp, Error *err)
 {
@@ -52,6 +54,7 @@ static void error_setv(Error **errp,
     int saved_errno = errno;
 
     if (ERR_IS_IGNORED(errp)) {
+        *errp = &ignored_error_set;
         return;
     }
     assert(!ERR_IS_SET(errp));
@@ -104,6 +107,7 @@ void error_setg_errno_internal(Error **errp,
     int saved_errno = errno;
 
     if (ERR_IS_IGNORED(errp)) {
+        *errp = &ignored_error_set;
         return;
     }
 
@@ -127,6 +131,8 @@ void error_vprepend(Error **errp, const char *fmt, va_list ap)
 {
     GString *newmsg;
 
+    assert(ERR_IS_SET(errp));
+
     if (ERR_IS_IGNORED(errp)) {
         return;
     }
@@ -153,6 +159,8 @@ void error_append_hint(Error **errp, const char *fmt, ...)
     int saved_errno = errno;
     Error *err;
 
+    assert(ERR_IS_SET(errp));
+
     if (ERR_IS_IGNORED(errp)) {
         return;
     }
@@ -179,6 +187,7 @@ void error_setg_win32_internal(Error **errp,
     char *suffix = NULL;
 
     if (ERR_IS_IGNORED(errp)) {
+        *errp = &ignored_error_set;
         return;
     }
 
@@ -266,7 +275,9 @@ void error_propagate(Error **dst_errp, Error *local_err)
         return;
     }
     error_handle_fatal(dst_errp, local_err);
-    if (!ERR_IS_IGNORED(dst_errp) && !ERR_IS_SET(dst_errp)) {
+    if (ERR_IS_IGNORED(dst_errp)) {
+        *dst_errp = &ignored_error_set;
+    } else if (!ERR_IS_SET(dst_errp)) {
         *dst_errp = local_err;
     } else {
         error_free(local_err);
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 13/15] rdma: Simplify var declaration to avoid confusing Coccinelle
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (11 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 12/15] error: Make IGNORED_ERRORS not a NULL pointer Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 14/15] [coccinelle] Eliminate unnecessary local_err/error_propagate() usage Eduardo Habkost
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

For some reason the declaration:

  Error *local_err = NULL, **errp = &local_err;

will be matched by Coccinelle even if we use:

  ... when != local_err
  Error *local_err = NULL;
  ... when != local_err

This moves the declarations to separate lines just to avoid that issue.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 migration/rdma.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/migration/rdma.c b/migration/rdma.c
index c6078bf51b..5cb9572a5c 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -2282,7 +2282,8 @@ static void qemu_rdma_cleanup(RDMAContext *rdma)
 static int qemu_rdma_source_init(RDMAContext *rdma, bool pin_all, Error **errp)
 {
     int ret, idx;
-    Error *local_err = NULL, **temp = &local_err;
+    Error *local_err = NULL;
+    Error **temp = &local_err;
 
     /*
      * Will be validated against destination's actual capabilities
@@ -3433,7 +3434,8 @@ static int qemu_rdma_registration_start(QEMUFile *f, void *opaque,
 static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
                                        uint64_t flags, void *data)
 {
-    Error *local_err = NULL, **errp = &local_err;
+    Error *local_err = NULL;
+    Error **errp = &local_err;
     QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(opaque);
     RDMAContext *rdma = rioc->rdma;
     RDMAControlHeader head = { .len = 0, .repeat = 1 };
@@ -3606,7 +3608,8 @@ static void rdma_accept_incoming_migration(void *opaque)
     RDMAContext *rdma = opaque;
     int ret;
     QEMUFile *f;
-    Error *local_err = NULL, **errp = &local_err;
+    Error *local_err = NULL;
+    Error **errp = &local_err;
 
     trace_qemu_rdma_accept_incoming_migration();
     ret = qemu_rdma_accept(rdma);
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 14/15] [coccinelle] Eliminate unnecessary local_err/error_propagate() usage
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (12 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 13/15] rdma: Simplify var declaration to avoid confusing Coccinelle Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
  2017-06-13 16:53 ` [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments Eduardo Habkost
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

Now we can check for errors on errp using the ERR_IS_SET() macro, even
if errors are being ignored.

Replace common local_err/error_propagate() usage using the following
Coccinelle script:

  @ simple_propagate @
  typedef Error;
  type T;
  identifier FN;
  expression some_func;
  identifier errp;
  identifier local_err;
  @@
   T FN(..., Error **errp)
   {
       ...
  -    Error *local_err = NULL;
       <... when != local_err
  (
       some_func(...,
  -        &local_err
  +        errp
          );
       ... when != local_err
  (
       error_propagate(errp, local_err);
  |
       if (local_err) {
           ... when != local_err
           error_propagate(errp, local_err);
           ... when != local_err
       }
  )
  |
       if (
  -        local_err
  +        ERR_IS_SET(errp)
          ) {
           ... when != local_err
  -        error_propagate(errp, local_err);
           ... when != local_err
       }
  |
  -    error_propagate(errp, local_err);
  )
       ...>
   }

>From the 792 error_propagate() calls in the tree, 346 were automatically
converted by the script.  Probably we can write a more complex script
that catches many of the remaining cases later, or convert them
manually.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 qapi/qapi-visit-core.c              |   6 +-
 backends/hostmem.c                  |   6 +-
 backends/rng.c                      |   6 +-
 backends/tpm.c                      |   6 +-
 block.c                             |  41 ++++------
 block/blkdebug.c                    |  16 ++--
 block/block-backend.c               |   6 +-
 block/commit.c                      |  16 ++--
 block/crypto.c                      |   6 +-
 block/curl.c                        |   6 +-
 block/file-posix.c                  |   6 +-
 block/gluster.c                     |   6 +-
 block/io.c                          |  11 +--
 block/iscsi.c                       |  27 +++----
 block/mirror.c                      |  12 +--
 block/nbd.c                         |  18 ++---
 block/nfs.c                         |  12 +--
 block/qapi.c                        |   6 +-
 block/qcow2.c                       |  11 +--
 block/raw-format.c                  |   6 +-
 block/rbd.c                         |   6 +-
 block/replication.c                 |  10 +--
 block/sheepdog.c                    |  28 +++----
 block/ssh.c                         |  12 +--
 blockdev.c                          |  45 ++++-------
 blockjob.c                          |  13 +--
 bootdevice.c                        |  13 +--
 chardev/char.c                      |   6 +-
 dump.c                              | 153 +++++++++++-------------------------
 exec.c                              |  18 ++---
 hw/arm/allwinner-a10.c              |  26 +++---
 hw/arm/armv7m.c                     |  26 +++---
 hw/arm/digic.c                      |  21 ++---
 hw/arm/fsl-imx25.c                  |  61 ++++++--------
 hw/arm/fsl-imx31.c                  |  56 ++++++-------
 hw/arm/fsl-imx6.c                   |  76 +++++++-----------
 hw/arm/xlnx-zynqmp.c                |   6 +-
 hw/block/fdc.c                      |  23 ++----
 hw/block/pflash_cfi01.c             |   6 +-
 hw/block/pflash_cfi02.c             |   6 +-
 hw/block/virtio-blk.c               |  16 ++--
 hw/char/debugcon.c                  |   6 +-
 hw/char/serial-pci.c                |  12 +--
 hw/char/virtio-serial-bus.c         |   6 +-
 hw/core/machine.c                   |  12 +--
 hw/core/qdev-properties-system.c    |  24 ++----
 hw/core/qdev-properties.c           |  47 ++++-------
 hw/core/qdev.c                      |   6 +-
 hw/cpu/a15mpcore.c                  |   6 +-
 hw/cpu/a9mpcore.c                   |  26 +++---
 hw/cpu/arm11mpcore.c                |  21 ++---
 hw/cpu/core.c                       |  12 +--
 hw/cpu/realview_mpcore.c            |  11 +--
 hw/display/qxl.c                    |   6 +-
 hw/display/virtio-gpu.c             |   6 +-
 hw/display/virtio-vga.c             |   6 +-
 hw/i386/kvm/pci-assign.c            |   6 +-
 hw/i386/pc.c                        |   6 +-
 hw/input/virtio-input.c             |  12 +--
 hw/intc/apic_common.c               |   6 +-
 hw/intc/arm_gic.c                   |   6 +-
 hw/intc/arm_gic_kvm.c               |  11 +--
 hw/intc/arm_gicv3.c                 |   6 +-
 hw/intc/arm_gicv3_its_kvm.c         |   6 +-
 hw/intc/arm_gicv3_kvm.c             |  11 +--
 hw/intc/armv7m_nvic.c               |   6 +-
 hw/intc/realview_gic.c              |   6 +-
 hw/ipack/ipack.c                    |   4 +-
 hw/misc/ivshmem.c                   |  18 ++---
 hw/misc/macio/macio.c               |  33 +++-----
 hw/misc/tmp105.c                    |   6 +-
 hw/net/dp8393x.c                    |   6 +-
 hw/nvram/fw_cfg.c                   |  12 +--
 hw/pci-bridge/pci_expander_bridge.c |   6 +-
 hw/pci/pci.c                        |  17 ++--
 hw/pci/shpc.c                       |  12 +--
 hw/ppc/e500.c                       |   6 +-
 hw/ppc/pnv.c                        |  32 +++-----
 hw/ppc/pnv_core.c                   |  16 ++--
 hw/ppc/spapr.c                      |  12 +--
 hw/ppc/spapr_drc.c                  |  26 +++---
 hw/ppc/spapr_pci.c                  |  12 +--
 hw/s390x/css-bridge.c               |   6 +-
 hw/s390x/css.c                      |   6 +-
 hw/s390x/virtio-ccw.c               |  16 ++--
 hw/scsi/esp-pci.c                   |   6 +-
 hw/scsi/scsi-bus.c                  |  17 ++--
 hw/scsi/scsi-disk.c                 |  11 +--
 hw/scsi/vhost-scsi.c                |  11 +--
 hw/scsi/virtio-scsi.c               |   6 +-
 hw/usb/bus.c                        |  32 +++-----
 hw/usb/dev-serial.c                 |   6 +-
 hw/usb/hcd-ohci.c                   |  12 +--
 hw/usb/hcd-uhci.c                   |   6 +-
 hw/vfio/pci.c                       |  11 +--
 hw/virtio/virtio-balloon.c          |   6 +-
 hw/virtio/virtio-pci.c              |   6 +-
 hw/virtio/virtio-rng.c              |   6 +-
 hw/virtio/virtio.c                  |  17 ++--
 migration/colo.c                    |  12 +--
 migration/migration.c               |   6 +-
 net/filter.c                        |   6 +-
 net/tap.c                           |   6 +-
 qapi/string-input-visitor.c         |   6 +-
 qdev-monitor.c                      |   6 +-
 qga/commands-posix.c                |  80 ++++++-------------
 qga/commands-win32.c                |  18 ++---
 qmp.c                               |  11 +--
 qom/object.c                        |  84 +++++++-------------
 replication.c                       |  24 ++----
 target/alpha/cpu.c                  |   6 +-
 target/arm/cpu.c                    |   6 +-
 target/cris/cpu.c                   |   6 +-
 target/hppa/cpu.c                   |   6 +-
 target/i386/cpu.c                   |  42 ++++------
 target/lm32/cpu.c                   |   6 +-
 target/m68k/cpu.c                   |   6 +-
 target/microblaze/cpu.c             |   6 +-
 target/mips/cpu.c                   |   6 +-
 target/moxie/cpu.c                  |   6 +-
 target/nios2/cpu.c                  |   6 +-
 target/openrisc/cpu.c               |   6 +-
 target/ppc/translate_init.c         |  23 ++----
 target/s390x/cpu.c                  |   6 +-
 target/sh4/cpu.c                    |   6 +-
 target/sparc/cpu.c                  |   6 +-
 target/tilegx/cpu.c                 |   6 +-
 target/tricore/cpu.c                |   6 +-
 target/unicore32/cpu.c              |   6 +-
 target/xtensa/cpu.c                 |   6 +-
 util/qemu-config.c                  |   6 +-
 util/qemu-option.c                  |  18 ++---
 132 files changed, 691 insertions(+), 1310 deletions(-)

diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
index 43a09d147d..e4700d3ff9 100644
--- a/qapi/qapi-visit-core.c
+++ b/qapi/qapi-visit-core.c
@@ -351,13 +351,11 @@ static void output_type_enum(Visitor *v, const char *name, int *obj,
 static void input_type_enum(Visitor *v, const char *name, int *obj,
                             const char *const strings[], Error **errp)
 {
-    Error *local_err = NULL;
     int64_t value = 0;
     char *enum_str;
 
-    visit_type_str(v, name, &enum_str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &enum_str, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 4606b73849..8fcc5d68c9 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -197,7 +197,6 @@ static bool host_memory_backend_get_prealloc(Object *obj, Error **errp)
 static void host_memory_backend_set_prealloc(Object *obj, bool value,
                                              Error **errp)
 {
-    Error *local_err = NULL;
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
     if (backend->force_prealloc) {
@@ -218,9 +217,8 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
         void *ptr = memory_region_get_ram_ptr(&backend->mr);
         uint64_t sz = memory_region_size(&backend->mr);
 
-        os_mem_prealloc(fd, ptr, sz, smp_cpus, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        os_mem_prealloc(fd, ptr, sz, smp_cpus, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         backend->prealloc = true;
diff --git a/backends/rng.c b/backends/rng.c
index 59b7503efb..c5f4f01642 100644
--- a/backends/rng.c
+++ b/backends/rng.c
@@ -54,7 +54,6 @@ 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);
-    Error *local_err = NULL;
 
     if (value == s->opened) {
         return;
@@ -66,9 +65,8 @@ static void rng_backend_prop_set_opened(Object *obj, bool value, Error **errp)
     }
 
     if (k->opened) {
-        k->opened(s, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        k->opened(s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/backends/tpm.c b/backends/tpm.c
index ef3e20a3cb..5b9788faf4 100644
--- a/backends/tpm.c
+++ b/backends/tpm.c
@@ -128,7 +128,6 @@ 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);
-    Error *local_err = NULL;
 
     if (value == s->opened) {
         return;
@@ -140,9 +139,8 @@ static void tpm_backend_prop_set_opened(Object *obj, bool value, Error **errp)
     }
 
     if (k->opened) {
-        k->opened(s, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        k->opened(s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/block.c b/block.c
index b08d95a62a..1a6776447a 100644
--- a/block.c
+++ b/block.c
@@ -1440,7 +1440,6 @@ static int bdrv_fill_options(QDict **options, const char *filename,
     bool protocol = *flags & BDRV_O_PROTOCOL;
     bool parse_filename = false;
     BlockDriver *drv = NULL;
-    Error *local_err = NULL;
 
     /*
      * Caution: while qdict_get_try_str() is fine, getting non-string
@@ -1505,9 +1504,8 @@ static int bdrv_fill_options(QDict **options, const char *filename,
 
     /* Driver-specific filename parsing */
     if (drv && drv->bdrv_parse_filename && parse_filename) {
-        drv->bdrv_parse_filename(filename, *options, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        drv->bdrv_parse_filename(filename, *options, errp);
+        if (ERR_IS_SET(errp)) {
             return -EINVAL;
         }
 
@@ -2119,7 +2117,6 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
     BlockDriverState *backing_hd;
     QDict *options;
     QDict *tmp_parent_options = NULL;
-    Error *local_err = NULL;
 
     if (bs->backing != NULL) {
         goto free_exit;
@@ -2152,10 +2149,9 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
         goto free_exit;
     } else {
         bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX,
-                                       &local_err);
-        if (local_err) {
+                                       errp);
+        if (ERR_IS_SET(errp)) {
             ret = -EINVAL;
-            error_propagate(errp, local_err);
             QDECREF(options);
             goto free_exit;
         }
@@ -2184,10 +2180,9 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
 
     /* Hook up the backing file link; drop our reference, bs owns the
      * backing_hd reference now */
-    bdrv_set_backing_hd(bs, backing_hd, &local_err);
+    bdrv_set_backing_hd(bs, backing_hd, errp);
     bdrv_unref(backing_hd);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto free_exit;
     }
@@ -2292,7 +2287,6 @@ static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs,
     int64_t total_size;
     QemuOpts *opts = NULL;
     BlockDriverState *bs_snapshot = NULL;
-    Error *local_err = NULL;
     int ret;
 
     /* if snapshot, we create a temporary backing file and open it
@@ -2339,9 +2333,8 @@ static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs,
      * order to be able to return one, we have to increase
      * bs_snapshot's refcount here */
     bdrv_ref(bs_snapshot);
-    bdrv_append(bs_snapshot, bs, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    bdrv_append(bs_snapshot, bs, errp);
+    if (ERR_IS_SET(errp)) {
         bs_snapshot = NULL;
         goto out;
     }
@@ -3196,17 +3189,13 @@ out:
 void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
                  Error **errp)
 {
-    Error *local_err = NULL;
-
-    bdrv_set_backing_hd(bs_new, bs_top, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    bdrv_set_backing_hd(bs_new, bs_top, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
-    bdrv_replace_node(bs_top, bs_new, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    bdrv_replace_node(bs_top, bs_new, errp);
+    if (ERR_IS_SET(errp)) {
         bdrv_set_backing_hd(bs_new, NULL, &error_abort);
         goto out;
     }
@@ -4074,17 +4063,15 @@ void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
 void bdrv_invalidate_cache_all(Error **errp)
 {
     BlockDriverState *bs;
-    Error *local_err = NULL;
     BdrvNextIterator it;
 
     for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
         AioContext *aio_context = bdrv_get_aio_context(bs);
 
         aio_context_acquire(aio_context);
-        bdrv_invalidate_cache(bs, &local_err);
+        bdrv_invalidate_cache(bs, errp);
         aio_context_release(aio_context);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/block/blkdebug.c b/block/blkdebug.c
index a5196e889d..57cd23d94a 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -246,7 +246,6 @@ static int read_config(BDRVBlkdebugState *s, const char *filename,
     FILE *f = NULL;
     int ret;
     struct add_rule_data d;
-    Error *local_err = NULL;
 
     if (filename) {
         f = fopen(filename, "r");
@@ -263,26 +262,23 @@ static int read_config(BDRVBlkdebugState *s, const char *filename,
         }
     }
 
-    qemu_config_parse_qdict(options, config_groups, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_config_parse_qdict(options, config_groups, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto fail;
     }
 
     d.s = s;
     d.action = ACTION_INJECT_ERROR;
-    qemu_opts_foreach(&inject_error_opts, add_rule, &d, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_foreach(&inject_error_opts, add_rule, &d, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto fail;
     }
 
     d.action = ACTION_SET_STATE;
-    qemu_opts_foreach(&set_state_opts, add_rule, &d, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_foreach(&set_state_opts, add_rule, &d, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/block-backend.c b/block/block-backend.c
index 9b9ca2eb35..0725cd84a4 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -141,7 +141,6 @@ static const char *blk_root_get_name(BdrvChild *child)
 static void blk_root_activate(BdrvChild *child, Error **errp)
 {
     BlockBackend *blk = child->opaque;
-    Error *local_err = NULL;
 
     if (!blk->disable_perm) {
         return;
@@ -149,9 +148,8 @@ static void blk_root_activate(BdrvChild *child, Error **errp)
 
     blk->disable_perm = false;
 
-    blk_set_perm(blk, blk->perm, blk->shared_perm, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    blk_set_perm(blk, blk->perm, blk->shared_perm, errp);
+    if (ERR_IS_SET(errp)) {
         blk->disable_perm = true;
         return;
     }
diff --git a/block/commit.c b/block/commit.c
index 264495177e..08ab3ce7de 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -293,7 +293,6 @@ void commit_start(const char *job_id, BlockDriverState *bs,
     BlockDriverState *iter;
     BlockDriverState *overlay_bs;
     BlockDriverState *commit_top_bs = NULL;
-    Error *local_err = NULL;
     int ret;
 
     assert(top != bs);
@@ -328,9 +327,8 @@ void commit_start(const char *job_id, BlockDriverState *bs,
                                          orig_overlay_flags | BDRV_O_RDWR);
     }
     if (reopen_queue) {
-        bdrv_reopen_multiple(bdrv_get_aio_context(bs), reopen_queue, &local_err);
-        if (local_err != NULL) {
-            error_propagate(errp, local_err);
+        bdrv_reopen_multiple(bdrv_get_aio_context(bs), reopen_queue, errp);
+        if (ERR_IS_SET(errp)) {
             goto fail;
         }
     }
@@ -345,18 +343,16 @@ void commit_start(const char *job_id, BlockDriverState *bs,
     commit_top_bs->total_sectors = top->total_sectors;
     bdrv_set_aio_context(commit_top_bs, bdrv_get_aio_context(top));
 
-    bdrv_set_backing_hd(commit_top_bs, top, &local_err);
-    if (local_err) {
+    bdrv_set_backing_hd(commit_top_bs, top, errp);
+    if (ERR_IS_SET(errp)) {
         bdrv_unref(commit_top_bs);
         commit_top_bs = NULL;
-        error_propagate(errp, local_err);
         goto fail;
     }
-    bdrv_set_backing_hd(overlay_bs, commit_top_bs, &local_err);
-    if (local_err) {
+    bdrv_set_backing_hd(overlay_bs, commit_top_bs, errp);
+    if (ERR_IS_SET(errp)) {
         bdrv_unref(commit_top_bs);
         commit_top_bs = NULL;
-        error_propagate(errp, local_err);
         goto fail;
     }
 
diff --git a/block/crypto.c b/block/crypto.c
index 5c2687d271..d98ae60c48 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -295,7 +295,6 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
 {
     BlockCrypto *crypto = bs->opaque;
     QemuOpts *opts = NULL;
-    Error *local_err = NULL;
     int ret = -EINVAL;
     QCryptoBlockOpenOptions *open_opts = NULL;
     unsigned int cflags = 0;
@@ -307,9 +306,8 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
     }
 
     opts = qemu_opts_create(opts_spec, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         goto cleanup;
     }
 
diff --git a/block/curl.c b/block/curl.c
index 2a244e2439..05ed2e82c6 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -679,7 +679,6 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
     BDRVCURLState *s = bs->opaque;
     CURLState *state = NULL;
     QemuOpts *opts;
-    Error *local_err = NULL;
     const char *file;
     const char *cookie;
     const char *cookie_secret;
@@ -696,9 +695,8 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
 
     qemu_mutex_init(&s->mutex);
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         goto out_noclean;
     }
 
diff --git a/block/file-posix.c b/block/file-posix.c
index 5e30164be3..ba49f0b528 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -756,7 +756,6 @@ static int raw_reopen_prepare(BDRVReopenState *state,
     BDRVRawState *s;
     BDRVRawReopenState *rs;
     int ret = 0;
-    Error *local_err = NULL;
 
     assert(state != NULL);
     assert(state->bs != NULL);
@@ -819,11 +818,10 @@ static int raw_reopen_prepare(BDRVReopenState *state,
     /* Fail already reopen_prepare() if we can't get a working O_DIRECT
      * alignment with the new fd. */
     if (rs->fd != -1) {
-        raw_probe_alignment(state->bs, rs->fd, &local_err);
-        if (local_err) {
+        raw_probe_alignment(state->bs, rs->fd, errp);
+        if (ERR_IS_SET(errp)) {
             qemu_close(rs->fd);
             rs->fd = -1;
-            error_propagate(errp, local_err);
             ret = -EINVAL;
         }
     }
diff --git a/block/gluster.c b/block/gluster.c
index 6179195620..30ac978a89 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -765,13 +765,11 @@ static int qemu_gluster_open(BlockDriverState *bs,  QDict *options,
     int ret = 0;
     BlockdevOptionsGluster *gconf = NULL;
     QemuOpts *opts;
-    Error *local_err = NULL;
     const char *filename, *logfile;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto out;
     }
diff --git a/block/io.c b/block/io.c
index ed31810c0a..cc3fd997a7 100644
--- a/block/io.c
+++ b/block/io.c
@@ -81,7 +81,6 @@ static void bdrv_merge_limits(BlockLimits *dst, const BlockLimits *src)
 void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
 {
     BlockDriver *drv = bs->drv;
-    Error *local_err = NULL;
 
     memset(&bs->bl, 0, sizeof(bs->bl));
 
@@ -94,9 +93,8 @@ void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
 
     /* Take some limits from the children as a default */
     if (bs->file) {
-        bdrv_refresh_limits(bs->file->bs, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        bdrv_refresh_limits(bs->file->bs, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         bdrv_merge_limits(&bs->bl, &bs->file->bs->bl);
@@ -109,9 +107,8 @@ void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
     }
 
     if (bs->backing) {
-        bdrv_refresh_limits(bs->backing->bs, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        bdrv_refresh_limits(bs->backing->bs, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         bdrv_merge_limits(&bs->bl, &bs->backing->bs->bl);
diff --git a/block/iscsi.c b/block/iscsi.c
index 0116fe97ce..6b3939585c 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1747,7 +1747,6 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     struct scsi_inquiry_supported_pages *inq_vpd;
     char *initiator_name = NULL;
     QemuOpts *opts;
-    Error *local_err = NULL;
     const char *transport_name, *portal, *target;
 #if LIBISCSI_API_VERSION >= (20160603)
     enum iscsi_transport_type transport;
@@ -1755,9 +1754,8 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     int i, ret = 0, timeout = 0, lun;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto out;
     }
@@ -1811,9 +1809,8 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     /* check if we got CHAP username/password via the options */
-    apply_chap(iscsi, opts, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    apply_chap(iscsi, opts, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto out;
     }
@@ -1825,9 +1822,8 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     /* check if we got HEADER_DIGEST via the options */
-    apply_header_digest(iscsi, opts, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    apply_header_digest(iscsi, opts, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto out;
     }
@@ -1878,9 +1874,8 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
         goto out;
     }
 
-    iscsi_readcapacity_sync(iscsilun, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    iscsi_readcapacity_sync(iscsilun, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto out;
     }
@@ -2063,16 +2058,14 @@ static void iscsi_reopen_commit(BDRVReopenState *reopen_state)
 static int iscsi_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
 {
     IscsiLun *iscsilun = bs->opaque;
-    Error *local_err = NULL;
 
     if (iscsilun->type != TYPE_DISK) {
         error_setg(errp, "Cannot resize non-disk iSCSI devices");
         return -ENOTSUP;
     }
 
-    iscsi_readcapacity_sync(iscsilun, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    iscsi_readcapacity_sync(iscsilun, errp);
+    if (ERR_IS_SET(errp)) {
         return -EIO;
     }
 
diff --git a/block/mirror.c b/block/mirror.c
index 2d5d7dbbc2..addafec0ee 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1127,7 +1127,6 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
     BlockDriverState *mirror_top_bs;
     bool target_graph_mod;
     bool target_is_backing;
-    Error *local_err = NULL;
     int ret;
 
     if (granularity == 0) {
@@ -1160,12 +1159,11 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
      * it alive until block_job_create() succeeds even if bs has no parent. */
     bdrv_ref(mirror_top_bs);
     bdrv_drained_begin(bs);
-    bdrv_append(mirror_top_bs, bs, &local_err);
+    bdrv_append(mirror_top_bs, bs, errp);
     bdrv_drained_end(bs);
 
-    if (local_err) {
+    if (ERR_IS_SET(errp)) {
         bdrv_unref(mirror_top_bs);
-        error_propagate(errp, local_err);
         return;
     }
 
@@ -1299,7 +1297,6 @@ void commit_active_start(const char *job_id, BlockDriverState *bs,
                          bool auto_complete, Error **errp)
 {
     int orig_base_flags;
-    Error *local_err = NULL;
 
     orig_base_flags = bdrv_get_flags(base);
 
@@ -1311,9 +1308,8 @@ void commit_active_start(const char *job_id, BlockDriverState *bs,
                      MIRROR_LEAVE_BACKING_CHAIN,
                      on_error, on_error, true, cb, opaque,
                      &commit_active_job_driver, false, base, auto_complete,
-                     filter_node_name, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                     filter_node_name, errp);
+    if (ERR_IS_SET(errp)) {
         goto error_restore_flags;
     }
 
diff --git a/block/nbd.c b/block/nbd.c
index 975faab2c5..6644c0e75f 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -265,7 +265,6 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
     QDict *addr = NULL;
     QObject *crumpled_addr = NULL;
     Visitor *iv = NULL;
-    Error *local_err = NULL;
 
     qdict_extract_subqdict(options, &addr, "server.");
     if (!qdict_size(addr)) {
@@ -287,9 +286,8 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
      * visitor expects the former.
      */
     iv = qobject_input_visitor_new(crumpled_addr);
-    visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_SocketAddress(iv, NULL, &saddr, errp);
+    if (ERR_IS_SET(errp)) {
         goto done;
     }
 
@@ -310,17 +308,15 @@ static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr,
                                                   Error **errp)
 {
     QIOChannelSocket *sioc;
-    Error *local_err = NULL;
 
     sioc = qio_channel_socket_new();
     qio_channel_set_name(QIO_CHANNEL(sioc), "nbd-client");
 
     qio_channel_socket_connect_sync(sioc,
                                     saddr,
-                                    &local_err);
-    if (local_err) {
+                                    errp);
+    if (ERR_IS_SET(errp)) {
         object_unref(OBJECT(sioc));
-        error_propagate(errp, local_err);
         return NULL;
     }
 
@@ -397,16 +393,14 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
 {
     BDRVNBDState *s = bs->opaque;
     QemuOpts *opts = NULL;
-    Error *local_err = NULL;
     QIOChannelSocket *sioc = NULL;
     QCryptoTLSCreds *tlscreds = NULL;
     const char *hostname = NULL;
     int ret = -EINVAL;
 
     opts = qemu_opts_create(&nbd_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         goto error;
     }
 
diff --git a/block/nfs.c b/block/nfs.c
index 848b2c0bb0..7792b3ad01 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -455,7 +455,6 @@ static NFSServer *nfs_config(QDict *options, Error **errp)
     QDict *addr = NULL;
     QObject *crumpled_addr = NULL;
     Visitor *iv = NULL;
-    Error *local_error = NULL;
 
     qdict_extract_subqdict(options, &addr, "server.");
     if (!qdict_size(addr)) {
@@ -476,9 +475,8 @@ static NFSServer *nfs_config(QDict *options, Error **errp)
      * they come from -drive, they're all QString.
      */
     iv = qobject_input_visitor_new(crumpled_addr);
-    visit_type_NFSServer(iv, NULL, &server, &local_error);
-    if (local_error) {
-        error_propagate(errp, local_error);
+    visit_type_NFSServer(iv, NULL, &server, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
@@ -495,14 +493,12 @@ static int64_t nfs_client_open(NFSClient *client, QDict *options,
 {
     int ret = -EINVAL;
     QemuOpts *opts = NULL;
-    Error *local_err = NULL;
     struct stat st;
     char *file = NULL, *strp = NULL;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/qapi.c b/block/qapi.c
index a40922ea26..423934f0bf 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -460,13 +460,11 @@ BlockInfoList *qmp_query_block(Error **errp)
 {
     BlockInfoList *head = NULL, **p_next = &head;
     BlockBackend *blk;
-    Error *local_err = NULL;
 
     for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
         BlockInfoList *info = g_malloc0(sizeof(*info));
-        bdrv_query_info(blk, &info->value, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        bdrv_query_info(blk, &info->value, errp);
+        if (ERR_IS_SET(errp)) {
             g_free(info);
             qapi_free_BlockInfoList(head);
             return NULL;
diff --git a/block/qcow2.c b/block/qcow2.c
index 53920a83b5..5e7e5bf292 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -598,22 +598,19 @@ static int qcow2_update_options_prepare(BlockDriverState *bs,
     int overlap_check_template = 0;
     uint64_t l2_cache_size, refcount_cache_size;
     int i;
-    Error *local_err = NULL;
     int ret;
 
     opts = qemu_opts_create(&qcow2_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto fail;
     }
 
     /* get L2 table/refcount block cache size from command line options */
     read_cache_sizes(bs, opts, &l2_cache_size, &refcount_cache_size,
-                     &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                     errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/raw-format.c b/block/raw-format.c
index 36e65036f0..5134373fbf 100644
--- a/block/raw-format.c
+++ b/block/raw-format.c
@@ -71,7 +71,6 @@ static QemuOptsList raw_create_opts = {
 static int raw_read_options(QDict *options, BlockDriverState *bs,
     BDRVRawState *s, Error **errp)
 {
-    Error *local_err = NULL;
     QemuOpts *opts = NULL;
     int64_t real_size = 0;
     int ret;
@@ -83,9 +82,8 @@ static int raw_read_options(QDict *options, BlockDriverState *bs,
     }
 
     opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto end;
     }
diff --git a/block/rbd.c b/block/rbd.c
index e551639e47..25149e776b 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -346,7 +346,6 @@ static QemuOptsList runtime_opts = {
 
 static int qemu_rbd_create(const char *filename, QemuOpts *opts, Error **errp)
 {
-    Error *local_err = NULL;
     int64_t bytes = 0;
     int64_t objsize;
     int obj_order = 0;
@@ -378,10 +377,9 @@ static int qemu_rbd_create(const char *filename, QemuOpts *opts, Error **errp)
     }
 
     options = qdict_new();
-    qemu_rbd_parse_filename(filename, options, &local_err);
-    if (local_err) {
+    qemu_rbd_parse_filename(filename, options, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
-        error_propagate(errp, local_err);
         goto exit;
     }
 
diff --git a/block/replication.c b/block/replication.c
index c4ac17201a..c7ea016af9 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -313,7 +313,6 @@ static bool replication_recurse_is_first_non_filter(BlockDriverState *bs,
 
 static void secondary_do_checkpoint(BDRVReplicationState *s, Error **errp)
 {
-    Error *local_err = NULL;
     int ret;
 
     if (!s->secondary_disk->bs->job) {
@@ -321,9 +320,8 @@ static void secondary_do_checkpoint(BDRVReplicationState *s, Error **errp)
         return;
     }
 
-    backup_do_checkpoint(s->secondary_disk->bs->job, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    backup_do_checkpoint(s->secondary_disk->bs->job, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -347,7 +345,6 @@ static void reopen_backing_file(BlockDriverState *bs, bool writable,
     BlockReopenQueue *reopen_queue = NULL;
     int orig_hidden_flags, orig_secondary_flags;
     int new_hidden_flags, new_secondary_flags;
-    Error *local_err = NULL;
 
     if (writable) {
         orig_hidden_flags = s->orig_hidden_flags =
@@ -379,8 +376,7 @@ static void reopen_backing_file(BlockDriverState *bs, bool writable,
 
     if (reopen_queue) {
         bdrv_reopen_multiple(bdrv_get_aio_context(bs),
-                             reopen_queue, &local_err);
-        error_propagate(errp, local_err);
+                             reopen_queue, errp);
     }
 }
 
diff --git a/block/sheepdog.c b/block/sheepdog.c
index dd75571435..6160fa6717 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -553,7 +553,6 @@ static SocketAddress *sd_server_config(QDict *options, Error **errp)
     QObject *crumpled_server = NULL;
     Visitor *iv = NULL;
     SocketAddress *saddr = NULL;
-    Error *local_err = NULL;
 
     qdict_extract_subqdict(options, &server, "server.");
 
@@ -571,9 +570,8 @@ static SocketAddress *sd_server_config(QDict *options, Error **errp)
      * visitor expects the former.
      */
     iv = qobject_input_visitor_new(crumpled_server);
-    visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_SocketAddress(iv, NULL, &saddr, errp);
+    if (ERR_IS_SET(errp)) {
         goto done;
     }
 
@@ -1197,17 +1195,15 @@ static void parse_vdiname(SheepdogConfig *cfg, const char *filename,
 static void sd_parse_filename(const char *filename, QDict *options,
                               Error **errp)
 {
-    Error *err = NULL;
     SheepdogConfig cfg;
     char buf[32];
 
     if (strstr(filename, "://")) {
-        sd_parse_uri(&cfg, filename, &err);
+        sd_parse_uri(&cfg, filename, errp);
     } else {
-        parse_vdiname(&cfg, filename, &err);
+        parse_vdiname(&cfg, filename, errp);
     }
-    if (err) {
-        error_propagate(errp, err);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1572,15 +1568,13 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags,
     uint64_t snap_id;
     char *buf = NULL;
     QemuOpts *opts;
-    Error *local_err = NULL;
 
     s->bs = bs;
     s->aio_context = bdrv_get_aio_context(bs);
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
         goto err_no_fd;
     }
@@ -1955,7 +1949,6 @@ static int parse_block_size_shift(BDRVSheepdogState *s, QemuOpts *opt)
 static int sd_create(const char *filename, QemuOpts *opts,
                      Error **errp)
 {
-    Error *err = NULL;
     int ret = 0;
     uint32_t vid = 0;
     char *backing_file = NULL;
@@ -1968,12 +1961,11 @@ static int sd_create(const char *filename, QemuOpts *opts,
     s = g_new0(BDRVSheepdogState, 1);
 
     if (strstr(filename, "://")) {
-        sd_parse_uri(&cfg, filename, &err);
+        sd_parse_uri(&cfg, filename, errp);
     } else {
-        parse_vdiname(&cfg, filename, &err);
+        parse_vdiname(&cfg, filename, errp);
     }
-    if (err) {
-        error_propagate(errp, err);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
diff --git a/block/ssh.c b/block/ssh.c
index 11203fc5a2..008e256ad1 100644
--- a/block/ssh.c
+++ b/block/ssh.c
@@ -586,7 +586,6 @@ static InetSocketAddress *ssh_config(QDict *options, Error **errp)
     QDict *addr = NULL;
     QObject *crumpled_addr = NULL;
     Visitor *iv = NULL;
-    Error *local_error = NULL;
 
     qdict_extract_subqdict(options, &addr, "server.");
     if (!qdict_size(addr)) {
@@ -608,9 +607,8 @@ static InetSocketAddress *ssh_config(QDict *options, Error **errp)
      * visitor expects the former.
      */
     iv = qobject_input_visitor_new(crumpled_addr);
-    visit_type_InetSocketAddress(iv, NULL, &inet, &local_error);
-    if (local_error) {
-        error_propagate(errp, local_error);
+    visit_type_InetSocketAddress(iv, NULL, &inet, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
@@ -626,15 +624,13 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options,
 {
     int r, ret;
     QemuOpts *opts = NULL;
-    Error *local_err = NULL;
     const char *user, *path, *host_key_check;
     long port = 0;
 
     opts = qemu_opts_create(&ssh_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
+    qemu_opts_absorb_qdict(opts, options, errp);
+    if (ERR_IS_SET(errp)) {
         ret = -EINVAL;
-        error_propagate(errp, local_err);
         goto err;
     }
 
diff --git a/blockdev.c b/blockdev.c
index fdbf33aa3d..3ce592d4af 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1620,7 +1620,6 @@ static void external_snapshot_prepare(BlkActionState *common,
 {
     int flags = 0;
     QDict *options = NULL;
-    Error *local_err = NULL;
     /* Device and node name of the image to generate the snapshot from */
     const char *device;
     const char *node_name;
@@ -1726,9 +1725,8 @@ static void external_snapshot_prepare(BlkActionState *common,
             bdrv_img_create(new_image_file, format,
                             state->old_bs->filename,
                             state->old_bs->drv->format_name,
-                            NULL, size, flags, false, &local_err);
-            if (local_err) {
-                error_propagate(errp, local_err);
+                            NULL, size, flags, false, errp);
+            if (ERR_IS_SET(errp)) {
                 return;
             }
         }
@@ -1775,9 +1773,8 @@ static void external_snapshot_prepare(BlkActionState *common,
      * can fail, so we need to do it in .prepare; undoing it for abort is
      * always possible. */
     bdrv_ref(state->new_bs);
-    bdrv_append(state->new_bs, state->old_bs, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    bdrv_append(state->new_bs, state->old_bs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     state->overlay_appended = true;
@@ -2166,7 +2163,6 @@ void qmp_transaction(TransactionActionList *dev_list,
     TransactionActionList *dev_entry = dev_list;
     BlockJobTxn *block_job_txn = NULL;
     BlkActionState *state, *next;
-    Error *local_err = NULL;
 
     QSIMPLEQ_HEAD(snap_bdrv_states, BlkActionState) snap_bdrv_states;
     QSIMPLEQ_INIT(&snap_bdrv_states);
@@ -2202,9 +2198,8 @@ void qmp_transaction(TransactionActionList *dev_list,
         state->txn_props = props;
         QSIMPLEQ_INSERT_TAIL(&snap_bdrv_states, state, entry);
 
-        state->ops->prepare(state, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        state->ops->prepare(state, errp);
+        if (ERR_IS_SET(errp)) {
             goto delete_and_fail;
         }
     }
@@ -2366,7 +2361,6 @@ void qmp_blockdev_close_tray(bool has_device, const char *device,
                              Error **errp)
 {
     BlockBackend *blk;
-    Error *local_err = NULL;
 
     device = has_device ? device : NULL;
     id = has_id ? id : NULL;
@@ -2390,9 +2384,8 @@ void qmp_blockdev_close_tray(bool has_device, const char *device,
         return;
     }
 
-    blk_dev_change_media_cb(blk, true, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    blk_dev_change_media_cb(blk, true, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 }
@@ -2457,7 +2450,6 @@ out:
 static void qmp_blockdev_insert_anon_medium(BlockBackend *blk,
                                             BlockDriverState *bs, Error **errp)
 {
-    Error *local_err = NULL;
     bool has_device;
     int ret;
 
@@ -2490,9 +2482,8 @@ static void qmp_blockdev_insert_anon_medium(BlockBackend *blk,
          * slot here.
          * Do it after blk_insert_bs() so blk_is_inserted(blk) returns the @load
          * value passed here (i.e. true). */
-        blk_dev_change_media_cb(blk, true, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        blk_dev_change_media_cb(blk, true, errp);
+        if (ERR_IS_SET(errp)) {
             blk_remove_bs(blk);
             return;
         }
@@ -2947,7 +2938,6 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
     BlockDriverState *bs, *iter;
     BlockDriverState *base_bs = NULL;
     AioContext *aio_context;
-    Error *local_err = NULL;
     const char *base_name = NULL;
 
     if (!has_on_error) {
@@ -3011,9 +3001,8 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
     base_name = has_backing_file ? backing_file : base_name;
 
     stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name,
-                 has_speed ? speed : 0, on_error, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                 has_speed ? speed : 0, on_error, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
@@ -3600,7 +3589,6 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
     BlockDriverState *target_bs;
     AioContext *aio_context;
     BlockMirrorBackingMode backing_mode = MIRROR_LEAVE_BACKING_CHAIN;
-    Error *local_err = NULL;
 
     bs = qmp_get_root_bs(device, errp);
     if (!bs) {
@@ -3626,8 +3614,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
                            has_on_target_error, on_target_error,
                            true, true,
                            has_filter_node_name, filter_node_name,
-                           &local_err);
-    error_propagate(errp, local_err);
+                           errp);
 
     aio_context_release(aio_context);
 }
@@ -3856,11 +3843,9 @@ void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
     QObject *obj;
     Visitor *v = qobject_output_visitor_new(&obj);
     QDict *qdict;
-    Error *local_err = NULL;
 
-    visit_type_BlockdevOptions(v, NULL, &options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_BlockdevOptions(v, NULL, &options, errp);
+    if (ERR_IS_SET(errp)) {
         goto fail;
     }
 
diff --git a/blockjob.c b/blockjob.c
index 69ad28dd65..c0b528f1e9 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -356,7 +356,6 @@ static int block_job_finish_sync(BlockJob *job,
                                  void (*finish)(BlockJob *, Error **errp),
                                  Error **errp)
 {
-    Error *local_err = NULL;
     int ret;
 
     assert(blk_bs(job->blk)->job == job);
@@ -364,10 +363,9 @@ static int block_job_finish_sync(BlockJob *job,
     block_job_ref(job);
 
     if (finish) {
-        finish(job, &local_err);
+        finish(job, errp);
     }
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (ERR_IS_SET(errp)) {
         block_job_unref(job);
         return -EBUSY;
     }
@@ -454,15 +452,12 @@ static void block_job_completed_txn_success(BlockJob *job)
 
 void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
 {
-    Error *local_err = NULL;
-
     if (!job->driver->set_speed) {
         error_setg(errp, QERR_UNSUPPORTED);
         return;
     }
-    job->driver->set_speed(job, speed, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    job->driver->set_speed(job, speed, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/bootdevice.c b/bootdevice.c
index 29ebbb1c48..92f607d321 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -52,17 +52,14 @@ void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
 
 void qemu_boot_set(const char *boot_order, Error **errp)
 {
-    Error *local_err = NULL;
-
     if (!boot_set_handler) {
         error_setg(errp, "no function defined to set boot device list for"
                          " this architecture");
         return;
     }
 
-    validate_bootdevices(boot_order, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    validate_bootdevices(boot_order, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -319,7 +316,6 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
                                    const char *name, const char *suffix,
                                    DeviceState *dev, Error **errp)
 {
-    Error *local_err = NULL;
     BootIndexProperty *prop = g_malloc0(sizeof(*prop));
 
     prop->bootindex = bootindex;
@@ -330,10 +326,9 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
                         device_get_bootindex,
                         device_set_bootindex,
                         property_release_bootindex,
-                        prop, &local_err);
+                        prop, errp);
 
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
         return;
     }
diff --git a/chardev/char.c b/chardev/char.c
index 7aa0210765..ac3cd2b436 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -559,7 +559,6 @@ help_string_append(const char *name, void *opaque)
 Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
                                 Error **errp)
 {
-    Error *local_err = NULL;
     const ChardevClass *cc;
     Chardev *chr;
     int i;
@@ -610,9 +609,8 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
 
     chr = NULL;
     if (cc->parse) {
-        cc->parse(opts, backend, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        cc->parse(opts, backend, errp);
+        if (ERR_IS_SET(errp)) {
             goto out;
         }
     } else {
diff --git a/dump.c b/dump.c
index dc78c98b23..3fa8ba3571 100644
--- a/dump.c
+++ b/dump.c
@@ -348,22 +348,19 @@ static void write_memory(DumpState *s, GuestPhysBlock *block, ram_addr_t start,
                          int64_t size, Error **errp)
 {
     int64_t i;
-    Error *local_err = NULL;
 
     for (i = 0; i < size / s->dump_info.page_size; i++) {
         write_data(s, block->host_addr + start + i * s->dump_info.page_size,
-                   s->dump_info.page_size, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+                   s->dump_info.page_size, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
 
     if ((size % s->dump_info.page_size) != 0) {
         write_data(s, block->host_addr + start + i * s->dump_info.page_size,
-                   size % s->dump_info.page_size, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+                   size % s->dump_info.page_size, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -437,7 +434,6 @@ static void write_elf_loads(DumpState *s, Error **errp)
     MemoryMapping *memory_mapping;
     uint32_t phdr_index = 1;
     uint32_t max_index;
-    Error *local_err = NULL;
 
     if (s->have_section) {
         max_index = s->sh_info;
@@ -451,14 +447,13 @@ static void write_elf_loads(DumpState *s, Error **errp)
                          s, &offset, &filesz);
         if (s->dump_info.d_class == ELFCLASS64) {
             write_elf64_load(s, memory_mapping, phdr_index++, offset,
-                             filesz, &local_err);
+                             filesz, errp);
         } else {
             write_elf32_load(s, memory_mapping, phdr_index++, offset,
-                             filesz, &local_err);
+                             filesz, errp);
         }
 
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -471,101 +466,65 @@ static void write_elf_loads(DumpState *s, Error **errp)
 /* write elf header, PT_NOTE and elf note to vmcore. */
 static void dump_begin(DumpState *s, Error **errp)
 {
-    Error *local_err = NULL;
-
-    /*
-     * the vmcore's format is:
-     *   --------------
-     *   |  elf header |
-     *   --------------
-     *   |  PT_NOTE    |
-     *   --------------
-     *   |  PT_LOAD    |
-     *   --------------
-     *   |  ......     |
-     *   --------------
-     *   |  PT_LOAD    |
-     *   --------------
-     *   |  sec_hdr    |
-     *   --------------
-     *   |  elf note   |
-     *   --------------
-     *   |  memory     |
-     *   --------------
-     *
-     * we only know where the memory is saved after we write elf note into
-     * vmcore.
-     */
-
-    /* write elf header to vmcore */
     if (s->dump_info.d_class == ELFCLASS64) {
-        write_elf64_header(s, &local_err);
+        write_elf64_header(s, errp);
     } else {
-        write_elf32_header(s, &local_err);
+        write_elf32_header(s, errp);
     }
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
     if (s->dump_info.d_class == ELFCLASS64) {
         /* write PT_NOTE to vmcore */
-        write_elf64_note(s, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        write_elf64_note(s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
         /* write all PT_LOAD to vmcore */
-        write_elf_loads(s, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        write_elf_loads(s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
         /* write section to vmcore */
         if (s->have_section) {
-            write_elf_section(s, 1, &local_err);
-            if (local_err) {
-                error_propagate(errp, local_err);
+            write_elf_section(s, 1, errp);
+            if (ERR_IS_SET(errp)) {
                 return;
             }
         }
 
         /* write notes to vmcore */
-        write_elf64_notes(fd_write_vmcore, s, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        write_elf64_notes(fd_write_vmcore, s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     } else {
         /* write PT_NOTE to vmcore */
-        write_elf32_note(s, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        write_elf32_note(s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
         /* write all PT_LOAD to vmcore */
-        write_elf_loads(s, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        write_elf_loads(s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
         /* write section to vmcore */
         if (s->have_section) {
-            write_elf_section(s, 0, &local_err);
-            if (local_err) {
-                error_propagate(errp, local_err);
+            write_elf_section(s, 0, errp);
+            if (ERR_IS_SET(errp)) {
                 return;
             }
         }
 
         /* write notes to vmcore */
-        write_elf32_notes(fd_write_vmcore, s, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        write_elf32_notes(fd_write_vmcore, s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -603,7 +562,6 @@ static void dump_iterate(DumpState *s, Error **errp)
 {
     GuestPhysBlock *block;
     int64_t size;
-    Error *local_err = NULL;
 
     do {
         block = s->next_block;
@@ -615,9 +573,8 @@ static void dump_iterate(DumpState *s, Error **errp)
                 size -= block->target_end - (s->begin + s->length);
             }
         }
-        write_memory(s, block, s->start, size, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        write_memory(s, block, s->start, size, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -626,11 +583,8 @@ static void dump_iterate(DumpState *s, Error **errp)
 
 static void create_vmcore(DumpState *s, Error **errp)
 {
-    Error *local_err = NULL;
-
-    dump_begin(s, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    dump_begin(s, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -725,7 +679,6 @@ static void create_header32(DumpState *s, Error **errp)
     uint32_t bitmap_blocks;
     uint32_t status = 0;
     uint64_t offset_note;
-    Error *local_err = NULL;
 
     /* write common header, the version of kdump-compressed format is 6th */
     size = sizeof(DiskDumpHeader32);
@@ -789,9 +742,8 @@ static void create_header32(DumpState *s, Error **errp)
     s->note_buf_offset = 0;
 
     /* use s->note_buf to store notes temporarily */
-    write_elf32_notes(buf_write_note, s, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    write_elf32_notes(buf_write_note, s, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
     if (write_buffer(s->fd, offset_note, s->note_buf,
@@ -825,7 +777,6 @@ static void create_header64(DumpState *s, Error **errp)
     uint32_t bitmap_blocks;
     uint32_t status = 0;
     uint64_t offset_note;
-    Error *local_err = NULL;
 
     /* write common header, the version of kdump-compressed format is 6th */
     size = sizeof(DiskDumpHeader64);
@@ -889,9 +840,8 @@ static void create_header64(DumpState *s, Error **errp)
     s->note_buf_offset = 0;
 
     /* use s->note_buf to store notes temporarily */
-    write_elf64_notes(buf_write_note, s, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    write_elf64_notes(buf_write_note, s, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
@@ -917,14 +867,11 @@ out:
 
 static void write_dump_header(DumpState *s, Error **errp)
 {
-     Error *local_err = NULL;
-
     if (s->dump_info.d_class == ELFCLASS32) {
-        create_header32(s, &local_err);
+        create_header32(s, errp);
     } else {
-        create_header64(s, &local_err);
+        create_header64(s, errp);
     }
-    error_propagate(errp, local_err);
 }
 
 static size_t dump_bitmap_get_bufsize(DumpState *s)
@@ -1359,7 +1306,6 @@ out:
 static void create_kdump_vmcore(DumpState *s, Error **errp)
 {
     int ret;
-    Error *local_err = NULL;
 
     /*
      * the kdump-compressed format is:
@@ -1389,21 +1335,18 @@ static void create_kdump_vmcore(DumpState *s, Error **errp)
         return;
     }
 
-    write_dump_header(s, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    write_dump_header(s, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
-    write_dump_bitmap(s, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    write_dump_bitmap(s, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
-    write_dump_pages(s, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    write_dump_pages(s, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1494,7 +1437,6 @@ static void dump_init(DumpState *s, int fd, bool has_format,
 {
     CPUState *cpu;
     int nr_cpus;
-    Error *err = NULL;
     int ret;
 
     s->has_format = has_format;
@@ -1565,9 +1507,8 @@ static void dump_init(DumpState *s, int fd, bool has_format,
 
     /* get memory mapping */
     if (paging) {
-        qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, errp);
+        if (ERR_IS_SET(errp)) {
             goto cleanup;
         }
     } else {
@@ -1723,7 +1664,6 @@ void qmp_dump_guest_memory(bool paging, const char *file,
     const char *p;
     int fd = -1;
     DumpState *s;
-    Error *local_err = NULL;
     bool detach_p = false;
 
     if (runstate_check(RUN_STATE_INMIGRATE)) {
@@ -1801,9 +1741,8 @@ void qmp_dump_guest_memory(bool paging, const char *file,
     dump_state_prepare(s);
 
     dump_init(s, fd, has_format, format, paging, has_begin,
-              begin, length, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+              begin, length, errp);
+    if (ERR_IS_SET(errp)) {
         atomic_set(&s->status, DUMP_STATUS_FAILED);
         return;
     }
diff --git a/exec.c b/exec.c
index 9d73a63f1c..35d9588350 100644
--- a/exec.c
+++ b/exec.c
@@ -1860,7 +1860,6 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
     RAMBlock *block;
     RAMBlock *last_block = NULL;
     ram_addr_t old_ram_size, new_ram_size;
-    Error *err = NULL;
 
     old_ram_size = last_ram_page();
 
@@ -1870,9 +1869,8 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
     if (!new_block->host) {
         if (xen_enabled()) {
             xen_ram_alloc(new_block->offset, new_block->max_length,
-                          new_block->mr, &err);
-            if (err) {
-                error_propagate(errp, err);
+                          new_block->mr, errp);
+            if (ERR_IS_SET(errp)) {
                 qemu_mutex_unlock_ramlist();
                 return;
             }
@@ -1938,7 +1936,6 @@ RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
                                    Error **errp)
 {
     RAMBlock *new_block;
-    Error *local_err = NULL;
 
     if (xen_enabled()) {
         error_setg(errp, "-mem-path not supported with Xen");
@@ -1969,10 +1966,9 @@ RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
         return NULL;
     }
 
-    ram_block_add(new_block, &local_err);
-    if (local_err) {
+    ram_block_add(new_block, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(new_block);
-        error_propagate(errp, local_err);
         return NULL;
     }
     return new_block;
@@ -1988,7 +1984,6 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
                                   MemoryRegion *mr, Error **errp)
 {
     RAMBlock *new_block;
-    Error *local_err = NULL;
 
     size = HOST_PAGE_ALIGN(size);
     max_size = HOST_PAGE_ALIGN(max_size);
@@ -2007,10 +2002,9 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
     if (resizeable) {
         new_block->flags |= RAM_RESIZEABLE;
     }
-    ram_block_add(new_block, &local_err);
-    if (local_err) {
+    ram_block_add(new_block, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(new_block);
-        error_propagate(errp, local_err);
         return NULL;
     }
     return new_block;
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 651409094c..7d9c8691bb 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -54,19 +54,16 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
     SysBusDevice *sysbusdev;
     uint8_t i;
     qemu_irq fiq, irq;
-    Error *err = NULL;
 
-    object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->cpu), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     irq = qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ);
     fiq = qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ);
 
-    object_property_set_bool(OBJECT(&s->intc), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->intc), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->intc);
@@ -77,9 +74,8 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
         s->irq[i] = qdev_get_gpio_in(DEVICE(&s->intc), i);
     }
 
-    object_property_set_bool(OBJECT(&s->timer), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->timer), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->timer);
@@ -91,18 +87,16 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(sysbusdev, 4, s->irq[67]);
     sysbus_connect_irq(sysbusdev, 5, s->irq[68]);
 
-    object_property_set_bool(OBJECT(&s->emac), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->emac), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->emac);
     sysbus_mmio_map(sysbusdev, 0, AW_A10_EMAC_BASE);
     sysbus_connect_irq(sysbusdev, 0, s->irq[55]);
 
-    object_property_set_bool(OBJECT(&s->sata), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->sata), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0, AW_A10_SATA_BASE);
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index c8a11f2b53..2fa8bbb249 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -161,7 +161,6 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
 {
     ARMv7MState *s = ARMV7M(dev);
     SysBusDevice *sbd;
-    Error *err = NULL;
     int i;
     char **cpustr;
     ObjectClass *oc;
@@ -186,10 +185,9 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
 
     cc = CPU_CLASS(oc);
     typename = object_class_get_name(oc);
-    cc->parse_features(typename, cpustr[1], &err);
+    cc->parse_features(typename, cpustr[1], errp);
     g_strfreev(cpustr);
-    if (err) {
-        error_propagate(errp, err);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -201,16 +199,14 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
 
     object_property_set_link(OBJECT(s->cpu), OBJECT(&s->container), "memory",
                              &error_abort);
-    object_property_set_bool(OBJECT(s->cpu), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(s->cpu), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
     /* Note that we must realize the NVIC after the CPU */
-    object_property_set_bool(OBJECT(&s->nvic), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->nvic), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -234,16 +230,14 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
         Object *obj = OBJECT(&s->bitband[i]);
         SysBusDevice *sbd = SYS_BUS_DEVICE(&s->bitband[i]);
 
-        object_property_set_int(obj, bitband_input_addr[i], "base", &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        object_property_set_int(obj, bitband_input_addr[i], "base", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         object_property_set_link(obj, OBJECT(s->board_memory),
                                  "source-memory", &error_abort);
-        object_property_set_bool(obj, true, "realized", &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        object_property_set_bool(obj, true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index f22fae73c3..eeaa8729ff 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -59,26 +59,22 @@ static void digic_init(Object *obj)
 static void digic_realize(DeviceState *dev, Error **errp)
 {
     DigicState *s = DIGIC(dev);
-    Error *err = NULL;
     SysBusDevice *sbd;
     int i;
 
-    object_property_set_bool(OBJECT(&s->cpu), true, "reset-hivecs", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->cpu), true, "reset-hivecs", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
-    object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->cpu), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
     for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
-        object_property_set_bool(OBJECT(&s->timer[i]), true, "realized", &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->timer[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -87,9 +83,8 @@ static void digic_realize(DeviceState *dev, Error **errp)
     }
 
     qdev_prop_set_chr(DEVICE(&s->uart), "chardev", serial_hds[0]);
-    object_property_set_bool(OBJECT(&s->uart), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->uart), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
index 40666b68a3..c10f96d83c 100644
--- a/hw/arm/fsl-imx25.c
+++ b/hw/arm/fsl-imx25.c
@@ -78,17 +78,14 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 {
     FslIMX25State *s = FSL_IMX25(dev);
     uint8_t i;
-    Error *err = NULL;
 
-    object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->cpu), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
-    object_property_set_bool(OBJECT(&s->avic), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->avic), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX25_AVIC_ADDR);
@@ -97,9 +94,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
 
-    object_property_set_bool(OBJECT(&s->ccm), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->ccm), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX25_CCM_ADDR);
@@ -131,9 +127,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
             qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", chr);
         }
 
-        object_property_set_bool(OBJECT(&s->uart[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->uart[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr);
@@ -156,9 +151,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
         s->gpt[i].ccm = IMX_CCM(&s->ccm);
 
-        object_property_set_bool(OBJECT(&s->gpt[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->gpt[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0, gpt_table[i].addr);
@@ -179,9 +173,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        object_property_set_bool(OBJECT(&s->epit[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->epit[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->epit[i]), 0, epit_table[i].addr);
@@ -192,9 +185,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
     qdev_set_nic_properties(DEVICE(&s->fec), &nd_table[0]);
 
-    object_property_set_bool(OBJECT(&s->fec), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->fec), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->fec), 0, FSL_IMX25_FEC_ADDR);
@@ -213,9 +205,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
             { FSL_IMX25_I2C3_ADDR, FSL_IMX25_I2C3_IRQ }
         };
 
-        object_property_set_bool(OBJECT(&s->i2c[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->i2c[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, i2c_table[i].addr);
@@ -236,9 +227,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
             { FSL_IMX25_GPIO4_ADDR, FSL_IMX25_GPIO4_IRQ }
         };
 
-        object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
@@ -250,17 +240,15 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
     /* initialize 2 x 16 KB ROM */
     memory_region_init_rom(&s->rom[0], NULL,
-                           "imx25.rom0", FSL_IMX25_ROM0_SIZE, &err);
-    if (err) {
-        error_propagate(errp, err);
+                           "imx25.rom0", FSL_IMX25_ROM0_SIZE, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX25_ROM0_ADDR,
                                 &s->rom[0]);
     memory_region_init_rom(&s->rom[1], NULL,
-                           "imx25.rom1", FSL_IMX25_ROM1_SIZE, &err);
-    if (err) {
-        error_propagate(errp, err);
+                           "imx25.rom1", FSL_IMX25_ROM1_SIZE, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX25_ROM1_ADDR,
@@ -268,9 +256,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
     /* initialize internal RAM (128 KB) */
     memory_region_init_ram(&s->iram, NULL, "imx25.iram", FSL_IMX25_IRAM_SIZE,
-                           &err);
-    if (err) {
-        error_propagate(errp, err);
+                           errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX25_IRAM_ADDR,
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
index c30130667e..0cc80f3aee 100644
--- a/hw/arm/fsl-imx31.c
+++ b/hw/arm/fsl-imx31.c
@@ -70,17 +70,14 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 {
     FslIMX31State *s = FSL_IMX31(dev);
     uint16_t i;
-    Error *err = NULL;
 
-    object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->cpu), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
-    object_property_set_bool(OBJECT(&s->avic), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->avic), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX31_AVIC_ADDR);
@@ -89,9 +86,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
 
-    object_property_set_bool(OBJECT(&s->ccm), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->ccm), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX31_CCM_ADDR);
@@ -120,9 +116,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
             qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", chr);
         }
 
-        object_property_set_bool(OBJECT(&s->uart[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->uart[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -134,9 +129,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
     s->gpt.ccm = IMX_CCM(&s->ccm);
 
-    object_property_set_bool(OBJECT(&s->gpt), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->gpt), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -156,9 +150,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        object_property_set_bool(OBJECT(&s->epit[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->epit[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -180,9 +173,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
         };
 
         /* Initialize the I2C */
-        object_property_set_bool(OBJECT(&s->i2c[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->i2c[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         /* Map I2C memory */
@@ -206,9 +198,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
         object_property_set_bool(OBJECT(&s->gpio[i]), false, "has-edge-sel",
                                  &error_abort);
-        object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
@@ -220,9 +211,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
     /* On a real system, the first 16k is a `secure boot rom' */
     memory_region_init_rom(&s->secure_rom, NULL, "imx31.secure_rom",
-                           FSL_IMX31_SECURE_ROM_SIZE, &err);
-    if (err) {
-        error_propagate(errp, err);
+                           FSL_IMX31_SECURE_ROM_SIZE, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX31_SECURE_ROM_ADDR,
@@ -230,9 +220,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
     /* There is also a 16k ROM */
     memory_region_init_rom(&s->rom, NULL, "imx31.rom",
-                           FSL_IMX31_ROM_SIZE, &err);
-    if (err) {
-        error_propagate(errp, err);
+                           FSL_IMX31_ROM_SIZE, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX31_ROM_ADDR,
@@ -240,9 +229,8 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
     /* initialize internal RAM (16 KB) */
     memory_region_init_ram(&s->iram, NULL, "imx31.iram", FSL_IMX31_IRAM_SIZE,
-                           &err);
-    if (err) {
-        error_propagate(errp, err);
+                           errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX31_IRAM_ADDR,
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 73610d48a5..1bdf9dbd70 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -123,7 +123,6 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 {
     FslIMX6State *s = FSL_IMX6(dev);
     uint16_t i;
-    Error *err = NULL;
 
     for (i = 0; i < smp_cpus; i++) {
 
@@ -139,9 +138,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                                      "start-powered-off", &error_abort);
         }
 
-        object_property_set_bool(OBJECT(&s->cpu[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->cpu[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -153,9 +151,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                             FSL_IMX6_MAX_IRQ + GIC_INTERNAL, "num-irq",
                             &error_abort);
 
-    object_property_set_bool(OBJECT(&s->a9mpcore), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->a9mpcore), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->a9mpcore), 0, FSL_IMX6_A9MPCORE_ADDR);
@@ -167,16 +164,14 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                            qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_FIQ));
     }
 
-    object_property_set_bool(OBJECT(&s->ccm), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->ccm), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX6_CCM_ADDR);
 
-    object_property_set_bool(OBJECT(&s->src), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->src), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->src), 0, FSL_IMX6_SRC_ADDR);
@@ -209,9 +204,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
             qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", chr);
         }
 
-        object_property_set_bool(OBJECT(&s->uart[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->uart[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -223,9 +217,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
     s->gpt.ccm = IMX_CCM(&s->ccm);
 
-    object_property_set_bool(OBJECT(&s->gpt), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->gpt), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -246,9 +239,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        object_property_set_bool(OBJECT(&s->epit[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->epit[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -269,9 +261,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
             { FSL_IMX6_I2C3_ADDR, FSL_IMX6_I2C3_IRQ }
         };
 
-        object_property_set_bool(OBJECT(&s->i2c[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->i2c[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -329,9 +320,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                                  &error_abort);
         object_property_set_bool(OBJECT(&s->gpio[i]), true, "has-upper-pin-irq",
                                  &error_abort);
-        object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -356,9 +346,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
             { FSL_IMX6_uSDHC4_ADDR, FSL_IMX6_uSDHC4_IRQ },
         };
 
-        object_property_set_bool(OBJECT(&s->esdhc[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->esdhc[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
@@ -381,9 +370,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
         };
 
         /* Initialize the SPI */
-        object_property_set_bool(OBJECT(&s->spi[i]), true, "realized", &err);
-        if (err) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->spi[i]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -393,9 +381,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                                             spi_table[i].irq));
     }
 
-    object_property_set_bool(OBJECT(&s->eth), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->eth), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->eth), 0, FSL_IMX6_ENET_ADDR);
@@ -408,9 +395,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
     /* ROM memory */
     memory_region_init_rom(&s->rom, NULL, "imx6.rom",
-                           FSL_IMX6_ROM_SIZE, &err);
-    if (err) {
-        error_propagate(errp, err);
+                           FSL_IMX6_ROM_SIZE, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX6_ROM_ADDR,
@@ -418,9 +404,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
     /* CAAM memory */
     memory_region_init_rom(&s->caam, NULL, "imx6.caam",
-                           FSL_IMX6_CAAM_MEM_SIZE, &err);
-    if (err) {
-        error_propagate(errp, err);
+                           FSL_IMX6_CAAM_MEM_SIZE, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX6_CAAM_MEM_ADDR,
@@ -428,9 +413,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
     /* OCRAM memory */
     memory_region_init_ram(&s->ocram, NULL, "imx6.ocram", FSL_IMX6_OCRAM_SIZE,
-                           &err);
-    if (err) {
-        error_propagate(errp, err);
+                           errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), FSL_IMX6_OCRAM_ADDR,
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 38f9577284..ee6c64b409 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -96,7 +96,6 @@ static inline int arm_gic_ppi_index(int cpu_nr, int ppi_index)
 static void xlnx_zynqmp_create_rpu(XlnxZynqMPState *s, const char *boot_cpu,
                                    Error **errp)
 {
-    Error *err = NULL;
     int i;
 
     for (i = 0; i < XLNX_ZYNQMP_NUM_RPU_CPUS; i++) {
@@ -120,9 +119,8 @@ static void xlnx_zynqmp_create_rpu(XlnxZynqMPState *s, const char *boot_cpu,
         object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "reset-hivecs",
                                  &error_abort);
         object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "realized",
-                                 &err);
-        if (err) {
-            error_propagate(errp, err);
+                                 errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 5fed23c774..597ea719a7 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -473,16 +473,14 @@ static void fd_revalidate(FDrive *drv)
 static void fd_change_cb(void *opaque, bool load, Error **errp)
 {
     FDrive *drive = opaque;
-    Error *local_err = NULL;
 
     if (!load) {
         blk_set_perm(drive->blk, 0, BLK_PERM_ALL, &error_abort);
     } else {
         blkconf_apply_backend_options(drive->conf,
                                       blk_is_read_only(drive->blk), false,
-                                      &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+                                      errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -2528,7 +2526,6 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
     FDrive *drive;
     DeviceState *dev;
     BlockBackend *blk;
-    Error *local_err = NULL;
 
     for (i = 0; i < MAX_FD; i++) {
         drive = &fdctrl->drives[i];
@@ -2550,17 +2547,15 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
         blk_ref(blk);
         blk_detach_dev(blk, fdc_dev);
         fdctrl->qdev_for_drives[i].blk = NULL;
-        qdev_prop_set_drive(dev, "drive", blk, &local_err);
+        qdev_prop_set_drive(dev, "drive", blk, errp);
         blk_unref(blk);
 
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
-        object_property_set_bool(OBJECT(dev), true, "realized", &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        object_property_set_bool(OBJECT(dev), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -2689,7 +2684,6 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
     ISADevice *isadev = ISA_DEVICE(dev);
     FDCtrlISABus *isa = ISA_FDC(dev);
     FDCtrl *fdctrl = &isa->state;
-    Error *err = NULL;
 
     isa_register_portio_list(isadev, &fdctrl->portio_list,
                              isa->iobase, fdc_portio_list, fdctrl,
@@ -2703,9 +2697,8 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
     }
 
     qdev_set_legacy_instance_id(dev, isa->iobase, 2);
-    fdctrl_realize_common(dev, fdctrl, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    fdctrl_realize_common(dev, fdctrl, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 }
diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index 594d4cf6fe..e634b128ce 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -706,7 +706,6 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
     int ret;
     uint64_t blocks_per_device, sector_len_per_device, device_len;
     int num_devices;
-    Error *local_err = NULL;
 
     if (pfl->sector_len == 0) {
         error_setg(errp, "attribute \"sector-length\" not specified or zero.");
@@ -747,9 +746,8 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
         &pfl->mem, OBJECT(dev),
         &pflash_cfi01_ops,
         pfl,
-        pfl->name, total_len, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+        pfl->name, total_len, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index e6c5c6c25d..2ef8c76b94 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -598,7 +598,6 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
     pflash_t *pfl = CFI_PFLASH02(dev);
     uint32_t chip_len;
     int ret;
-    Error *local_err = NULL;
 
     if (pfl->sector_len == 0) {
         error_setg(errp, "attribute \"sector-length\" not specified or zero.");
@@ -623,9 +622,8 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
 
     memory_region_init_rom_device(&pfl->orig_mem, OBJECT(pfl), pfl->be ?
                                   &pflash_cfi02_ops_be : &pflash_cfi02_ops_le,
-                                  pfl, pfl->name, chip_len, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                                  pfl, pfl->name, chip_len, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index ce9cf63c3e..11455faebc 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -909,7 +909,6 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOBlock *s = VIRTIO_BLK(dev);
     VirtIOBlkConf *conf = &s->conf;
-    Error *err = NULL;
     unsigned i;
 
     if (!conf->conf.blk) {
@@ -928,15 +927,13 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
     blkconf_serial(&conf->conf, &conf->serial);
     blkconf_apply_backend_options(&conf->conf,
                                   blk_is_read_only(conf->conf.blk), true,
-                                  &err);
-    if (err) {
-        error_propagate(errp, err);
+                                  errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     s->original_wce = blk_enable_write_cache(conf->conf.blk);
-    blkconf_geometry(&conf->conf, NULL, 65535, 255, 255, &err);
-    if (err) {
-        error_propagate(errp, err);
+    blkconf_geometry(&conf->conf, NULL, 65535, 255, 255, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     blkconf_blocksizes(&conf->conf);
@@ -951,9 +948,8 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < conf->num_queues; i++) {
         virtio_add_queue(vdev, 128, virtio_blk_handle_output);
     }
-    virtio_blk_data_plane_create(vdev, conf, &s->dataplane, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    virtio_blk_data_plane_create(vdev, conf, &s->dataplane, errp);
+    if (ERR_IS_SET(errp)) {
         virtio_cleanup(vdev);
         return;
     }
diff --git a/hw/char/debugcon.c b/hw/char/debugcon.c
index 762e3d8ada..90e437edfb 100644
--- a/hw/char/debugcon.c
+++ b/hw/char/debugcon.c
@@ -100,11 +100,9 @@ static void debugcon_isa_realizefn(DeviceState *dev, Error **errp)
     ISADevice *d = ISA_DEVICE(dev);
     ISADebugconState *isa = ISA_DEBUGCON_DEVICE(dev);
     DebugconState *s = &isa->state;
-    Error *err = NULL;
 
-    debugcon_realize_core(s, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    debugcon_realize_core(s, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_init_io(&s->io, OBJECT(dev), &debugcon_ops, s,
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index 303104dd19..60074eb114 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -55,12 +55,10 @@ static void serial_pci_realize(PCIDevice *dev, Error **errp)
 {
     PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
     SerialState *s = &pci->state;
-    Error *err = NULL;
 
     s->baudbase = 115200;
-    serial_realize_core(s, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    serial_realize_core(s, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -91,7 +89,6 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
     SerialState *s;
-    Error *err = NULL;
     int i, nr_ports = 0;
 
     switch (pc->device_id) {
@@ -115,9 +112,8 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
     for (i = 0; i < nr_ports; i++) {
         s = pci->state + i;
         s->baudbase = 115200;
-        serial_realize_core(s, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        serial_realize_core(s, errp);
+        if (ERR_IS_SET(errp)) {
             multi_serial_pci_exit(dev);
             return;
         }
diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c
index f5bc173844..8f0d130d49 100644
--- a/hw/char/virtio-serial-bus.c
+++ b/hw/char/virtio-serial-bus.c
@@ -926,7 +926,6 @@ static void virtser_port_device_realize(DeviceState *dev, Error **errp)
     VirtIOSerialBus *bus = VIRTIO_SERIAL_BUS(qdev_get_parent_bus(dev));
     int max_nr_ports;
     bool plugging_port0;
-    Error *err = NULL;
 
     port->vser = bus->vser;
     port->bh = qemu_bh_new(flush_queued_data_bh, port);
@@ -972,9 +971,8 @@ static void virtser_port_device_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    vsc->realize(dev, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    vsc->realize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 2e7e9778cd..61e921c9ef 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -91,12 +91,10 @@ static void machine_set_kvm_shadow_mem(Object *obj, Visitor *v,
                                        Error **errp)
 {
     MachineState *ms = MACHINE(obj);
-    Error *error = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &error);
-    if (error) {
-        error_propagate(errp, error);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -193,12 +191,10 @@ static void machine_set_phandle_start(Object *obj, Visitor *v,
                                       Error **errp)
 {
     MachineState *ms = MACHINE(obj);
-    Error *error = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &error);
-    if (error) {
-        error_propagate(errp, error);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 73640ee3c6..68c97c08dc 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -43,7 +43,6 @@ static void set_pointer(Object *obj, Visitor *v, Property *prop,
                         const char *name, Error **errp)
 {
     DeviceState *dev = DEVICE(obj);
-    Error *local_err = NULL;
     void **ptr = qdev_get_prop_ptr(dev, prop);
     char *str;
 
@@ -52,9 +51,8 @@ static void set_pointer(Object *obj, Visitor *v, Property *prop,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &str, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (!*str) {
@@ -185,7 +183,6 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
                     Error **errp)
 {
     DeviceState *dev = DEVICE(obj);
-    Error *local_err = NULL;
     Property *prop = opaque;
     CharBackend *be = qdev_get_prop_ptr(dev, prop);
     Chardev *s;
@@ -196,9 +193,8 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &str, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -257,7 +253,6 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,
     NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);
     NetClientState **ncs = peers_ptr->ncs;
     NetClientState *peers[MAX_QUEUE_NUM];
-    Error *local_err = NULL;
     int queues, err = 0, i = 0;
     char *str;
 
@@ -266,9 +261,8 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &str, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -361,7 +355,6 @@ static void set_vlan(Object *obj, Visitor *v, const char *name, void *opaque,
     Property *prop = opaque;
     NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);
     NetClientState **ptr = &peers_ptr->ncs[0];
-    Error *local_err = NULL;
     int32_t id;
     NetClientState *hubport;
 
@@ -370,9 +363,8 @@ static void set_vlan(Object *obj, Visitor *v, const char *name, void *opaque,
         return;
     }
 
-    visit_type_int32(v, name, &id, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int32(v, name, &id, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (id == -1) {
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 65ba36f4fb..f289841484 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -104,7 +104,6 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
-    Error *local_err = NULL;
     bool value;
 
     if (dev->realized) {
@@ -112,9 +111,8 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_bool(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     bit_prop_set(dev, prop, value);
@@ -162,7 +160,6 @@ static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
-    Error *local_err = NULL;
     bool value;
 
     if (dev->realized) {
@@ -170,9 +167,8 @@ static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_bool(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     bit64_prop_set(dev, prop, value);
@@ -410,7 +406,6 @@ static void set_string(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     char **ptr = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     char *str;
 
     if (dev->realized) {
@@ -418,9 +413,8 @@ static void set_string(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &str, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     g_free(*ptr);
@@ -470,7 +464,6 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     MACAddr *mac = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     int i, pos;
     char *str, *p;
 
@@ -479,9 +472,8 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &str, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -658,7 +650,6 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     const int64_t min = 512;
     const int64_t max = 32768;
 
@@ -667,9 +658,8 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_uint16(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_uint16(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     /* value of 0 means "unset" */
@@ -732,7 +722,6 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     char *str, *p;
     char *e;
     unsigned long val;
@@ -744,9 +733,8 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &str, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -852,7 +840,6 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
     Property *prop = opaque;
     uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);
     void **arrayptr = (void *)dev + prop->arrayoffset;
-    Error *local_err = NULL;
     void *eltptr;
     const char *arrayname;
     int i;
@@ -866,9 +853,8 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
                    name);
         return;
     }
-    visit_type_uint32(v, name, alenptr, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_uint32(v, name, alenptr, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (!*alenptr) {
@@ -905,9 +891,8 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
                             arrayprop->prop.info->get,
                             arrayprop->prop.info->set,
                             array_element_release,
-                            arrayprop, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+                            arrayprop, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 163e827e01..cd95d8ce63 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -768,7 +768,6 @@ static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
 void qdev_property_add_static(DeviceState *dev, Property *prop,
                               Error **errp)
 {
-    Error *local_err = NULL;
     Object *obj = OBJECT(dev);
 
     /*
@@ -783,10 +782,9 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
     object_property_add(obj, prop->name, prop->info->name,
                         prop->info->get, prop->info->set,
                         prop->info->release,
-                        prop, &local_err);
+                        prop, errp);
 
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
index 6d376b978d..e9f5caee7d 100644
--- a/hw/cpu/a15mpcore.c
+++ b/hw/cpu/a15mpcore.c
@@ -53,7 +53,6 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *gicdev;
     SysBusDevice *busdev;
     int i;
-    Error *err = NULL;
     bool has_el3;
     Object *cpuobj;
 
@@ -71,9 +70,8 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
         qdev_prop_set_bit(gicdev, "has-security-extensions", has_el3);
     }
 
-    object_property_set_bool(OBJECT(&s->gic), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->gic), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(&s->gic);
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index 23f2c252bd..b32fbb7a44 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -50,16 +50,14 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *scudev, *gicdev, *gtimerdev, *mptimerdev, *wdtdev;
     SysBusDevice *scubusdev, *gicbusdev, *gtimerbusdev, *mptimerbusdev,
                  *wdtbusdev;
-    Error *err = NULL;
     int i;
     bool has_el3;
     Object *cpuobj;
 
     scudev = DEVICE(&s->scu);
     qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
-    object_property_set_bool(OBJECT(&s->scu), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->scu), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     scubusdev = SYS_BUS_DEVICE(&s->scu);
@@ -76,9 +74,8 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
         object_property_get_bool(cpuobj, "has_el3", &error_abort);
     qdev_prop_set_bit(gicdev, "has-security-extensions", has_el3);
 
-    object_property_set_bool(OBJECT(&s->gic), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->gic), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     gicbusdev = SYS_BUS_DEVICE(&s->gic);
@@ -91,27 +88,24 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
 
     gtimerdev = DEVICE(&s->gtimer);
     qdev_prop_set_uint32(gtimerdev, "num-cpu", s->num_cpu);
-    object_property_set_bool(OBJECT(&s->gtimer), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->gtimer), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     gtimerbusdev = SYS_BUS_DEVICE(&s->gtimer);
 
     mptimerdev = DEVICE(&s->mptimer);
     qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
-    object_property_set_bool(OBJECT(&s->mptimer), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->mptimer), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     mptimerbusdev = SYS_BUS_DEVICE(&s->mptimer);
 
     wdtdev = DEVICE(&s->wdt);
     qdev_prop_set_uint32(wdtdev, "num-cpu", s->num_cpu);
-    object_property_set_bool(OBJECT(&s->wdt), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->wdt), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     wdtbusdev = SYS_BUS_DEVICE(&s->wdt);
diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
index eb244658b9..60336b1c0a 100644
--- a/hw/cpu/arm11mpcore.c
+++ b/hw/cpu/arm11mpcore.c
@@ -72,20 +72,17 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *gicdev = DEVICE(&s->gic);
     DeviceState *mptimerdev = DEVICE(&s->mptimer);
     DeviceState *wdtimerdev = DEVICE(&s->wdtimer);
-    Error *err = NULL;
 
     qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
-    object_property_set_bool(OBJECT(&s->scu), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->scu), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
     qdev_prop_set_uint32(gicdev, "num-cpu", s->num_cpu);
     qdev_prop_set_uint32(gicdev, "num-irq", s->num_irq);
-    object_property_set_bool(OBJECT(&s->gic), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->gic), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -96,16 +93,14 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
     qdev_init_gpio_in(dev, mpcore_priv_set_irq, s->num_irq - 32);
 
     qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
-    object_property_set_bool(OBJECT(&s->mptimer), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->mptimer), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
     qdev_prop_set_uint32(wdtimerdev, "num-cpu", s->num_cpu);
-    object_property_set_bool(OBJECT(&s->wdtimer), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->wdtimer), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/cpu/core.c b/hw/cpu/core.c
index b38d882432..a10e655d32 100644
--- a/hw/cpu/core.c
+++ b/hw/cpu/core.c
@@ -24,12 +24,10 @@ static void core_prop_set_core_id(Object *obj, Visitor *v, const char *name,
                                   void *opaque, Error **errp)
 {
     CPUCore *core = CPU_CORE(obj);
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -49,12 +47,10 @@ static void core_prop_set_nr_threads(Object *obj, Visitor *v, const char *name,
                                      void *opaque, Error **errp)
 {
     CPUCore *core = CPU_CORE(obj);
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
index 39d4ebeb1d..be5fad6d74 100644
--- a/hw/cpu/realview_mpcore.c
+++ b/hw/cpu/realview_mpcore.c
@@ -62,14 +62,12 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
     DeviceState *priv = DEVICE(&s->priv);
     DeviceState *gic;
     SysBusDevice *gicbusdev;
-    Error *err = NULL;
     int n;
     int i;
 
     qdev_prop_set_uint32(priv, "num-cpu", s->num_cpu);
-    object_property_set_bool(OBJECT(&s->priv), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->priv), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_pass_irq(sbd, SYS_BUS_DEVICE(&s->priv));
@@ -78,9 +76,8 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
     }
     /* ??? IRQ routing is hardcoded to "normal" mode.  */
     for (n = 0; n < 4; n++) {
-        object_property_set_bool(OBJECT(&s->gic[n]), true, "realized", &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        object_property_set_bool(OBJECT(&s->gic[n]), true, "realized", errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
         gic = DEVICE(&s->gic[n]);
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index ad09bb98f9..0013b29ca5 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -2163,7 +2163,6 @@ static void qxl_realize_primary(PCIDevice *dev, Error **errp)
 {
     PCIQXLDevice *qxl = PCI_QXL(dev);
     VGACommonState *vga = &qxl->vga;
-    Error *local_err = NULL;
 
     qxl->id = 0;
     qxl_init_ramsize(qxl);
@@ -2180,9 +2179,8 @@ static void qxl_realize_primary(PCIDevice *dev, Error **errp)
     vga->con = graphic_console_init(DEVICE(dev), 0, &qxl_ops, qxl);
     qemu_spice_display_init_common(&qxl->ssd);
 
-    qxl_realize_common(qxl, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qxl_realize_common(qxl, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 58dc0b2737..9c8ecd2d87 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -1104,7 +1104,6 @@ static void virtio_gpu_device_realize(DeviceState *qdev, Error **errp)
     VirtIODevice *vdev = VIRTIO_DEVICE(qdev);
     VirtIOGPU *g = VIRTIO_GPU(qdev);
     bool have_virgl;
-    Error *local_err = NULL;
     int i;
 
     if (g->conf.max_outputs > VIRTIO_GPU_MAX_SCANOUTS) {
@@ -1124,9 +1123,8 @@ static void virtio_gpu_device_realize(DeviceState *qdev, Error **errp)
 
     if (virtio_gpu_virgl_enabled(g->conf)) {
         error_setg(&g->migration_blocker, "virgl is not yet migratable");
-        migrate_add_blocker(g->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        migrate_add_blocker(g->migration_blocker, errp);
+        if (ERR_IS_SET(errp)) {
             error_free(g->migration_blocker);
             return;
         }
diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
index f9b017d86b..f18484e333 100644
--- a/hw/display/virtio-vga.c
+++ b/hw/display/virtio-vga.c
@@ -101,7 +101,6 @@ static void virtio_vga_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     VirtIOVGA *vvga = VIRTIO_VGA(vpci_dev);
     VirtIOGPU *g = &vvga->vdev;
     VGACommonState *vga = &vvga->vga;
-    Error *err = NULL;
     uint32_t offset;
     int i;
 
@@ -146,9 +145,8 @@ static void virtio_vga_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     /* init virtio bits */
     qdev_set_parent_bus(DEVICE(g), BUS(&vpci_dev->bus));
     virtio_pci_force_virtio_1(vpci_dev);
-    object_property_set_bool(OBJECT(g), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(g), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index bc8795f7f3..194ebb70f3 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -838,7 +838,6 @@ static int assign_intx(AssignedDevice *dev, Error **errp)
     PCIINTxRoute intx_route;
     bool intx_host_msi;
     int r;
-    Error *local_err = NULL;
 
     /* Interrupt PIN 0 means don't use INTx */
     if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0) {
@@ -846,9 +845,8 @@ static int assign_intx(AssignedDevice *dev, Error **errp)
         return 0;
     }
 
-    verify_irqchip_in_kernel(&local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    verify_irqchip_in_kernel(errp);
+    if (ERR_IS_SET(errp)) {
         return -ENOTSUP;
     }
 
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index efa6c35157..7ce0ed96de 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1111,7 +1111,6 @@ void pc_hot_add_cpu(const int64_t id, Error **errp)
     ObjectClass *oc;
     MachineState *ms = MACHINE(qdev_get_machine());
     int64_t apic_id = x86_cpu_apic_id_from_index(id);
-    Error *local_err = NULL;
 
     if (id < 0) {
         error_setg(errp, "Invalid CPU id: %" PRIi64, id);
@@ -1127,9 +1126,8 @@ void pc_hot_add_cpu(const int64_t id, Error **errp)
 
     assert(ms->possible_cpus->cpus[0].cpu); /* BSP is always present */
     oc = OBJECT_CLASS(CPU_GET_CLASS(ms->possible_cpus->cpus[0].cpu));
-    pc_new_cpu(object_class_get_name(oc), apic_id, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    pc_new_cpu(object_class_get_name(oc), apic_id, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 }
diff --git a/hw/input/virtio-input.c b/hw/input/virtio-input.c
index 0e42f0d02c..beb38528bd 100644
--- a/hw/input/virtio-input.c
+++ b/hw/input/virtio-input.c
@@ -235,12 +235,10 @@ static void virtio_input_device_realize(DeviceState *dev, Error **errp)
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOInput *vinput = VIRTIO_INPUT(dev);
     VirtIOInputConfig *cfg;
-    Error *local_err = NULL;
 
     if (vic->realize) {
-        vic->realize(dev, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        vic->realize(dev, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -278,12 +276,10 @@ static void virtio_input_device_unrealize(DeviceState *dev, Error **errp)
 {
     VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(dev);
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
-    Error *local_err = NULL;
 
     if (vic->unrealize) {
-        vic->unrealize(dev, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        vic->unrealize(dev, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 09b75a3048..536cbad4d0 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -461,7 +461,6 @@ static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
 {
     APICCommonState *s = APIC_COMMON(obj);
     DeviceState *dev = DEVICE(obj);
-    Error *local_err = NULL;
     int64_t value;
 
     if (dev->realized) {
@@ -469,9 +468,8 @@ static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
index b305d9032a..aa01bac522 100644
--- a/hw/intc/arm_gic.c
+++ b/hw/intc/arm_gic.c
@@ -1404,11 +1404,9 @@ static void arm_gic_realize(DeviceState *dev, Error **errp)
     GICState *s = ARM_GIC(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     ARMGICClass *agc = ARM_GIC_GET_CLASS(s);
-    Error *local_err = NULL;
 
-    agc->parent_realize(dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    agc->parent_realize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
index af5cd367e9..00f1b704be 100644
--- a/hw/intc/arm_gic_kvm.c
+++ b/hw/intc/arm_gic_kvm.c
@@ -495,12 +495,10 @@ 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);
-    Error *local_err = NULL;
     int ret;
 
-    kgc->parent_realize(dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    kgc->parent_realize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -513,9 +511,8 @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
     if (!kvm_arm_gic_can_save_restore(s)) {
         error_setg(&s->migration_blocker, "This operating system kernel does "
                                           "not support vGICv2 migration");
-        migrate_add_blocker(s->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        migrate_add_blocker(s->migration_blocker, errp);
+        if (ERR_IS_SET(errp)) {
             error_free(s->migration_blocker);
             return;
         }
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
index f0c967b304..1dd941fef3 100644
--- a/hw/intc/arm_gicv3.c
+++ b/hw/intc/arm_gicv3.c
@@ -365,11 +365,9 @@ 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);
-    Error *local_err = NULL;
 
-    agc->parent_realize(dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    agc->parent_realize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
index a0441d6bd1..edeb4334d1 100644
--- a/hw/intc/arm_gicv3_its_kvm.c
+++ b/hw/intc/arm_gicv3_its_kvm.c
@@ -56,16 +56,14 @@ static int kvm_its_send_msi(GICv3ITSState *s, uint32_t value, uint16_t devid)
 static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
 {
     GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
-    Error *local_err = NULL;
 
     /*
      * Block migration of a KVM GICv3 ITS device: the API for saving and
      * restoring the state in the kernel is not yet available
      */
     error_setg(&s->migration_blocker, "vITS migration is not implemented");
-    migrate_add_blocker(s->migration_blocker, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    migrate_add_blocker(s->migration_blocker, errp);
+    if (ERR_IS_SET(errp)) {
         error_free(s->migration_blocker);
         return;
     }
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
index 4ee2baa691..21e86edb17 100644
--- a/hw/intc/arm_gicv3_kvm.c
+++ b/hw/intc/arm_gicv3_kvm.c
@@ -684,14 +684,12 @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
 {
     GICv3State *s = KVM_ARM_GICV3(dev);
     KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
-    Error *local_err = NULL;
     int i;
 
     DPRINTF("kvm_arm_gicv3_realize\n");
 
-    kgc->parent_realize(dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    kgc->parent_realize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -744,9 +742,8 @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
                                GICD_CTLR)) {
         error_setg(&s->migration_blocker, "This operating system kernel does "
                                           "not support vGICv3 migration");
-        migrate_add_blocker(s->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        migrate_add_blocker(s->migration_blocker, errp);
+        if (ERR_IS_SET(errp)) {
             error_free(s->migration_blocker);
             return;
         }
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
index 26a4b2dcb5..7795c0623f 100644
--- a/hw/intc/armv7m_nvic.c
+++ b/hw/intc/armv7m_nvic.c
@@ -1003,7 +1003,6 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
 {
     NVICState *s = NVIC(dev);
     SysBusDevice *systick_sbd;
-    Error *err = NULL;
 
     s->cpu = ARM_CPU(qemu_get_cpu(0));
     assert(s->cpu);
@@ -1018,9 +1017,8 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
     /* include space for internal exception vectors */
     s->num_irq += NVIC_FIRST_IRQ;
 
-    object_property_set_bool(OBJECT(&s->systick), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->systick), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     systick_sbd = SYS_BUS_DEVICE(&s->systick);
diff --git a/hw/intc/realview_gic.c b/hw/intc/realview_gic.c
index 50bbab66ee..1b114e7065 100644
--- a/hw/intc/realview_gic.c
+++ b/hw/intc/realview_gic.c
@@ -23,7 +23,6 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     RealViewGICState *s = REALVIEW_GIC(dev);
     SysBusDevice *busdev;
-    Error *err = NULL;
     /* The GICs on the RealView boards have a fixed nonconfigurable
      * number of interrupt lines, so we don't need to expose this as
      * a qdev property.
@@ -31,9 +30,8 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
     int numirq = 96;
 
     qdev_prop_set_uint32(DEVICE(&s->gic), "num-irq", numirq);
-    object_property_set_bool(OBJECT(&s->gic), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->gic), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(&s->gic);
diff --git a/hw/ipack/ipack.c b/hw/ipack/ipack.c
index 6021e6d135..e380f4f369 100644
--- a/hw/ipack/ipack.c
+++ b/hw/ipack/ipack.c
@@ -60,11 +60,9 @@ static void ipack_device_unrealize(DeviceState *dev, Error **errp)
 {
     IPackDevice *idev = IPACK_DEVICE(dev);
     IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(dev);
-    Error *err = NULL;
 
     if (k->unrealize) {
-        k->unrealize(dev, &err);
-        error_propagate(errp, err);
+        k->unrealize(dev, errp);
         return;
     }
 
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index 6367d041f0..a68342bd0e 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -463,7 +463,6 @@ static void setup_interrupt(IVShmemState *s, int vector, Error **errp)
     bool with_irqfd = kvm_msi_via_irqfd_enabled() &&
         ivshmem_has_feature(s, IVSHMEM_MSI);
     PCIDevice *pdev = PCI_DEVICE(s);
-    Error *err = NULL;
 
     IVSHMEM_DPRINTF("setting up interrupt for vector: %d\n", vector);
 
@@ -472,9 +471,8 @@ static void setup_interrupt(IVShmemState *s, int vector, Error **errp)
         watch_vector_notifier(s, n, vector);
     } else if (msix_enabled(pdev)) {
         IVSHMEM_DPRINTF("with irqfd\n");
-        ivshmem_add_kvm_msi_virq(s, vector, &err);
-        if (err) {
-            error_propagate(errp, err);
+        ivshmem_add_kvm_msi_virq(s, vector, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -836,11 +834,9 @@ static void ivshmem_write_config(PCIDevice *pdev, uint32_t address,
 static void ivshmem_common_realize(PCIDevice *dev, Error **errp)
 {
     IVShmemState *s = IVSHMEM_COMMON(dev);
-    Error *err = NULL;
     uint8_t *pci_conf;
     uint8_t attr = PCI_BASE_ADDRESS_SPACE_MEMORY |
         PCI_BASE_ADDRESS_MEM_PREFETCH;
-    Error *local_err = NULL;
 
     /* IRQFD requires MSI */
     if (ivshmem_has_feature(s, IVSHMEM_IOEVENTFD) &&
@@ -883,9 +879,8 @@ static void ivshmem_common_realize(PCIDevice *dev, Error **errp)
          * Older versions did it asynchronously, but that creates a
          * number of entertaining race conditions.
          */
-        ivshmem_recv_setup(s, &err);
-        if (err) {
-            error_propagate(errp, err);
+        ivshmem_recv_setup(s, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
@@ -911,9 +906,8 @@ static void ivshmem_common_realize(PCIDevice *dev, Error **errp)
     if (!ivshmem_is_master(s)) {
         error_setg(&s->migration_blocker,
                    "Migration is disabled when using feature 'peer mode' in device 'ivshmem'");
-        migrate_add_blocker(s->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        migrate_add_blocker(s->migration_blocker, errp);
+        if (ERR_IS_SET(errp)) {
             error_free(s->migration_blocker);
             return;
         }
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index fed0c6b269..c5945b81f7 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -126,15 +126,13 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
 {
     MacIOState *s = MACIO(d);
     SysBusDevice *sysbus_dev;
-    Error *err = NULL;
     MemoryRegion *dbdma_mem;
 
     s->dbdma = DBDMA_init(&dbdma_mem);
     memory_region_add_subregion(&s->bar, 0x08000, dbdma_mem);
 
-    object_property_set_bool(OBJECT(&s->cuda), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&s->cuda), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
@@ -162,23 +160,20 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
 {
     MacIOState *s = MACIO(d);
     OldWorldMacIOState *os = OLDWORLD_MACIO(d);
-    Error *err = NULL;
     SysBusDevice *sysbus_dev;
     int i;
     int cur_irq = 0;
 
-    macio_common_realize(d, &err);
-    if (err) {
-        error_propagate(errp, err);
+    macio_common_realize(d, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
     sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
     sysbus_connect_irq(sysbus_dev, 0, os->irqs[cur_irq++]);
 
-    object_property_set_bool(OBJECT(&os->nvram), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(&os->nvram), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_dev = SYS_BUS_DEVICE(&os->nvram);
@@ -196,9 +191,8 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
         qemu_irq irq0 = os->irqs[cur_irq++];
         qemu_irq irq1 = os->irqs[cur_irq++];
 
-        macio_realize_ide(s, &os->ide[i], irq0, irq1, 0x16 + (i * 4), &err);
-        if (err) {
-            error_propagate(errp, err);
+        macio_realize_ide(s, &os->ide[i], irq0, irq1, 0x16 + (i * 4), errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -273,15 +267,13 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
 {
     MacIOState *s = MACIO(d);
     NewWorldMacIOState *ns = NEWWORLD_MACIO(d);
-    Error *err = NULL;
     SysBusDevice *sysbus_dev;
     MemoryRegion *timer_memory = NULL;
     int i;
     int cur_irq = 0;
 
-    macio_common_realize(d, &err);
-    if (err) {
-        error_propagate(errp, err);
+    macio_common_realize(d, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -298,9 +290,8 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
         qemu_irq irq0 = ns->irqs[cur_irq++];
         qemu_irq irq1 = ns->irqs[cur_irq++];
 
-        macio_realize_ide(s, &ns->ide[i], irq0, irq1, 0x16 + (i * 4), &err);
-        if (err) {
-            error_propagate(errp, err);
+        macio_realize_ide(s, &ns->ide[i], irq0, irq1, 0x16 + (i * 4), errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
index 82a25b91f4..1b0584d14b 100644
--- a/hw/misc/tmp105.c
+++ b/hw/misc/tmp105.c
@@ -70,12 +70,10 @@ static void tmp105_set_temperature(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
 {
     TMP105State *s = TMP105(obj);
-    Error *local_err = NULL;
     int64_t temp;
 
-    visit_type_int(v, name, &temp, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &temp, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (temp >= 128000 || temp < -128000) {
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index b53fcaa8bc..5142003d07 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -874,7 +874,6 @@ static void dp8393x_realize(DeviceState *dev, Error **errp)
     dp8393xState *s = DP8393X(dev);
     int i, checksum;
     uint8_t *prom;
-    Error *local_err = NULL;
 
     address_space_init(&s->as, s->dma_mr, "dp8393x");
     memory_region_init_io(&s->mmio, OBJECT(dev), &dp8393x_ops, s,
@@ -888,9 +887,8 @@ static void dp8393x_realize(DeviceState *dev, Error **errp)
     s->regs[SONIC_SR] = 0x0004; /* only revision recognized by Linux */
 
     memory_region_init_ram(&s->prom, OBJECT(dev),
-                           "dp8393x-prom", SONIC_PROM_SIZE, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                           "dp8393x-prom", SONIC_PROM_SIZE, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     memory_region_set_readonly(&s->prom, true);
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index 44da2caf51..43118044f1 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -1073,11 +1073,9 @@ static void fw_cfg_io_realize(DeviceState *dev, Error **errp)
 {
     FWCfgIoState *s = FW_CFG_IO(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
-    Error *local_err = NULL;
 
-    fw_cfg_file_slots_allocate(FW_CFG(s), &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    fw_cfg_file_slots_allocate(FW_CFG(s), errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1126,11 +1124,9 @@ static void fw_cfg_mem_realize(DeviceState *dev, Error **errp)
     FWCfgMemState *s = FW_CFG_MEM(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     const MemoryRegionOps *data_ops = &fw_cfg_data_mem_ops;
-    Error *local_err = NULL;
 
-    fw_cfg_file_slots_allocate(FW_CFG(s), &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    fw_cfg_file_slots_allocate(FW_CFG(s), errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
index ff59abf208..54132c52ad 100644
--- a/hw/pci-bridge/pci_expander_bridge.c
+++ b/hw/pci-bridge/pci_expander_bridge.c
@@ -216,7 +216,6 @@ static void pxb_dev_realize_common(PCIDevice *dev, bool pcie, Error **errp)
     DeviceState *ds, *bds = NULL;
     PCIBus *bus;
     const char *dev_name = NULL;
-    Error *local_err = NULL;
 
     if (pxb->numa_node != NUMA_NODE_UNASSIGNED &&
         pxb->numa_node >= nb_numa_nodes) {
@@ -246,9 +245,8 @@ static void pxb_dev_realize_common(PCIDevice *dev, bool pcie, Error **errp)
 
     PCI_HOST_BRIDGE(ds)->bus = bus;
 
-    pxb_register_bus(dev, bus, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    pxb_register_bus(dev, bus, errp);
+    if (ERR_IS_SET(errp)) {
         goto err_register_bus;
     }
 
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index a848d1508b..4e25eee0ad 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -960,7 +960,6 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
     PCIConfigReadFunc *config_read = pc->config_read;
     PCIConfigWriteFunc *config_write = pc->config_write;
-    Error *local_err = NULL;
     DeviceState *dev = DEVICE(pci_dev);
 
     pci_dev->bus = bus;
@@ -1039,9 +1038,8 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
     if (pc->is_bridge) {
         pci_init_mask_bridge(pci_dev);
     }
-    pci_init_multifunction(bus, pci_dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    pci_init_multifunction(bus, pci_dev, errp);
+    if (ERR_IS_SET(errp)) {
         do_pci_unregister_device(pci_dev);
         return NULL;
     }
@@ -1983,7 +1981,6 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
 {
     PCIDevice *pci_dev = (PCIDevice *)qdev;
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
-    Error *local_err = NULL;
     PCIBus *bus;
     bool is_default_rom;
 
@@ -2000,9 +1997,8 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
         return;
 
     if (pc->realize) {
-        pc->realize(pci_dev, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        pc->realize(pci_dev, errp);
+        if (ERR_IS_SET(errp)) {
             do_pci_unregister_device(pci_dev);
             return;
         }
@@ -2015,9 +2011,8 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
         is_default_rom = true;
     }
 
-    pci_add_option_rom(pci_dev, is_default_rom, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    pci_add_option_rom(pci_dev, is_default_rom, errp);
+    if (ERR_IS_SET(errp)) {
         pci_qdev_unrealize(DEVICE(pci_dev), IGNORE_ERRORS);
         return;
     }
diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
index 844bc97737..f3ea297a4d 100644
--- a/hw/pci/shpc.c
+++ b/hw/pci/shpc.c
@@ -508,14 +508,12 @@ static void shpc_device_hotplug_common(PCIDevice *affected_dev, int *slot,
 void shpc_device_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
                             Error **errp)
 {
-    Error *local_err = NULL;
     PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
     SHPCDevice *shpc = pci_hotplug_dev->shpc;
     int slot;
 
-    shpc_device_hotplug_common(PCI_DEVICE(dev), &slot, shpc, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    shpc_device_hotplug_common(PCI_DEVICE(dev), &slot, shpc, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -551,16 +549,14 @@ void shpc_device_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
 void shpc_device_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
                                        DeviceState *dev, Error **errp)
 {
-    Error *local_err = NULL;
     PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
     SHPCDevice *shpc = pci_hotplug_dev->shpc;
     uint8_t state;
     uint8_t led;
     int slot;
 
-    shpc_device_hotplug_common(PCI_DEVICE(dev), &slot, shpc, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    shpc_device_hotplug_common(PCI_DEVICE(dev), &slot, shpc, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 04621d5534..1b9abbb094 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -708,16 +708,14 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500Params *params,
 static DeviceState *ppce500_init_mpic_kvm(PPCE500Params *params,
                                           qemu_irq **irqs, Error **errp)
 {
-    Error *err = NULL;
     DeviceState *dev;
     CPUState *cs;
 
     dev = qdev_create(NULL, TYPE_KVM_OPENPIC);
     qdev_prop_set_uint32(dev, "model", params->mpic_version);
 
-    object_property_set_bool(OBJECT(dev), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(dev), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 655f1da14c..0e5236e577 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -885,7 +885,6 @@ static void pnv_chip_icp_realize(PnvChip *chip, Error **errp)
 static void pnv_chip_realize(DeviceState *dev, Error **errp)
 {
     PnvChip *chip = PNV_CHIP(dev);
-    Error *error = NULL;
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
     char *typename = pnv_core_typename(pcc->cpu_model);
     size_t typesize = object_type_get_instance_size(typename);
@@ -897,17 +896,15 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
     }
 
     /* XSCOM bridge */
-    pnv_xscom_realize(chip, &error);
-    if (error) {
-        error_propagate(errp, error);
+    pnv_xscom_realize(chip, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(chip), 0, PNV_XSCOM_BASE(chip));
 
     /* Cores */
-    pnv_chip_core_sanitize(chip, &error);
-    if (error) {
-        error_propagate(errp, error);
+    pnv_chip_core_sanitize(chip, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -955,26 +952,23 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
 
     /* Interrupt Management Area. This is the memory region holding
      * all the Interrupt Control Presenter (ICP) registers */
-    pnv_chip_icp_realize(chip, &error);
-    if (error) {
-        error_propagate(errp, error);
+    pnv_chip_icp_realize(chip, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
     /* Processor Service Interface (PSI) Host Bridge */
     object_property_set_int(OBJECT(&chip->psi), PNV_PSIHB_BASE(chip),
                             "bar", &error_fatal);
-    object_property_set_bool(OBJECT(&chip->psi), true, "realized", &error);
-    if (error) {
-        error_propagate(errp, error);
+    object_property_set_bool(OBJECT(&chip->psi), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE, &chip->psi.xscom_regs);
 
     /* Create the simplified OCC model */
-    object_property_set_bool(OBJECT(&chip->occ), true, "realized", &error);
-    if (error) {
-        error_propagate(errp, error);
+    object_property_set_bool(OBJECT(&chip->occ), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip->occ.xscom_regs);
@@ -1083,11 +1077,9 @@ static void pnv_set_num_chips(Object *obj, Visitor *v, const char *name,
 {
     PnvMachineState *pnv = POWERNV_MACHINE(obj);
     uint32_t num_chips;
-    Error *local_err = NULL;
 
-    visit_type_uint32(v, name, &num_chips, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_uint32(v, name, &num_chips, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 161f7dbc62..24d132cc3e 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -113,7 +113,6 @@ static const MemoryRegionOps pnv_core_xscom_ops = {
 
 static void pnv_core_realize_child(Object *child, XICSFabric *xi, Error **errp)
 {
-    Error *local_err = NULL;
     CPUState *cs = CPU(child);
     PowerPCCPU *cpu = POWERPC_CPU(cs);
     Object *obj;
@@ -121,23 +120,20 @@ static void pnv_core_realize_child(Object *child, XICSFabric *xi, Error **errp)
     obj = object_new(TYPE_PNV_ICP);
     object_property_add_child(OBJECT(cpu), "icp", obj, IGNORE_ERRORS);
     object_property_add_const_link(obj, "xics", OBJECT(xi), &error_abort);
-    object_property_set_bool(obj, true, "realized", &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    object_property_set_bool(obj, true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
-    object_property_set_bool(child, true, "realized", &local_err);
-    if (local_err) {
+    object_property_set_bool(child, true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         object_unparent(obj);
-        error_propagate(errp, local_err);
         return;
     }
 
-    powernv_cpu_init(cpu, &local_err);
-    if (local_err) {
+    powernv_cpu_init(cpu, errp);
+    if (ERR_IS_SET(errp)) {
         object_unparent(obj);
-        error_propagate(errp, local_err);
         return;
     }
 
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index af33297e0f..f39fd1e06f 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2823,7 +2823,6 @@ void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev,
     int index;
     sPAPRDRConnector *drc;
     sPAPRDRConnectorClass *drck;
-    Error *local_err = NULL;
     CPUCore *cc = CPU_CORE(dev);
     int smt = kvmppc_smt_threads();
 
@@ -2841,9 +2840,8 @@ void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev,
     g_assert(drc);
 
     drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
-    drck->detach(drc, dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    drck->detach(drc, dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -2859,7 +2857,6 @@ static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
     CPUCore *cc = CPU_CORE(dev);
     CPUState *cs = CPU(core->threads);
     sPAPRDRConnector *drc;
-    Error *local_err = NULL;
     void *fdt = NULL;
     int fdt_offset = 0;
     int smt = kvmppc_smt_threads();
@@ -2886,10 +2883,9 @@ static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
 
     if (drc) {
         sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
-        drck->attach(drc, dev, fdt, fdt_offset, !dev->hotplugged, &local_err);
-        if (local_err) {
+        drck->attach(drc, dev, fdt, fdt_offset, !dev->hotplugged, errp);
+        if (ERR_IS_SET(errp)) {
             g_free(fdt);
-            error_propagate(errp, local_err);
             return;
         }
     }
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 1b0a7546fb..867fe9cd84 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -239,7 +239,6 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
                          void *opaque, Error **errp)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
-    Error *err = NULL;
     int fdt_offset_next, fdt_offset, fdt_depth;
     void *fdt;
 
@@ -263,19 +262,17 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
         case FDT_BEGIN_NODE:
             fdt_depth++;
             name = fdt_get_name(fdt, fdt_offset, &name_len);
-            visit_start_struct(v, name, NULL, 0, &err);
-            if (err) {
-                error_propagate(errp, err);
+            visit_start_struct(v, name, NULL, 0, errp);
+            if (ERR_IS_SET(errp)) {
                 return;
             }
             break;
         case FDT_END_NODE:
             /* shouldn't ever see an FDT_END_NODE before FDT_BEGIN_NODE */
             g_assert(fdt_depth > 0);
-            visit_check_struct(v, &err);
+            visit_check_struct(v, errp);
             visit_end_struct(v, NULL);
-            if (err) {
-                error_propagate(errp, err);
+            if (ERR_IS_SET(errp)) {
                 return;
             }
             fdt_depth--;
@@ -284,22 +281,19 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
             int i;
             prop = fdt_get_property_by_offset(fdt, fdt_offset, &prop_len);
             name = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
-            visit_start_list(v, name, NULL, 0, &err);
-            if (err) {
-                error_propagate(errp, err);
+            visit_start_list(v, name, NULL, 0, errp);
+            if (ERR_IS_SET(errp)) {
                 return;
             }
             for (i = 0; i < prop_len; i++) {
-                visit_type_uint8(v, NULL, (uint8_t *)&prop->data[i], &err);
-                if (err) {
-                    error_propagate(errp, err);
+                visit_type_uint8(v, NULL, (uint8_t *)&prop->data[i], errp);
+                if (ERR_IS_SET(errp)) {
                     return;
                 }
             }
-            visit_check_list(v, &err);
+            visit_check_list(v, errp);
             visit_end_list(v, NULL);
-            if (err) {
-                error_propagate(errp, err);
+            if (ERR_IS_SET(errp)) {
                 return;
             }
             break;
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 5b3660b674..03eff2f67c 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -1429,7 +1429,6 @@ static void spapr_phb_hot_plug_child(HotplugHandler *plug_handler,
     sPAPRPHBState *phb = SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler));
     PCIDevice *pdev = PCI_DEVICE(plugged_dev);
     sPAPRDRConnector *drc = spapr_phb_get_pci_drc(phb, pdev);
-    Error *local_err = NULL;
     PCIBus *bus = PCI_BUS(qdev_get_parent_bus(DEVICE(pdev)));
     uint32_t slotnr = PCI_SLOT(pdev->devfn);
 
@@ -1461,9 +1460,8 @@ static void spapr_phb_hot_plug_child(HotplugHandler *plug_handler,
         return;
     }
 
-    spapr_phb_add_pci_device(drc, phb, pdev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    spapr_phb_add_pci_device(drc, phb, pdev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1497,7 +1495,6 @@ static void spapr_phb_hot_unplug_child(HotplugHandler *plug_handler,
     PCIDevice *pdev = PCI_DEVICE(plugged_dev);
     sPAPRDRConnectorClass *drck;
     sPAPRDRConnector *drc = spapr_phb_get_pci_drc(phb, pdev);
-    Error *local_err = NULL;
 
     if (!phb->dr_enabled) {
         error_setg(errp, QERR_BUS_NO_HOTPLUG,
@@ -1534,9 +1531,8 @@ static void spapr_phb_hot_unplug_child(HotplugHandler *plug_handler,
             }
         }
 
-        spapr_phb_remove_pci_device(drc, phb, pdev, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        spapr_phb_remove_pci_device(drc, phb, pdev, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
 
diff --git a/hw/s390x/css-bridge.c b/hw/s390x/css-bridge.c
index 823747fcd7..49e20a5786 100644
--- a/hw/s390x/css-bridge.c
+++ b/hw/s390x/css-bridge.c
@@ -30,12 +30,10 @@ static void ccw_device_unplug(HotplugHandler *hotplug_dev,
     CcwDevice *ccw_dev = CCW_DEVICE(dev);
     CCWDeviceClass *k = CCW_DEVICE_GET_CLASS(ccw_dev);
     SubchDev *sch = ccw_dev->sch;
-    Error *err = NULL;
 
     if (k->unplug) {
-        k->unplug(hotplug_dev, dev, &err);
-        if (err) {
-            error_propagate(errp, err);
+        k->unplug(hotplug_dev, dev, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index c39e65f206..cf3a3fa70a 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -1974,7 +1974,6 @@ static void set_css_devid(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     CssDevId *dev_id = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     char *str;
     int num, n1, n2;
     unsigned int cssid, ssid, devid;
@@ -1984,9 +1983,8 @@ static void set_css_devid(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &str, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 9c56e17196..5cace901e0 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -901,12 +901,10 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 {
     VirtIORNGCcw *dev = VIRTIO_RNG_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
-    Error *err = NULL;
 
     qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus));
-    object_property_set_bool(OBJECT(vdev), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(vdev), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -919,12 +917,10 @@ static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 {
     VirtIOCryptoCcw *dev = VIRTIO_CRYPTO_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
-    Error *err = NULL;
 
     qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus));
-    object_property_set_bool(OBJECT(vdev), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(vdev), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1762,11 +1758,9 @@ static void vhost_vsock_ccw_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 {
     VHostVSockCCWState *dev = VHOST_VSOCK_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
-    Error *err = NULL;
 
     qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus));
-    object_property_set_bool(OBJECT(vdev), true, "realized", &err);
-    error_propagate(errp, err);
+    object_property_set_bool(OBJECT(vdev), true, "realized", errp);
 }
 
 static void vhost_vsock_ccw_class_init(ObjectClass *klass, void *data)
diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index e295d88939..30f866d5a0 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -462,15 +462,13 @@ static void dc390_write_config(PCIDevice *dev,
 static void dc390_scsi_realize(PCIDevice *dev, Error **errp)
 {
     DC390State *pci = DC390(dev);
-    Error *err = NULL;
     uint8_t *contents;
     uint16_t chksum = 0;
     int i;
 
     /* init base class */
-    esp_pci_scsi_realize(dev, &err);
-    if (err) {
-        error_propagate(errp, err);
+    esp_pci_scsi_realize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index 796ae562bf..bb9f5628db 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -152,7 +152,6 @@ static void scsi_qdev_realize(DeviceState *qdev, Error **errp)
     SCSIDevice *dev = SCSI_DEVICE(qdev);
     SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
     SCSIDevice *d;
-    Error *local_err = NULL;
 
     if (dev->channel > bus->info->max_channel) {
         error_setg(errp, "bad scsi channel id: %d", dev->channel);
@@ -200,9 +199,8 @@ static void scsi_qdev_realize(DeviceState *qdev, Error **errp)
     }
 
     QTAILQ_INIT(&dev->requests);
-    scsi_device_realize(dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    scsi_device_realize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     dev->vmsentry = qemu_add_vm_change_state_handler(scsi_dma_restart_cb,
@@ -229,7 +227,6 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
     const char *driver;
     char *name;
     DeviceState *dev;
-    Error *err = NULL;
 
     driver = blk_is_sg(blk) ? "scsi-generic" : "scsi-disk";
     dev = qdev_create(&bus->qbus, driver);
@@ -248,15 +245,13 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
     if (serial && object_property_find(OBJECT(dev), "serial", IGNORE_ERRORS)) {
         qdev_prop_set_string(dev, "serial", serial);
     }
-    qdev_prop_set_drive(dev, "drive", blk, &err);
-    if (err) {
-        error_propagate(errp, err);
+    qdev_prop_set_drive(dev, "drive", blk, errp);
+    if (ERR_IS_SET(errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
-    object_property_set_bool(OBJECT(dev), true, "realized", &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(dev), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
index a53f058621..d5c984504b 100644
--- a/hw/scsi/scsi-disk.c
+++ b/hw/scsi/scsi-disk.c
@@ -2306,7 +2306,6 @@ static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
 static void scsi_realize(SCSIDevice *dev, Error **errp)
 {
     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
-    Error *err = NULL;
 
     if (!s->qdev.conf.blk) {
         error_setg(errp, "drive property not set");
@@ -2322,17 +2321,15 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
     blkconf_serial(&s->qdev.conf, &s->serial);
     blkconf_blocksizes(&s->qdev.conf);
     if (dev->type == TYPE_DISK) {
-        blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, &err);
-        if (err) {
-            error_propagate(errp, err);
+        blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
     blkconf_apply_backend_options(&dev->conf,
                                   blk_is_read_only(s->qdev.conf.blk),
-                                  dev->type == TYPE_DISK, &err);
-    if (err) {
-        error_propagate(errp, err);
+                                  dev->type == TYPE_DISK, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index c44d1045b6..dea479b7ba 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -139,7 +139,6 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
 {
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(dev);
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
-    Error *err = NULL;
     int vhostfd = -1;
     int ret;
 
@@ -167,17 +166,15 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
                                vhost_dummy_handle_output,
                                vhost_dummy_handle_output,
                                vhost_dummy_handle_output,
-                               &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+                               errp);
+    if (ERR_IS_SET(errp)) {
         goto close_fd;
     }
 
     error_setg(&vsc->migration_blocker,
                "vhost-scsi does not support migration");
-    migrate_add_blocker(vsc->migration_blocker, &err);
-    if (err) {
-        error_propagate(errp, err);
+    migrate_add_blocker(vsc->migration_blocker, errp);
+    if (ERR_IS_SET(errp)) {
         error_free(vsc->migration_blocker);
         goto close_fd;
     }
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index f46f06d055..a253b5df59 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -877,15 +877,13 @@ static void virtio_scsi_device_realize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOSCSI *s = VIRTIO_SCSI(dev);
-    Error *err = NULL;
 
     virtio_scsi_common_realize(dev,
                                virtio_scsi_handle_ctrl,
                                virtio_scsi_handle_event,
                                virtio_scsi_handle_cmd,
-                               &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+                               errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index c25247e3cb..9c747821d2 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -246,7 +246,6 @@ void usb_device_free_streams(USBDevice *dev, USBEndpoint **eps, int nr_eps)
 static void usb_qdev_realize(DeviceState *qdev, Error **errp)
 {
     USBDevice *dev = USB_DEVICE(qdev);
-    Error *local_err = NULL;
 
     pstrcpy(dev->product_desc, sizeof(dev->product_desc),
             usb_device_get_product_desc(dev));
@@ -254,24 +253,21 @@ static void usb_qdev_realize(DeviceState *qdev, Error **errp)
     QLIST_INIT(&dev->strings);
     usb_ep_init(dev);
 
-    usb_claim_port(dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    usb_claim_port(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
-    usb_device_realize(dev, &local_err);
-    if (local_err) {
+    usb_device_realize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         usb_release_port(dev);
-        error_propagate(errp, local_err);
         return;
     }
 
     if (dev->auto_attach) {
-        usb_device_attach(dev, &local_err);
-        if (local_err) {
+        usb_device_attach(dev, errp);
+        if (ERR_IS_SET(errp)) {
             usb_qdev_unrealize(qdev, IGNORE_ERRORS);
-            error_propagate(errp, local_err);
             return;
         }
     }
@@ -330,7 +326,6 @@ USBDevice *usb_create(USBBus *bus, const char *name)
 static USBDevice *usb_try_create_simple(USBBus *bus, const char *name,
                                         Error **errp)
 {
-    Error *err = NULL;
     USBDevice *dev;
 
     dev = USB_DEVICE(qdev_try_create(&bus->qbus, name));
@@ -338,9 +333,8 @@ static USBDevice *usb_try_create_simple(USBBus *bus, const char *name,
         error_setg(errp, "Failed to create USB device '%s'", name);
         return NULL;
     }
-    object_property_set_bool(OBJECT(dev), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(dev), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         error_prepend(errp, "Failed to initialize USB device '%s': ",
                       name);
         object_unparent(OBJECT(dev));
@@ -533,11 +527,9 @@ void usb_check_attach(USBDevice *dev, Error **errp)
 void usb_device_attach(USBDevice *dev, Error **errp)
 {
     USBPort *port = dev->port;
-    Error *local_err = NULL;
 
-    usb_check_attach(dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    usb_check_attach(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -754,15 +746,13 @@ static bool usb_get_attached(Object *obj, Error **errp)
 static void usb_set_attached(Object *obj, bool value, Error **errp)
 {
     USBDevice *dev = USB_DEVICE(obj);
-    Error *err = NULL;
 
     if (dev->attached == value) {
         return;
     }
 
     if (value) {
-        usb_device_attach(dev, &err);
-        error_propagate(errp, err);
+        usb_device_attach(dev, errp);
     } else {
         usb_device_detach(dev);
     }
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index bfbf7cdce7..cc9dd8b533 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -483,7 +483,6 @@ static void usb_serial_event(void *opaque, int event)
 static void usb_serial_realize(USBDevice *dev, Error **errp)
 {
     USBSerialState *s = USB_SERIAL_DEV(dev);
-    Error *local_err = NULL;
     Chardev *chr = qemu_chr_fe_get_driver(&s->cs);
 
     usb_desc_create_serial(dev);
@@ -495,9 +494,8 @@ static void usb_serial_realize(USBDevice *dev, Error **errp)
         return;
     }
 
-    usb_check_attach(dev, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    usb_check_attach(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 3ada35e954..2c221d23be 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1850,7 +1850,6 @@ static void usb_ohci_init(OHCIState *ohci, DeviceState *dev,
                           char *masterbus, uint32_t firstport,
                           AddressSpace *as, Error **errp)
 {
-    Error *err = NULL;
     int i;
 
     ohci->as = as;
@@ -1885,9 +1884,8 @@ static void usb_ohci_init(OHCIState *ohci, DeviceState *dev,
         usb_register_companion(masterbus, ports, num_ports,
                                firstport, ohci, &ohci_port_ops,
                                USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL,
-                               &err);
-        if (err) {
-            error_propagate(errp, err);
+                               errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     } else {
@@ -1944,7 +1942,6 @@ static void ohci_die(OHCIState *ohci)
 
 static void usb_ohci_realize_pci(PCIDevice *dev, Error **errp)
 {
-    Error *err = NULL;
     OHCIPCIState *ohci = PCI_OHCI(dev);
 
     dev->config[PCI_CLASS_PROG] = 0x10; /* OHCI */
@@ -1952,9 +1949,8 @@ static void usb_ohci_realize_pci(PCIDevice *dev, Error **errp)
 
     usb_ohci_init(&ohci->state, DEVICE(dev), ohci->num_ports, 0,
                   ohci->masterbus, ohci->firstport,
-                  pci_get_address_space(dev), &err);
-    if (err) {
-        error_propagate(errp, err);
+                  pci_get_address_space(dev), errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
index ca72a80f27..b99a4d6429 100644
--- a/hw/usb/hcd-uhci.c
+++ b/hw/usb/hcd-uhci.c
@@ -1208,7 +1208,6 @@ 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);
     UHCIPCIDeviceClass *u = container_of(pc, UHCIPCIDeviceClass, parent_class);
     UHCIState *s = UHCI(dev);
@@ -1229,9 +1228,8 @@ static void usb_uhci_common_realize(PCIDevice *dev, Error **errp)
         usb_register_companion(s->masterbus, ports, NB_PORTS,
                                s->firstport, s, &uhci_port_ops,
                                USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL,
-                               &err);
-        if (err) {
-            error_propagate(errp, err);
+                               errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     } else {
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 2d3bad68fc..ae34f35a55 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2615,7 +2615,6 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
     VFIODevice *vbasedev_iter;
     VFIOGroup *group;
     char *tmp, group_path[PATH_MAX], *group_name;
-    Error *err = NULL;
     ssize_t len;
     struct stat st;
     int groupid;
@@ -2684,9 +2683,8 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
         goto error;
     }
 
-    vfio_populate_device(vdev, &err);
-    if (err) {
-        error_propagate(errp, err);
+    vfio_populate_device(vdev, errp);
+    if (ERR_IS_SET(errp)) {
         goto error;
     }
 
@@ -2775,9 +2773,8 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
 
     vfio_pci_size_rom(vdev);
 
-    vfio_msix_early_setup(vdev, &err);
-    if (err) {
-        error_propagate(errp, err);
+    vfio_msix_early_setup(vdev, errp);
+    if (ERR_IS_SET(errp)) {
         goto error;
     }
 
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index c2ba3f991b..09ac3b7d12 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -162,12 +162,10 @@ static void balloon_stats_set_poll_interval(Object *obj, Visitor *v,
                                             Error **errp)
 {
     VirtIOBalloon *s = opaque;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 20b2fef683..d6a8b6be5f 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -2373,12 +2373,10 @@ static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
 {
     VirtIORngPCI *vrng = VIRTIO_RNG_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&vrng->vdev);
-    Error *err = NULL;
 
     qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));
-    object_property_set_bool(OBJECT(vdev), true, "realized", &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_set_bool(OBJECT(vdev), true, "realized", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c
index e564e3b291..964c775e41 100644
--- a/hw/virtio/virtio-rng.c
+++ b/hw/virtio/virtio-rng.c
@@ -160,7 +160,6 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIORNG *vrng = VIRTIO_RNG(dev);
-    Error *local_err = NULL;
 
     if (vrng->conf.period_ms <= 0) {
         error_setg(errp, "'period' parameter expects a positive integer");
@@ -179,9 +178,8 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
         vrng->conf.default_backend = RNG_RANDOM(object_new(TYPE_RNG_RANDOM));
 
         user_creatable_complete(OBJECT(vrng->conf.default_backend),
-                                &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+                                errp);
+        if (ERR_IS_SET(errp)) {
             object_unref(OBJECT(vrng->conf.default_backend));
             return;
         }
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index fd16ff7d9d..530b5e568e 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -2477,22 +2477,19 @@ static void virtio_device_realize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
-    Error *err = NULL;
 
     /* Devices should either use vmsd or the load/save methods */
     assert(!vdc->vmsd || !vdc->load);
 
     if (vdc->realize != NULL) {
-        vdc->realize(dev, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        vdc->realize(dev, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
 
-    virtio_bus_device_plugged(vdev, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    virtio_bus_device_plugged(vdev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -2504,14 +2501,12 @@ static void virtio_device_unrealize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
-    Error *err = NULL;
 
     virtio_bus_device_unplugged(vdev);
 
     if (vdc->unrealize != NULL) {
-        vdc->unrealize(dev, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        vdc->unrealize(dev, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/migration/colo.c b/migration/colo.c
index a68e6e9cdf..039b8afa03 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -235,12 +235,10 @@ static void colo_send_message(QEMUFile *f, COLOMessage msg,
 static void colo_send_message_value(QEMUFile *f, COLOMessage msg,
                                     uint64_t value, Error **errp)
 {
-    Error *local_err = NULL;
     int ret;
 
-    colo_send_message(f, msg, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    colo_send_message(f, msg, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     qemu_put_be64(f, value);
@@ -292,13 +290,11 @@ static void colo_receive_check_message(QEMUFile *f, COLOMessage expect_msg,
 static uint64_t colo_receive_message_value(QEMUFile *f, uint32_t expect_msg,
                                            Error **errp)
 {
-    Error *local_err = NULL;
     uint64_t value;
     int ret;
 
-    colo_receive_check_message(f, expect_msg, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    colo_receive_check_message(f, expect_msg, errp);
+    if (ERR_IS_SET(errp)) {
         return 0;
     }
 
diff --git a/migration/migration.c b/migration/migration.c
index ac49c4cac8..16bdd0a8d6 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1151,7 +1151,6 @@ void migrate_del_blocker(Error *reason)
 
 void qmp_migrate_incoming(const char *uri, Error **errp)
 {
-    Error *local_err = NULL;
     static bool once = true;
 
     if (!deferred_incoming) {
@@ -1162,10 +1161,9 @@ void qmp_migrate_incoming(const char *uri, Error **errp)
         error_setg(errp, "The incoming migration has already been started");
     }
 
-    qemu_start_incoming_migration(uri, &local_err);
+    qemu_start_incoming_migration(uri, errp);
 
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/net/filter.c b/net/filter.c
index ee7ab8e443..43af9f3733 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -193,7 +193,6 @@ static void netfilter_complete(UserCreatable *uc, Error **errp)
     NetClientState *ncs[MAX_QUEUE_NUM];
     NetFilterClass *nfc = NETFILTER_GET_CLASS(uc);
     int queues;
-    Error *local_err = NULL;
 
     if (!nf->netdev_id) {
         error_setg(errp, "Parameter 'netdev' is required");
@@ -220,9 +219,8 @@ static void netfilter_complete(UserCreatable *uc, Error **errp)
     nf->netdev = ncs[0];
 
     if (nfc->setup) {
-        nfc->setup(nf, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        nfc->setup(nf, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/net/tap.c b/net/tap.c
index 979e622e60..70e5dda82a 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -605,7 +605,6 @@ static int net_tap_init(const NetdevTapOptions *tap, int *vnet_hdr,
                         const char *setup_script, char *ifname,
                         size_t ifname_sz, int mq_required, Error **errp)
 {
-    Error *err = NULL;
     int fd, vnet_hdr_required;
 
     if (tap->has_vnet_hdr) {
@@ -625,9 +624,8 @@ static int net_tap_init(const NetdevTapOptions *tap, int *vnet_hdr,
     if (setup_script &&
         setup_script[0] != '\0' &&
         strcmp(setup_script, "no") != 0) {
-        launch_script(setup_script, ifname, fd, &err);
-        if (err) {
-            error_propagate(errp, err);
+        launch_script(setup_script, ifname, fd, errp);
+        if (ERR_IS_SET(errp)) {
             close(fd);
             return -1;
         }
diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
index c089491c24..bb4a21ce0d 100644
--- a/qapi/string-input-visitor.c
+++ b/qapi/string-input-visitor.c
@@ -266,12 +266,10 @@ static void parse_type_size(Visitor *v, const char *name, uint64_t *obj,
                             Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
-    Error *err = NULL;
     uint64_t val;
 
-    parse_option_size(name, siv->string, &val, &err);
-    if (err) {
-        error_propagate(errp, err);
+    parse_option_size(name, siv->string, &val, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 37302305c5..7a802c6b37 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -175,16 +175,14 @@ static int set_property(void *opaque, const char *name, const char *value,
                         Error **errp)
 {
     Object *obj = opaque;
-    Error *err = NULL;
 
     if (strcmp(name, "driver") == 0)
         return 0;
     if (strcmp(name, "bus") == 0)
         return 0;
 
-    object_property_parse(obj, value, name, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    object_property_parse(obj, value, name, errp);
+    if (ERR_IS_SET(errp)) {
         return -1;
     }
     return 0;
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 623a32a7d8..6d3476477f 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -72,7 +72,6 @@ static void ga_wait_child(pid_t pid, int *status, Error **errp)
 void qmp_guest_shutdown(bool has_mode, const char *mode, Error **errp)
 {
     const char *shutdown_flag;
-    Error *local_err = NULL;
     pid_t pid;
     int status;
 
@@ -105,9 +104,8 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **errp)
         return;
     }
 
-    ga_wait_child(pid, &status, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ga_wait_child(pid, &status, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -143,7 +141,6 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
     int ret;
     int status;
     pid_t pid;
-    Error *local_err = NULL;
     struct timeval tv;
 
     /* If user has passed a time, validate and set it. */
@@ -192,9 +189,8 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
         return;
     }
 
-    ga_wait_child(pid, &status, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ga_wait_child(pid, &status, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1201,21 +1197,18 @@ int64_t qmp_guest_fsfreeze_freeze_list(bool has_mountpoints,
     strList *list;
     FsMountList mounts;
     struct FsMount *mount;
-    Error *local_err = NULL;
     int fd;
 
     slog("guest-fsfreeze called");
 
-    execute_fsfreeze_hook(FSFREEZE_HOOK_FREEZE, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    execute_fsfreeze_hook(FSFREEZE_HOOK_FREEZE, errp);
+    if (ERR_IS_SET(errp)) {
         return -1;
     }
 
     QTAILQ_INIT(&mounts);
-    build_fs_mount_list(&mounts, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    build_fs_mount_list(&mounts, errp);
+    if (ERR_IS_SET(errp)) {
         return -1;
     }
 
@@ -1286,12 +1279,10 @@ int64_t qmp_guest_fsfreeze_thaw(Error **errp)
     FsMountList mounts;
     FsMount *mount;
     int fd, i = 0, logged;
-    Error *local_err = NULL;
 
     QTAILQ_INIT(&mounts);
-    build_fs_mount_list(&mounts, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    build_fs_mount_list(&mounts, errp);
+    if (ERR_IS_SET(errp)) {
         return 0;
     }
 
@@ -1364,15 +1355,13 @@ qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
     FsMountList mounts;
     struct FsMount *mount;
     int fd;
-    Error *local_err = NULL;
     struct fstrim_range r;
 
     slog("guest-fstrim called");
 
     QTAILQ_INIT(&mounts);
-    build_fs_mount_list(&mounts, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    build_fs_mount_list(&mounts, errp);
+    if (ERR_IS_SET(errp)) {
         return NULL;
     }
 
@@ -1437,7 +1426,6 @@ qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
 static void bios_supports_mode(const char *pmutils_bin, const char *pmutils_arg,
                                const char *sysfile_str, Error **errp)
 {
-    Error *local_err = NULL;
     char *pmutils_path;
     pid_t pid;
     int status;
@@ -1489,9 +1477,8 @@ static void bios_supports_mode(const char *pmutils_bin, const char *pmutils_arg,
         goto out;
     }
 
-    ga_wait_child(pid, &status, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ga_wait_child(pid, &status, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
@@ -1521,7 +1508,6 @@ out:
 static void guest_suspend(const char *pmutils_bin, const char *sysfile_str,
                           Error **errp)
 {
-    Error *local_err = NULL;
     char *pmutils_path;
     pid_t pid;
     int status;
@@ -1566,9 +1552,8 @@ static void guest_suspend(const char *pmutils_bin, const char *sysfile_str,
         goto out;
     }
 
-    ga_wait_child(pid, &status, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ga_wait_child(pid, &status, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
@@ -1588,11 +1573,8 @@ out:
 
 void qmp_guest_suspend_disk(Error **errp)
 {
-    Error *local_err = NULL;
-
-    bios_supports_mode("pm-is-supported", "--hibernate", "disk", &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    bios_supports_mode("pm-is-supported", "--hibernate", "disk", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1601,11 +1583,8 @@ void qmp_guest_suspend_disk(Error **errp)
 
 void qmp_guest_suspend_ram(Error **errp)
 {
-    Error *local_err = NULL;
-
-    bios_supports_mode("pm-is-supported", "--suspend", "mem", &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    bios_supports_mode("pm-is-supported", "--suspend", "mem", errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1614,12 +1593,9 @@ void qmp_guest_suspend_ram(Error **errp)
 
 void qmp_guest_suspend_hybrid(Error **errp)
 {
-    Error *local_err = NULL;
-
     bios_supports_mode("pm-is-supported", "--suspend-hybrid", NULL,
-                       &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                       errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1947,7 +1923,6 @@ void qmp_guest_set_user_password(const char *username,
                                  bool crypted,
                                  Error **errp)
 {
-    Error *local_err = NULL;
     char *passwd_path = NULL;
     pid_t pid;
     int status;
@@ -2019,9 +1994,8 @@ void qmp_guest_set_user_password(const char *username,
     close(datafd[1]);
     datafd[1] = -1;
 
-    ga_wait_child(pid, &status, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ga_wait_child(pid, &status, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
@@ -2327,7 +2301,6 @@ err:
 
 GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
 {
-    Error *local_err = NULL;
     char *dirpath;
     int dirfd;
     char *buf;
@@ -2343,11 +2316,10 @@ GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
     g_free(dirpath);
 
     buf = g_malloc0(20);
-    ga_read_sysfs_file(dirfd, "block_size_bytes", buf, 20, &local_err);
+    ga_read_sysfs_file(dirfd, "block_size_bytes", buf, 20, errp);
     close(dirfd);
-    if (local_err) {
+    if (ERR_IS_SET(errp)) {
         g_free(buf);
-        error_propagate(errp, local_err);
         return NULL;
     }
 
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 439d229225..9f7936eeeb 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -269,7 +269,6 @@ static void execute_async(DWORD WINAPI (*func)(LPVOID), LPVOID opaque,
 
 void qmp_guest_shutdown(bool has_mode, const char *mode, Error **errp)
 {
-    Error *local_err = NULL;
     UINT shutdown_flag = EWX_FORCE;
 
     slog("guest-shutdown called, mode: %s", mode);
@@ -288,9 +287,8 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **errp)
 
     /* Request a shutdown privilege, but try to shut down the system
        anyway. */
-    acquire_privilege(SE_SHUTDOWN_NAME, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    acquire_privilege(SE_SHUTDOWN_NAME, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -760,7 +758,6 @@ GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
 int64_t qmp_guest_fsfreeze_freeze(Error **errp)
 {
     int i;
-    Error *local_err = NULL;
 
     if (!vss_initialized()) {
         error_setg(errp, QERR_UNSUPPORTED);
@@ -772,9 +769,8 @@ int64_t qmp_guest_fsfreeze_freeze(Error **errp)
     /* cannot risk guest agent blocking itself on a write in this state */
     ga_set_frozen(ga_state);
 
-    qga_vss_fsfreeze(&i, true, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qga_vss_fsfreeze(&i, true, errp);
+    if (ERR_IS_SET(errp)) {
         goto error;
     }
 
@@ -1264,7 +1260,6 @@ int64_t qmp_guest_get_time(Error **errp)
 
 void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
 {
-    Error *local_err = NULL;
     SYSTEMTIME ts;
     FILETIME tf;
     LONGLONG time;
@@ -1296,9 +1291,8 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
         return;
     }
 
-    acquire_privilege(SE_SYSTEMTIME_NAME, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    acquire_privilege(SE_SYSTEMTIME_NAME, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/qmp.c b/qmp.c
index 7ee9bcfdcf..9821343ad4 100644
--- a/qmp.c
+++ b/qmp.c
@@ -164,7 +164,6 @@ SpiceInfo *qmp_query_spice(Error **errp)
 
 void qmp_cont(Error **errp)
 {
-    Error *local_err = NULL;
     BlockBackend *blk;
     BlockDriverState *bs;
     BdrvNextIterator it;
@@ -188,9 +187,8 @@ void qmp_cont(Error **errp)
     }
 
     for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
-        bdrv_add_key(bs, NULL, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        bdrv_add_key(bs, NULL, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -201,9 +199,8 @@ void qmp_cont(Error **errp)
      * If there are no inactive block nodes (e.g. because the VM was just
      * paused rather than completing a migration), bdrv_inactivate_all() simply
      * doesn't do anything. */
-    bdrv_invalidate_cache_all(&local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    bdrv_invalidate_cache_all(errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/qom/object.c b/qom/object.c
index 8b2f2ef8ac..2a0084ea96 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1227,7 +1227,6 @@ typedef struct EnumProperty {
 int object_property_get_enum(Object *obj, const char *name,
                              const char *typename, Error **errp)
 {
-    Error *err = NULL;
     Visitor *v;
     char *str;
     int ret;
@@ -1248,9 +1247,8 @@ int object_property_get_enum(Object *obj, const char *name,
     enumprop = prop->opaque;
 
     v = string_output_visitor_new(false, &str);
-    object_property_get(obj, v, name, &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_get(obj, v, name, errp);
+    if (ERR_IS_SET(errp)) {
         visit_free(v);
         return 0;
     }
@@ -1268,14 +1266,12 @@ int object_property_get_enum(Object *obj, const char *name,
 void object_property_get_uint16List(Object *obj, const char *name,
                                     uint16List **list, Error **errp)
 {
-    Error *err = NULL;
     Visitor *v;
     char *str;
 
     v = string_output_visitor_new(false, &str);
-    object_property_get(obj, v, name, &err);
-    if (err) {
-        error_propagate(errp, err);
+    object_property_get(obj, v, name, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
     visit_complete(v, &str);
@@ -1301,12 +1297,10 @@ char *object_property_print(Object *obj, const char *name, bool human,
 {
     Visitor *v;
     char *string = NULL;
-    Error *local_err = NULL;
 
     v = string_output_visitor_new(human, &string);
-    object_property_get(obj, v, name, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    object_property_get(obj, v, name, errp);
+    if (ERR_IS_SET(errp)) {
         goto out;
     }
 
@@ -1758,11 +1752,9 @@ static void property_set_str(Object *obj, Visitor *v, const char *name,
 {
     StringProperty *prop = opaque;
     char *value;
-    Error *local_err = NULL;
 
-    visit_type_str(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_str(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1782,7 +1774,6 @@ void object_property_add_str(Object *obj, const char *name,
                            void (*set)(Object *, const char *, Error **),
                            Error **errp)
 {
-    Error *local_err = NULL;
     StringProperty *prop = g_malloc0(sizeof(*prop));
 
     prop->get = get;
@@ -1792,9 +1783,8 @@ void object_property_add_str(Object *obj, const char *name,
                         get ? property_get_str : NULL,
                         set ? property_set_str : NULL,
                         property_release_str,
-                        prop, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                        prop, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
     }
 }
@@ -1805,7 +1795,6 @@ void object_class_property_add_str(ObjectClass *klass, const char *name,
                                                Error **),
                                    Error **errp)
 {
-    Error *local_err = NULL;
     StringProperty *prop = g_malloc0(sizeof(*prop));
 
     prop->get = get;
@@ -1815,9 +1804,8 @@ void object_class_property_add_str(ObjectClass *klass, const char *name,
                               get ? property_get_str : NULL,
                               set ? property_set_str : NULL,
                               property_release_str,
-                              prop, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                              prop, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
     }
 }
@@ -1849,11 +1837,9 @@ static void property_set_bool(Object *obj, Visitor *v, const char *name,
 {
     BoolProperty *prop = opaque;
     bool value;
-    Error *local_err = NULL;
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_bool(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -1872,7 +1858,6 @@ void object_property_add_bool(Object *obj, const char *name,
                               void (*set)(Object *, bool, Error **),
                               Error **errp)
 {
-    Error *local_err = NULL;
     BoolProperty *prop = g_malloc0(sizeof(*prop));
 
     prop->get = get;
@@ -1882,9 +1867,8 @@ void object_property_add_bool(Object *obj, const char *name,
                         get ? property_get_bool : NULL,
                         set ? property_set_bool : NULL,
                         property_release_bool,
-                        prop, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                        prop, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
     }
 }
@@ -1894,7 +1878,6 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
                                     void (*set)(Object *, bool, Error **),
                                     Error **errp)
 {
-    Error *local_err = NULL;
     BoolProperty *prop = g_malloc0(sizeof(*prop));
 
     prop->get = get;
@@ -1904,9 +1887,8 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
                               get ? property_get_bool : NULL,
                               set ? property_set_bool : NULL,
                               property_release_bool,
-                              prop, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                              prop, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
     }
 }
@@ -1932,11 +1914,9 @@ static void property_set_enum(Object *obj, Visitor *v, const char *name,
 {
     EnumProperty *prop = opaque;
     int value;
-    Error *err = NULL;
 
-    visit_type_enum(v, name, &value, prop->strings, &err);
-    if (err) {
-        error_propagate(errp, err);
+    visit_type_enum(v, name, &value, prop->strings, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     prop->set(obj, value, errp);
@@ -1956,7 +1936,6 @@ void object_property_add_enum(Object *obj, const char *name,
                               void (*set)(Object *, int, Error **),
                               Error **errp)
 {
-    Error *local_err = NULL;
     EnumProperty *prop = g_malloc(sizeof(*prop));
 
     prop->strings = strings;
@@ -1967,9 +1946,8 @@ void object_property_add_enum(Object *obj, const char *name,
                         get ? property_get_enum : NULL,
                         set ? property_set_enum : NULL,
                         property_release_enum,
-                        prop, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                        prop, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
     }
 }
@@ -1981,7 +1959,6 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
                                     void (*set)(Object *, int, Error **),
                                     Error **errp)
 {
-    Error *local_err = NULL;
     EnumProperty *prop = g_malloc(sizeof(*prop));
 
     prop->strings = strings;
@@ -1992,9 +1969,8 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
                               get ? property_get_enum : NULL,
                               set ? property_set_enum : NULL,
                               property_release_enum,
-                              prop, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                              prop, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
     }
 }
@@ -2062,7 +2038,6 @@ void object_property_add_tm(Object *obj, const char *name,
                             void (*get)(Object *, struct tm *, Error **),
                             Error **errp)
 {
-    Error *local_err = NULL;
     TMProperty *prop = g_malloc0(sizeof(*prop));
 
     prop->get = get;
@@ -2070,9 +2045,8 @@ void object_property_add_tm(Object *obj, const char *name,
     object_property_add(obj, name, "struct tm",
                         get ? property_get_tm : NULL, NULL,
                         property_release_tm,
-                        prop, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                        prop, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
     }
 }
@@ -2081,7 +2055,6 @@ void object_class_property_add_tm(ObjectClass *klass, const char *name,
                                   void (*get)(Object *, struct tm *, Error **),
                                   Error **errp)
 {
-    Error *local_err = NULL;
     TMProperty *prop = g_malloc0(sizeof(*prop));
 
     prop->get = get;
@@ -2089,9 +2062,8 @@ void object_class_property_add_tm(ObjectClass *klass, const char *name,
     object_class_property_add(klass, name, "struct tm",
                               get ? property_get_tm : NULL, NULL,
                               property_release_tm,
-                              prop, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+                              prop, errp);
+    if (ERR_IS_SET(errp)) {
         g_free(prop);
     }
 }
diff --git a/replication.c b/replication.c
index be3a42f9c9..d8f00e75b2 100644
--- a/replication.c
+++ b/replication.c
@@ -45,14 +45,12 @@ void replication_remove(ReplicationState *rs)
 void replication_start_all(ReplicationMode mode, Error **errp)
 {
     ReplicationState *rs, *next;
-    Error *local_err = NULL;
 
     QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
         if (rs->ops && rs->ops->start) {
-            rs->ops->start(rs, mode, &local_err);
+            rs->ops->start(rs, mode, errp);
         }
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -61,14 +59,12 @@ void replication_start_all(ReplicationMode mode, Error **errp)
 void replication_do_checkpoint_all(Error **errp)
 {
     ReplicationState *rs, *next;
-    Error *local_err = NULL;
 
     QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
         if (rs->ops && rs->ops->checkpoint) {
-            rs->ops->checkpoint(rs, &local_err);
+            rs->ops->checkpoint(rs, errp);
         }
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -77,14 +73,12 @@ void replication_do_checkpoint_all(Error **errp)
 void replication_get_error_all(Error **errp)
 {
     ReplicationState *rs, *next;
-    Error *local_err = NULL;
 
     QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
         if (rs->ops && rs->ops->get_error) {
-            rs->ops->get_error(rs, &local_err);
+            rs->ops->get_error(rs, errp);
         }
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
@@ -93,14 +87,12 @@ void replication_get_error_all(Error **errp)
 void replication_stop_all(bool failover, Error **errp)
 {
     ReplicationState *rs, *next;
-    Error *local_err = NULL;
 
     QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
         if (rs->ops && rs->ops->stop) {
-            rs->ops->stop(rs, failover, &local_err);
+            rs->ops->stop(rs, failover, errp);
         }
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index a863a1bf4d..b0a391f54b 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -58,11 +58,9 @@ static void alpha_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     AlphaCPUClass *acc = ALPHA_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 28a9141298..00b17ca6af 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -628,11 +628,9 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
     ARMCPUClass *acc = ARM_CPU_GET_CLASS(dev);
     CPUARMState *env = &cpu->env;
     int pagebits;
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/cris/cpu.c b/target/cris/cpu.c
index 5f766f09d6..32815e3fa3 100644
--- a/target/cris/cpu.c
+++ b/target/cris/cpu.c
@@ -141,11 +141,9 @@ static void cris_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     CRISCPUClass *ccc = CRIS_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
index 6a05445e0e..500414752e 100644
--- a/target/hppa/cpu.c
+++ b/target/hppa/cpu.c
@@ -52,11 +52,9 @@ static void hppa_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     HPPACPUClass *acc = HPPA_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index ae7abdade5..e0a5862568 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -1699,12 +1699,10 @@ static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
     CPUX86State *env = &cpu->env;
     const int64_t min = 0;
     const int64_t max = 0xff + 0xf;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (value < min || value > max) {
@@ -1742,12 +1740,10 @@ static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
     CPUX86State *env = &cpu->env;
     const int64_t min = 0;
     const int64_t max = 0xff;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (value < min || value > max) {
@@ -1780,12 +1776,10 @@ static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
     CPUX86State *env = &cpu->env;
     const int64_t min = 0;
     const int64_t max = 0xf;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (value < min || value > max) {
@@ -1885,12 +1879,10 @@ static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
     X86CPU *cpu = X86_CPU(obj);
     const int64_t min = 0;
     const int64_t max = INT64_MAX;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (value < min || value > max) {
@@ -1946,12 +1938,10 @@ static void x86_set_hv_spinlocks(Object *obj, Visitor *v, const char *name,
     const int64_t min = 0xFFF;
     const int64_t max = UINT_MAX;
     X86CPU *cpu = X86_CPU(obj);
-    Error *err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -3684,7 +3674,6 @@ static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
 {
     X86CPU *cpu = X86_CPU(dev);
     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
 #ifndef CONFIG_USER_ONLY
     cpu_remove_sync(CPU(dev));
@@ -3696,9 +3685,8 @@ static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
         cpu->apic_state = NULL;
     }
 
-    xcc->parent_unrealize(dev, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    xcc->parent_unrealize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 }
@@ -3724,7 +3712,6 @@ static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     X86CPU *cpu = X86_CPU(obj);
     BitProperty *fp = opaque;
-    Error *local_err = NULL;
     bool value;
 
     if (dev->realized) {
@@ -3732,9 +3719,8 @@ static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    visit_type_bool(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/lm32/cpu.c b/target/lm32/cpu.c
index 2b8c36b6d0..8bd90c09dc 100644
--- a/target/lm32/cpu.c
+++ b/target/lm32/cpu.c
@@ -143,11 +143,9 @@ static void lm32_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     LM32CPUClass *lcc = LM32_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
index f06892271f..ae7fa0e1b0 100644
--- a/target/m68k/cpu.c
+++ b/target/m68k/cpu.c
@@ -221,11 +221,9 @@ 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);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
index 3d58869716..026b5b3e3f 100644
--- a/target/microblaze/cpu.c
+++ b/target/microblaze/cpu.c
@@ -137,11 +137,9 @@ static void mb_cpu_realizefn(DeviceState *dev, Error **errp)
     CPUMBState *env = &cpu->env;
     uint8_t version_code = 0;
     int i = 0;
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
index 1bb66b7a5a..07c82ebb9d 100644
--- a/target/mips/cpu.c
+++ b/target/mips/cpu.c
@@ -123,11 +123,9 @@ static void mips_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/moxie/cpu.c b/target/moxie/cpu.c
index 927b1a1e44..ad7435ecbd 100644
--- a/target/moxie/cpu.c
+++ b/target/moxie/cpu.c
@@ -59,11 +59,9 @@ static void moxie_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     MoxieCPUClass *mcc = MOXIE_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
index 7015cdefe6..227c5352a7 100644
--- a/target/nios2/cpu.c
+++ b/target/nios2/cpu.c
@@ -96,11 +96,9 @@ static void nios2_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     Nios2CPUClass *ncc = NIOS2_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
index 1d6330cbcc..8cd0a46bf1 100644
--- a/target/openrisc/cpu.c
+++ b/target/openrisc/cpu.c
@@ -69,11 +69,9 @@ static void openrisc_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     OpenRISCCPUClass *occ = OPENRISC_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
index 56a0ab22cf..0597df737e 100644
--- a/target/ppc/translate_init.c
+++ b/target/ppc/translate_init.c
@@ -8444,14 +8444,12 @@ static void powerpc_get_compat(Object *obj, Visitor *v, const char *name,
 static void powerpc_set_compat(Object *obj, Visitor *v, const char *name,
                                void *opaque, Error **errp)
 {
-    Error *error = NULL;
     char *value = NULL;
     Property *prop = opaque;
     uint32_t *max_compat = qdev_get_prop_ptr(DEVICE(obj), prop);
 
-    visit_type_str(v, name, &value, &error);
-    if (error) {
-        error_propagate(errp, error);
+    visit_type_str(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -9825,7 +9823,6 @@ 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);
-    Error *local_err = NULL;
 #if !defined(CONFIG_USER_ONLY)
     int max_smt = kvmppc_smt_threads();
 #endif
@@ -9844,9 +9841,8 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
     }
 #endif
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
@@ -9879,9 +9875,8 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
     }
 #endif
 
-    create_ppc_opcodes(cpu, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    create_ppc_opcodes(cpu, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     init_ppc_proc(cpu);
@@ -10074,13 +10069,11 @@ static void ppc_cpu_unrealizefn(DeviceState *dev, Error **errp)
     PowerPCCPU *cpu = POWERPC_CPU(dev);
     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
-    Error *local_err = NULL;
     opc_handler_t **table, **table_2;
     int i, j, k;
 
-    pcc->parent_unrealize(dev, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    pcc->parent_unrealize(dev, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 75e5966749..7d9e104151 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -250,7 +250,6 @@ static void s390x_cpu_set_id(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     const int64_t min = 0;
     const int64_t max = UINT32_MAX;
-    Error *err = NULL;
     int64_t value;
 
     if (dev->realized) {
@@ -259,9 +258,8 @@ static void s390x_cpu_set_id(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_int(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
+    visit_type_int(v, name, &value, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
     if (value < min || value > max) {
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
index 9da7e1ed38..dc2cbce478 100644
--- a/target/sh4/cpu.c
+++ b/target/sh4/cpu.c
@@ -243,11 +243,9 @@ static void superh_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     SuperHCPUClass *scc = SUPERH_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index 4d6f0c4f66..51a6f129a1 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -800,7 +800,6 @@ static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 #if defined(CONFIG_USER_ONLY)
     SPARCCPU *cpu = SPARC_CPU(dev);
     CPUSPARCState *env = &cpu->env;
@@ -810,9 +809,8 @@ static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
     }
 #endif
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/tilegx/cpu.c b/target/tilegx/cpu.c
index f8c479e1d7..f8448c4c9e 100644
--- a/target/tilegx/cpu.c
+++ b/target/tilegx/cpu.c
@@ -90,11 +90,9 @@ static void tilegx_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     TileGXCPUClass *tcc = TILEGX_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c
index 08f50e2ba7..efeb6553d0 100644
--- a/target/tricore/cpu.c
+++ b/target/tricore/cpu.c
@@ -67,11 +67,9 @@ static void tricore_cpu_realizefn(DeviceState *dev, Error **errp)
     TriCoreCPU *cpu = TRICORE_CPU(dev);
     TriCoreCPUClass *tcc = TRICORE_CPU_GET_CLASS(dev);
     CPUTriCoreState *env = &cpu->env;
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/unicore32/cpu.c b/target/unicore32/cpu.c
index c9b78ce68e..3b14cfa37d 100644
--- a/target/unicore32/cpu.c
+++ b/target/unicore32/cpu.c
@@ -103,11 +103,9 @@ static void uc32_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     UniCore32CPUClass *ucc = UNICORE32_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
index cd7f95823f..69bf002489 100644
--- a/target/xtensa/cpu.c
+++ b/target/xtensa/cpu.c
@@ -101,11 +101,9 @@ static void xtensa_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     XtensaCPUClass *xcc = XTENSA_CPU_GET_CLASS(dev);
-    Error *local_err = NULL;
 
-    cpu_exec_realizefn(cs, &local_err);
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
+    cpu_exec_realizefn(cs, errp);
+    if (ERR_IS_SET(errp)) {
         return;
     }
 
diff --git a/util/qemu-config.c b/util/qemu-config.c
index be9ffb5872..48e5691f8d 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -568,12 +568,10 @@ void qemu_config_parse_qdict(QDict *options, QemuOptsList **lists,
                              Error **errp)
 {
     int i;
-    Error *local_err = NULL;
 
     for (i = 0; lists[i]; i++) {
-        config_parse_qdict_section(options, lists[i], &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        config_parse_qdict_section(options, lists[i], errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 5f1c7af1c6..4a4b145d42 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -526,7 +526,6 @@ static void opt_set(QemuOpts *opts, const char *name, const char *value,
 {
     QemuOpt *opt;
     const QemuOptDesc *desc;
-    Error *local_err = NULL;
 
     desc = find_desc_by_name(opts->list->desc, name);
     if (!desc && !opts_accepts_any(opts)) {
@@ -545,9 +544,8 @@ static void opt_set(QemuOpts *opts, const char *name, const char *value,
     opt->desc = desc;
     opt->str = g_strdup(value);
     assert(opt->str);
-    qemu_opt_parse(opt, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    qemu_opt_parse(opt, errp);
+    if (ERR_IS_SET(errp)) {
         qemu_opt_del(opt);
     }
 }
@@ -790,7 +788,6 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
 {
     char option[128], value[1024];
     const char *p,*pe,*pc;
-    Error *local_err = NULL;
 
     for (p = params; *p != '\0'; p++) {
         pe = strchr(p, '=');
@@ -822,9 +819,8 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
         }
         if (strcmp(option, "id") != 0) {
             /* store and parse */
-            opt_set(opts, option, value, prepend, &local_err);
-            if (local_err) {
-                error_propagate(errp, local_err);
+            opt_set(opts, option, value, prepend, errp);
+            if (ERR_IS_SET(errp)) {
                 return;
             }
         }
@@ -1073,7 +1069,6 @@ QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict)
 void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
 {
     QemuOpt *opt;
-    Error *local_err = NULL;
 
     assert(opts_accepts_any(opts));
 
@@ -1084,9 +1079,8 @@ void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
             return;
         }
 
-        qemu_opt_parse(opt, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        qemu_opt_parse(opt, errp);
+        if (ERR_IS_SET(errp)) {
             return;
         }
     }
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (13 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 14/15] [coccinelle] Eliminate unnecessary local_err/error_propagate() usage Eduardo Habkost
@ 2017-06-13 16:53 ` Eduardo Habkost
       [not found]   ` <20170615121407.GA2399@work-vm>
  2017-06-27 20:22 ` [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eric Blake
  2017-06-28  9:05 ` Markus Armbruster
  16 siblings, 1 reply; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-13 16:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Markus Armbruster, Michael Roth

This is being included in the RFC just to help validating the series,
and ensure we don't use NULL errp anywhere.

I don't propose we actually change all code to use the
'Error *errp[static 1]' syntax because it confuses Cocinelle.

I am considering including a assert(errp) line in the ERR_IS_SET()
macro, so we can catch NULL errp at runtime in case somebody forgets
about it.

Generated by the following Coccinelle patch:

  @@
  typedef Error;
  type T;
  identifier FN !~ "os_mem_prealloc|qemu_fork";
  identifier errp;
  @@
   T FN(...,
  -     Error **errp
  +     Error *errp[STATIC_1]
       );

  @@
  typedef Error;
  type T;
  identifier FN !~ "os_mem_prealloc|qemu_fork";
  identifier errp;
  @@
   T FN(...,
  -     Error **errp
  +     Error *errp[STATIC_1]
       ) { ... }

Followed by the following sed command:

  $ sed -i -e 's/\[STATIC_1\]/[static 1]/g' $(g grep -w -l STATIC_1)

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qapi/visitor.h                  |  47 ++++++-----
 block/nbd-client.h                      |   2 +-
 block/qcow2.h                           |   8 +-
 block/vhdx.h                            |   2 +-
 crypto/blockpriv.h                      |   4 +-
 crypto/hmac.h                           |  10 +--
 crypto/tlscredspriv.h                   |   4 +-
 hw/9pfs/9p.h                            |   4 +-
 hw/block/dataplane/virtio-blk.h         |   2 +-
 hw/s390x/s390-virtio.h                  |   2 +-
 hw/timer/m48t59-internal.h              |   2 +-
 hw/usb/hcd-ehci.h                       |   4 +-
 hw/vfio/pci.h                           |   4 +-
 hw/xen/xen-host-pci-device.h            |   2 +-
 hw/xen/xen_pt.h                         |   4 +-
 include/block/aio.h                     |   4 +-
 include/block/block.h                   |  69 +++++++++-------
 include/block/block_backup.h            |   2 +-
 include/block/block_int.h               |  19 +++--
 include/block/blockjob.h                |  11 +--
 include/block/blockjob_int.h            |   3 +-
 include/block/dirty-bitmap.h            |   8 +-
 include/block/nbd.h                     |  13 +--
 include/block/qapi.h                    |   7 +-
 include/block/snapshot.h                |  12 +--
 include/chardev/char-fd.h               |   2 +-
 include/chardev/char-fe.h               |   4 +-
 include/chardev/char-win.h              |   3 +-
 include/chardev/char.h                  |   9 ++-
 include/crypto/afsplit.h                |   4 +-
 include/crypto/block.h                  |  10 +--
 include/crypto/cipher.h                 |   8 +-
 include/crypto/hash.h                   |  12 +--
 include/crypto/init.h                   |   2 +-
 include/crypto/ivgen.h                  |   2 +-
 include/crypto/pbkdf.h                  |   4 +-
 include/crypto/random.h                 |   4 +-
 include/crypto/secret.h                 |   6 +-
 include/crypto/tlssession.h             |   6 +-
 include/exec/memory.h                   |  12 +--
 include/exec/ram_addr.h                 |  12 +--
 include/hw/acpi/acpi.h                  |   4 +-
 include/hw/acpi/cpu.h                   |   7 +-
 include/hw/acpi/cpu_hotplug.h           |   3 +-
 include/hw/acpi/ich9.h                  |   9 ++-
 include/hw/acpi/memory_hotplug.h        |   6 +-
 include/hw/acpi/pcihp.h                 |   4 +-
 include/hw/block/block.h                |   4 +-
 include/hw/boards.h                     |   2 +-
 include/hw/char/serial.h                |   2 +-
 include/hw/hotplug.h                    |   8 +-
 include/hw/i386/pc.h                    |   2 +-
 include/hw/isa/isa.h                    |   2 +-
 include/hw/loader.h                     |   3 +-
 include/hw/mem/pc-dimm.h                |  10 ++-
 include/hw/nmi.h                        |   2 +-
 include/hw/pci/msi.h                    |   2 +-
 include/hw/pci/msix.h                   |   4 +-
 include/hw/pci/pci.h                    |   2 +-
 include/hw/pci/pcie.h                   |   5 +-
 include/hw/pci/pcie_aer.h               |   2 +-
 include/hw/pci/shpc.h                   |   5 +-
 include/hw/ppc/pnv_xscom.h              |   2 +-
 include/hw/ppc/xics.h                   |   7 +-
 include/hw/qdev-core.h                  |   8 +-
 include/hw/qdev-properties.h            |  10 ++-
 include/hw/s390x/css.h                  |   4 +-
 include/hw/scsi/scsi.h                  |   3 +-
 include/hw/smbios/smbios.h              |   2 +-
 include/hw/usb.h                        |   8 +-
 include/hw/vfio/vfio-common.h           |   5 +-
 include/hw/virtio/vhost-scsi-common.h   |   2 +-
 include/hw/virtio/virtio-bus.h          |   2 +-
 include/hw/virtio/virtio-scsi.h         |   6 +-
 include/hw/xen/xen.h                    |   2 +-
 include/io/channel-command.h            |   2 +-
 include/io/channel-file.h               |   2 +-
 include/io/channel-socket.h             |  14 ++--
 include/io/channel-tls.h                |   4 +-
 include/io/channel-util.h               |   2 +-
 include/io/channel.h                    |  20 ++---
 include/io/dns-resolver.h               |   2 +-
 include/io/task.h                       |   2 +-
 include/migration/blocker.h             |   2 +-
 include/migration/failover.h            |   2 +-
 include/migration/migration.h           |   4 +-
 include/migration/snapshot.h            |   4 +-
 include/migration/vmstate.h             |   2 +-
 include/monitor/monitor.h               |   6 +-
 include/monitor/qdev.h                  |   4 +-
 include/net/net.h                       |   6 +-
 include/qapi/error.h                    |   2 +-
 include/qapi/qmp/json-parser.h          |   3 +-
 include/qapi/qmp/qdict.h                |   2 +-
 include/qapi/qmp/qjson.h                |   5 +-
 include/qapi/qobject-input-visitor.h    |   2 +-
 include/qapi/util.h                     |   2 +-
 include/qemu/base64.h                   |   2 +-
 include/qemu/config-file.h              |   4 +-
 include/qemu/log.h                      |   4 +-
 include/qemu/main-loop.h                |   2 +-
 include/qemu/option.h                   |  30 +++----
 include/qemu/sockets.h                  |  33 ++++----
 include/qemu/throttle.h                 |   2 +-
 include/qom/cpu.h                       |   4 +-
 include/qom/object.h                    |  89 ++++++++++----------
 include/qom/object_interfaces.h         |  12 +--
 include/qom/qom-qobject.h               |   4 +-
 include/sysemu/arch_init.h              |   8 +-
 include/sysemu/block-backend.h          |  19 +++--
 include/sysemu/cpus.h                   |   4 +-
 include/sysemu/cryptodev.h              |   8 +-
 include/sysemu/device_tree.h            |   6 +-
 include/sysemu/hostmem.h                |   2 +-
 include/sysemu/memory_mapping.h         |   2 +-
 include/sysemu/numa.h                   |   5 +-
 include/sysemu/qtest.h                  |   3 +-
 include/sysemu/sysemu.h                 |  10 +--
 include/sysemu/tpm_backend.h            |   2 +-
 include/ui/console.h                    |  14 ++--
 include/ui/input.h                      |   2 +-
 include/ui/qemu-spice.h                 |   2 +-
 migration/block.h                       |   2 +-
 migration/exec.h                        |   5 +-
 migration/fd.h                          |   4 +-
 migration/rdma.h                        |   5 +-
 migration/savevm.h                      |   2 +-
 migration/socket.h                      |   9 ++-
 migration/tls.h                         |   4 +-
 nbd/nbd-internal.h                      |   6 +-
 net/clients.h                           |  20 ++---
 net/tap_int.h                           |   5 +-
 qga/guest-agent-core.h                  |   4 +-
 qga/vss-win32.h                         |   2 +-
 replication.h                           |   8 +-
 target/i386/cpu.h                       |   2 +-
 target/ppc/cpu.h                        |   5 +-
 target/s390x/cpu.h                      |   7 +-
 target/s390x/cpu_models.h               |   9 ++-
 qapi/qapi-visit-core.c                  |  58 ++++++++------
 arch_init.c                             |   2 +-
 backends/cryptodev-builtin.c            |  15 ++--
 backends/cryptodev.c                    |  18 ++---
 backends/hostmem-file.c                 |  11 +--
 backends/hostmem-ram.c                  |   2 +-
 backends/hostmem.c                      |  39 +++++----
 backends/rng-egd.c                      |   7 +-
 backends/rng-random.c                   |   6 +-
 backends/rng.c                          |   7 +-
 backends/tpm.c                          |   7 +-
 balloon.c                               |   6 +-
 block.c                                 | 103 +++++++++++++-----------
 block/backup.c                          |   7 +-
 block/blkdebug.c                        |  17 ++--
 block/blkreplay.c                       |   2 +-
 block/blkverify.c                       |   4 +-
 block/block-backend.c                   |  22 ++---
 block/bochs.c                           |   4 +-
 block/cloop.c                           |   4 +-
 block/commit.c                          |   5 +-
 block/crypto.c                          |  20 ++---
 block/curl.c                            |   4 +-
 block/dirty-bitmap.c                    |   9 ++-
 block/dmg.c                             |   6 +-
 block/file-posix.c                      |  42 +++++-----
 block/file-win32.c                      |  18 +++--
 block/gluster.c                         |  15 ++--
 block/io.c                              |   2 +-
 block/iscsi.c                           |  26 +++---
 block/mirror.c                          |  12 +--
 block/nbd-client.c                      |   2 +-
 block/nbd.c                             |  18 +++--
 block/nfs.c                             |  25 +++---
 block/null.c                            |   4 +-
 block/parallels.c                       |   5 +-
 block/qapi.c                            |  13 +--
 block/qcow.c                            |   9 ++-
 block/qcow2-cluster.c                   |   2 +-
 block/qcow2-refcount.c                  |   8 +-
 block/qcow2-snapshot.c                  |   4 +-
 block/qcow2.c                           |  29 ++++---
 block/qed.c                             |  21 +++--
 block/quorum.c                          |   9 ++-
 block/raw-format.c                      |  14 ++--
 block/rbd.c                             |  23 +++---
 block/replication.c                     |  26 +++---
 block/sheepdog.c                        |  33 ++++----
 block/snapshot.c                        |  12 +--
 block/ssh.c                             |  31 ++++---
 block/stream.c                          |   6 +-
 block/vdi.c                             |   7 +-
 block/vhdx-log.c                        |   2 +-
 block/vhdx.c                            |  11 +--
 block/vmdk.c                            |  33 ++++----
 block/vpc.c                             |  11 +--
 block/vvfat.c                           |  12 +--
 block/vxhs.c                            |   6 +-
 block/write-threshold.c                 |   2 +-
 blockdev-nbd.c                          |  11 +--
 blockdev.c                              | 129 +++++++++++++++--------------
 blockjob.c                              |  18 +++--
 bootdevice.c                            |  12 +--
 chardev/baum.c                          |   2 +-
 chardev/char-console.c                  |   2 +-
 chardev/char-fd.c                       |   2 +-
 chardev/char-fe.c                       |   4 +-
 chardev/char-file.c                     |   4 +-
 chardev/char-mux.c                      |   4 +-
 chardev/char-null.c                     |   2 +-
 chardev/char-parallel.c                 |   8 +-
 chardev/char-pipe.c                     |   8 +-
 chardev/char-pty.c                      |   2 +-
 chardev/char-ringbuf.c                  |   8 +-
 chardev/char-serial.c                   |   6 +-
 chardev/char-socket.c                   |  10 +--
 chardev/char-stdio.c                    |   4 +-
 chardev/char-udp.c                      |   4 +-
 chardev/char-win-stdio.c                |   2 +-
 chardev/char-win.c                      |   3 +-
 chardev/char.c                          |  19 ++---
 chardev/msmouse.c                       |   2 +-
 chardev/spice.c                         |   8 +-
 chardev/wctablet.c                      |   2 +-
 cpus.c                                  |  12 +--
 crypto/afsplit.c                        |   6 +-
 crypto/block-luks.c                     |  22 ++---
 crypto/block-qcow.c                     |  10 +--
 crypto/block.c                          |  14 ++--
 crypto/cipher-builtin.c                 |  24 +++---
 crypto/cipher-gcrypt.c                  |   8 +-
 crypto/cipher-nettle.c                  |   8 +-
 crypto/cipher.c                         |   2 +-
 crypto/hash-gcrypt.c                    |   2 +-
 crypto/hash-glib.c                      |   2 +-
 crypto/hash-nettle.c                    |   2 +-
 crypto/hash.c                           |  10 +--
 crypto/hmac-gcrypt.c                    |   4 +-
 crypto/hmac-glib.c                      |   8 +-
 crypto/hmac-nettle.c                    |   4 +-
 crypto/hmac.c                           |   6 +-
 crypto/init.c                           |   2 +-
 crypto/ivgen-essiv.c                    |   4 +-
 crypto/ivgen-plain.c                    |   4 +-
 crypto/ivgen-plain64.c                  |   4 +-
 crypto/ivgen.c                          |   4 +-
 crypto/pbkdf-gcrypt.c                   |   2 +-
 crypto/pbkdf-nettle.c                   |   2 +-
 crypto/pbkdf-stub.c                     |   2 +-
 crypto/pbkdf.c                          |   4 +-
 crypto/random-gcrypt.c                  |   4 +-
 crypto/random-gnutls.c                  |   4 +-
 crypto/random-platform.c                |   4 +-
 crypto/secret.c                         |  38 ++++-----
 crypto/tlscreds.c                       |  20 ++---
 crypto/tlscredsanon.c                   |  12 +--
 crypto/tlscredsx509.c                   |  38 ++++-----
 crypto/tlssession.c                     |  18 ++---
 device_tree.c                           |   8 +-
 dump.c                                  |  52 ++++++------
 exec.c                                  |  20 ++---
 fsdev/qemu-fsdev-throttle.c             |   3 +-
 gdbstub.c                               |   2 +-
 hw/9pfs/9p.c                            |   4 +-
 hw/9pfs/virtio-9p-device.c              |   7 +-
 hw/acpi/acpi-stub.c                     |   2 +-
 hw/acpi/core.c                          |   6 +-
 hw/acpi/cpu.c                           |   7 +-
 hw/acpi/cpu_hotplug.c                   |   5 +-
 hw/acpi/ich9.c                          |  37 +++++----
 hw/acpi/memory_hotplug.c                |   8 +-
 hw/acpi/pcihp.c                         |   4 +-
 hw/acpi/piix4.c                         |  14 ++--
 hw/acpi/vmgenid.c                       |   7 +-
 hw/arm/allwinner-a10.c                  |   2 +-
 hw/arm/armv7m.c                         |   4 +-
 hw/arm/aspeed.c                         |   4 +-
 hw/arm/aspeed_soc.c                     |   2 +-
 hw/arm/bcm2835_peripherals.c            |   3 +-
 hw/arm/bcm2836.c                        |   2 +-
 hw/arm/digic.c                          |   2 +-
 hw/arm/fsl-imx25.c                      |   2 +-
 hw/arm/fsl-imx31.c                      |   2 +-
 hw/arm/fsl-imx6.c                       |   2 +-
 hw/arm/integratorcp.c                   |   2 +-
 hw/arm/musicpal.c                       |   4 +-
 hw/arm/pxa2xx.c                         |   2 +-
 hw/arm/pxa2xx_gpio.c                    |   2 +-
 hw/arm/spitz.c                          |   4 +-
 hw/arm/stm32f205_soc.c                  |   2 +-
 hw/arm/strongarm.c                      |   2 +-
 hw/arm/tosa.c                           |   2 +-
 hw/arm/vexpress.c                       |   5 +-
 hw/arm/virt.c                           |  21 ++---
 hw/arm/xlnx-zynqmp.c                    |   4 +-
 hw/arm/z2.c                             |   2 +-
 hw/audio/ac97.c                         |   2 +-
 hw/audio/adlib.c                        |   2 +-
 hw/audio/cs4231a.c                      |   2 +-
 hw/audio/es1370.c                       |   2 +-
 hw/audio/gus.c                          |   2 +-
 hw/audio/intel-hda.c                    |   6 +-
 hw/audio/marvell_88w8618.c              |   2 +-
 hw/audio/milkymist-ac97.c               |   2 +-
 hw/audio/pcspk.c                        |   2 +-
 hw/audio/pl041.c                        |   2 +-
 hw/audio/sb16.c                         |   2 +-
 hw/block/block.c                        |   4 +-
 hw/block/dataplane/virtio-blk.c         |   2 +-
 hw/block/fdc.c                          |  10 +--
 hw/block/m25p80.c                       |   2 +-
 hw/block/nand.c                         |   2 +-
 hw/block/pflash_cfi01.c                 |   2 +-
 hw/block/pflash_cfi02.c                 |   2 +-
 hw/block/virtio-blk.c                   |   7 +-
 hw/bt/hci-csr.c                         |   2 +-
 hw/char/bcm2835_aux.c                   |   2 +-
 hw/char/cadence_uart.c                  |   2 +-
 hw/char/debugcon.c                      |   4 +-
 hw/char/digic-uart.c                    |   2 +-
 hw/char/escc.c                          |   2 +-
 hw/char/etraxfs_ser.c                   |   2 +-
 hw/char/exynos4210_uart.c               |   2 +-
 hw/char/imx_serial.c                    |   2 +-
 hw/char/ipoctal232.c                    |   2 +-
 hw/char/lm32_juart.c                    |   2 +-
 hw/char/lm32_uart.c                     |   2 +-
 hw/char/mcf_uart.c                      |   2 +-
 hw/char/milkymist-uart.c                |   2 +-
 hw/char/parallel.c                      |   2 +-
 hw/char/pl011.c                         |   2 +-
 hw/char/serial-isa.c                    |   2 +-
 hw/char/serial-pci.c                    |   4 +-
 hw/char/serial.c                        |   2 +-
 hw/char/spapr_vty.c                     |   2 +-
 hw/char/stm32f2xx_usart.c               |   2 +-
 hw/char/terminal3270.c                  |   2 +-
 hw/char/virtio-console.c                |   4 +-
 hw/char/virtio-serial-bus.c             |  16 ++--
 hw/char/xilinx_uartlite.c               |   2 +-
 hw/core/bus.c                           |  11 +--
 hw/core/generic-loader.c                |   4 +-
 hw/core/hotplug.c                       |   8 +-
 hw/core/loader.c                        |   3 +-
 hw/core/machine.c                       |  87 +++++++++++---------
 hw/core/nmi.c                           |   2 +-
 hw/core/or-irq.c                        |   2 +-
 hw/core/platform-bus.c                  |   2 +-
 hw/core/qdev-properties-system.c        |  24 +++---
 hw/core/qdev-properties.c               |  63 ++++++++-------
 hw/core/qdev.c                          |  23 +++---
 hw/cpu/a15mpcore.c                      |   2 +-
 hw/cpu/a9mpcore.c                       |   2 +-
 hw/cpu/arm11mpcore.c                    |   2 +-
 hw/cpu/core.c                           |   8 +-
 hw/cpu/realview_mpcore.c                |   2 +-
 hw/display/ads7846.c                    |   2 +-
 hw/display/bcm2835_fb.c                 |   2 +-
 hw/display/cg3.c                        |   2 +-
 hw/display/cirrus_vga.c                 |   4 +-
 hw/display/exynos4210_fimd.c            |   2 +-
 hw/display/jazz_led.c                   |   2 +-
 hw/display/milkymist-tmu2.c             |   2 +-
 hw/display/milkymist-vgafb.c            |   2 +-
 hw/display/pl110.c                      |   2 +-
 hw/display/qxl.c                        |   6 +-
 hw/display/sm501.c                      |   4 +-
 hw/display/ssd0323.c                    |   2 +-
 hw/display/tcx.c                        |   2 +-
 hw/display/vga-isa.c                    |   2 +-
 hw/display/vga-pci.c                    |   9 ++-
 hw/display/virtio-gpu-pci.c             |   3 +-
 hw/display/virtio-gpu.c                 |   8 +-
 hw/display/virtio-vga.c                 |   3 +-
 hw/display/vmware_vga.c                 |   2 +-
 hw/display/xlnx_dp.c                    |   4 +-
 hw/dma/bcm2835_dma.c                    |   2 +-
 hw/dma/i82374.c                         |   2 +-
 hw/dma/i8257.c                          |   2 +-
 hw/dma/pl330.c                          |   2 +-
 hw/dma/pxa2xx_dma.c                     |   2 +-
 hw/dma/rc4030.c                         |   4 +-
 hw/dma/sparc32_dma.c                    |   2 +-
 hw/dma/xilinx_axidma.c                  |   2 +-
 hw/gpio/bcm2835_gpio.c                  |   2 +-
 hw/gpio/gpio_key.c                      |   2 +-
 hw/gpio/imx_gpio.c                      |   2 +-
 hw/gpio/omap_gpio.c                     |   4 +-
 hw/i2c/aspeed_i2c.c                     |   2 +-
 hw/i2c/imx_i2c.c                        |   2 +-
 hw/i2c/omap_i2c.c                       |   2 +-
 hw/i2c/smbus_ich9.c                     |   2 +-
 hw/i386/amd_iommu.c                     |   2 +-
 hw/i386/intel_iommu.c                   |   4 +-
 hw/i386/kvm/apic.c                      |   4 +-
 hw/i386/kvm/clock.c                     |   2 +-
 hw/i386/kvm/i8254.c                     |   2 +-
 hw/i386/kvm/i8259.c                     |   2 +-
 hw/i386/kvm/ioapic.c                    |   2 +-
 hw/i386/kvm/pci-assign.c                |  21 ++---
 hw/i386/kvmvapic.c                      |   2 +-
 hw/i386/pc.c                            |  73 +++++++++--------
 hw/i386/x86-iommu.c                     |   2 +-
 hw/i386/xen/xen-hvm.c                   |   4 +-
 hw/i386/xen/xen_apic.c                  |   2 +-
 hw/i386/xen/xen_platform.c              |   2 +-
 hw/i386/xen/xen_pvdevice.c              |   2 +-
 hw/ide/ahci.c                           |   2 +-
 hw/ide/cmd646.c                         |   2 +-
 hw/ide/core.c                           |   2 +-
 hw/ide/ich.c                            |   2 +-
 hw/ide/isa.c                            |   2 +-
 hw/ide/macio.c                          |   2 +-
 hw/ide/microdrive.c                     |   2 +-
 hw/ide/mmio.c                           |   2 +-
 hw/ide/piix.c                           |   2 +-
 hw/ide/qdev.c                           |   8 +-
 hw/ide/via.c                            |   2 +-
 hw/input/adb.c                          |   6 +-
 hw/input/pckbd.c                        |   2 +-
 hw/input/virtio-input-hid.c             |   5 +-
 hw/input/virtio-input-host.c            |   5 +-
 hw/input/virtio-input.c                 |   8 +-
 hw/input/vmmouse.c                      |   2 +-
 hw/intc/apic.c                          |   4 +-
 hw/intc/apic_common.c                   |   8 +-
 hw/intc/arm_gic.c                       |   2 +-
 hw/intc/arm_gic_common.c                |   2 +-
 hw/intc/arm_gic_kvm.c                   |   2 +-
 hw/intc/arm_gicv2m.c                    |   2 +-
 hw/intc/arm_gicv3.c                     |   2 +-
 hw/intc/arm_gicv3_common.c              |   2 +-
 hw/intc/arm_gicv3_its_kvm.c             |   2 +-
 hw/intc/arm_gicv3_kvm.c                 |   2 +-
 hw/intc/armv7m_nvic.c                   |   2 +-
 hw/intc/aspeed_vic.c                    |   2 +-
 hw/intc/exynos4210_gic.c                |   3 +-
 hw/intc/grlib_irqmp.c                   |   2 +-
 hw/intc/i8259.c                         |   2 +-
 hw/intc/i8259_common.c                  |   2 +-
 hw/intc/ioapic.c                        |   2 +-
 hw/intc/ioapic_common.c                 |   2 +-
 hw/intc/mips_gic.c                      |   2 +-
 hw/intc/nios2_iic.c                     |   2 +-
 hw/intc/omap_intc.c                     |   4 +-
 hw/intc/openpic.c                       |   2 +-
 hw/intc/openpic_kvm.c                   |   2 +-
 hw/intc/realview_gic.c                  |   2 +-
 hw/intc/s390_flic.c                     |   2 +-
 hw/intc/s390_flic_kvm.c                 |   2 +-
 hw/intc/xics.c                          |   8 +-
 hw/intc/xics_kvm.c                      |   8 +-
 hw/intc/xics_pnv.c                      |   2 +-
 hw/intc/xics_spapr.c                    |   5 +-
 hw/ipack/ipack.c                        |   4 +-
 hw/ipack/tpci200.c                      |   2 +-
 hw/ipmi/ipmi.c                          |   2 +-
 hw/ipmi/ipmi_bmc_extern.c               |   2 +-
 hw/ipmi/ipmi_bmc_sim.c                  |   2 +-
 hw/ipmi/isa_ipmi_bt.c                   |   4 +-
 hw/ipmi/isa_ipmi_kcs.c                  |   4 +-
 hw/isa/i82378.c                         |   2 +-
 hw/isa/isa-bus.c                        |   2 +-
 hw/isa/lpc_ich9.c                       |   4 +-
 hw/isa/pc87312.c                        |   2 +-
 hw/isa/piix4.c                          |   2 +-
 hw/isa/vt82c686.c                       |   8 +-
 hw/mem/nvdimm.c                         |   6 +-
 hw/mem/pc-dimm.c                        |  18 +++--
 hw/mips/cps.c                           |   2 +-
 hw/mips/gt64xxx_pci.c                   |   2 +-
 hw/misc/applesmc.c                      |   2 +-
 hw/misc/arm11scu.c                      |   2 +-
 hw/misc/arm_sysctl.c                    |   2 +-
 hw/misc/aspeed_scu.c                    |   2 +-
 hw/misc/aspeed_sdmc.c                   |   2 +-
 hw/misc/bcm2835_mbox.c                  |   2 +-
 hw/misc/bcm2835_property.c              |   2 +-
 hw/misc/debugexit.c                     |   2 +-
 hw/misc/eccmemctl.c                     |   2 +-
 hw/misc/edu.c                           |   4 +-
 hw/misc/hyperv_testdev.c                |   2 +-
 hw/misc/imx6_src.c                      |   2 +-
 hw/misc/ivshmem.c                       |  31 +++----
 hw/misc/macio/cuda.c                    |   2 +-
 hw/misc/macio/macio.c                   |   8 +-
 hw/misc/max111x.c                       |   4 +-
 hw/misc/mips_cmgcr.c                    |   2 +-
 hw/misc/mips_cpc.c                      |   2 +-
 hw/misc/mips_itu.c                      |   2 +-
 hw/misc/pc-testdev.c                    |   2 +-
 hw/misc/pci-testdev.c                   |   2 +-
 hw/misc/pvpanic.c                       |   2 +-
 hw/misc/sga.c                           |   2 +-
 hw/misc/tmp105.c                        |   4 +-
 hw/misc/unimp.c                         |   2 +-
 hw/misc/vmport.c                        |   2 +-
 hw/net/allwinner_emac.c                 |   2 +-
 hw/net/cadence_gem.c                    |   2 +-
 hw/net/dp8393x.c                        |   2 +-
 hw/net/e1000.c                          |   2 +-
 hw/net/e1000e.c                         |   2 +-
 hw/net/eepro100.c                       |   2 +-
 hw/net/fsl_etsec/etsec.c                |   2 +-
 hw/net/ftgmac100.c                      |   2 +-
 hw/net/imx_fec.c                        |   2 +-
 hw/net/mcf_fec.c                        |   2 +-
 hw/net/ne2000-isa.c                     |   6 +-
 hw/net/ne2000.c                         |   2 +-
 hw/net/pcnet-pci.c                      |   2 +-
 hw/net/rocker/qmp-norocker.c            |   9 ++-
 hw/net/rocker/rocker.c                  |   5 +-
 hw/net/rocker/rocker_of_dpa.c           |   2 +-
 hw/net/rtl8139.c                        |   2 +-
 hw/net/spapr_llan.c                     |   2 +-
 hw/net/virtio-net.c                     |   7 +-
 hw/net/vmxnet3.c                        |   4 +-
 hw/net/xilinx_axienet.c                 |   2 +-
 hw/net/xilinx_ethlite.c                 |   2 +-
 hw/nvram/fw_cfg.c                       |   6 +-
 hw/nvram/mac_nvram.c                    |   4 +-
 hw/nvram/spapr_nvram.c                  |   2 +-
 hw/pci-bridge/dec.c                     |   4 +-
 hw/pci-bridge/gen_pcie_root_port.c      |   2 +-
 hw/pci-bridge/ioh3420.c                 |   2 +-
 hw/pci-bridge/pci_bridge_dev.c          |   4 +-
 hw/pci-bridge/pci_expander_bridge.c     |  10 ++-
 hw/pci-bridge/pcie_root_port.c          |   2 +-
 hw/pci-host/apb.c                       |   4 +-
 hw/pci-host/bonito.c                    |   2 +-
 hw/pci-host/gpex.c                      |   2 +-
 hw/pci-host/grackle.c                   |   2 +-
 hw/pci-host/piix.c                      |  15 ++--
 hw/pci-host/ppce500.c                   |   2 +-
 hw/pci-host/prep.c                      |   4 +-
 hw/pci-host/q35.c                       |  14 ++--
 hw/pci-host/uninorth.c                  |   9 ++-
 hw/pci-host/versatile.c                 |   4 +-
 hw/pci-host/xilinx-pcie.c               |   2 +-
 hw/pci/msi.c                            |   2 +-
 hw/pci/msix.c                           |   4 +-
 hw/pci/pci-stub.c                       |   2 +-
 hw/pci/pci.c                            |  24 +++---
 hw/pci/pcie.c                           |   8 +-
 hw/pci/pcie_aer.c                       |   2 +-
 hw/pci/shpc.c                           |   8 +-
 hw/ppc/e500.c                           |   3 +-
 hw/ppc/mac_newworld.c                   |   2 +-
 hw/ppc/mac_oldworld.c                   |   2 +-
 hw/ppc/pnv.c                            |  10 +--
 hw/ppc/pnv_core.c                       |   7 +-
 hw/ppc/pnv_lpc.c                        |   2 +-
 hw/ppc/pnv_occ.c                        |   2 +-
 hw/ppc/pnv_psi.c                        |   2 +-
 hw/ppc/pnv_xscom.c                      |   2 +-
 hw/ppc/prep.c                           |   2 +-
 hw/ppc/prep_systemio.c                  |   2 +-
 hw/ppc/rs6000_mc.c                      |   2 +-
 hw/ppc/spapr.c                          |  61 ++++++++------
 hw/ppc/spapr_cpu_core.c                 |   9 ++-
 hw/ppc/spapr_drc.c                      |  15 ++--
 hw/ppc/spapr_hcall.c                    |   2 +-
 hw/ppc/spapr_iommu.c                    |   2 +-
 hw/ppc/spapr_pci.c                      |  12 +--
 hw/ppc/spapr_rng.c                      |   2 +-
 hw/ppc/spapr_rtc.c                      |   5 +-
 hw/ppc/spapr_vio.c                      |   2 +-
 hw/s390x/3270-ccw.c                     |   2 +-
 hw/s390x/ccw-device.c                   |   2 +-
 hw/s390x/css-bridge.c                   |   2 +-
 hw/s390x/css.c                          |  10 +--
 hw/s390x/event-facility.c               |   6 +-
 hw/s390x/ipl.c                          |   4 +-
 hw/s390x/s390-ccw.c                     |   7 +-
 hw/s390x/s390-pci-bus.c                 |  12 +--
 hw/s390x/s390-skeys.c                   |   9 ++-
 hw/s390x/s390-virtio-ccw.c              |  25 +++---
 hw/s390x/s390-virtio.c                  |   2 +-
 hw/s390x/sclp.c                         |   2 +-
 hw/s390x/virtio-ccw.c                   |  41 ++++++----
 hw/scsi/esp-pci.c                       |   4 +-
 hw/scsi/esp.c                           |   2 +-
 hw/scsi/lsi53c895a.c                    |   4 +-
 hw/scsi/megasas.c                       |   2 +-
 hw/scsi/mptsas.c                        |   2 +-
 hw/scsi/scsi-bus.c                      |   9 ++-
 hw/scsi/scsi-disk.c                     |  13 +--
 hw/scsi/scsi-generic.c                  |   2 +-
 hw/scsi/spapr_vscsi.c                   |   2 +-
 hw/scsi/vhost-scsi-common.c             |   2 +-
 hw/scsi/vhost-scsi.c                    |   4 +-
 hw/scsi/virtio-scsi-dataplane.c         |   2 +-
 hw/scsi/virtio-scsi.c                   |  16 ++--
 hw/scsi/vmw_pvscsi.c                    |   8 +-
 hw/sd/pl181.c                           |   2 +-
 hw/sd/sd.c                              |   4 +-
 hw/sd/sdhci.c                           |   4 +-
 hw/sd/ssi-sd.c                          |   2 +-
 hw/sh4/sh_pci.c                         |   2 +-
 hw/smbios/smbios-stub.c                 |   2 +-
 hw/smbios/smbios.c                      |   2 +-
 hw/sparc/sun4m.c                        |   4 +-
 hw/sparc64/sun4u.c                      |   6 +-
 hw/ssi/aspeed_smc.c                     |   2 +-
 hw/ssi/imx_spi.c                        |   2 +-
 hw/ssi/ssi.c                            |   2 +-
 hw/ssi/xilinx_spips.c                   |   4 +-
 hw/timer/a9gtimer.c                     |   2 +-
 hw/timer/altera_timer.c                 |   2 +-
 hw/timer/arm_mptimer.c                  |   2 +-
 hw/timer/arm_timer.c                    |   2 +-
 hw/timer/aspeed_timer.c                 |   2 +-
 hw/timer/hpet.c                         |   2 +-
 hw/timer/i8254.c                        |   2 +-
 hw/timer/i8254_common.c                 |   2 +-
 hw/timer/imx_epit.c                     |   2 +-
 hw/timer/imx_gpt.c                      |   2 +-
 hw/timer/lm32_timer.c                   |   2 +-
 hw/timer/m48t59-isa.c                   |   2 +-
 hw/timer/m48t59.c                       |   4 +-
 hw/timer/mc146818rtc.c                  |   7 +-
 hw/timer/milkymist-sysctl.c             |   2 +-
 hw/timer/pxa2xx_timer.c                 |   2 +-
 hw/timer/xilinx_timer.c                 |   2 +-
 hw/tpm/tpm_tis.c                        |   2 +-
 hw/usb/bus.c                            |  24 +++---
 hw/usb/dev-audio.c                      |   4 +-
 hw/usb/dev-bluetooth.c                  |   4 +-
 hw/usb/dev-hid.c                        |  10 +--
 hw/usb/dev-hub.c                        |   4 +-
 hw/usb/dev-mtp.c                        |   2 +-
 hw/usb/dev-network.c                    |   4 +-
 hw/usb/dev-serial.c                     |   2 +-
 hw/usb/dev-smartcard-reader.c           |   4 +-
 hw/usb/dev-storage.c                    |  12 +--
 hw/usb/dev-uas.c                        |   4 +-
 hw/usb/dev-wacom.c                      |   4 +-
 hw/usb/hcd-ehci-pci.c                   |   2 +-
 hw/usb/hcd-ehci-sysbus.c                |   2 +-
 hw/usb/hcd-ehci.c                       |   6 +-
 hw/usb/hcd-ohci.c                       |   6 +-
 hw/usb/hcd-uhci.c                       |   4 +-
 hw/usb/hcd-xhci.c                       |   2 +-
 hw/usb/host-libusb.c                    |   4 +-
 hw/usb/redirect.c                       |   4 +-
 hw/vfio/amd-xgbe.c                      |   2 +-
 hw/vfio/calxeda-xgmac.c                 |   2 +-
 hw/vfio/ccw.c                           |  12 +--
 hw/vfio/common.c                        |   7 +-
 hw/vfio/pci-quirks.c                    |   6 +-
 hw/vfio/pci.c                           |  22 ++---
 hw/vfio/platform.c                      |   9 ++-
 hw/virtio/vhost-vsock.c                 |   8 +-
 hw/virtio/virtio-balloon.c              |  14 ++--
 hw/virtio/virtio-bus.c                  |   2 +-
 hw/virtio/virtio-crypto-pci.c           |   3 +-
 hw/virtio/virtio-crypto.c               |  10 ++-
 hw/virtio/virtio-mmio.c                 |   2 +-
 hw/virtio/virtio-pci.c                  |  38 +++++----
 hw/virtio/virtio-rng.c                  |   8 +-
 hw/virtio/virtio.c                      |   4 +-
 hw/watchdog/wdt_aspeed.c                |   2 +-
 hw/watchdog/wdt_diag288.c               |   4 +-
 hw/watchdog/wdt_i6300esb.c              |   2 +-
 hw/watchdog/wdt_ib700.c                 |   2 +-
 hw/xen/xen-host-pci-device.c            |  12 +--
 hw/xen/xen_pt.c                         |   2 +-
 hw/xen/xen_pt_config_init.c             |   4 +-
 hw/xen/xen_pt_graphics.c                |   2 +-
 io/channel-buffer.c                     |  10 +--
 io/channel-command.c                    |  14 ++--
 io/channel-file.c                       |  12 +--
 io/channel-socket.c                     |  30 +++----
 io/channel-tls.c                        |  14 ++--
 io/channel-util.c                       |   2 +-
 io/channel-websock.c                    |  26 +++---
 io/channel.c                            |  20 ++---
 io/dns-resolver.c                       |   6 +-
 io/task.c                               |   2 +-
 iothread.c                              |   8 +-
 memory.c                                |  21 ++---
 memory_mapping.c                        |   2 +-
 migration/colo-failover.c               |   4 +-
 migration/colo.c                        |  18 ++---
 migration/exec.c                        |   5 +-
 migration/fd.c                          |   5 +-
 migration/migration.c                   |  37 ++++-----
 migration/rdma.c                        |  27 ++++---
 migration/savevm.c                      |  14 ++--
 migration/socket.c                      |  16 ++--
 migration/tls.c                         |   6 +-
 monitor.c                               |  43 +++++-----
 nbd/client.c                            |  25 +++---
 nbd/common.c                            |   2 +-
 nbd/server.c                            |   2 +-
 net/colo-compare.c                      |  19 +++--
 net/dump.c                              |  15 ++--
 net/filter-buffer.c                     |   9 ++-
 net/filter-mirror.c                     |  16 ++--
 net/filter-rewriter.c                   |   2 +-
 net/filter.c                            |  18 +++--
 net/hub.c                               |   2 +-
 net/l2tpv3.c                            |   2 +-
 net/net.c                               |  21 ++---
 net/netmap.c                            |   5 +-
 net/slirp.c                             |   2 +-
 net/socket.c                            |   2 +-
 net/tap-bsd.c                           |  10 ++-
 net/tap-linux.c                         |   5 +-
 net/tap-solaris.c                       |   7 +-
 net/tap-stub.c                          |   5 +-
 net/tap-win32.c                         |   2 +-
 net/tap.c                               |  15 ++--
 net/vde.c                               |   2 +-
 net/vhost-user.c                        |   7 +-
 numa.c                                  |  13 +--
 qapi/opts-visitor.c                     |  26 +++---
 qapi/qapi-clone-visitor.c               |  20 ++---
 qapi/qapi-dealloc-visitor.c             |  22 ++---
 qapi/qapi-util.c                        |   2 +-
 qapi/qmp-dispatch.c                     |   5 +-
 qapi/qobject-input-visitor.c            |  48 ++++++-----
 qapi/qobject-output-visitor.c           |  20 ++---
 qapi/string-input-visitor.c             |  19 ++---
 qapi/string-output-visitor.c            |  14 ++--
 qdev-monitor.c                          |  23 +++---
 qemu-img.c                              |   4 +-
 qemu-nbd.c                              |   3 +-
 qga/commands-posix.c                    | 138 +++++++++++++++++---------------
 qga/commands-win32.c                    |  83 ++++++++++---------
 qga/commands.c                          |  16 ++--
 qga/main.c                              |   2 +-
 qga/vss-win32.c                         |   2 +-
 qmp.c                                   |  76 +++++++++---------
 qobject/json-parser.c                   |   3 +-
 qobject/qdict.c                         |   4 +-
 qobject/qjson.c                         |   5 +-
 qom/cpu.c                               |  10 +--
 qom/object.c                            | 135 ++++++++++++++++---------------
 qom/object_interfaces.c                 |  13 +--
 qom/qom-qobject.c                       |   4 +-
 qtest.c                                 |   3 +-
 replication.c                           |   8 +-
 stubs/arch-query-cpu-def.c              |   2 +-
 stubs/arch-query-cpu-model-baseline.c   |   2 +-
 stubs/arch-query-cpu-model-comparison.c |   2 +-
 stubs/arch-query-cpu-model-expansion.c  |   2 +-
 stubs/migr-blocker.c                    |   2 +-
 stubs/monitor.c                         |   2 +-
 stubs/uuid.c                            |   2 +-
 stubs/vmgenid.c                         |   2 +-
 stubs/vmstate.c                         |   2 +-
 stubs/xen-hvm.c                         |   4 +-
 target/alpha/cpu.c                      |   2 +-
 target/arm/cpu.c                        |   2 +-
 target/arm/cpu64.c                      |   5 +-
 target/arm/helper.c                     |   2 +-
 target/arm/monitor.c                    |   2 +-
 target/cris/cpu.c                       |   2 +-
 target/hppa/cpu.c                       |   2 +-
 target/i386/arch_memory_mapping.c       |   2 +-
 target/i386/cpu.c                       |  66 ++++++++-------
 target/lm32/cpu.c                       |   2 +-
 target/m68k/cpu.c                       |   2 +-
 target/microblaze/cpu.c                 |   2 +-
 target/mips/cpu.c                       |   2 +-
 target/moxie/cpu.c                      |   2 +-
 target/nios2/cpu.c                      |   2 +-
 target/openrisc/cpu.c                   |   2 +-
 target/ppc/compat.c                     |   5 +-
 target/ppc/translate_init.c             |  12 +--
 target/s390x/cpu.c                      |   6 +-
 target/s390x/cpu_models.c               |  32 ++++----
 target/s390x/helper.c                   |   5 +-
 target/s390x/kvm.c                      |   5 +-
 target/sh4/cpu.c                        |   2 +-
 target/sparc/cpu.c                      |   6 +-
 target/tilegx/cpu.c                     |   2 +-
 target/tricore/cpu.c                    |   2 +-
 target/unicore32/cpu.c                  |   2 +-
 target/xtensa/cpu.c                     |   2 +-
 tests/check-qom-proplist.c              |  12 +--
 tests/test-crypto-block.c               |   6 +-
 tests/test-crypto-tlscredsx509.c        |   2 +-
 tests/test-crypto-tlssession.c          |   2 +-
 tests/test-io-channel-tls.c             |   2 +-
 tests/test-logging.c                    |   3 +-
 tests/test-qapi-util.c                  |  10 +--
 tests/test-qdev-global-props.c          |   4 +-
 tests/test-qemu-opts.c                  |   2 +-
 tests/test-qmp-commands.c               |  17 ++--
 tests/test-qmp-event.c                  |   3 +-
 tests/test-visitor-serialization.c      |  25 +++---
 tpm.c                                   |   8 +-
 trace/qmp.c                             |   8 +-
 ui/console.c                            |  12 +--
 ui/gtk.c                                |   2 +-
 ui/input-legacy.c                       |   2 +-
 ui/input-linux.c                        |  14 ++--
 ui/input.c                              |   6 +-
 ui/spice-core.c                         |   4 +-
 ui/vnc-auth-sasl.c                      |   2 +-
 ui/vnc.c                                |  30 +++----
 util/aio-posix.c                        |   3 +-
 util/aio-win32.c                        |   3 +-
 util/async.c                            |   2 +-
 util/base64.c                           |   2 +-
 util/error.c                            |   2 +-
 util/keyval.c                           |   9 ++-
 util/log.c                              |   4 +-
 util/main-loop.c                        |   2 +-
 util/qemu-config.c                      |  15 ++--
 util/qemu-option.c                      |  42 +++++-----
 util/qemu-sockets.c                     |  76 ++++++++++--------
 util/throttle.c                         |   2 +-
 vl.c                                    |  44 +++++-----
 815 files changed, 3406 insertions(+), 2952 deletions(-)

diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
index 4721c39ae3..55ad2cb5b9 100644
--- a/include/qapi/visitor.h
+++ b/include/qapi/visitor.h
@@ -296,7 +296,7 @@ void visit_free(Visitor *v);
  * used for QAPI unions, and maps to JSON objects?
  */
 void visit_start_struct(Visitor *v, const char *name, void **obj,
-                        size_t size, Error **errp);
+                        size_t size, Error *errp[static 1]);
 
 /*
  * Prepare for completing an object visit.
@@ -309,7 +309,7 @@ void visit_start_struct(Visitor *v, const char *name, void **obj,
  * last chance to report errors.  May be skipped on a cleanup path,
  * where there is no need to check for further errors.
  */
-void visit_check_struct(Visitor *v, Error **errp);
+void visit_check_struct(Visitor *v, Error *errp[static 1]);
 
 /*
  * Complete an object visit started earlier.
@@ -353,7 +353,7 @@ void visit_end_struct(Visitor *v, void **obj);
  * examples above.
  */
 void visit_start_list(Visitor *v, const char *name, GenericList **list,
-                      size_t size, Error **errp);
+                      size_t size, Error *errp[static 1]);
 
 /*
  * Iterate over a GenericList during a non-virtual list visit.
@@ -382,7 +382,7 @@ GenericList *visit_next_list(Visitor *v, GenericList *tail, size_t size);
  * last chance to report errors.  May be skipped on a cleanup path,
  * where there is no need to check for further errors.
  */
-void visit_check_list(Visitor *v, Error **errp);
+void visit_check_list(Visitor *v, Error *errp[static 1]);
 
 /*
  * Complete a list visit started earlier.
@@ -418,7 +418,7 @@ void visit_end_list(Visitor *v, void **list);
  */
 void visit_start_alternate(Visitor *v, const char *name,
                            GenericAlternate **obj, size_t size,
-                           bool promote_int, Error **errp);
+                           bool promote_int, Error *errp[static 1]);
 
 /*
  * Finish visiting an alternate type.
@@ -471,7 +471,7 @@ bool visit_optional(Visitor *v, const char *name, bool *present);
  * that visit_type_str() must have no unwelcome side effects.
  */
 void visit_type_enum(Visitor *v, const char *name, int *obj,
-                     const char *const strings[], Error **errp);
+                     const char *const strings[], Error *errp[static 1]);
 
 /*
  * Check if visitor is an input visitor.
@@ -489,28 +489,29 @@ bool visit_is_input(Visitor *v);
  * @obj must be non-NULL.  Input visitors set *@obj to the value;
  * other visitors will leave *@obj unchanged.
  */
-void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp);
+void visit_type_int(Visitor *v, const char *name, int64_t *obj,
+		    Error *errp[static 1]);
 
 /*
  * Visit a uint8_t value.
  * Like visit_type_int(), except clamps the value to uint8_t range.
  */
 void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj,
-                      Error **errp);
+                      Error *errp[static 1]);
 
 /*
  * Visit a uint16_t value.
  * Like visit_type_int(), except clamps the value to uint16_t range.
  */
 void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 /*
  * Visit a uint32_t value.
  * Like visit_type_int(), except clamps the value to uint32_t range.
  */
 void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 /*
  * Visit a uint64_t value.
@@ -518,34 +519,35 @@ void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
  * that is, ensures it is unsigned.
  */
 void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 /*
  * Visit an int8_t value.
  * Like visit_type_int(), except clamps the value to int8_t range.
  */
-void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp);
+void visit_type_int8(Visitor *v, const char *name, int8_t *obj,
+		     Error *errp[static 1]);
 
 /*
  * Visit an int16_t value.
  * Like visit_type_int(), except clamps the value to int16_t range.
  */
 void visit_type_int16(Visitor *v, const char *name, int16_t *obj,
-                      Error **errp);
+                      Error *errp[static 1]);
 
 /*
  * Visit an int32_t value.
  * Like visit_type_int(), except clamps the value to int32_t range.
  */
 void visit_type_int32(Visitor *v, const char *name, int32_t *obj,
-                      Error **errp);
+                      Error *errp[static 1]);
 
 /*
  * Visit an int64_t value.
  * Identical to visit_type_int().
  */
 void visit_type_int64(Visitor *v, const char *name, int64_t *obj,
-                      Error **errp);
+                      Error *errp[static 1]);
 
 /*
  * Visit a uint64_t value.
@@ -554,7 +556,7 @@ void visit_type_int64(Visitor *v, const char *name, int64_t *obj,
  * values.
  */
 void visit_type_size(Visitor *v, const char *name, uint64_t *obj,
-                     Error **errp);
+                     Error *errp[static 1]);
 
 /*
  * Visit a boolean value.
@@ -565,7 +567,8 @@ void visit_type_size(Visitor *v, const char *name, uint64_t *obj,
  * @obj must be non-NULL.  Input visitors set *@obj to the value;
  * other visitors will leave *@obj unchanged.
  */
-void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp);
+void visit_type_bool(Visitor *v, const char *name, bool *obj,
+		     Error *errp[static 1]);
 
 /*
  * Visit a string value.
@@ -583,7 +586,8 @@ void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp);
  *
  * FIXME: Callers that try to output NULL *obj should not be allowed.
  */
-void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp);
+void visit_type_str(Visitor *v, const char *name, char **obj,
+		    Error *errp[static 1]);
 
 /*
  * Visit a number (i.e. double) value.
@@ -596,7 +600,7 @@ void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp);
  * document if infinity or NaN are not permitted.
  */
 void visit_type_number(Visitor *v, const char *name, double *obj,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 /*
  * Visit an arbitrary value.
@@ -612,7 +616,8 @@ void visit_type_number(Visitor *v, const char *name, double *obj,
  * E.g. the visitor returned by qobject_input_visitor_new_keyval()
  * can't create numbers or booleans, only strings.
  */
-void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp);
+void visit_type_any(Visitor *v, const char *name, QObject **obj,
+		    Error *errp[static 1]);
 
 /*
  * Visit a JSON null value.
@@ -624,6 +629,6 @@ void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp);
  * needed; rather, this is a witness that an explicit null value is
  * expected rather than any other type.
  */
-void visit_type_null(Visitor *v, const char *name, Error **errp);
+void visit_type_null(Visitor *v, const char *name, Error *errp[static 1]);
 
 #endif
diff --git a/block/nbd-client.h b/block/nbd-client.h
index 891ba44a20..4d663017b3 100644
--- a/block/nbd-client.h
+++ b/block/nbd-client.h
@@ -39,7 +39,7 @@ int nbd_client_init(BlockDriverState *bs,
                     const char *export_name,
                     QCryptoTLSCreds *tlscreds,
                     const char *hostname,
-                    Error **errp);
+                    Error *errp[static 1]);
 void nbd_client_close(BlockDriverState *bs);
 
 int nbd_client_co_pdiscard(BlockDriverState *bs, int64_t offset, int count);
diff --git a/block/qcow2.h b/block/qcow2.h
index 1801dc30dc..64a16db406 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -530,7 +530,7 @@ int qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t offset,
 
 int qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order,
                                 BlockDriverAmendStatusCB *status_cb,
-                                void *cb_opaque, Error **errp);
+                                void *cb_opaque, Error *errp[static 1]);
 
 /* qcow2-cluster.c functions */
 int qcow2_grow_l1_table(BlockDriverState *bs, uint64_t min_size,
@@ -539,7 +539,7 @@ int qcow2_write_l1_entry(BlockDriverState *bs, int l1_index);
 int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset);
 int qcow2_encrypt_sectors(BDRVQcow2State *s, int64_t sector_num,
                           uint8_t *out_buf, const uint8_t *in_buf,
-                          int nb_sectors, bool enc, Error **errp);
+                          int nb_sectors, bool enc, Error *errp[static 1]);
 
 int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
                              unsigned int *bytes, uint64_t *cluster_offset);
@@ -567,12 +567,12 @@ int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id);
 int qcow2_snapshot_delete(BlockDriverState *bs,
                           const char *snapshot_id,
                           const char *name,
-                          Error **errp);
+                          Error *errp[static 1]);
 int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab);
 int qcow2_snapshot_load_tmp(BlockDriverState *bs,
                             const char *snapshot_id,
                             const char *name,
-                            Error **errp);
+                            Error *errp[static 1]);
 
 void qcow2_free_snapshots(BlockDriverState *bs);
 int qcow2_read_snapshots(BlockDriverState *bs);
diff --git a/block/vhdx.h b/block/vhdx.h
index 7003ab7a79..ad7e772043 100644
--- a/block/vhdx.h
+++ b/block/vhdx.h
@@ -413,7 +413,7 @@ uint32_t vhdx_checksum_calc(uint32_t crc, uint8_t *buf, size_t size,
 bool vhdx_checksum_is_valid(uint8_t *buf, size_t size, int crc_offset);
 
 int vhdx_parse_log(BlockDriverState *bs, BDRVVHDXState *s, bool *flushed,
-                   Error **errp);
+                   Error *errp[static 1]);
 
 int vhdx_log_write_and_flush(BlockDriverState *bs, BDRVVHDXState *s,
                              void *data, uint32_t length, uint64_t offset);
diff --git a/crypto/blockpriv.h b/crypto/blockpriv.h
index 68f0f06704..54d2af2f20 100644
--- a/crypto/blockpriv.h
+++ b/crypto/blockpriv.h
@@ -82,7 +82,7 @@ int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
                                  uint64_t startsector,
                                  uint8_t *buf,
                                  size_t len,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 
 int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
                                  size_t niv,
@@ -91,6 +91,6 @@ int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
                                  uint64_t startsector,
                                  uint8_t *buf,
                                  size_t len,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 
 #endif /* QCRYPTO_BLOCKPRIV_H */
diff --git a/crypto/hmac.h b/crypto/hmac.h
index 0d3acd728a..e2cccfd9be 100644
--- a/crypto/hmac.h
+++ b/crypto/hmac.h
@@ -53,7 +53,7 @@ bool qcrypto_hmac_supports(QCryptoHashAlgorithm alg);
  */
 QCryptoHmac *qcrypto_hmac_new(QCryptoHashAlgorithm alg,
                               const uint8_t *key, size_t nkey,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 /**
  * qcrypto_hmac_free:
@@ -88,7 +88,7 @@ int qcrypto_hmac_bytesv(QCryptoHmac *hmac,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp);
+                        Error *errp[static 1]);
 
 /**
  * qcrypto_hmac_bytes:
@@ -114,7 +114,7 @@ int qcrypto_hmac_bytes(QCryptoHmac *hmac,
                        size_t len,
                        uint8_t **result,
                        size_t *resultlen,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 /**
  * qcrypto_hmac_digestv:
@@ -138,7 +138,7 @@ int qcrypto_hmac_digestv(QCryptoHmac *hmac,
                          const struct iovec *iov,
                          size_t niov,
                          char **digest,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 /**
  * qcrypto_hmac_digest:
@@ -161,6 +161,6 @@ int qcrypto_hmac_digest(QCryptoHmac *hmac,
                         const char *buf,
                         size_t len,
                         char **digest,
-                        Error **errp);
+                        Error *errp[static 1]);
 
 #endif
diff --git a/crypto/tlscredspriv.h b/crypto/tlscredspriv.h
index 13e9b6c0b2..cb11ff8dcb 100644
--- a/crypto/tlscredspriv.h
+++ b/crypto/tlscredspriv.h
@@ -29,12 +29,12 @@ int qcrypto_tls_creds_get_path(QCryptoTLSCreds *creds,
                                const char *filename,
                                bool required,
                                char **cred,
-                               Error **errp);
+                               Error *errp[static 1]);
 
 int qcrypto_tls_creds_get_dh_params_file(QCryptoTLSCreds *creds,
                                          const char *filename,
                                          gnutls_dh_params_t *dh_params,
-                                         Error **errp);
+                                         Error *errp[static 1]);
 
 #endif
 
diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h
index c886ba78d2..9e2708e047 100644
--- a/hw/9pfs/9p.h
+++ b/hw/9pfs/9p.h
@@ -340,8 +340,8 @@ void v9fs_path_sprintf(V9fsPath *path, const char *fmt, ...);
 void v9fs_path_copy(V9fsPath *lhs, V9fsPath *rhs);
 int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath,
                       const char *name, V9fsPath *path);
-int v9fs_device_realize_common(V9fsState *s, Error **errp);
-void v9fs_device_unrealize_common(V9fsState *s, Error **errp);
+int v9fs_device_realize_common(V9fsState *s, Error *errp[static 1]);
+void v9fs_device_unrealize_common(V9fsState *s, Error *errp[static 1]);
 
 ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...);
 ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...);
diff --git a/hw/block/dataplane/virtio-blk.h b/hw/block/dataplane/virtio-blk.h
index db3f47b173..b740749d7a 100644
--- a/hw/block/dataplane/virtio-blk.h
+++ b/hw/block/dataplane/virtio-blk.h
@@ -21,7 +21,7 @@ typedef struct VirtIOBlockDataPlane VirtIOBlockDataPlane;
 
 void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf,
                                   VirtIOBlockDataPlane **dataplane,
-                                  Error **errp);
+                                  Error *errp[static 1]);
 void virtio_blk_data_plane_destroy(VirtIOBlockDataPlane *s);
 void virtio_blk_data_plane_notify(VirtIOBlockDataPlane *s, VirtQueue *vq);
 
diff --git a/hw/s390x/s390-virtio.h b/hw/s390x/s390-virtio.h
index f2377a3e0e..9bbf9affb9 100644
--- a/hw/s390x/s390-virtio.h
+++ b/hw/s390x/s390-virtio.h
@@ -27,7 +27,7 @@ void s390_init_ipl_dev(const char *kernel_filename,
                        const char *netboot_fw,
                        bool enforce_bios);
 void s390_create_virtio_net(BusState *bus, const char *name);
-void s390_nmi(NMIState *n, int cpu_index, Error **errp);
+void s390_nmi(NMIState *n, int cpu_index, Error *errp[static 1]);
 void s390_machine_reset(void);
 void s390_memory_init(ram_addr_t mem_size);
 #endif
diff --git a/hw/timer/m48t59-internal.h b/hw/timer/m48t59-internal.h
index 32ae957805..640bf1f5d5 100644
--- a/hw/timer/m48t59-internal.h
+++ b/hw/timer/m48t59-internal.h
@@ -70,7 +70,7 @@ typedef struct M48t59State {
 uint32_t m48t59_read(M48t59State *NVRAM, uint32_t addr);
 void m48t59_write(M48t59State *NVRAM, uint32_t addr, uint32_t val);
 void m48t59_reset_common(M48t59State *NVRAM);
-void m48t59_realize_common(M48t59State *s, Error **errp);
+void m48t59_realize_common(M48t59State *s, Error *errp[static 1]);
 
 static inline void m48t59_toggle_lock(M48t59State *NVRAM, int lock)
 {
diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h
index 938d8aa284..ca7df4cc33 100644
--- a/hw/usb/hcd-ehci.h
+++ b/hw/usb/hcd-ehci.h
@@ -324,8 +324,8 @@ extern const VMStateDescription vmstate_ehci;
 
 void usb_ehci_init(EHCIState *s, DeviceState *dev);
 void usb_ehci_finalize(EHCIState *s);
-void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp);
-void usb_ehci_unrealize(EHCIState *s, DeviceState *dev, Error **errp);
+void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error *errp[static 1]);
+void usb_ehci_unrealize(EHCIState *s, DeviceState *dev, Error *errp[static 1]);
 void ehci_reset(void *opaque);
 
 #define TYPE_PCI_EHCI "pci-ehci-usb"
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
index a8366bb2a7..91d17117ac 100644
--- a/hw/vfio/pci.h
+++ b/hw/vfio/pci.h
@@ -161,10 +161,10 @@ void vfio_bar_quirk_exit(VFIOPCIDevice *vdev, int nr);
 void vfio_bar_quirk_finalize(VFIOPCIDevice *vdev, int nr);
 void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev);
 
-int vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp);
+int vfio_populate_vga(VFIOPCIDevice *vdev, Error *errp[static 1]);
 
 int vfio_pci_igd_opregion_init(VFIOPCIDevice *vdev,
                                struct vfio_region_info *info,
-                               Error **errp);
+                               Error *errp[static 1]);
 
 #endif /* HW_VFIO_VFIO_PCI_H */
diff --git a/hw/xen/xen-host-pci-device.h b/hw/xen/xen-host-pci-device.h
index 4d8d34ecb0..fb320914b7 100644
--- a/hw/xen/xen-host-pci-device.h
+++ b/hw/xen/xen-host-pci-device.h
@@ -38,7 +38,7 @@ typedef struct XenHostPCIDevice {
 
 void xen_host_pci_device_get(XenHostPCIDevice *d, uint16_t domain,
                              uint8_t bus, uint8_t dev, uint8_t func,
-                             Error **errp);
+                             Error *errp[static 1]);
 void xen_host_pci_device_put(XenHostPCIDevice *pci_dev);
 bool xen_host_pci_device_closed(XenHostPCIDevice *d);
 
diff --git a/hw/xen/xen_pt.h b/hw/xen/xen_pt.h
index 191d9caea1..d47db9f4b6 100644
--- a/hw/xen/xen_pt.h
+++ b/hw/xen/xen_pt.h
@@ -230,7 +230,7 @@ struct XenPCIPassthroughState {
     bool listener_set;
 };
 
-void xen_pt_config_init(XenPCIPassthroughState *s, Error **errp);
+void xen_pt_config_init(XenPCIPassthroughState *s, Error *errp[static 1]);
 void xen_pt_config_delete(XenPCIPassthroughState *s);
 XenPTRegGroup *xen_pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address);
 XenPTReg *xen_pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address);
@@ -331,5 +331,5 @@ static inline bool is_igd_vga_passthrough(XenHostPCIDevice *dev)
 int xen_pt_register_vga_regions(XenHostPCIDevice *dev);
 int xen_pt_unregister_vga_regions(XenHostPCIDevice *dev);
 void xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev,
-                     Error **errp);
+                     Error *errp[static 1]);
 #endif /* XEN_PT_H */
diff --git a/include/block/aio.h b/include/block/aio.h
index e9aeeaec94..6008d9e6d0 100644
--- a/include/block/aio.h
+++ b/include/block/aio.h
@@ -156,7 +156,7 @@ struct AioContext {
  * They also provide bottom halves, a service to execute a piece of code
  * as soon as possible.
  */
-AioContext *aio_context_new(Error **errp);
+AioContext *aio_context_new(Error *errp[static 1]);
 
 /**
  * aio_context_ref:
@@ -562,6 +562,6 @@ void aio_context_setup(AioContext *ctx);
  */
 void aio_context_set_poll_params(AioContext *ctx, int64_t max_ns,
                                  int64_t grow, int64_t shrink,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 
 #endif
diff --git a/include/block/block.h b/include/block/block.h
index 9b355e92d8..6973265e1d 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -236,16 +236,17 @@ void bdrv_init_with_whitelist(void);
 bool bdrv_uses_whitelist(void);
 BlockDriver *bdrv_find_protocol(const char *filename,
                                 bool allow_protocol_prefix,
-                                Error **errp);
+                                Error *errp[static 1]);
 BlockDriver *bdrv_find_format(const char *format_name);
 int bdrv_create(BlockDriver *drv, const char* filename,
-                QemuOpts *opts, Error **errp);
-int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp);
+                QemuOpts *opts, Error *errp[static 1]);
+int bdrv_create_file(const char *filename, QemuOpts *opts,
+		     Error *errp[static 1]);
 BlockDriverState *bdrv_new(void);
 void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
-                 Error **errp);
+                 Error *errp[static 1]);
 void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 int bdrv_parse_cache_mode(const char *mode, int *flags, bool *writethrough);
 int bdrv_parse_discard_flags(const char *mode, int *flags);
@@ -253,22 +254,23 @@ BdrvChild *bdrv_open_child(const char *filename,
                            QDict *options, const char *bdref_key,
                            BlockDriverState* parent,
                            const BdrvChildRole *child_role,
-                           bool allow_none, Error **errp);
+                           bool allow_none, Error *errp[static 1]);
 void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
-                         Error **errp);
+                         Error *errp[static 1]);
 int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
-                           const char *bdref_key, Error **errp);
+                           const char *bdref_key, Error *errp[static 1]);
 BlockDriverState *bdrv_open(const char *filename, const char *reference,
-                            QDict *options, int flags, Error **errp);
+                            QDict *options, int flags, Error *errp[static 1]);
 BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_name,
-                                       int flags, Error **errp);
+                                       int flags, Error *errp[static 1]);
 BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
                                     BlockDriverState *bs,
                                     QDict *options, int flags);
-int bdrv_reopen_multiple(AioContext *ctx, BlockReopenQueue *bs_queue, Error **errp);
-int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp);
+int bdrv_reopen_multiple(AioContext *ctx, BlockReopenQueue *bs_queue,
+			 Error *errp[static 1]);
+int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error *errp[static 1]);
 int bdrv_reopen_prepare(BDRVReopenState *reopen_state,
-                        BlockReopenQueue *queue, Error **errp);
+                        BlockReopenQueue *queue, Error *errp[static 1]);
 void bdrv_reopen_commit(BDRVReopenState *reopen_state);
 void bdrv_reopen_abort(BDRVReopenState *reopen_state);
 int bdrv_read(BdrvChild *child, int64_t sector_num,
@@ -300,12 +302,12 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
     const char *backing_file);
 int bdrv_get_backing_file_depth(BlockDriverState *bs);
 void bdrv_refresh_filename(BlockDriverState *bs);
-int bdrv_truncate(BdrvChild *child, int64_t offset, Error **errp);
+int bdrv_truncate(BdrvChild *child, int64_t offset, Error *errp[static 1]);
 int64_t bdrv_nb_sectors(BlockDriverState *bs);
 int64_t bdrv_getlength(BlockDriverState *bs);
 int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
 void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
-void bdrv_refresh_limits(BlockDriverState *bs, Error **errp);
+void bdrv_refresh_limits(BlockDriverState *bs, Error *errp[static 1]);
 int bdrv_commit(BlockDriverState *bs);
 int bdrv_change_backing_file(BlockDriverState *bs,
     const char *backing_file, const char *backing_fmt);
@@ -350,7 +352,8 @@ bool bdrv_is_first_non_filter(BlockDriverState *candidate);
 
 /* check if a named node can be replaced when doing drive-mirror */
 BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
-                                        const char *node_name, Error **errp);
+                                        const char *node_name,
+                                        Error *errp[static 1]);
 
 /* async block I/O */
 BlockAIOCB *bdrv_aio_readv(BdrvChild *child, int64_t sector_num,
@@ -368,8 +371,8 @@ void bdrv_aio_cancel_async(BlockAIOCB *acb);
 int bdrv_co_ioctl(BlockDriverState *bs, int req, void *buf);
 
 /* Invalidate any cached metadata used by image formats */
-void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp);
-void bdrv_invalidate_cache_all(Error **errp);
+void bdrv_invalidate_cache(BlockDriverState *bs, Error *errp[static 1]);
+void bdrv_invalidate_cache_all(Error *errp[static 1]);
 int bdrv_inactivate_all(void);
 
 /* Ensure contents are flushed to disk.  */
@@ -439,8 +442,10 @@ int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
 
 bool bdrv_is_read_only(BlockDriverState *bs);
 bool bdrv_is_writable(BlockDriverState *bs);
-int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only, Error **errp);
-int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp);
+int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
+			   Error *errp[static 1]);
+int bdrv_set_read_only(BlockDriverState *bs, bool read_only,
+		       Error *errp[static 1]);
 bool bdrv_is_sg(BlockDriverState *bs);
 bool bdrv_is_inserted(BlockDriverState *bs);
 int bdrv_media_changed(BlockDriverState *bs);
@@ -448,10 +453,10 @@ void bdrv_lock_medium(BlockDriverState *bs, bool locked);
 void bdrv_eject(BlockDriverState *bs, bool eject_flag);
 const char *bdrv_get_format_name(BlockDriverState *bs);
 BlockDriverState *bdrv_find_node(const char *node_name);
-BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp);
+BlockDeviceInfoList *bdrv_named_nodes_list(Error *errp[static 1]);
 BlockDriverState *bdrv_lookup_bs(const char *device,
                                  const char *node_name,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base);
 BlockDriverState *bdrv_next_node(BlockDriverState *bs);
 
@@ -471,7 +476,8 @@ BlockDriverState *bdrv_next_monitor_owned(BlockDriverState *bs);
 bool bdrv_is_encrypted(BlockDriverState *bs);
 bool bdrv_key_required(BlockDriverState *bs);
 int bdrv_set_key(BlockDriverState *bs, const char *key);
-void bdrv_add_key(BlockDriverState *bs, const char *key, Error **errp);
+void bdrv_add_key(BlockDriverState *bs, const char *key,
+		  Error *errp[static 1]);
 void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
                          void *opaque);
 const char *bdrv_get_node_name(const BlockDriverState *bs);
@@ -493,11 +499,12 @@ const char *bdrv_get_encrypted_filename(BlockDriverState *bs);
 void bdrv_get_backing_filename(BlockDriverState *bs,
                                char *filename, int filename_size);
 void bdrv_get_full_backing_filename(BlockDriverState *bs,
-                                    char *dest, size_t sz, Error **errp);
+                                    char *dest, size_t sz,
+                                    Error *errp[static 1]);
 void bdrv_get_full_backing_filename_from_filename(const char *backed,
                                                   const char *backing,
                                                   char *dest, size_t sz,
-                                                  Error **errp);
+                                                  Error *errp[static 1]);
 
 int path_has_protocol(const char *path);
 int path_is_absolute(const char *path);
@@ -516,7 +523,7 @@ int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
 void bdrv_img_create(const char *filename, const char *fmt,
                      const char *base_filename, const char *base_fmt,
                      char *options, uint64_t img_size, int flags,
-                     bool quiet, Error **errp);
+                     bool quiet, Error *errp[static 1]);
 
 /* Returns the alignment in bytes that is required so that no bounce buffer
  * is required throughout the stack */
@@ -539,9 +546,10 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
                              BlockDriverState *child_bs,
                              const char *child_name,
                              const BdrvChildRole *child_role,
-                             Error **errp);
+                             Error *errp[static 1]);
 
-bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp);
+bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op,
+			Error *errp[static 1]);
 void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason);
 void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason);
 void bdrv_op_block_all(BlockDriverState *bs, Error *reason);
@@ -626,7 +634,8 @@ void bdrv_drained_begin(BlockDriverState *bs);
 void bdrv_drained_end(BlockDriverState *bs);
 
 void bdrv_add_child(BlockDriverState *parent, BlockDriverState *child,
-                    Error **errp);
-void bdrv_del_child(BlockDriverState *parent, BdrvChild *child, Error **errp);
+                    Error *errp[static 1]);
+void bdrv_del_child(BlockDriverState *parent, BdrvChild *child,
+		    Error *errp[static 1]);
 
 #endif
diff --git a/include/block/block_backup.h b/include/block/block_backup.h
index 8a759477a3..30629dcba6 100644
--- a/include/block/block_backup.h
+++ b/include/block/block_backup.h
@@ -34,6 +34,6 @@ void backup_cow_request_begin(CowRequest *req, BlockJob *job,
                               int nb_sectors);
 void backup_cow_request_end(CowRequest *req);
 
-void backup_do_checkpoint(BlockJob *job, Error **errp);
+void backup_do_checkpoint(BlockJob *job, Error *errp[static 1]);
 
 #endif
diff --git a/include/block/block_int.h b/include/block/block_int.h
index cb78c4fa82..3c5670f641 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -785,7 +785,8 @@ int is_windows_drive(const char *filename);
  */
 void stream_start(const char *job_id, BlockDriverState *bs,
                   BlockDriverState *base, const char *backing_file_str,
-                  int64_t speed, BlockdevOnError on_error, Error **errp);
+                  int64_t speed, BlockdevOnError on_error,
+                  Error *errp[static 1]);
 
 /**
  * commit_start:
@@ -806,7 +807,7 @@ void stream_start(const char *job_id, BlockDriverState *bs,
 void commit_start(const char *job_id, BlockDriverState *bs,
                   BlockDriverState *base, BlockDriverState *top, int64_t speed,
                   BlockdevOnError on_error, const char *backing_file_str,
-                  const char *filter_node_name, Error **errp);
+                  const char *filter_node_name, Error *errp[static 1]);
 /**
  * commit_active_start:
  * @job_id: The id of the newly-created job, or %NULL to use the
@@ -831,7 +832,7 @@ void commit_active_start(const char *job_id, BlockDriverState *bs,
                          int64_t speed, BlockdevOnError on_error,
                          const char *filter_node_name,
                          BlockCompletionFunc *cb, void *opaque,
-                         bool auto_complete, Error **errp);
+                         bool auto_complete, Error *errp[static 1]);
 /*
  * mirror_start:
  * @job_id: The id of the newly-created job, or %NULL to use the
@@ -864,7 +865,8 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
                   MirrorSyncMode mode, BlockMirrorBackingMode backing_mode,
                   BlockdevOnError on_source_error,
                   BlockdevOnError on_target_error,
-                  bool unmap, const char *filter_node_name, Error **errp);
+                  bool unmap, const char *filter_node_name,
+                  Error *errp[static 1]);
 
 /*
  * backup_job_create:
@@ -895,7 +897,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
                             BlockdevOnError on_target_error,
                             int creation_flags,
                             BlockCompletionFunc *cb, void *opaque,
-                            BlockJobTxn *txn, Error **errp);
+                            BlockJobTxn *txn, Error *errp[static 1]);
 
 void hmp_drive_add_node(Monitor *mon, const char *optstr);
 
@@ -903,11 +905,11 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
                                   const char *child_name,
                                   const BdrvChildRole *child_role,
                                   uint64_t perm, uint64_t shared_perm,
-                                  void *opaque, Error **errp);
+                                  void *opaque, Error *errp[static 1]);
 void bdrv_root_unref_child(BdrvChild *child);
 
 int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
-                            Error **errp);
+                            Error *errp[static 1]);
 
 /* Default implementation for BlockDriver.bdrv_child_perm() that can be used by
  * block filters: Forward CONSISTENT_READ, WRITE, WRITE_UNCHANGED and RESIZE to
@@ -927,7 +929,8 @@ void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
                                uint64_t *nperm, uint64_t *nshared);
 
 const char *bdrv_get_parent_name(const BlockDriverState *bs);
-void blk_dev_change_media_cb(BlockBackend *blk, bool load, Error **errp);
+void blk_dev_change_media_cb(BlockBackend *blk, bool load,
+			     Error *errp[static 1]);
 bool blk_dev_has_removable_media(BlockBackend *blk);
 bool blk_dev_has_tray(BlockBackend *blk);
 void blk_dev_eject_request(BlockBackend *blk, bool force);
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
index 09c7c694b5..480ee92f1a 100644
--- a/include/block/blockjob.h
+++ b/include/block/blockjob.h
@@ -178,7 +178,8 @@ BlockJob *block_job_get(const char *id);
  * @job exists.
  */
 int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
-                       uint64_t perm, uint64_t shared_perm, Error **errp);
+                       uint64_t perm, uint64_t shared_perm,
+                       Error *errp[static 1]);
 
 /**
  * block_job_remove_all_bdrv:
@@ -198,7 +199,7 @@ void block_job_remove_all_bdrv(BlockJob *job);
  * Set a rate-limiting parameter for the job; the actual meaning may
  * vary depending on the job type.
  */
-void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp);
+void block_job_set_speed(BlockJob *job, int64_t speed, Error *errp[static 1]);
 
 /**
  * block_job_start:
@@ -224,7 +225,7 @@ void block_job_cancel(BlockJob *job);
  *
  * Asynchronously complete the specified job.
  */
-void block_job_complete(BlockJob *job, Error **errp);
+void block_job_complete(BlockJob *job, Error *errp[static 1]);
 
 /**
  * block_job_query:
@@ -232,7 +233,7 @@ void block_job_complete(BlockJob *job, Error **errp);
  *
  * Return information about a job.
  */
-BlockJobInfo *block_job_query(BlockJob *job, Error **errp);
+BlockJobInfo *block_job_query(BlockJob *job, Error *errp[static 1]);
 
 /**
  * block_job_user_pause:
@@ -294,7 +295,7 @@ void block_job_cancel_sync_all(void);
  *
  * Returns the return value from the job.
  */
-int block_job_complete_sync(BlockJob *job, Error **errp);
+int block_job_complete_sync(BlockJob *job, Error *errp[static 1]);
 
 /**
  * block_job_iostatus_reset:
diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h
index f13ad05c0d..b4a31bf1b4 100644
--- a/include/block/blockjob_int.h
+++ b/include/block/blockjob_int.h
@@ -134,7 +134,8 @@ struct BlockJobDriver {
 void *block_job_create(const char *job_id, const BlockJobDriver *driver,
                        BlockDriverState *bs, uint64_t perm,
                        uint64_t shared_perm, int64_t speed, int flags,
-                       BlockCompletionFunc *cb, void *opaque, Error **errp);
+                       BlockCompletionFunc *cb, void *opaque,
+                       Error *errp[static 1]);
 
 /**
  * block_job_sleep_ns:
diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
index 9dea14ba03..46fd81ef82 100644
--- a/include/block/dirty-bitmap.h
+++ b/include/block/dirty-bitmap.h
@@ -7,19 +7,19 @@
 BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
                                           uint32_t granularity,
                                           const char *name,
-                                          Error **errp);
+                                          Error *errp[static 1]);
 void bdrv_create_meta_dirty_bitmap(BdrvDirtyBitmap *bitmap,
                                    int chunk_size);
 void bdrv_release_meta_dirty_bitmap(BdrvDirtyBitmap *bitmap);
 int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
                                        BdrvDirtyBitmap *bitmap,
-                                       Error **errp);
+                                       Error *errp[static 1]);
 BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
                                             BdrvDirtyBitmap *bitmap,
-                                            Error **errp);
+                                            Error *errp[static 1]);
 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
                                            BdrvDirtyBitmap *bitmap,
-                                           Error **errp);
+                                           Error *errp[static 1]);
 BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs,
                                         const char *name);
 void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap);
diff --git a/include/block/nbd.h b/include/block/nbd.h
index 416257abca..cf0f523ef9 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -128,15 +128,16 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc,
                      size_t niov,
                      size_t length,
                      bool do_read,
-                     Error **errp);
+                     Error *errp[static 1]);
 int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *flags,
                           QCryptoTLSCreds *tlscreds, const char *hostname,
                           QIOChannel **outioc,
-                          off_t *size, Error **errp);
+                          off_t *size, Error *errp[static 1]);
 int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size,
-             Error **errp);
+             Error *errp[static 1]);
 ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *request);
-ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply, Error **errp);
+ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply,
+			  Error *errp[static 1]);
 int nbd_client(int fd);
 int nbd_disconnect(int fd);
 
@@ -146,7 +147,7 @@ typedef struct NBDClient NBDClient;
 NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset, off_t size,
                           uint16_t nbdflags, void (*close)(NBDExport *),
                           bool writethrough, BlockBackend *on_eject_blk,
-                          Error **errp);
+                          Error *errp[static 1]);
 void nbd_export_close(NBDExport *exp);
 void nbd_export_get(NBDExport *exp);
 void nbd_export_put(NBDExport *exp);
@@ -167,6 +168,6 @@ void nbd_client_get(NBDClient *client);
 void nbd_client_put(NBDClient *client);
 
 void nbd_server_start(SocketAddress *addr, const char *tls_creds,
-                      Error **errp);
+                      Error *errp[static 1]);
 
 #endif
diff --git a/include/block/qapi.h b/include/block/qapi.h
index 82ba4b63a0..3d9d5af97f 100644
--- a/include/block/qapi.h
+++ b/include/block/qapi.h
@@ -30,13 +30,14 @@
 #include "block/snapshot.h"
 
 BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
-                                        BlockDriverState *bs, Error **errp);
+                                        BlockDriverState *bs,
+                                        Error *errp[static 1]);
 int bdrv_query_snapshot_info_list(BlockDriverState *bs,
                                   SnapshotInfoList **p_list,
-                                  Error **errp);
+                                  Error *errp[static 1]);
 void bdrv_query_image_info(BlockDriverState *bs,
                            ImageInfo **p_info,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 void bdrv_snapshot_dump(fprintf_function func_fprintf, void *f,
                         QEMUSnapshotInfo *sn);
diff --git a/include/block/snapshot.h b/include/block/snapshot.h
index e5c0553115..62cd81d6f3 100644
--- a/include/block/snapshot.h
+++ b/include/block/snapshot.h
@@ -52,7 +52,7 @@ bool bdrv_snapshot_find_by_id_and_name(BlockDriverState *bs,
                                        const char *id,
                                        const char *name,
                                        QEMUSnapshotInfo *sn_info,
-                                       Error **errp);
+                                       Error *errp[static 1]);
 int bdrv_can_snapshot(BlockDriverState *bs);
 int bdrv_snapshot_create(BlockDriverState *bs,
                          QEMUSnapshotInfo *sn_info);
@@ -61,19 +61,19 @@ int bdrv_snapshot_goto(BlockDriverState *bs,
 int bdrv_snapshot_delete(BlockDriverState *bs,
                          const char *snapshot_id,
                          const char *name,
-                         Error **errp);
+                         Error *errp[static 1]);
 int bdrv_snapshot_delete_by_id_or_name(BlockDriverState *bs,
                                        const char *id_or_name,
-                                       Error **errp);
+                                       Error *errp[static 1]);
 int bdrv_snapshot_list(BlockDriverState *bs,
                        QEMUSnapshotInfo **psn_info);
 int bdrv_snapshot_load_tmp(BlockDriverState *bs,
                            const char *snapshot_id,
                            const char *name,
-                           Error **errp);
+                           Error *errp[static 1]);
 int bdrv_snapshot_load_tmp_by_id_or_name(BlockDriverState *bs,
                                          const char *id_or_name,
-                                         Error **errp);
+                                         Error *errp[static 1]);
 
 
 /* Group operations. All block drivers are involved.
@@ -82,7 +82,7 @@ int bdrv_snapshot_load_tmp_by_id_or_name(BlockDriverState *bs,
 
 bool bdrv_all_can_snapshot(BlockDriverState **first_bad_bs);
 int bdrv_all_delete_snapshot(const char *name, BlockDriverState **first_bsd_bs,
-                             Error **err);
+                             Error *err[static 1]);
 int bdrv_all_goto_snapshot(const char *name, BlockDriverState **first_bsd_bs);
 int bdrv_all_find_snapshot(const char *name, BlockDriverState **first_bad_bs);
 int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
diff --git a/include/chardev/char-fd.h b/include/chardev/char-fd.h
index 55ae5b47b0..e23c130c1f 100644
--- a/include/chardev/char-fd.h
+++ b/include/chardev/char-fd.h
@@ -39,6 +39,6 @@ typedef struct FDChardev {
 #define FD_CHARDEV(obj) OBJECT_CHECK(FDChardev, (obj), TYPE_CHARDEV_FD)
 
 void qemu_chr_open_fd(Chardev *chr, int fd_in, int fd_out);
-int qmp_chardev_open_file_source(char *src, int flags, Error **errp);
+int qmp_chardev_open_file_source(char *src, int flags, Error *errp[static 1]);
 
 #endif /* CHAR_FD_H */
diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h
index 2cbb262f66..7446826fa0 100644
--- a/include/chardev/char-fe.h
+++ b/include/chardev/char-fe.h
@@ -26,7 +26,7 @@ struct CharBackend {
  *
  * Returns: false on error.
  */
-bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp);
+bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error *errp[static 1]);
 
 /**
  * @qemu_chr_fe_deinit:
@@ -102,7 +102,7 @@ void qemu_chr_fe_disconnect(CharBackend *be);
  * Wait for characted backend to be connected, return < 0 on error or
  * if no assicated Chardev.
  */
-int qemu_chr_fe_wait_connected(CharBackend *be, Error **errp);
+int qemu_chr_fe_wait_connected(CharBackend *be, Error *errp[static 1]);
 
 /**
  * @qemu_chr_fe_set_echo:
diff --git a/include/chardev/char-win.h b/include/chardev/char-win.h
index fa59e9e423..cae26c67cf 100644
--- a/include/chardev/char-win.h
+++ b/include/chardev/char-win.h
@@ -45,7 +45,8 @@ typedef struct {
 #define WIN_CHARDEV(obj) OBJECT_CHECK(WinChardev, (obj), TYPE_CHARDEV_WIN)
 
 void win_chr_set_file(Chardev *chr, HANDLE file, bool keep_open);
-int win_chr_serial_init(Chardev *chr, const char *filename, Error **errp);
+int win_chr_serial_init(Chardev *chr, const char *filename,
+			Error *errp[static 1]);
 int win_chr_pipe_poll(void *opaque);
 
 #endif /* CHAR_WIN_H */
diff --git a/include/chardev/char.h b/include/chardev/char.h
index 8a9ade4931..a9daceec93 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -68,7 +68,7 @@ struct Chardev {
  * Returns: a new character backend
  */
 Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
-                                Error **errp);
+                                Error *errp[static 1]);
 
 /**
  * @qemu_chr_parse_common:
@@ -166,7 +166,7 @@ void qemu_chr_set_feature(Chardev *chr,
 QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename);
 int qemu_chr_write(Chardev *s, const uint8_t *buf, int len, bool write_all);
 #define qemu_chr_write_all(s, buf, len) qemu_chr_write(s, buf, len, true)
-int qemu_chr_wait_connected(Chardev *chr, Error **errp);
+int qemu_chr_wait_connected(Chardev *chr, Error *errp[static 1]);
 
 #define TYPE_CHARDEV "chardev"
 #define CHARDEV(obj) OBJECT_CHECK(Chardev, (obj), TYPE_CHARDEV)
@@ -219,11 +219,12 @@ typedef struct ChardevClass {
 } ChardevClass;
 
 Chardev *qemu_chardev_new(const char *id, const char *typename,
-                          ChardevBackend *backend, Error **errp);
+                          ChardevBackend *backend, Error *errp[static 1]);
 
 extern int term_escape_char;
 
 /* console.c */
-void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp);
+void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend,
+		       Error *errp[static 1]);
 
 #endif
diff --git a/include/crypto/afsplit.h b/include/crypto/afsplit.h
index 7dd21f0a67..7b1a9c8216 100644
--- a/include/crypto/afsplit.h
+++ b/include/crypto/afsplit.h
@@ -108,7 +108,7 @@ int qcrypto_afsplit_encode(QCryptoHashAlgorithm hash,
                            uint32_t stripes,
                            const uint8_t *in,
                            uint8_t *out,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 /**
  * qcrypto_afsplit_decode:
@@ -130,6 +130,6 @@ int qcrypto_afsplit_decode(QCryptoHashAlgorithm hash,
                            uint32_t stripes,
                            const uint8_t *in,
                            uint8_t *out,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 #endif /* QCRYPTO_AFSPLIT_H */
diff --git a/include/crypto/block.h b/include/crypto/block.h
index 013a435f1b..5095000e68 100644
--- a/include/crypto/block.h
+++ b/include/crypto/block.h
@@ -105,7 +105,7 @@ QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
                                  QCryptoBlockReadFunc readfunc,
                                  void *opaque,
                                  unsigned int flags,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 
 /**
  * qcrypto_block_create:
@@ -136,7 +136,7 @@ QCryptoBlock *qcrypto_block_create(QCryptoBlockCreateOptions *options,
                                    QCryptoBlockInitFunc initfunc,
                                    QCryptoBlockWriteFunc writefunc,
                                    void *opaque,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 
 
 /**
@@ -152,7 +152,7 @@ QCryptoBlock *qcrypto_block_create(QCryptoBlockCreateOptions *options,
  * Returns: a block encryption info object, or NULL on error
  */
 QCryptoBlockInfo *qcrypto_block_get_info(QCryptoBlock *block,
-                                         Error **errp);
+                                         Error *errp[static 1]);
 
 /**
  * @qcrypto_block_decrypt:
@@ -171,7 +171,7 @@ int qcrypto_block_decrypt(QCryptoBlock *block,
                           uint64_t startsector,
                           uint8_t *buf,
                           size_t len,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 /**
  * @qcrypto_block_encrypt:
@@ -190,7 +190,7 @@ int qcrypto_block_encrypt(QCryptoBlock *block,
                           uint64_t startsector,
                           uint8_t *buf,
                           size_t len,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 /**
  * qcrypto_block_get_cipher:
diff --git a/include/crypto/cipher.h b/include/crypto/cipher.h
index bec9f412b0..e8c80e9032 100644
--- a/include/crypto/cipher.h
+++ b/include/crypto/cipher.h
@@ -158,7 +158,7 @@ size_t qcrypto_cipher_get_iv_len(QCryptoCipherAlgorithm alg,
 QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
                                   QCryptoCipherMode mode,
                                   const uint8_t *key, size_t nkey,
-                                  Error **errp);
+                                  Error *errp[static 1]);
 
 /**
  * qcrypto_cipher_free:
@@ -188,7 +188,7 @@ int qcrypto_cipher_encrypt(QCryptoCipher *cipher,
                            const void *in,
                            void *out,
                            size_t len,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 
 /**
@@ -210,7 +210,7 @@ int qcrypto_cipher_decrypt(QCryptoCipher *cipher,
                            const void *in,
                            void *out,
                            size_t len,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 /**
  * qcrypto_cipher_setiv:
@@ -230,6 +230,6 @@ int qcrypto_cipher_decrypt(QCryptoCipher *cipher,
  */
 int qcrypto_cipher_setiv(QCryptoCipher *cipher,
                          const uint8_t *iv, size_t niv,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 #endif /* QCRYPTO_CIPHER_H */
diff --git a/include/crypto/hash.h b/include/crypto/hash.h
index ca3267f3df..7537d6cf96 100644
--- a/include/crypto/hash.h
+++ b/include/crypto/hash.h
@@ -70,7 +70,7 @@ int qcrypto_hash_bytesv(QCryptoHashAlgorithm alg,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp);
+                        Error *errp[static 1]);
 
 /**
  * qcrypto_hash_bytes:
@@ -95,7 +95,7 @@ int qcrypto_hash_bytes(QCryptoHashAlgorithm alg,
                        size_t len,
                        uint8_t **result,
                        size_t *resultlen,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 /**
  * qcrypto_hash_digestv:
@@ -118,7 +118,7 @@ int qcrypto_hash_digestv(QCryptoHashAlgorithm alg,
                          const struct iovec *iov,
                          size_t niov,
                          char **digest,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 /**
  * qcrypto_hash_digest:
@@ -141,7 +141,7 @@ int qcrypto_hash_digest(QCryptoHashAlgorithm alg,
                         const char *buf,
                         size_t len,
                         char **digest,
-                        Error **errp);
+                        Error *errp[static 1]);
 
 /**
  * qcrypto_hash_base64v:
@@ -164,7 +164,7 @@ int qcrypto_hash_base64v(QCryptoHashAlgorithm alg,
                          const struct iovec *iov,
                          size_t niov,
                          char **base64,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 /**
  * qcrypto_hash_base64:
@@ -187,6 +187,6 @@ int qcrypto_hash_base64(QCryptoHashAlgorithm alg,
                         const char *buf,
                         size_t len,
                         char **base64,
-                        Error **errp);
+                        Error *errp[static 1]);
 
 #endif /* QCRYPTO_HASH_H */
diff --git a/include/crypto/init.h b/include/crypto/init.h
index 04c1edf770..c731110598 100644
--- a/include/crypto/init.h
+++ b/include/crypto/init.h
@@ -21,6 +21,6 @@
 #ifndef QCRYPTO_INIT_H
 #define QCRYPTO_INIT_H
 
-int qcrypto_init(Error **errp);
+int qcrypto_init(Error *errp[static 1]);
 
 #endif /* QCRYPTO_INIT_H */
diff --git a/include/crypto/ivgen.h b/include/crypto/ivgen.h
index 0350cd2a93..183807202f 100644
--- a/include/crypto/ivgen.h
+++ b/include/crypto/ivgen.h
@@ -156,7 +156,7 @@ QCryptoIVGen *qcrypto_ivgen_new(QCryptoIVGenAlgorithm alg,
 int qcrypto_ivgen_calculate(QCryptoIVGen *ivgen,
                             uint64_t sector,
                             uint8_t *iv, size_t niv,
-                            Error **errp);
+                            Error *errp[static 1]);
 
 
 /**
diff --git a/include/crypto/pbkdf.h b/include/crypto/pbkdf.h
index ef209b3e03..3b5453367c 100644
--- a/include/crypto/pbkdf.h
+++ b/include/crypto/pbkdf.h
@@ -124,7 +124,7 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,
                    const uint8_t *salt, size_t nsalt,
                    uint64_t iterations,
                    uint8_t *out, size_t nout,
-                   Error **errp);
+                   Error *errp[static 1]);
 
 /**
  * qcrypto_pbkdf2_count_iters:
@@ -151,6 +151,6 @@ uint64_t qcrypto_pbkdf2_count_iters(QCryptoHashAlgorithm hash,
                                     const uint8_t *key, size_t nkey,
                                     const uint8_t *salt, size_t nsalt,
                                     size_t nout,
-                                    Error **errp);
+                                    Error *errp[static 1]);
 
 #endif /* QCRYPTO_PBKDF_H */
diff --git a/include/crypto/random.h b/include/crypto/random.h
index a07229ce96..7c503cc9c6 100644
--- a/include/crypto/random.h
+++ b/include/crypto/random.h
@@ -38,7 +38,7 @@
  */
 int qcrypto_random_bytes(uint8_t *buf,
                          size_t buflen,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 /**
  * qcrypto_random_init:
@@ -48,6 +48,6 @@ int qcrypto_random_bytes(uint8_t *buf,
  *
  * Returns 0 on success, -1 on error
  */
-int qcrypto_random_init(Error **errp);
+int qcrypto_random_init(Error *errp[static 1]);
 
 #endif /* QCRYPTO_RANDOM_H */
diff --git a/include/crypto/secret.h b/include/crypto/secret.h
index 07a963e794..cd497a1ee2 100644
--- a/include/crypto/secret.h
+++ b/include/crypto/secret.h
@@ -137,10 +137,10 @@ struct QCryptoSecretClass {
 extern int qcrypto_secret_lookup(const char *secretid,
                                  uint8_t **data,
                                  size_t *datalen,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 extern char *qcrypto_secret_lookup_as_utf8(const char *secretid,
-                                           Error **errp);
+                                           Error *errp[static 1]);
 extern char *qcrypto_secret_lookup_as_base64(const char *secretid,
-                                             Error **errp);
+                                             Error *errp[static 1]);
 
 #endif /* QCRYPTO_SECRET_H */
diff --git a/include/crypto/tlssession.h b/include/crypto/tlssession.h
index 1c7414e4ff..d3135b2442 100644
--- a/include/crypto/tlssession.h
+++ b/include/crypto/tlssession.h
@@ -173,7 +173,7 @@ void qcrypto_tls_session_free(QCryptoTLSSession *sess);
  * Returns 0 if the credentials validated, -1 on error
  */
 int qcrypto_tls_session_check_credentials(QCryptoTLSSession *sess,
-                                          Error **errp);
+                                          Error *errp[static 1]);
 
 typedef ssize_t (*QCryptoTLSSessionWriteFunc)(const char *buf,
                                               size_t len,
@@ -264,7 +264,7 @@ ssize_t qcrypto_tls_session_read(QCryptoTLSSession *sess,
  * or write again
  */
 int qcrypto_tls_session_handshake(QCryptoTLSSession *sess,
-                                  Error **errp);
+                                  Error *errp[static 1]);
 
 typedef enum {
     QCRYPTO_TLS_HANDSHAKE_COMPLETE,
@@ -300,7 +300,7 @@ qcrypto_tls_session_get_handshake_status(QCryptoTLSSession *sess);
  * or -1 on error
  */
 int qcrypto_tls_session_get_key_size(QCryptoTLSSession *sess,
-                                     Error **errp);
+                                     Error *errp[static 1]);
 
 /**
  * qcrypto_tls_session_get_peer_name:
diff --git a/include/exec/memory.h b/include/exec/memory.h
index 80e605a96a..8bd3a8f1f0 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -408,7 +408,7 @@ void memory_region_init_ram(MemoryRegion *mr,
                             struct Object *owner,
                             const char *name,
                             uint64_t size,
-                            Error **errp);
+                            Error *errp[static 1]);
 
 /**
  * memory_region_init_resizeable_ram:  Initialize memory region with resizeable
@@ -434,7 +434,7 @@ void memory_region_init_resizeable_ram(MemoryRegion *mr,
                                        void (*resized)(const char*,
                                                        uint64_t length,
                                                        void *host),
-                                       Error **errp);
+                                       Error *errp[static 1]);
 #ifdef __linux__
 /**
  * memory_region_init_ram_from_file:  Initialize RAM memory region with a
@@ -455,7 +455,7 @@ void memory_region_init_ram_from_file(MemoryRegion *mr,
                                       uint64_t size,
                                       bool share,
                                       const char *path,
-                                      Error **errp);
+                                      Error *errp[static 1]);
 #endif
 
 /**
@@ -537,7 +537,7 @@ void memory_region_init_rom(MemoryRegion *mr,
                             struct Object *owner,
                             const char *name,
                             uint64_t size,
-                            Error **errp);
+                            Error *errp[static 1]);
 
 /**
  * memory_region_init_rom_device:  Initialize a ROM memory region.  Writes are
@@ -557,7 +557,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
                                    void *opaque,
                                    const char *name,
                                    uint64_t size,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 
 /**
  * memory_region_init_reservation: Initialize a memory region that reserves
@@ -859,7 +859,7 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr);
  * @errp: pointer to Error*, to store an error if it happens.
  */
 void memory_region_ram_resize(MemoryRegion *mr, ram_addr_t newsize,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 /**
  * memory_region_set_log: Turn dirty logging on or off for a region.
diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
index 140efa840c..7a3b1721f4 100644
--- a/include/exec/ram_addr.h
+++ b/include/exec/ram_addr.h
@@ -64,18 +64,20 @@ long qemu_getrampagesize(void);
 unsigned long last_ram_page(void);
 RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
                                    bool share, const char *mem_path,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
-                                  MemoryRegion *mr, Error **errp);
-RAMBlock *qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp);
+                                  MemoryRegion *mr, Error *errp[static 1]);
+RAMBlock *qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr,
+			 Error *errp[static 1]);
 RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t max_size,
                                     void (*resized)(const char*,
                                                     uint64_t length,
                                                     void *host),
-                                    MemoryRegion *mr, Error **errp);
+                                    MemoryRegion *mr, Error *errp[static 1]);
 void qemu_ram_free(RAMBlock *block);
 
-int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize, Error **errp);
+int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize,
+		    Error *errp[static 1]);
 
 #define DIRTY_CLIENTS_ALL     ((1 << DIRTY_MEMORY_NUM) - 1)
 #define DIRTY_CLIENTS_NOCODE  (DIRTY_CLIENTS_ALL & ~(1 << DIRTY_MEMORY_CODE))
diff --git a/include/hw/acpi/acpi.h b/include/hw/acpi/acpi.h
index 7b3d93cf0d..dddcf6b21c 100644
--- a/include/hw/acpi/acpi.h
+++ b/include/hw/acpi/acpi.h
@@ -179,8 +179,8 @@ extern size_t acpi_tables_len;
 uint8_t *acpi_table_first(void);
 uint8_t *acpi_table_next(uint8_t *current);
 unsigned acpi_table_len(void *current);
-void acpi_table_add(const QemuOpts *opts, Error **errp);
-void acpi_table_add_builtin(const QemuOpts *opts, Error **errp);
+void acpi_table_add(const QemuOpts *opts, Error *errp[static 1]);
+void acpi_table_add_builtin(const QemuOpts *opts, Error *errp[static 1]);
 
 typedef struct AcpiSlicOem AcpiSlicOem;
 struct AcpiSlicOem {
diff --git a/include/hw/acpi/cpu.h b/include/hw/acpi/cpu.h
index 89ce172941..20e2187cfc 100644
--- a/include/hw/acpi/cpu.h
+++ b/include/hw/acpi/cpu.h
@@ -35,14 +35,15 @@ typedef struct CPUHotplugState {
 } CPUHotplugState;
 
 void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev,
-                      CPUHotplugState *cpu_st, DeviceState *dev, Error **errp);
+                      CPUHotplugState *cpu_st, DeviceState *dev,
+                      Error *errp[static 1]);
 
 void acpi_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
                                 CPUHotplugState *cpu_st,
-                                DeviceState *dev, Error **errp);
+                                DeviceState *dev, Error *errp[static 1]);
 
 void acpi_cpu_unplug_cb(CPUHotplugState *cpu_st,
-                        DeviceState *dev, Error **errp);
+                        DeviceState *dev, Error *errp[static 1]);
 
 void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner,
                          CPUHotplugState *state, hwaddr base_addr);
diff --git a/include/hw/acpi/cpu_hotplug.h b/include/hw/acpi/cpu_hotplug.h
index 3b932abbbb..73ccd64c20 100644
--- a/include/hw/acpi/cpu_hotplug.h
+++ b/include/hw/acpi/cpu_hotplug.h
@@ -26,7 +26,8 @@ typedef struct AcpiCpuHotplug {
 } AcpiCpuHotplug;
 
 void legacy_acpi_cpu_plug_cb(HotplugHandler *hotplug_dev,
-                             AcpiCpuHotplug *g, DeviceState *dev, Error **errp);
+                             AcpiCpuHotplug *g, DeviceState *dev,
+                             Error *errp[static 1]);
 
 void legacy_acpi_cpu_hotplug_init(MemoryRegion *parent, Object *owner,
                                   AcpiCpuHotplug *gpe_cpu, uint16_t base);
diff --git a/include/hw/acpi/ich9.h b/include/hw/acpi/ich9.h
index a352c94fde..af5357f702 100644
--- a/include/hw/acpi/ich9.h
+++ b/include/hw/acpi/ich9.h
@@ -70,14 +70,15 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
 void ich9_pm_iospace_update(ICH9LPCPMRegs *pm, uint32_t pm_io_base);
 extern const VMStateDescription vmstate_ich9_pm;
 
-void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp);
+void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm,
+			    Error *errp[static 1]);
 
 void ich9_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
-                            Error **errp);
+                            Error *errp[static 1]);
 void ich9_pm_device_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                      DeviceState *dev, Error **errp);
+                                      DeviceState *dev, Error *errp[static 1]);
 void ich9_pm_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 void ich9_pm_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list);
 #endif /* HW_ACPI_ICH9_H */
diff --git a/include/hw/acpi/memory_hotplug.h b/include/hw/acpi/memory_hotplug.h
index 77c65765d6..fe8f64c66f 100644
--- a/include/hw/acpi/memory_hotplug.h
+++ b/include/hw/acpi/memory_hotplug.h
@@ -32,12 +32,12 @@ void acpi_memory_hotplug_init(MemoryRegion *as, Object *owner,
                               MemHotplugState *state, uint16_t io_base);
 
 void acpi_memory_plug_cb(HotplugHandler *hotplug_dev, MemHotplugState *mem_st,
-                         DeviceState *dev, Error **errp);
+                         DeviceState *dev, Error *errp[static 1]);
 void acpi_memory_unplug_request_cb(HotplugHandler *hotplug_dev,
                                    MemHotplugState *mem_st,
-                                   DeviceState *dev, Error **errp);
+                                   DeviceState *dev, Error *errp[static 1]);
 void acpi_memory_unplug_cb(MemHotplugState *mem_st,
-                           DeviceState *dev, Error **errp);
+                           DeviceState *dev, Error *errp[static 1]);
 
 extern const VMStateDescription vmstate_memory_hotplug;
 #define VMSTATE_MEMORY_HOTPLUG(memhp, state) \
diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
index 8a65f99fc8..7442f8c337 100644
--- a/include/hw/acpi/pcihp.h
+++ b/include/hw/acpi/pcihp.h
@@ -57,9 +57,9 @@ void acpi_pcihp_init(Object *owner, AcpiPciHpState *, PCIBus *root,
                      MemoryRegion *address_space_io, bool bridges_enabled);
 
 void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
-                               DeviceState *dev, Error **errp);
+                               DeviceState *dev, Error *errp[static 1]);
 void acpi_pcihp_device_unplug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
-                                 DeviceState *dev, Error **errp);
+                                 DeviceState *dev, Error *errp[static 1]);
 
 /* Called on reset */
 void acpi_pcihp_reset(AcpiPciHpState *s);
diff --git a/include/hw/block/block.h b/include/hw/block/block.h
index f3f6e8ef02..0408e96a84 100644
--- a/include/hw/block/block.h
+++ b/include/hw/block/block.h
@@ -74,10 +74,10 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
 void blkconf_serial(BlockConf *conf, char **serial);
 void blkconf_geometry(BlockConf *conf, int *trans,
                       unsigned cyls_max, unsigned heads_max, unsigned secs_max,
-                      Error **errp);
+                      Error *errp[static 1]);
 void blkconf_blocksizes(BlockConf *conf);
 void blkconf_apply_backend_options(BlockConf *conf, bool readonly,
-                                   bool resizable, Error **errp);
+                                   bool resizable, Error *errp[static 1]);
 
 /* Hard disk geometry */
 
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 76ce0219ff..aa36da926f 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -45,7 +45,7 @@ void machine_register_compat_props(MachineState *machine);
 HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine);
 void machine_set_cpu_numa_node(MachineState *machine,
                                const CpuInstanceProperties *props,
-                               Error **errp);
+                               Error *errp[static 1]);
 
 /**
  * CPUArchId:
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index c4daf11a14..d3463ca0f8 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -82,7 +82,7 @@ struct SerialState {
 extern const VMStateDescription vmstate_serial;
 extern const MemoryRegionOps serial_io_ops;
 
-void serial_realize_core(SerialState *s, Error **errp);
+void serial_realize_core(SerialState *s, Error *errp[static 1]);
 void serial_exit_core(SerialState *s);
 void serial_set_frequency(SerialState *s, uint32_t frequency);
 
diff --git a/include/hw/hotplug.h b/include/hw/hotplug.h
index 1a0516a479..eb3344e5dd 100644
--- a/include/hw/hotplug.h
+++ b/include/hw/hotplug.h
@@ -72,7 +72,7 @@ typedef struct HotplugHandlerClass {
  */
 void hotplug_handler_plug(HotplugHandler *plug_handler,
                           DeviceState *plugged_dev,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 /**
  * hotplug_handler_pre_plug:
@@ -81,7 +81,7 @@ void hotplug_handler_plug(HotplugHandler *plug_handler,
  */
 void hotplug_handler_pre_plug(HotplugHandler *plug_handler,
                               DeviceState *plugged_dev,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 /**
  * hotplug_handler_unplug_request:
@@ -90,7 +90,7 @@ void hotplug_handler_pre_plug(HotplugHandler *plug_handler,
  */
 void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
                                     DeviceState *plugged_dev,
-                                    Error **errp);
+                                    Error *errp[static 1]);
 /**
  * hotplug_handler_unplug:
  *
@@ -98,5 +98,5 @@ void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
  */
 void hotplug_handler_unplug(HotplugHandler *plug_handler,
                             DeviceState *plugged_dev,
-                            Error **errp);
+                            Error *errp[static 1]);
 #endif
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index d071c9c0e9..07344a115e 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -239,7 +239,7 @@ void pc_register_ferr_irq(qemu_irq irq);
 void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
 
 void pc_cpus_init(PCMachineState *pcms);
-void pc_hot_add_cpu(const int64_t id, Error **errp);
+void pc_hot_add_cpu(const int64_t id, Error *errp[static 1]);
 void pc_acpi_init(const char *default_dsdt);
 
 void pc_guest_info_init(PCMachineState *pcms);
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index 4b8c13532c..af66c5d4a4 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -100,7 +100,7 @@ struct ISADevice {
 };
 
 ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space,
-                    MemoryRegion *address_space_io, Error **errp);
+                    MemoryRegion *address_space_io, Error *errp[static 1]);
 void isa_bus_irqs(ISABus *bus, qemu_irq *irqs);
 qemu_irq isa_get_irq(ISADevice *dev, int isairq);
 void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq);
diff --git a/include/hw/loader.h b/include/hw/loader.h
index 490c9ff8e6..ac4d10433f 100644
--- a/include/hw/loader.h
+++ b/include/hw/loader.h
@@ -129,7 +129,8 @@ int load_elf(const char *filename, uint64_t (*translate_fn)(void *, uint64_t),
  * Inspect an ELF file's header. Read its full header contents into a
  * buffer and/or determine if the ELF is 64bit.
  */
-void load_elf_hdr(const char *filename, void *hdr, bool *is64, Error **errp);
+void load_elf_hdr(const char *filename, void *hdr, bool *is64,
+		  Error *errp[static 1]);
 
 int load_aout(const char *filename, hwaddr addr, int max_sz,
               int bswap_needed, hwaddr target_page_size);
diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h
index 1e483f2670..2a91796c8c 100644
--- a/include/hw/mem/pc-dimm.h
+++ b/include/hw/mem/pc-dimm.h
@@ -89,14 +89,16 @@ typedef struct MemoryHotplugState {
 uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
                                uint64_t address_space_size,
                                uint64_t *hint, uint64_t align, uint64_t size,
-                               Error **errp);
+                               Error *errp[static 1]);
 
-int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);
+int pc_dimm_get_free_slot(const int *hint, int max_slots,
+			  Error *errp[static 1]);
 
 int qmp_pc_dimm_device_list(Object *obj, void *opaque);
-uint64_t pc_existing_dimms_capacity(Error **errp);
+uint64_t pc_existing_dimms_capacity(Error *errp[static 1]);
 void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
-                         MemoryRegion *mr, uint64_t align, Error **errp);
+                         MemoryRegion *mr, uint64_t align,
+                         Error *errp[static 1]);
 void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms,
                            MemoryRegion *mr);
 #endif
diff --git a/include/hw/nmi.h b/include/hw/nmi.h
index d092c684a1..472ef9f2e1 100644
--- a/include/hw/nmi.h
+++ b/include/hw/nmi.h
@@ -44,6 +44,6 @@ typedef struct NMIClass {
     void (*nmi_monitor_handler)(NMIState *n, int cpu_index, Error **errp);
 } NMIClass;
 
-void nmi_monitor_handle(int cpu_index, Error **errp);
+void nmi_monitor_handle(int cpu_index, Error *errp[static 1]);
 
 #endif /* NMI_H */
diff --git a/include/hw/pci/msi.h b/include/hw/pci/msi.h
index 4837bcf490..dd84819016 100644
--- a/include/hw/pci/msi.h
+++ b/include/hw/pci/msi.h
@@ -36,7 +36,7 @@ MSIMessage msi_get_message(PCIDevice *dev, unsigned int vector);
 bool msi_enabled(const PCIDevice *dev);
 int msi_init(struct PCIDevice *dev, uint8_t offset,
              unsigned int nr_vectors, bool msi64bit,
-             bool msi_per_vector_mask, Error **errp);
+             bool msi_per_vector_mask, Error *errp[static 1]);
 void msi_uninit(struct PCIDevice *dev);
 void msi_reset(PCIDevice *dev);
 void msi_notify(PCIDevice *dev, unsigned int vector);
diff --git a/include/hw/pci/msix.h b/include/hw/pci/msix.h
index 1f27658d35..76f3cf27a4 100644
--- a/include/hw/pci/msix.h
+++ b/include/hw/pci/msix.h
@@ -10,9 +10,9 @@ int msix_init(PCIDevice *dev, unsigned short nentries,
               MemoryRegion *table_bar, uint8_t table_bar_nr,
               unsigned table_offset, MemoryRegion *pba_bar,
               uint8_t pba_bar_nr, unsigned pba_offset, uint8_t cap_pos,
-              Error **errp);
+              Error *errp[static 1]);
 int msix_init_exclusive_bar(PCIDevice *dev, unsigned short nentries,
-                            uint8_t bar_nr, Error **errp);
+                            uint8_t bar_nr, Error *errp[static 1]);
 
 void msix_write_config(PCIDevice *dev, uint32_t address, uint32_t val, int len);
 
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index a37a2d5cb6..bffb8a6bbb 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -359,7 +359,7 @@ int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
                        uint8_t offset, uint8_t size);
 int pci_add_capability2(PCIDevice *pdev, uint8_t cap_id,
                        uint8_t offset, uint8_t size,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 void pci_del_capability(PCIDevice *pci_dev, uint8_t cap_id, uint8_t cap_size);
 
diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h
index 3d8f24b007..08c33a1ff5 100644
--- a/include/hw/pci/pcie.h
+++ b/include/hw/pci/pcie.h
@@ -131,7 +131,8 @@ void pcie_dev_ser_num_init(PCIDevice *dev, uint16_t offset, uint64_t ser_num);
 void pcie_ats_init(PCIDevice *dev, uint16_t offset);
 
 void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
-                              Error **errp);
+                              Error *errp[static 1]);
 void pcie_cap_slot_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                         DeviceState *dev, Error **errp);
+                                         DeviceState *dev,
+                                         Error *errp[static 1]);
 #endif /* QEMU_PCIE_H */
diff --git a/include/hw/pci/pcie_aer.h b/include/hw/pci/pcie_aer.h
index 729a9439c8..084a11f99e 100644
--- a/include/hw/pci/pcie_aer.h
+++ b/include/hw/pci/pcie_aer.h
@@ -87,7 +87,7 @@ struct PCIEAERErr {
 extern const VMStateDescription vmstate_pcie_aer_log;
 
 int pcie_aer_init(PCIDevice *dev, uint8_t cap_ver, uint16_t offset,
-                  uint16_t size, Error **errp);
+                  uint16_t size, Error *errp[static 1]);
 void pcie_aer_exit(PCIDevice *dev);
 void pcie_aer_write_config(PCIDevice *dev,
                            uint32_t addr, uint32_t val, int len);
diff --git a/include/hw/pci/shpc.h b/include/hw/pci/shpc.h
index 71e836b1c0..fc18466e39 100644
--- a/include/hw/pci/shpc.h
+++ b/include/hw/pci/shpc.h
@@ -45,9 +45,10 @@ void shpc_cap_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int len);
 
 
 void shpc_device_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
-                            Error **errp);
+                            Error *errp[static 1]);
 void shpc_device_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                       DeviceState *dev, Error **errp);
+                                       DeviceState *dev,
+                                       Error *errp[static 1]);
 
 extern VMStateInfo shpc_vmstate_info;
 #define SHPC_VMSTATE(_field, _type,  _test) \
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index 3757b2cab9..41ba14e0cc 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -66,7 +66,7 @@ typedef struct PnvXScomInterfaceClass {
 #define PNV_XSCOM_OCC_BASE        0x0066000
 #define PNV_XSCOM_OCC_SIZE        0x6000
 
-extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
+extern void pnv_xscom_realize(PnvChip *chip, Error *errp[static 1]);
 extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
 
 extern void pnv_xscom_add_subregion(PnvChip *chip, hwaddr offset,
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index a3073f9053..2804fbfc97 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -174,9 +174,10 @@ typedef struct XICSFabricClass {
 
 #define XICS_IRQS_SPAPR               1024
 
-int spapr_ics_alloc(ICSState *ics, int irq_hint, bool lsi, Error **errp);
+int spapr_ics_alloc(ICSState *ics, int irq_hint, bool lsi,
+		    Error *errp[static 1]);
 int spapr_ics_alloc_block(ICSState *ics, int num, bool lsi, bool align,
-                           Error **errp);
+                           Error *errp[static 1]);
 void spapr_ics_free(ICSState *ics, int irq, int num);
 void spapr_dt_xics(int nr_servers, void *fdt, uint32_t phandle);
 
@@ -204,7 +205,7 @@ void icp_resend(ICPState *ss);
 
 typedef struct sPAPRMachineState sPAPRMachineState;
 
-int xics_kvm_init(sPAPRMachineState *spapr, Error **errp);
+int xics_kvm_init(sPAPRMachineState *spapr, Error *errp[static 1]);
 void xics_spapr_init(sPAPRMachineState *spapr);
 
 #endif /* XICS_H */
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index e69489ec6c..5cca0b95e0 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -271,9 +271,9 @@ void qdev_init_nofail(DeviceState *dev);
 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
                                  int required_for_version);
 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev);
-void qdev_unplug(DeviceState *dev, Error **errp);
+void qdev_unplug(DeviceState *dev, Error *errp[static 1]);
 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
-                                  DeviceState *dev, Error **errp);
+                                  DeviceState *dev, Error *errp[static 1]);
 void qdev_machine_creation_done(void);
 bool qdev_machine_modified(void);
 
@@ -382,9 +382,9 @@ char *qdev_get_dev_path(DeviceState *dev);
 GSList *qdev_build_hotpluggable_device_list(Object *peripheral);
 
 void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler,
-                              Error **errp);
+                              Error *errp[static 1]);
 
-void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp);
+void qbus_set_bus_hotplug_handler(BusState *bus, Error *errp[static 1]);
 
 static inline bool qbus_is_hotpluggable(BusState *bus)
 {
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index d206fc93dd..b1b569e662 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -187,7 +187,7 @@ void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value)
 void qdev_prop_set_chr(DeviceState *dev, const char *name, Chardev *value);
 void qdev_prop_set_netdev(DeviceState *dev, const char *name, NetClientState *value);
 void qdev_prop_set_drive(DeviceState *dev, const char *name,
-                         BlockBackend *value, Error **errp);
+                         BlockBackend *value, Error *errp[static 1]);
 void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
                            const uint8_t *value);
 void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);
@@ -211,7 +211,8 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
  * On error, store error in @errp.  Static properties access data in a struct.
  * The type of the QOM property is derived from prop->info.
  */
-void qdev_property_add_static(DeviceState *dev, Property *prop, Error **errp);
+void qdev_property_add_static(DeviceState *dev, Property *prop,
+			      Error *errp[static 1]);
 
 void qdev_alias_all_properties(DeviceState *target, Object *source);
 
@@ -226,7 +227,7 @@ void qdev_alias_all_properties(DeviceState *target, Object *source);
  * a friendly format identifying both the device and the property.
  */
 void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 
 /**
  * qdev_prop_allow_set_link_before_realize:
@@ -236,6 +237,7 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
  * object_property_add_link().
  */
 void qdev_prop_allow_set_link_before_realize(Object *obj, const char *name,
-                                             Object *val, Error **errp);
+                                             Object *val,
+                                             Error *errp[static 1]);
 
 #endif
diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
index 596a2f2ef3..3d5dc0edc9 100644
--- a/include/hw/s390x/css.h
+++ b/include/hw/s390x/css.h
@@ -161,7 +161,7 @@ typedef enum {
 
 uint32_t css_get_adapter_id(CssIoAdapterType type, uint8_t isc);
 void css_register_io_adapters(CssIoAdapterType type, bool swap, bool maskable,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 #ifndef CONFIG_USER_ONLY
 SubchDev *css_find_subch(uint8_t m, uint8_t cssid, uint8_t ssid,
@@ -218,5 +218,5 @@ extern PropertyInfo css_devid_ro_propinfo;
  * is responsible for unregistering and freeing it.
  */
 SubchDev *css_create_sch(CssDevId bus_id, bool is_virtual, bool squash_mcss,
-                         Error **errp);
+                         Error *errp[static 1]);
 #endif
diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h
index 6b85786dbf..3d04dbba67 100644
--- a/include/hw/scsi/scsi.h
+++ b/include/hw/scsi/scsi.h
@@ -176,7 +176,8 @@ static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d)
 
 SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
                                       int unit, bool removable, int bootindex,
-                                      const char *serial, Error **errp);
+                                      const char *serial,
+                                      Error *errp[static 1]);
 void scsi_bus_legacy_handle_cmdline(SCSIBus *bus, bool deprecated);
 void scsi_legacy_handle_cmdline(void);
 
diff --git a/include/hw/smbios/smbios.h b/include/hw/smbios/smbios.h
index 31e8d5f47e..e3a08a09f1 100644
--- a/include/hw/smbios/smbios.h
+++ b/include/hw/smbios/smbios.h
@@ -257,7 +257,7 @@ struct smbios_type_127 {
     struct smbios_structure_header header;
 } QEMU_PACKED;
 
-void smbios_entry_add(QemuOpts *opts, Error **errp);
+void smbios_entry_add(QemuOpts *opts, Error *errp[static 1]);
 void smbios_set_cpuid(uint32_t version, uint32_t features);
 void smbios_set_defaults(const char *manufacturer, const char *product,
                          const char *version, bool legacy_mode,
diff --git a/include/hw/usb.h b/include/hw/usb.h
index eb28655270..9a95e1d147 100644
--- a/include/hw/usb.h
+++ b/include/hw/usb.h
@@ -542,15 +542,15 @@ void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
 void usb_register_companion(const char *masterbus, USBPort *ports[],
                             uint32_t portcount, uint32_t firstport,
                             void *opaque, USBPortOps *ops, int speedmask,
-                            Error **errp);
+                            Error *errp[static 1]);
 void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr);
 void usb_unregister_port(USBBus *bus, USBPort *port);
-void usb_claim_port(USBDevice *dev, Error **errp);
+void usb_claim_port(USBDevice *dev, Error *errp[static 1]);
 void usb_release_port(USBDevice *dev);
-void usb_device_attach(USBDevice *dev, Error **errp);
+void usb_device_attach(USBDevice *dev, Error *errp[static 1]);
 int usb_device_detach(USBDevice *dev);
 int usb_device_delete_addr(int busnr, int addr);
-void usb_check_attach(USBDevice *dev, Error **errp);
+void usb_check_attach(USBDevice *dev, Error *errp[static 1]);
 
 static inline USBBus *usb_bus_from_device(USBDevice *d)
 {
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index 9521013d52..3404659297 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -156,10 +156,11 @@ void vfio_region_mmaps_set_enabled(VFIORegion *region, bool enabled);
 void vfio_region_exit(VFIORegion *region);
 void vfio_region_finalize(VFIORegion *region);
 void vfio_reset_handler(void *opaque);
-VFIOGroup *vfio_get_group(int groupid, AddressSpace *as, Error **errp);
+VFIOGroup *vfio_get_group(int groupid, AddressSpace *as,
+			  Error *errp[static 1]);
 void vfio_put_group(VFIOGroup *group);
 int vfio_get_device(VFIOGroup *group, const char *name,
-                    VFIODevice *vbasedev, Error **errp);
+                    VFIODevice *vbasedev, Error *errp[static 1]);
 
 extern const MemoryRegionOps vfio_region_ops;
 extern QLIST_HEAD(vfio_group_head, VFIOGroup) vfio_group_list;
diff --git a/include/hw/virtio/vhost-scsi-common.h b/include/hw/virtio/vhost-scsi-common.h
index 4553be4bc3..ed74797e1d 100644
--- a/include/hw/virtio/vhost-scsi-common.h
+++ b/include/hw/virtio/vhost-scsi-common.h
@@ -43,6 +43,6 @@ char *vhost_scsi_common_get_fw_dev_path(FWPathProvider *p, BusState *bus,
                                         DeviceState *dev);
 void vhost_scsi_common_set_config(VirtIODevice *vdev, const uint8_t *config);
 uint64_t vhost_scsi_common_get_features(VirtIODevice *vdev, uint64_t features,
-                                        Error **errp);
+                                        Error *errp[static 1]);
 
 #endif /* VHOST_SCSI_COMMON_H */
diff --git a/include/hw/virtio/virtio-bus.h b/include/hw/virtio/virtio-bus.h
index a63c1d216d..7f0f5e92c1 100644
--- a/include/hw/virtio/virtio-bus.h
+++ b/include/hw/virtio/virtio-bus.h
@@ -110,7 +110,7 @@ struct VirtioBusState {
     int ioeventfd_grabbed;
 };
 
-void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp);
+void virtio_bus_device_plugged(VirtIODevice *vdev, Error *errp[static 1]);
 void virtio_bus_reset(VirtioBusState *bus);
 void virtio_bus_device_unplugged(VirtIODevice *bus);
 /* Get the device id of the plugged device. */
diff --git a/include/hw/virtio/virtio-scsi.h b/include/hw/virtio/virtio-scsi.h
index eac2013ddd..bdd037f8be 100644
--- a/include/hw/virtio/virtio-scsi.h
+++ b/include/hw/virtio/virtio-scsi.h
@@ -141,9 +141,9 @@ void virtio_scsi_common_realize(DeviceState *dev,
                                 VirtIOHandleOutput ctrl,
                                 VirtIOHandleOutput evt,
                                 VirtIOHandleOutput cmd,
-                                Error **errp);
+                                Error *errp[static 1]);
 
-void virtio_scsi_common_unrealize(DeviceState *dev, Error **errp);
+void virtio_scsi_common_unrealize(DeviceState *dev, Error *errp[static 1]);
 bool virtio_scsi_handle_event_vq(VirtIOSCSI *s, VirtQueue *vq);
 bool virtio_scsi_handle_cmd_vq(VirtIOSCSI *s, VirtQueue *vq);
 bool virtio_scsi_handle_ctrl_vq(VirtIOSCSI *s, VirtQueue *vq);
@@ -152,7 +152,7 @@ void virtio_scsi_free_req(VirtIOSCSIReq *req);
 void virtio_scsi_push_event(VirtIOSCSI *s, SCSIDevice *dev,
                             uint32_t event, uint32_t reason);
 
-void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp);
+void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error *errp[static 1]);
 int virtio_scsi_dataplane_start(VirtIODevice *s);
 void virtio_scsi_dataplane_stop(VirtIODevice *s);
 
diff --git a/include/hw/xen/xen.h b/include/hw/xen/xen.h
index 7efcdaa8fe..5d2d1e5824 100644
--- a/include/hw/xen/xen.h
+++ b/include/hw/xen/xen.h
@@ -43,7 +43,7 @@ void xenstore_store_pv_console_info(int i, struct Chardev *chr);
 void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory);
 
 void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size,
-                   struct MemoryRegion *mr, Error **errp);
+                   struct MemoryRegion *mr, Error *errp[static 1]);
 void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length);
 
 void xen_register_framebuffer(struct MemoryRegion *mr);
diff --git a/include/io/channel-command.h b/include/io/channel-command.h
index 336d47fa5c..56ddbe5901 100644
--- a/include/io/channel-command.h
+++ b/include/io/channel-command.h
@@ -85,7 +85,7 @@ qio_channel_command_new_pid(int writefd,
 QIOChannelCommand *
 qio_channel_command_new_spawn(const char *const argv[],
                               int flags,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 
 #endif /* QIO_CHANNEL_COMMAND_H */
diff --git a/include/io/channel-file.h b/include/io/channel-file.h
index 79245f1183..f7e6078c4a 100644
--- a/include/io/channel-file.h
+++ b/include/io/channel-file.h
@@ -88,6 +88,6 @@ QIOChannelFile *
 qio_channel_file_new_path(const char *path,
                           int flags,
                           mode_t mode,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 #endif /* QIO_CHANNEL_FILE_H */
diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h
index 53801f6042..95b3028854 100644
--- a/include/io/channel-socket.h
+++ b/include/io/channel-socket.h
@@ -76,7 +76,7 @@ qio_channel_socket_new(void);
  */
 QIOChannelSocket *
 qio_channel_socket_new_fd(int fd,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 
 /**
@@ -92,7 +92,7 @@ qio_channel_socket_new_fd(int fd,
  */
 int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
                                     SocketAddress *addr,
-                                    Error **errp);
+                                    Error *errp[static 1]);
 
 /**
  * qio_channel_socket_connect_async:
@@ -129,7 +129,7 @@ void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
  */
 int qio_channel_socket_listen_sync(QIOChannelSocket *ioc,
                                    SocketAddress *addr,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 
 /**
  * qio_channel_socket_listen_async:
@@ -169,7 +169,7 @@ void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
 int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
                                   SocketAddress *localAddr,
                                   SocketAddress *remoteAddr,
-                                  Error **errp);
+                                  Error *errp[static 1]);
 
 /**
  * qio_channel_socket_dgram_async:
@@ -212,7 +212,7 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
  */
 SocketAddress *
 qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
-                                     Error **errp);
+                                     Error *errp[static 1]);
 
 /**
  * qio_channel_socket_get_remote_address:
@@ -229,7 +229,7 @@ qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
  */
 SocketAddress *
 qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
-                                      Error **errp);
+                                      Error *errp[static 1]);
 
 
 /**
@@ -245,7 +245,7 @@ qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
  */
 QIOChannelSocket *
 qio_channel_socket_accept(QIOChannelSocket *ioc,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 
 #endif /* QIO_CHANNEL_SOCKET_H */
diff --git a/include/io/channel-tls.h b/include/io/channel-tls.h
index d157eb10e8..e086062ae7 100644
--- a/include/io/channel-tls.h
+++ b/include/io/channel-tls.h
@@ -78,7 +78,7 @@ QIOChannelTLS *
 qio_channel_tls_new_server(QIOChannel *master,
                            QCryptoTLSCreds *creds,
                            const char *aclname,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 /**
  * qio_channel_tls_new_client:
@@ -108,7 +108,7 @@ QIOChannelTLS *
 qio_channel_tls_new_client(QIOChannel *master,
                            QCryptoTLSCreds *creds,
                            const char *hostname,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 /**
  * qio_channel_tls_handshake:
diff --git a/include/io/channel-util.h b/include/io/channel-util.h
index c0b79cf603..56a7b99c1f 100644
--- a/include/io/channel-util.h
+++ b/include/io/channel-util.h
@@ -47,6 +47,6 @@
  * Returns: the channel object, or NULL on error
  */
 QIOChannel *qio_channel_new_fd(int fd,
-                               Error **errp);
+                               Error *errp[static 1]);
 
 #endif /* QIO_CHANNEL_UTIL_H */
diff --git a/include/io/channel.h b/include/io/channel.h
index db9bb022a1..695ec994b7 100644
--- a/include/io/channel.h
+++ b/include/io/channel.h
@@ -224,7 +224,7 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
                                size_t niov,
                                int **fds,
                                size_t *nfds,
-                               Error **errp);
+                               Error *errp[static 1]);
 
 
 /**
@@ -266,7 +266,7 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc,
                                 size_t niov,
                                 int *fds,
                                 size_t nfds,
-                                Error **errp);
+                                Error *errp[static 1]);
 
 /**
  * qio_channel_readv:
@@ -281,7 +281,7 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc,
 ssize_t qio_channel_readv(QIOChannel *ioc,
                           const struct iovec *iov,
                           size_t niov,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 /**
  * qio_channel_writev:
@@ -296,7 +296,7 @@ ssize_t qio_channel_readv(QIOChannel *ioc,
 ssize_t qio_channel_writev(QIOChannel *ioc,
                            const struct iovec *iov,
                            size_t niov,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 /**
  * qio_channel_readv:
@@ -312,7 +312,7 @@ ssize_t qio_channel_writev(QIOChannel *ioc,
 ssize_t qio_channel_read(QIOChannel *ioc,
                          char *buf,
                          size_t buflen,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 /**
  * qio_channel_write:
@@ -328,7 +328,7 @@ ssize_t qio_channel_read(QIOChannel *ioc,
 ssize_t qio_channel_write(QIOChannel *ioc,
                           const char *buf,
                           size_t buflen,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 /**
  * qio_channel_set_blocking:
@@ -345,7 +345,7 @@ ssize_t qio_channel_write(QIOChannel *ioc,
  */
 int qio_channel_set_blocking(QIOChannel *ioc,
                              bool enabled,
-                             Error **errp);
+                             Error *errp[static 1]);
 
 /**
  * qio_channel_close:
@@ -357,7 +357,7 @@ int qio_channel_set_blocking(QIOChannel *ioc,
  * Returns: 0 on success, -1 on error
  */
 int qio_channel_close(QIOChannel *ioc,
-                      Error **errp);
+                      Error *errp[static 1]);
 
 /**
  * qio_channel_shutdown:
@@ -378,7 +378,7 @@ int qio_channel_close(QIOChannel *ioc,
  */
 int qio_channel_shutdown(QIOChannel *ioc,
                          QIOChannelShutdown how,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 /**
  * qio_channel_set_delay:
@@ -457,7 +457,7 @@ void qio_channel_set_cork(QIOChannel *ioc,
 off_t qio_channel_io_seek(QIOChannel *ioc,
                           off_t offset,
                           int whence,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 
 /**
diff --git a/include/io/dns-resolver.h b/include/io/dns-resolver.h
index 2f69c08c13..71de4450c0 100644
--- a/include/io/dns-resolver.h
+++ b/include/io/dns-resolver.h
@@ -180,7 +180,7 @@ int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
                                  SocketAddress *addr,
                                  size_t *naddrs,
                                  SocketAddress ***addrs,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 
 /**
  * qio_dns_resolver_lookup_async:
diff --git a/include/io/task.h b/include/io/task.h
index 6021f51336..d373340557 100644
--- a/include/io/task.h
+++ b/include/io/task.h
@@ -276,7 +276,7 @@ void qio_task_set_error(QIOTask *task,
  * Returns: true if an error was propagated, false otherwise
  */
 bool qio_task_propagate_error(QIOTask *task,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 
 /**
diff --git a/include/migration/blocker.h b/include/migration/blocker.h
index acd27018e9..5b8be4e0af 100644
--- a/include/migration/blocker.h
+++ b/include/migration/blocker.h
@@ -23,7 +23,7 @@
  *
  * @returns - 0 on success, -EBUSY/-EACCES on failure, with errp set.
  */
-int migrate_add_blocker(Error *reason, Error **errp);
+int migrate_add_blocker(Error *reason, Error *errp[static 1]);
 
 /**
  * @migrate_del_blocker - remove a blocking error from migration
diff --git a/include/migration/failover.h b/include/migration/failover.h
index ad91ef2381..6bc59e2c77 100644
--- a/include/migration/failover.h
+++ b/include/migration/failover.h
@@ -20,7 +20,7 @@ void failover_init_state(void);
 FailoverStatus failover_set_state(FailoverStatus old_state,
                                      FailoverStatus new_state);
 FailoverStatus failover_get_state(void);
-void failover_request_active(Error **errp);
+void failover_request_active(Error *errp[static 1]);
 bool failover_request_is_active(void);
 
 #endif
diff --git a/include/migration/migration.h b/include/migration/migration.h
index 79b5484d65..5cdd9b6cf9 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -149,7 +149,7 @@ void migrate_set_state(int *state, int old_state, int new_state);
 
 void migration_fd_process_incoming(QEMUFile *f);
 
-void qemu_start_incoming_migration(const char *uri, Error **errp);
+void qemu_start_incoming_migration(const char *uri, Error *errp[static 1]);
 
 uint64_t migrate_max_downtime(void);
 
@@ -160,7 +160,7 @@ void migrate_fd_connect(MigrationState *s);
 void add_migration_state_change_notifier(Notifier *notify);
 void remove_migration_state_change_notifier(Notifier *notify);
 MigrationState *migrate_init(void);
-bool migration_is_blocked(Error **errp);
+bool migration_is_blocked(Error *errp[static 1]);
 bool migration_in_setup(MigrationState *);
 bool migration_is_idle(void);
 bool migration_has_finished(MigrationState *);
diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h
index c85b6ec75b..48f6bd3b10 100644
--- a/include/migration/snapshot.h
+++ b/include/migration/snapshot.h
@@ -15,7 +15,7 @@
 #ifndef QEMU_MIGRATION_SNAPSHOT_H
 #define QEMU_MIGRATION_SNAPSHOT_H
 
-int save_snapshot(const char *name, Error **errp);
-int load_snapshot(const char *name, Error **errp);
+int save_snapshot(const char *name, Error *errp[static 1]);
+int load_snapshot(const char *name, Error *errp[static 1]);
 
 #endif
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 13fb10797a..8be9416bf8 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -1025,7 +1025,7 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
                                    const VMStateDescription *vmsd,
                                    void *base, int alias_id,
                                    int required_for_version,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 
 /* Returns: 0 on success, -1 on failure */
 static inline int vmstate_register(DeviceState *dev, int instance_id,
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index d2b3aafdb4..35b2b7e818 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -30,8 +30,8 @@ int monitor_read_block_device_key(Monitor *mon, const char *device,
                                   BlockCompletionFunc *completion_cb,
                                   void *opaque);
 
-int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp);
-int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp);
+int monitor_get_fd(Monitor *mon, const char *fdname, Error *errp[static 1]);
+int monitor_fd_param(Monitor *mon, const char *fdname, Error *errp[static 1]);
 
 void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
     GCC_FMT_ATTR(2, 0);
@@ -47,7 +47,7 @@ int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
 
 AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
                                 bool has_opaque, const char *opaque,
-                                Error **errp);
+                                Error *errp[static 1]);
 int monitor_fdset_get_fd(int64_t fdset_id, int flags);
 int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd);
 void monitor_fdset_dup_fd_remove(int dup_fd);
diff --git a/include/monitor/qdev.h b/include/monitor/qdev.h
index 0ff3331284..437724dc98 100644
--- a/include/monitor/qdev.h
+++ b/include/monitor/qdev.h
@@ -8,10 +8,10 @@
 void hmp_info_qtree(Monitor *mon, const QDict *qdict);
 void hmp_info_qdm(Monitor *mon, const QDict *qdict);
 void hmp_info_qom_tree(Monitor *mon, const QDict *dict);
-void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp);
+void qmp_device_add(QDict *qdict, QObject **ret_data, Error *errp[static 1]);
 
 int qdev_device_help(QemuOpts *opts);
-DeviceState *qdev_device_add(QemuOpts *opts, Error **errp);
+DeviceState *qdev_device_add(QemuOpts *opts, Error *errp[static 1]);
 void qdev_set_id(DeviceState *dev, const char *id);
 
 #endif
diff --git a/include/net/net.h b/include/net/net.h
index 99b28d5b38..5aec9d2494 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -201,15 +201,15 @@ extern const char *host_net_devices[];
 extern const char *legacy_tftp_prefix;
 extern const char *legacy_bootp_filename;
 
-int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp);
+int net_client_init(QemuOpts *opts, bool is_netdev, Error *errp[static 1]);
 int net_client_parse(QemuOptsList *opts_list, const char *str);
 int net_init_clients(void);
 void net_check_clients(void);
 void net_cleanup(void);
 void hmp_host_net_add(Monitor *mon, const QDict *qdict);
 void hmp_host_net_remove(Monitor *mon, const QDict *qdict);
-void netdev_add(QemuOpts *opts, Error **errp);
-void qmp_netdev_add(QDict *qdict, QObject **ret, Error **errp);
+void netdev_add(QemuOpts *opts, Error *errp[static 1]);
+void qmp_netdev_add(QDict *qdict, QObject **ret, Error *errp[static 1]);
 
 int net_hub_id_for_client(NetClientState *nc, int *id);
 NetClientState *net_hub_port_find(int hub_id);
diff --git a/include/qapi/error.h b/include/qapi/error.h
index d1378396dd..449b09a741 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -283,7 +283,7 @@ void error_free(Error *err);
 /*
  * Convenience function to assert that *@errp is set, then silently free it.
  */
-void error_free_or_abort(Error **errp);
+void error_free_or_abort(Error *errp[static 1]);
 
 /*
  * Convenience function to error_report() and free @err.
diff --git a/include/qapi/qmp/json-parser.h b/include/qapi/qmp/json-parser.h
index 9987f8ca85..f926331eb2 100644
--- a/include/qapi/qmp/json-parser.h
+++ b/include/qapi/qmp/json-parser.h
@@ -18,6 +18,7 @@
 #include "qapi/qmp/qlist.h"
 
 QObject *json_parser_parse(GQueue *tokens, va_list *ap);
-QObject *json_parser_parse_err(GQueue *tokens, va_list *ap, Error **errp);
+QObject *json_parser_parse_err(GQueue *tokens, va_list *ap,
+			       Error *errp[static 1]);
 
 #endif
diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h
index 188440a6a8..4283f1f572 100644
--- a/include/qapi/qmp/qdict.h
+++ b/include/qapi/qmp/qdict.h
@@ -81,7 +81,7 @@ void qdict_flatten(QDict *qdict);
 void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start);
 void qdict_array_split(QDict *src, QList **dst);
 int qdict_array_entries(QDict *src, const char *subqdict);
-QObject *qdict_crumple(const QDict *src, Error **errp);
+QObject *qdict_crumple(const QDict *src, Error *errp[static 1]);
 
 void qdict_join(QDict *dest, QDict *src, bool overwrite);
 
diff --git a/include/qapi/qmp/qjson.h b/include/qapi/qmp/qjson.h
index 6e84082d5f..24ae99bd9e 100644
--- a/include/qapi/qmp/qjson.h
+++ b/include/qapi/qmp/qjson.h
@@ -17,9 +17,10 @@
 #include "qapi/qmp/qobject.h"
 #include "qapi/qmp/qstring.h"
 
-QObject *qobject_from_json(const char *string, Error **errp);
+QObject *qobject_from_json(const char *string, Error *errp[static 1]);
 QObject *qobject_from_jsonf(const char *string, ...) GCC_FMT_ATTR(1, 2);
-QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
+QObject *qobject_from_jsonv(const char *string, va_list *ap,
+			    Error *errp[static 1])
     GCC_FMT_ATTR(1, 0);
 
 QString *qobject_to_json(const QObject *obj);
diff --git a/include/qapi/qobject-input-visitor.h b/include/qapi/qobject-input-visitor.h
index b399285c43..756e0678c0 100644
--- a/include/qapi/qobject-input-visitor.h
+++ b/include/qapi/qobject-input-visitor.h
@@ -78,6 +78,6 @@ Visitor *qobject_input_visitor_new_keyval(QObject *obj);
  */
 Visitor *qobject_input_visitor_new_str(const char *str,
                                        const char *implied_key,
-                                       Error **errp);
+                                       Error *errp[static 1]);
 
 #endif
diff --git a/include/qapi/util.h b/include/qapi/util.h
index 7436ed815c..ab18c690af 100644
--- a/include/qapi/util.h
+++ b/include/qapi/util.h
@@ -12,7 +12,7 @@
 #define QAPI_UTIL_H
 
 int qapi_enum_parse(const char * const lookup[], const char *buf,
-                    int max, int def, Error **errp);
+                    int max, int def, Error *errp[static 1]);
 
 int parse_qapi_name(const char *name, bool complete);
 
diff --git a/include/qemu/base64.h b/include/qemu/base64.h
index 815d85267d..6c990a4433 100644
--- a/include/qemu/base64.h
+++ b/include/qemu/base64.h
@@ -52,7 +52,7 @@
 uint8_t *qbase64_decode(const char *input,
                         size_t in_len,
                         size_t *out_len,
-                        Error **errp);
+                        Error *errp[static 1]);
 
 
 #endif /* QEMU_BASE64_H */
diff --git a/include/qemu/config-file.h b/include/qemu/config-file.h
index c80d5c8a33..531c184218 100644
--- a/include/qemu/config-file.h
+++ b/include/qemu/config-file.h
@@ -5,7 +5,7 @@
 #include "qapi/qmp/qdict.h"
 
 QemuOptsList *qemu_find_opts(const char *group);
-QemuOptsList *qemu_find_opts_err(const char *group, Error **errp);
+QemuOptsList *qemu_find_opts_err(const char *group, Error *errp[static 1]);
 QemuOpts *qemu_find_opts_singleton(const char *group);
 
 void qemu_add_opts(QemuOptsList *list);
@@ -21,6 +21,6 @@ int qemu_read_config_file(const char *filename);
 /* Parse QDict options as a replacement for a config file (allowing multiple
    enumerated (0..(n-1)) configuration "sections") */
 void qemu_config_parse_qdict(QDict *options, QemuOptsList **lists,
-                             Error **errp);
+                             Error *errp[static 1]);
 
 #endif /* QEMU_CONFIG_FILE_H */
diff --git a/include/qemu/log.h b/include/qemu/log.h
index a50e994c21..787c53043c 100644
--- a/include/qemu/log.h
+++ b/include/qemu/log.h
@@ -123,8 +123,8 @@ extern const QEMULogItem qemu_log_items[];
 
 void qemu_set_log(int log_flags);
 void qemu_log_needs_buffers(void);
-void qemu_set_log_filename(const char *filename, Error **errp);
-void qemu_set_dfilter_ranges(const char *ranges, Error **errp);
+void qemu_set_log_filename(const char *filename, Error *errp[static 1]);
+void qemu_set_dfilter_ranges(const char *ranges, Error *errp[static 1]);
 bool qemu_log_in_addr_range(uint64_t addr);
 int qemu_str_to_log_mask(const char *str);
 
diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h
index d7e24af78d..1711896dd5 100644
--- a/include/qemu/main-loop.h
+++ b/include/qemu/main-loop.h
@@ -42,7 +42,7 @@
  *
  * In the case of QEMU tools, this will also start/initialize timers.
  */
-int qemu_init_main_loop(Error **errp);
+int qemu_init_main_loop(Error *errp[static 1]);
 
 /**
  * main_loop_wait: Run one iteration of the main loop.
diff --git a/include/qemu/option.h b/include/qemu/option.h
index f7338dbe80..b5b149866d 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -38,7 +38,7 @@ int get_param_value(char *buf, int buf_size,
 
 
 void parse_option_size(const char *name, const char *value,
-                       uint64_t *ret, Error **errp);
+                       uint64_t *ret, Error *errp[static 1]);
 bool has_help_option(const char *param);
 bool is_valid_option_list(const char *param);
 
@@ -89,16 +89,16 @@ uint64_t qemu_opt_get_size_del(QemuOpts *opts, const char *name,
                                uint64_t defval);
 int qemu_opt_unset(QemuOpts *opts, const char *name);
 void qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
-                  Error **errp);
+                  Error *errp[static 1]);
 void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
-                       Error **errp);
+                       Error *errp[static 1]);
 void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
-                         Error **errp);
+                         Error *errp[static 1]);
 typedef int (*qemu_opt_loopfunc)(void *opaque,
                                  const char *name, const char *value,
                                  Error **errp);
 int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
-                     Error **errp);
+                     Error *errp[static 1]);
 
 typedef struct {
     QemuOpts *opts;
@@ -111,37 +111,39 @@ const char *qemu_opt_iter_next(QemuOptsIter *iter);
 
 QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id);
 QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
-                           int fail_if_exists, Error **errp);
+                           int fail_if_exists, Error *errp[static 1]);
 void qemu_opts_reset(QemuOptsList *list);
 void qemu_opts_loc_restore(QemuOpts *opts);
 void qemu_opts_set(QemuOptsList *list, const char *id,
-                   const char *name, const char *value, Error **errp);
+                   const char *name, const char *value, Error *errp[static 1]);
 const char *qemu_opts_id(QemuOpts *opts);
 void qemu_opts_set_id(QemuOpts *opts, char *id);
 void qemu_opts_del(QemuOpts *opts);
-void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp);
+void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc,
+			Error *errp[static 1]);
 void qemu_opts_do_parse(QemuOpts *opts, const char *params,
-                        const char *firstname, Error **errp);
+                        const char *firstname, Error *errp[static 1]);
 QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, const char *params,
                                   bool permit_abbrev);
 QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params,
-                          bool permit_abbrev, Error **errp);
+                          bool permit_abbrev, Error *errp[static 1]);
 void qemu_opts_set_defaults(QemuOptsList *list, const char *params,
                             int permit_abbrev);
 QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
-                               Error **errp);
+                               Error *errp[static 1]);
 QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
-void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
+void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict,
+			    Error *errp[static 1]);
 
 typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error **errp);
 int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
-                      void *opaque, Error **errp);
+                      void *opaque, Error *errp[static 1]);
 void qemu_opts_print(QemuOpts *opts, const char *sep);
 void qemu_opts_print_help(QemuOptsList *list);
 void qemu_opts_free(QemuOptsList *list);
 QemuOptsList *qemu_opts_append(QemuOptsList *dst, QemuOptsList *list);
 
 QDict *keyval_parse(const char *params, const char *implied_key,
-                    Error **errp);
+                    Error *errp[static 1]);
 
 #endif
diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h
index 5c326db232..703e94ef47 100644
--- a/include/qemu/sockets.h
+++ b/include/qemu/sockets.h
@@ -33,24 +33,26 @@ int socket_set_fast_reuse(int fd);
 typedef void NonBlockingConnectHandler(int fd, Error *err, void *opaque);
 
 int inet_ai_family_from_address(InetSocketAddress *addr,
-                                Error **errp);
-int inet_parse(InetSocketAddress *addr, const char *str, Error **errp);
-int inet_connect(const char *str, Error **errp);
+                                Error *errp[static 1]);
+int inet_parse(InetSocketAddress *addr, const char *str,
+	       Error *errp[static 1]);
+int inet_connect(const char *str, Error *errp[static 1]);
 int inet_connect_saddr(InetSocketAddress *saddr,
                        NonBlockingConnectHandler *callback, void *opaque,
-                       Error **errp);
+                       Error *errp[static 1]);
 
 NetworkAddressFamily inet_netfamily(int family);
 
-int unix_listen(const char *path, char *ostr, int olen, Error **errp);
-int unix_connect(const char *path, Error **errp);
+int unix_listen(const char *path, char *ostr, int olen, Error *errp[static 1]);
+int unix_connect(const char *path, Error *errp[static 1]);
 
-SocketAddress *socket_parse(const char *str, Error **errp);
+SocketAddress *socket_parse(const char *str, Error *errp[static 1]);
 int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
-                   void *opaque, Error **errp);
-int socket_listen(SocketAddress *addr, Error **errp);
-void socket_listen_cleanup(int fd, Error **errp);
-int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp);
+                   void *opaque, Error *errp[static 1]);
+int socket_listen(SocketAddress *addr, Error *errp[static 1]);
+void socket_listen_cleanup(int fd, Error *errp[static 1]);
+int socket_dgram(SocketAddress *remote, SocketAddress *local,
+		 Error *errp[static 1]);
 
 /* Old, ipv4 only bits.  Don't use for new code. */
 int parse_host_port(struct sockaddr_in *saddr, const char *str);
@@ -73,7 +75,7 @@ int socket_init(void);
 SocketAddress *
 socket_sockaddr_to_address(struct sockaddr_storage *sa,
                            socklen_t salen,
-                           Error **errp);
+                           Error *errp[static 1]);
 
 /**
  * socket_local_address:
@@ -88,7 +90,7 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddress *socket_local_address(int fd, Error **errp);
+SocketAddress *socket_local_address(int fd, Error *errp[static 1]);
 
 /**
  * socket_remote_address:
@@ -103,7 +105,7 @@ SocketAddress *socket_local_address(int fd, Error **errp);
  *
  * Returns: the socket address struct, or NULL on error
  */
-SocketAddress *socket_remote_address(int fd, Error **errp);
+SocketAddress *socket_remote_address(int fd, Error *errp[static 1]);
 
 /**
  * socket_address_to_string:
@@ -118,7 +120,8 @@ SocketAddress *socket_remote_address(int fd, Error **errp);
  *
  * Returns: the socket address in string format, or NULL on error
  */
-char *socket_address_to_string(struct SocketAddress *addr, Error **errp);
+char *socket_address_to_string(struct SocketAddress *addr,
+			       Error *errp[static 1]);
 
 /**
  * socket_address_flatten:
diff --git a/include/qemu/throttle.h b/include/qemu/throttle.h
index 9109657609..d7c4c058f5 100644
--- a/include/qemu/throttle.h
+++ b/include/qemu/throttle.h
@@ -136,7 +136,7 @@ bool throttle_timers_are_initialized(ThrottleTimers *tt);
 /* configuration */
 bool throttle_enabled(ThrottleConfig *cfg);
 
-bool throttle_is_valid(ThrottleConfig *cfg, Error **errp);
+bool throttle_is_valid(ThrottleConfig *cfg, Error *errp[static 1]);
 
 void throttle_config(ThrottleState *ts,
                      ThrottleTimers *tt,
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 89ddb686fb..f048419a9f 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -446,7 +446,7 @@ bool cpu_paging_enabled(const CPUState *cpu);
  * @errp: Pointer for reporting an #Error.
  */
 void cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list,
-                            Error **errp);
+                            Error *errp[static 1]);
 
 /**
  * cpu_write_elf64_note:
@@ -1002,7 +1002,7 @@ AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx);
 void QEMU_NORETURN cpu_abort(CPUState *cpu, const char *fmt, ...)
     GCC_FMT_ATTR(2, 3);
 void cpu_exec_initfn(CPUState *cpu);
-void cpu_exec_realizefn(CPUState *cpu, Error **errp);
+void cpu_exec_realizefn(CPUState *cpu, Error *errp[static 1]);
 void cpu_exec_unrealizefn(CPUState *cpu);
 
 #ifdef CONFIG_SOFTMMU
diff --git a/include/qom/object.h b/include/qom/object.h
index cd0f412ce9..6775b7c4d2 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -913,16 +913,16 @@ ObjectProperty *object_property_add(Object *obj, const char *name,
                                     ObjectPropertyAccessor *get,
                                     ObjectPropertyAccessor *set,
                                     ObjectPropertyRelease *release,
-                                    void *opaque, Error **errp);
+                                    void *opaque, Error *errp[static 1]);
 
-void object_property_del(Object *obj, const char *name, Error **errp);
+void object_property_del(Object *obj, const char *name, Error *errp[static 1]);
 
 ObjectProperty *object_class_property_add(ObjectClass *klass, const char *name,
                                           const char *type,
                                           ObjectPropertyAccessor *get,
                                           ObjectPropertyAccessor *set,
                                           ObjectPropertyRelease *release,
-                                          void *opaque, Error **errp);
+                                          void *opaque, Error *errp[static 1]);
 
 /**
  * object_property_find:
@@ -933,9 +933,9 @@ ObjectProperty *object_class_property_add(ObjectClass *klass, const char *name,
  * Look up a property for an object and return its #ObjectProperty if found.
  */
 ObjectProperty *object_property_find(Object *obj, const char *name,
-                                     Error **errp);
+                                     Error *errp[static 1]);
 ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
-                                           Error **errp);
+                                           Error *errp[static 1]);
 
 typedef struct ObjectPropertyIterator {
     ObjectClass *nextclass;
@@ -997,7 +997,7 @@ void object_unparent(Object *obj);
  * Reads a property from a object.
  */
 void object_property_get(Object *obj, Visitor *v, const char *name,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 /**
  * object_property_set_str:
@@ -1008,7 +1008,7 @@ void object_property_get(Object *obj, Visitor *v, const char *name,
  * Writes a string value to a property.
  */
 void object_property_set_str(Object *obj, const char *value,
-                             const char *name, Error **errp);
+                             const char *name, Error *errp[static 1]);
 
 /**
  * object_property_get_str:
@@ -1021,7 +1021,7 @@ void object_property_set_str(Object *obj, const char *value,
  * The caller should free the string.
  */
 char *object_property_get_str(Object *obj, const char *name,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 /**
  * object_property_set_link:
@@ -1032,7 +1032,7 @@ char *object_property_get_str(Object *obj, const char *name,
  * Writes an object's canonical path to a property.
  */
 void object_property_set_link(Object *obj, Object *value,
-                              const char *name, Error **errp);
+                              const char *name, Error *errp[static 1]);
 
 /**
  * object_property_get_link:
@@ -1045,7 +1045,7 @@ void object_property_set_link(Object *obj, Object *value,
  * string or not a valid object path).
  */
 Object *object_property_get_link(Object *obj, const char *name,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 
 /**
  * object_property_set_bool:
@@ -1056,7 +1056,7 @@ Object *object_property_get_link(Object *obj, const char *name,
  * Writes a bool value to a property.
  */
 void object_property_set_bool(Object *obj, bool value,
-                              const char *name, Error **errp);
+                              const char *name, Error *errp[static 1]);
 
 /**
  * object_property_get_bool:
@@ -1068,7 +1068,7 @@ void object_property_set_bool(Object *obj, bool value,
  * an error occurs (including when the property value is not a bool).
  */
 bool object_property_get_bool(Object *obj, const char *name,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 /**
  * object_property_set_int:
@@ -1079,7 +1079,7 @@ bool object_property_get_bool(Object *obj, const char *name,
  * Writes an integer value to a property.
  */
 void object_property_set_int(Object *obj, int64_t value,
-                             const char *name, Error **errp);
+                             const char *name, Error *errp[static 1]);
 
 /**
  * object_property_get_int:
@@ -1091,7 +1091,7 @@ void object_property_set_int(Object *obj, int64_t value,
  * an error occurs (including when the property value is not an integer).
  */
 int64_t object_property_get_int(Object *obj, const char *name,
-                                Error **errp);
+                                Error *errp[static 1]);
 
 /**
  * object_property_get_enum:
@@ -1105,7 +1105,7 @@ int64_t object_property_get_int(Object *obj, const char *name,
  * an enum).
  */
 int object_property_get_enum(Object *obj, const char *name,
-                             const char *typename, Error **errp);
+                             const char *typename, Error *errp[static 1]);
 
 /**
  * object_property_get_uint16List:
@@ -1119,7 +1119,7 @@ int object_property_get_enum(Object *obj, const char *name,
  * an list of integers).
  */
 void object_property_get_uint16List(Object *obj, const char *name,
-                                    uint16List **list, Error **errp);
+                                    uint16List **list, Error *errp[static 1]);
 
 /**
  * object_property_set:
@@ -1133,7 +1133,7 @@ void object_property_get_uint16List(Object *obj, const char *name,
  * Writes a property to a object.
  */
 void object_property_set(Object *obj, Visitor *v, const char *name,
-                         Error **errp);
+                         Error *errp[static 1]);
 
 /**
  * object_property_parse:
@@ -1145,7 +1145,7 @@ void object_property_set(Object *obj, Visitor *v, const char *name,
  * Parses a string and writes the result into a property of an object.
  */
 void object_property_parse(Object *obj, const char *string,
-                           const char *name, Error **errp);
+                           const char *name, Error *errp[static 1]);
 
 /**
  * object_property_print:
@@ -1158,7 +1158,7 @@ void object_property_parse(Object *obj, const char *string,
  * caller shall free the string.
  */
 char *object_property_print(Object *obj, const char *name, bool human,
-                            Error **errp);
+                            Error *errp[static 1]);
 
 /**
  * object_property_get_type:
@@ -1169,7 +1169,7 @@ char *object_property_print(Object *obj, const char *name, bool human,
  * Returns:  The type name of the property.
  */
 const char *object_property_get_type(Object *obj, const char *name,
-                                     Error **errp);
+                                     Error *errp[static 1]);
 
 /**
  * object_get_root:
@@ -1282,7 +1282,7 @@ Object *object_resolve_path_component(Object *parent, const gchar *part);
  * The child object itself can be retrieved using object_property_get_link().
  */
 void object_property_add_child(Object *obj, const char *name,
-                               Object *child, Error **errp);
+                               Object *child, Error *errp[static 1]);
 
 typedef enum {
     /* Unref the link pointer when the property is deleted */
@@ -1332,7 +1332,7 @@ void object_property_add_link(Object *obj, const char *name,
                               void (*check)(Object *obj, const char *name,
                                             Object *val, Error **errp),
                               ObjectPropertyLinkFlags flags,
-                              Error **errp);
+                              Error *errp[static 1]);
 
 /**
  * object_property_add_str:
@@ -1349,13 +1349,13 @@ void object_property_add_link(Object *obj, const char *name,
 void object_property_add_str(Object *obj, const char *name,
                              char *(*get)(Object *, Error **),
                              void (*set)(Object *, const char *, Error **),
-                             Error **errp);
+                             Error *errp[static 1]);
 
 void object_class_property_add_str(ObjectClass *klass, const char *name,
                                    char *(*get)(Object *, Error **),
                                    void (*set)(Object *, const char *,
                                                Error **),
-                                   Error **errp);
+                                   Error *errp[static 1]);
 
 /**
  * object_property_add_bool:
@@ -1371,12 +1371,12 @@ void object_class_property_add_str(ObjectClass *klass, const char *name,
 void object_property_add_bool(Object *obj, const char *name,
                               bool (*get)(Object *, Error **),
                               void (*set)(Object *, bool, Error **),
-                              Error **errp);
+                              Error *errp[static 1]);
 
 void object_class_property_add_bool(ObjectClass *klass, const char *name,
                                     bool (*get)(Object *, Error **),
                                     void (*set)(Object *, bool, Error **),
-                                    Error **errp);
+                                    Error *errp[static 1]);
 
 /**
  * object_property_add_enum:
@@ -1395,14 +1395,14 @@ void object_property_add_enum(Object *obj, const char *name,
                               const char * const *strings,
                               int (*get)(Object *, Error **),
                               void (*set)(Object *, int, Error **),
-                              Error **errp);
+                              Error *errp[static 1]);
 
 void object_class_property_add_enum(ObjectClass *klass, const char *name,
                                     const char *typename,
                                     const char * const *strings,
                                     int (*get)(Object *, Error **),
                                     void (*set)(Object *, int, Error **),
-                                    Error **errp);
+                                    Error *errp[static 1]);
 
 /**
  * object_property_add_tm:
@@ -1416,11 +1416,11 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
  */
 void object_property_add_tm(Object *obj, const char *name,
                             void (*get)(Object *, struct tm *, Error **),
-                            Error **errp);
+                            Error *errp[static 1]);
 
 void object_class_property_add_tm(ObjectClass *klass, const char *name,
                                   void (*get)(Object *, struct tm *, Error **),
-                                  Error **errp);
+                                  Error *errp[static 1]);
 
 /**
  * object_property_add_uint8_ptr:
@@ -1433,9 +1433,10 @@ void object_class_property_add_tm(ObjectClass *klass, const char *name,
  * property of type 'uint8'.
  */
 void object_property_add_uint8_ptr(Object *obj, const char *name,
-                                   const uint8_t *v, Error **errp);
+                                   const uint8_t *v, Error *errp[static 1]);
 void object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
-                                         const uint8_t *v, Error **errp);
+                                         const uint8_t *v,
+                                         Error *errp[static 1]);
 
 /**
  * object_property_add_uint16_ptr:
@@ -1448,9 +1449,10 @@ void object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
  * property of type 'uint16'.
  */
 void object_property_add_uint16_ptr(Object *obj, const char *name,
-                                    const uint16_t *v, Error **errp);
+                                    const uint16_t *v, Error *errp[static 1]);
 void object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
-                                          const uint16_t *v, Error **errp);
+                                          const uint16_t *v,
+                                          Error *errp[static 1]);
 
 /**
  * object_property_add_uint32_ptr:
@@ -1463,9 +1465,10 @@ void object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
  * property of type 'uint32'.
  */
 void object_property_add_uint32_ptr(Object *obj, const char *name,
-                                    const uint32_t *v, Error **errp);
+                                    const uint32_t *v, Error *errp[static 1]);
 void object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
-                                          const uint32_t *v, Error **errp);
+                                          const uint32_t *v,
+                                          Error *errp[static 1]);
 
 /**
  * object_property_add_uint64_ptr:
@@ -1478,9 +1481,10 @@ void object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
  * property of type 'uint64'.
  */
 void object_property_add_uint64_ptr(Object *obj, const char *name,
-                                    const uint64_t *v, Error **Errp);
+                                    const uint64_t *v, Error *Errp[static 1]);
 void object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
-                                          const uint64_t *v, Error **Errp);
+                                          const uint64_t *v,
+                                          Error *Errp[static 1]);
 
 /**
  * object_property_add_alias:
@@ -1500,7 +1504,7 @@ void object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
  */
 void object_property_add_alias(Object *obj, const char *name,
                                Object *target_obj, const char *target_name,
-                               Error **errp);
+                               Error *errp[static 1]);
 
 /**
  * object_property_add_const_link:
@@ -1518,7 +1522,7 @@ void object_property_add_alias(Object *obj, const char *name,
  * taking a reference.
  */
 void object_property_add_const_link(Object *obj, const char *name,
-                                    Object *target, Error **errp);
+                                    Object *target, Error *errp[static 1]);
 
 /**
  * object_property_set_description:
@@ -1531,10 +1535,11 @@ void object_property_add_const_link(Object *obj, const char *name,
  *
  */
 void object_property_set_description(Object *obj, const char *name,
-                                     const char *description, Error **errp);
+                                     const char *description,
+                                     Error *errp[static 1]);
 void object_class_property_set_description(ObjectClass *klass, const char *name,
                                            const char *description,
-                                           Error **errp);
+                                           Error *errp[static 1]);
 
 /**
  * object_child_foreach:
diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index fdd7603c84..7326a93bcf 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -63,7 +63,7 @@ typedef struct UserCreatableClass {
  * from implements USER_CREATABLE interface, otherwise the call does
  * nothing.
  */
-void user_creatable_complete(Object *obj, Error **errp);
+void user_creatable_complete(Object *obj, Error *errp[static 1]);
 
 /**
  * user_creatable_can_be_deleted:
@@ -73,7 +73,7 @@ void user_creatable_complete(Object *obj, Error **errp);
  * Wrapper to call can_be_deleted() method if one of types it's inherited
  * from implements USER_CREATABLE interface.
  */
-bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp);
+bool user_creatable_can_be_deleted(UserCreatable *uc, Error *errp[static 1]);
 
 /**
  * user_creatable_add_type:
@@ -91,7 +91,7 @@ bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp);
  */
 Object *user_creatable_add_type(const char *type, const char *id,
                                 const QDict *qdict,
-                                Visitor *v, Error **errp);
+                                Visitor *v, Error *errp[static 1]);
 
 /**
  * user_creatable_add_opts:
@@ -106,7 +106,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
  *
  * Returns: the newly created object or NULL on error
  */
-Object *user_creatable_add_opts(QemuOpts *opts, Error **errp);
+Object *user_creatable_add_opts(QemuOpts *opts, Error *errp[static 1]);
 
 
 /**
@@ -136,7 +136,7 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
  * Returns: 0 on success, -1 when an error was reported.
  */
 int user_creatable_add_opts_foreach(void *opaque,
-                                    QemuOpts *opts, Error **errp);
+                                    QemuOpts *opts, Error *errp[static 1]);
 
 /**
  * user_creatable_del:
@@ -146,6 +146,6 @@ int user_creatable_add_opts_foreach(void *opaque,
  * Delete an instance of the user creatable object identified
  * by @id.
  */
-void user_creatable_del(const char *id, Error **errp);
+void user_creatable_del(const char *id, Error *errp[static 1]);
 
 #endif
diff --git a/include/qom/qom-qobject.h b/include/qom/qom-qobject.h
index 3d49d26681..fc590222f3 100644
--- a/include/qom/qom-qobject.h
+++ b/include/qom/qom-qobject.h
@@ -26,7 +26,7 @@
  * an error occurs.
  */
 struct QObject *object_property_get_qobject(Object *obj, const char *name,
-                                            Error **errp);
+                                            Error *errp[static 1]);
 
 /**
  * object_property_set_qobject:
@@ -38,6 +38,6 @@ struct QObject *object_property_get_qobject(Object *obj, const char *name,
  * Writes a property to a object.
  */
 void object_property_set_qobject(Object *obj, struct QObject *qobj,
-                                 const char *name, Error **errp);
+                                 const char *name, Error *errp[static 1]);
 
 #endif
diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h
index 8751c468ed..31217a15da 100644
--- a/include/sysemu/arch_init.h
+++ b/include/sysemu/arch_init.h
@@ -31,15 +31,15 @@ extern const uint32_t arch_type;
 int kvm_available(void);
 int xen_available(void);
 
-CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp);
+CpuDefinitionInfoList *arch_query_cpu_definitions(Error *errp[static 1]);
 CpuModelExpansionInfo *arch_query_cpu_model_expansion(CpuModelExpansionType type,
                                                       CpuModelInfo *mode,
-                                                      Error **errp);
+                                                      Error *errp[static 1]);
 CpuModelCompareInfo *arch_query_cpu_model_comparison(CpuModelInfo *modela,
                                                      CpuModelInfo *modelb,
-                                                     Error **errp);
+                                                     Error *errp[static 1]);
 CpuModelBaselineInfo *arch_query_cpu_model_baseline(CpuModelInfo *modela,
                                                     CpuModelInfo *modelb,
-                                                    Error **errp);
+                                                    Error *errp[static 1]);
 
 #endif
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
index 840ad6134c..88631cc604 100644
--- a/include/sysemu/block-backend.h
+++ b/include/sysemu/block-backend.h
@@ -94,7 +94,7 @@ typedef struct BlockBackendPublic {
 
 BlockBackend *blk_new(uint64_t perm, uint64_t shared_perm);
 BlockBackend *blk_new_open(const char *filename, const char *reference,
-                           QDict *options, int flags, Error **errp);
+                           QDict *options, int flags, Error *errp[static 1]);
 int blk_get_refcnt(BlockBackend *blk);
 void blk_ref(BlockBackend *blk);
 void blk_unref(BlockBackend *blk);
@@ -102,7 +102,8 @@ void blk_remove_all_bs(void);
 const char *blk_name(const BlockBackend *blk);
 BlockBackend *blk_by_name(const char *name);
 BlockBackend *blk_next(BlockBackend *blk);
-bool monitor_add_blk(BlockBackend *blk, const char *name, Error **errp);
+bool monitor_add_blk(BlockBackend *blk, const char *name,
+		     Error *errp[static 1]);
 void monitor_remove_blk(BlockBackend *blk);
 
 BlockBackendPublic *blk_get_public(BlockBackend *blk);
@@ -110,11 +111,12 @@ BlockBackend *blk_by_public(BlockBackendPublic *public);
 
 BlockDriverState *blk_bs(BlockBackend *blk);
 void blk_remove_bs(BlockBackend *blk);
-int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp);
+int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs,
+		  Error *errp[static 1]);
 bool bdrv_has_blk(BlockDriverState *bs);
 bool bdrv_is_root_node(BlockDriverState *bs);
 int blk_set_perm(BlockBackend *blk, uint64_t perm, uint64_t shared_perm,
-                 Error **errp);
+                 Error *errp[static 1]);
 void blk_get_perm(BlockBackend *blk, uint64_t *perm, uint64_t *shared_perm);
 
 void blk_set_allow_write_beyond_eof(BlockBackend *blk, bool allow);
@@ -129,7 +131,7 @@ void blk_attach_dev_legacy(BlockBackend *blk, void *dev);
 void blk_detach_dev(BlockBackend *blk, void *dev);
 void *blk_get_attached_dev(BlockBackend *blk);
 BlockBackend *blk_by_dev(void *dev);
-BlockBackend *blk_by_qdev_id(const char *id, Error **errp);
+BlockBackend *blk_by_qdev_id(const char *id, Error *errp[static 1]);
 void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaque);
 int blk_pread_unthrottled(BlockBackend *blk, int64_t offset, uint8_t *buf,
                           int count);
@@ -184,7 +186,7 @@ int blk_is_read_only(BlockBackend *blk);
 int blk_is_sg(BlockBackend *blk);
 int blk_enable_write_cache(BlockBackend *blk);
 void blk_set_enable_write_cache(BlockBackend *blk, bool wce);
-void blk_invalidate_cache(BlockBackend *blk, Error **errp);
+void blk_invalidate_cache(BlockBackend *blk, Error *errp[static 1]);
 bool blk_is_inserted(BlockBackend *blk);
 bool blk_is_available(BlockBackend *blk);
 void blk_lock_medium(BlockBackend *blk, bool locked);
@@ -195,7 +197,8 @@ int blk_get_max_iov(BlockBackend *blk);
 void blk_set_guest_block_size(BlockBackend *blk, int align);
 void *blk_try_blockalign(BlockBackend *blk, size_t size);
 void *blk_blockalign(BlockBackend *blk, size_t size);
-bool blk_op_is_blocked(BlockBackend *blk, BlockOpType op, Error **errp);
+bool blk_op_is_blocked(BlockBackend *blk, BlockOpType op,
+		       Error *errp[static 1]);
 void blk_op_unblock(BlockBackend *blk, BlockOpType op, Error *reason);
 void blk_op_block_all(BlockBackend *blk, Error *reason);
 void blk_op_unblock_all(BlockBackend *blk, Error *reason);
@@ -225,7 +228,7 @@ int coroutine_fn blk_co_pwrite_zeroes(BlockBackend *blk, int64_t offset,
                                       int count, BdrvRequestFlags flags);
 int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, const void *buf,
                           int count);
-int blk_truncate(BlockBackend *blk, int64_t offset, Error **errp);
+int blk_truncate(BlockBackend *blk, int64_t offset, Error *errp[static 1]);
 int blk_pdiscard(BlockBackend *blk, int64_t offset, int count);
 int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf,
                      int64_t pos, int size);
diff --git a/include/sysemu/cpus.h b/include/sysemu/cpus.h
index 731756d948..72d0fdccf9 100644
--- a/include/sysemu/cpus.h
+++ b/include/sysemu/cpus.h
@@ -11,7 +11,7 @@ void pause_all_vcpus(void);
 void cpu_stop_current(void);
 void cpu_ticks_init(void);
 
-void configure_icount(QemuOpts *opts, Error **errp);
+void configure_icount(QemuOpts *opts, Error *errp[static 1]);
 extern int use_icount;
 extern int icount_align_option;
 
@@ -40,6 +40,6 @@ extern int smp_threads;
 
 void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg);
 
-void qemu_tcg_configure(QemuOpts *opts, Error **errp);
+void qemu_tcg_configure(QemuOpts *opts, Error *errp[static 1]);
 
 #endif
diff --git a/include/sysemu/cryptodev.h b/include/sysemu/cryptodev.h
index a9d0d1ee25..9c9bff41f9 100644
--- a/include/sysemu/cryptodev.h
+++ b/include/sysemu/cryptodev.h
@@ -244,7 +244,7 @@ void cryptodev_backend_free_client(
  */
 void cryptodev_backend_cleanup(
            CryptoDevBackend *backend,
-           Error **errp);
+           Error *errp[static 1]);
 
 /**
  * cryptodev_backend_sym_create_session:
@@ -260,7 +260,7 @@ void cryptodev_backend_cleanup(
 int64_t cryptodev_backend_sym_create_session(
            CryptoDevBackend *backend,
            CryptoDevBackendSymSessionInfo *sess_info,
-           uint32_t queue_index, Error **errp);
+           uint32_t queue_index, Error *errp[static 1]);
 
 /**
  * cryptodev_backend_sym_close_session:
@@ -277,7 +277,7 @@ int64_t cryptodev_backend_sym_create_session(
 int cryptodev_backend_sym_close_session(
            CryptoDevBackend *backend,
            uint64_t session_id,
-           uint32_t queue_index, Error **errp);
+           uint32_t queue_index, Error *errp[static 1]);
 
 /**
  * cryptodev_backend_crypto_operation:
@@ -295,7 +295,7 @@ int cryptodev_backend_sym_close_session(
 int cryptodev_backend_crypto_operation(
                  CryptoDevBackend *backend,
                  void *opaque,
-                 uint32_t queue_index, Error **errp);
+                 uint32_t queue_index, Error *errp[static 1]);
 
 /**
  * cryptodev_backend_set_used:
diff --git a/include/sysemu/device_tree.h b/include/sysemu/device_tree.h
index e22e5bec9c..9e3f57d5f8 100644
--- a/include/sysemu/device_tree.h
+++ b/include/sysemu/device_tree.h
@@ -41,7 +41,7 @@ void *load_device_tree_from_sysfs(void);
  * was encountered when parsing the blob, the function returns NULL
  */
 char **qemu_fdt_node_path(void *fdt, const char *name, char *compat,
-                          Error **errp);
+                          Error *errp[static 1]);
 
 int qemu_fdt_setprop(void *fdt, const char *node_path,
                      const char *property, const void *val, int size);
@@ -66,7 +66,7 @@ int qemu_fdt_setprop_phandle(void *fdt, const char *node_path,
  */
 const void *qemu_fdt_getprop(void *fdt, const char *node_path,
                              const char *property, int *lenp,
-                             Error **errp);
+                             Error *errp[static 1]);
 /**
  * qemu_fdt_getprop_cell: retrieve the value of a given 4 byte property
  * @fdt: pointer to the device tree blob
@@ -80,7 +80,7 @@ const void *qemu_fdt_getprop(void *fdt, const char *node_path,
  */
 uint32_t qemu_fdt_getprop_cell(void *fdt, const char *node_path,
                                const char *property, int *lenp,
-                               Error **errp);
+                               Error *errp[static 1]);
 uint32_t qemu_fdt_get_phandle(void *fdt, const char *path);
 uint32_t qemu_fdt_alloc_phandle(void *fdt);
 int qemu_fdt_nop_node(void *fdt, const char *node_path);
diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index ed6a437f4d..9c3ce9706d 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -64,7 +64,7 @@ struct HostMemoryBackend {
 
 bool host_memory_backend_mr_inited(HostMemoryBackend *backend);
 MemoryRegion *host_memory_backend_get_memory(HostMemoryBackend *backend,
-                                             Error **errp);
+                                             Error *errp[static 1]);
 
 void host_memory_backend_set_mapped(HostMemoryBackend *backend, bool mapped);
 bool host_memory_backend_is_mapped(HostMemoryBackend *backend);
diff --git a/include/sysemu/memory_mapping.h b/include/sysemu/memory_mapping.h
index 706152d533..ca65337a31 100644
--- a/include/sysemu/memory_mapping.h
+++ b/include/sysemu/memory_mapping.h
@@ -73,7 +73,7 @@ void guest_phys_blocks_append(GuestPhysBlockList *list);
 
 void qemu_get_guest_memory_mapping(MemoryMappingList *list,
                                    const GuestPhysBlockList *guest_phys_blocks,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 
 /* get guest's memory mapping without do paging(virtual address is 0). */
 void qemu_get_guest_simple_memory_mapping(MemoryMappingList *list,
diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
index 610eece211..d46d8431c8 100644
--- a/include/sysemu/numa.h
+++ b/include/sysemu/numa.h
@@ -30,10 +30,11 @@ void query_numa_node_mem(uint64_t node_mem[]);
 extern QemuOptsList qemu_numa_opts;
 void numa_set_mem_node_id(ram_addr_t addr, uint64_t size, uint32_t node);
 void numa_unset_mem_node_id(ram_addr_t addr, uint64_t size, uint32_t node);
-uint32_t numa_get_node(ram_addr_t addr, Error **errp);
+uint32_t numa_get_node(ram_addr_t addr, Error *errp[static 1]);
 void numa_legacy_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
                                  int nb_nodes, ram_addr_t size);
 void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
                                   int nb_nodes, ram_addr_t size);
-void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev, Error **errp);
+void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev,
+		       Error *errp[static 1]);
 #endif
diff --git a/include/sysemu/qtest.h b/include/sysemu/qtest.h
index 70aa40aa72..68a28b4f2b 100644
--- a/include/sysemu/qtest.h
+++ b/include/sysemu/qtest.h
@@ -25,7 +25,8 @@ static inline bool qtest_enabled(void)
 
 bool qtest_driver(void);
 
-void qtest_init(const char *qtest_chrdev, const char *qtest_log, Error **errp);
+void qtest_init(const char *qtest_chrdev, const char *qtest_log,
+		Error *errp[static 1]);
 
 static inline int qtest_available(void)
 {
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 9841a527a1..1617b25d49 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -176,19 +176,19 @@ void add_boot_device_path(int32_t bootindex, DeviceState *dev,
 char *get_boot_devices_list(size_t *size, bool ignore_suffixes);
 
 DeviceState *get_boot_device(uint32_t position);
-void check_boot_index(int32_t bootindex, Error **errp);
+void check_boot_index(int32_t bootindex, Error *errp[static 1]);
 void del_boot_device_path(DeviceState *dev, const char *suffix);
 void device_add_bootindex_property(Object *obj, int32_t *bootindex,
                                    const char *name, const char *suffix,
-                                   DeviceState *dev, Error **errp);
+                                   DeviceState *dev, Error *errp[static 1]);
 void restore_boot_order(void *opaque);
-void validate_bootdevices(const char *devices, Error **errp);
+void validate_bootdevices(const char *devices, Error *errp[static 1]);
 
 /* handler to set the boot_device order for a specific type of MachineClass */
 typedef void QEMUBootSetHandler(void *opaque, const char *boot_order,
-                                Error **errp);
+                                Error *errp[static 1]);
 void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque);
-void qemu_boot_set(const char *boot_order, Error **errp);
+void qemu_boot_set(const char *boot_order, Error *errp[static 1]);
 
 QemuOpts *qemu_get_machine_opts(void);
 
diff --git a/include/sysemu/tpm_backend.h b/include/sysemu/tpm_backend.h
index b58f52d39f..8dcff421a4 100644
--- a/include/sysemu/tpm_backend.h
+++ b/include/sysemu/tpm_backend.h
@@ -211,7 +211,7 @@ int tpm_backend_reset_tpm_established_flag(TPMBackend *s, uint8_t locty);
  * This function will open the backend if it is not already open.  Calling this
  * function on an already opened backend will not result in an error.
  */
-void tpm_backend_open(TPMBackend *s, Error **errp);
+void tpm_backend_open(TPMBackend *s, Error *errp[static 1]);
 
 /**
  * tpm_backend_get_tpm_version:
diff --git a/include/ui/console.h b/include/ui/console.h
index 7262bef6d3..bb6fcfec57 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -388,7 +388,8 @@ void qemu_console_early_init(void);
 QemuConsole *qemu_console_lookup_by_index(unsigned int index);
 QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head);
 QemuConsole *qemu_console_lookup_by_device_name(const char *device_id,
-                                                uint32_t head, Error **errp);
+                                                uint32_t head,
+                                                Error *errp[static 1]);
 bool qemu_console_is_visible(QemuConsole *con);
 bool qemu_console_is_graphic(QemuConsole *con);
 bool qemu_console_is_fixedsize(QemuConsole *con);
@@ -463,13 +464,13 @@ static inline void cocoa_display_init(DisplayState *ds, int full_screen)
 
 /* vnc.c */
 void vnc_display_init(const char *id);
-void vnc_display_open(const char *id, Error **errp);
+void vnc_display_open(const char *id, Error *errp[static 1]);
 void vnc_display_add_client(const char *id, int csock, bool skipauth);
 #ifdef CONFIG_VNC
 int vnc_display_password(const char *id, const char *password);
 int vnc_display_pw_expire(const char *id, time_t expires);
-QemuOpts *vnc_parse(const char *str, Error **errp);
-int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp);
+QemuOpts *vnc_parse(const char *str, Error *errp[static 1]);
+int vnc_init_func(void *opaque, QemuOpts *opts, Error *errp[static 1]);
 #else
 static inline int vnc_display_password(const char *id, const char *password)
 {
@@ -479,12 +480,13 @@ static inline int vnc_display_pw_expire(const char *id, time_t expires)
 {
     return -ENODEV;
 };
-static inline QemuOpts *vnc_parse(const char *str, Error **errp)
+static inline QemuOpts *vnc_parse(const char *str, Error *errp[static 1])
 {
     error_setg(errp, "VNC support is disabled");
     return NULL;
 }
-static inline int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
+static inline int vnc_init_func(void *opaque, QemuOpts *opts,
+                                Error *errp[static 1])
 {
     error_setg(errp, "VNC support is disabled");
     return -1;
diff --git a/include/ui/input.h b/include/ui/input.h
index 3cfd0f3363..6b3a2e5420 100644
--- a/include/ui/input.h
+++ b/include/ui/input.h
@@ -32,7 +32,7 @@ void qemu_input_handler_deactivate(QemuInputHandlerState *s);
 void qemu_input_handler_unregister(QemuInputHandlerState *s);
 void qemu_input_handler_bind(QemuInputHandlerState *s,
                              const char *device_id, int head,
-                             Error **errp);
+                             Error *errp[static 1]);
 void qemu_input_event_send(QemuConsole *src, InputEvent *evt);
 void qemu_input_event_send_impl(QemuConsole *src, InputEvent *evt);
 void qemu_input_event_sync(void);
diff --git a/include/ui/qemu-spice.h b/include/ui/qemu-spice.h
index 52a9f8808b..8054833e09 100644
--- a/include/ui/qemu-spice.h
+++ b/include/ui/qemu-spice.h
@@ -96,7 +96,7 @@ static inline void qemu_spice_init(void)
 
 #endif /* CONFIG_SPICE */
 
-static inline bool qemu_using_spice(Error **errp)
+static inline bool qemu_using_spice(Error *errp[static 1])
 {
     if (!using_spice) {
         error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
diff --git a/migration/block.h b/migration/block.h
index 22ebe94259..bc2ee0a0ae 100644
--- a/migration/block.h
+++ b/migration/block.h
@@ -41,5 +41,5 @@ static inline uint64_t blk_mig_bytes_total(void)
 }
 #endif /* CONFIG_LIVE_BLOCK_MIGRATION */
 
-void migrate_set_block_enabled(bool value, Error **errp);
+void migrate_set_block_enabled(bool value, Error *errp[static 1]);
 #endif /* MIGRATION_BLOCK_H */
diff --git a/migration/exec.h b/migration/exec.h
index b210ffde7a..1facf8d7c3 100644
--- a/migration/exec.h
+++ b/migration/exec.h
@@ -19,8 +19,9 @@
 
 #ifndef QEMU_MIGRATION_EXEC_H
 #define QEMU_MIGRATION_EXEC_H
-void exec_start_incoming_migration(const char *host_port, Error **errp);
+void exec_start_incoming_migration(const char *host_port,
+				   Error *errp[static 1]);
 
 void exec_start_outgoing_migration(MigrationState *s, const char *host_port,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 #endif
diff --git a/migration/fd.h b/migration/fd.h
index a14a63ce2e..44c7ac84d9 100644
--- a/migration/fd.h
+++ b/migration/fd.h
@@ -16,8 +16,8 @@
 
 #ifndef QEMU_MIGRATION_FD_H
 #define QEMU_MIGRATION_FD_H
-void fd_start_incoming_migration(const char *path, Error **errp);
+void fd_start_incoming_migration(const char *path, Error *errp[static 1]);
 
 void fd_start_outgoing_migration(MigrationState *s, const char *fdname,
-                                 Error **errp);
+                                 Error *errp[static 1]);
 #endif
diff --git a/migration/rdma.h b/migration/rdma.h
index de2ba09dc5..1a8ccc3fea 100644
--- a/migration/rdma.h
+++ b/migration/rdma.h
@@ -18,8 +18,9 @@
 #define QEMU_MIGRATION_RDMA_H
 
 void rdma_start_outgoing_migration(void *opaque, const char *host_port,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 
-void rdma_start_incoming_migration(const char *host_port, Error **errp);
+void rdma_start_incoming_migration(const char *host_port,
+				   Error *errp[static 1]);
 
 #endif
diff --git a/migration/savevm.h b/migration/savevm.h
index eb4487771a..e606f0f702 100644
--- a/migration/savevm.h
+++ b/migration/savevm.h
@@ -14,7 +14,7 @@
 #ifndef MIGRATION_SAVEVM_H
 #define MIGRATION_SAVEVM_H
 
-bool qemu_savevm_state_blocked(Error **errp);
+bool qemu_savevm_state_blocked(Error *errp[static 1]);
 void qemu_savevm_state_begin(QEMUFile *f);
 void qemu_savevm_state_header(QEMUFile *f);
 int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy);
diff --git a/migration/socket.h b/migration/socket.h
index 6b91e9db38..d913f270ab 100644
--- a/migration/socket.h
+++ b/migration/socket.h
@@ -16,13 +16,14 @@
 
 #ifndef QEMU_MIGRATION_SOCKET_H
 #define QEMU_MIGRATION_SOCKET_H
-void tcp_start_incoming_migration(const char *host_port, Error **errp);
+void tcp_start_incoming_migration(const char *host_port,
+				  Error *errp[static 1]);
 
 void tcp_start_outgoing_migration(MigrationState *s, const char *host_port,
-                                  Error **errp);
+                                  Error *errp[static 1]);
 
-void unix_start_incoming_migration(const char *path, Error **errp);
+void unix_start_incoming_migration(const char *path, Error *errp[static 1]);
 
 void unix_start_outgoing_migration(MigrationState *s, const char *path,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 #endif
diff --git a/migration/tls.h b/migration/tls.h
index cdd70001ed..455552db87 100644
--- a/migration/tls.h
+++ b/migration/tls.h
@@ -25,10 +25,10 @@
 
 void migration_tls_channel_process_incoming(MigrationState *s,
                                             QIOChannel *ioc,
-                                            Error **errp);
+                                            Error *errp[static 1]);
 
 void migration_tls_channel_connect(MigrationState *s,
                                    QIOChannel *ioc,
                                    const char *hostname,
-                                   Error **errp);
+                                   Error *errp[static 1]);
 #endif
diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h
index d6071640a0..f3ba5d5d92 100644
--- a/nbd/nbd-internal.h
+++ b/nbd/nbd-internal.h
@@ -101,7 +101,7 @@
  * iteratively.
  */
 static inline ssize_t read_sync_eof(QIOChannel *ioc, void *buffer, size_t size,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     struct iovec iov = { .iov_base = buffer, .iov_len = size };
     /* Sockets are kept in blocking mode in the negotiation phase.  After
@@ -116,7 +116,7 @@ static inline ssize_t read_sync_eof(QIOChannel *ioc, void *buffer, size_t size,
  * Reads @size bytes from @ioc. Returns 0 on success.
  */
 static inline int read_sync(QIOChannel *ioc, void *buffer, size_t size,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     ssize_t ret = read_sync_eof(ioc, buffer, size, errp);
 
@@ -132,7 +132,7 @@ static inline int read_sync(QIOChannel *ioc, void *buffer, size_t size,
  * Writes @size bytes to @ioc. Returns 0 on success.
  */
 static inline int write_sync(QIOChannel *ioc, const void *buffer, size_t size,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     struct iovec iov = { .iov_base = (void *) buffer, .iov_len = size };
 
diff --git a/net/clients.h b/net/clients.h
index 5cae479730..c11d22ddf5 100644
--- a/net/clients.h
+++ b/net/clients.h
@@ -28,38 +28,38 @@
 #include "qapi-types.h"
 
 int net_init_dump(const Netdev *netdev, const char *name,
-                  NetClientState *peer, Error **errp);
+                  NetClientState *peer, Error *errp[static 1]);
 
 #ifdef CONFIG_SLIRP
 int net_init_slirp(const Netdev *netdev, const char *name,
-                   NetClientState *peer, Error **errp);
+                   NetClientState *peer, Error *errp[static 1]);
 #endif
 
 int net_init_hubport(const Netdev *netdev, const char *name,
-                     NetClientState *peer, Error **errp);
+                     NetClientState *peer, Error *errp[static 1]);
 
 int net_init_socket(const Netdev *netdev, const char *name,
-                    NetClientState *peer, Error **errp);
+                    NetClientState *peer, Error *errp[static 1]);
 
 int net_init_tap(const Netdev *netdev, const char *name,
-                 NetClientState *peer, Error **errp);
+                 NetClientState *peer, Error *errp[static 1]);
 
 int net_init_bridge(const Netdev *netdev, const char *name,
-                    NetClientState *peer, Error **errp);
+                    NetClientState *peer, Error *errp[static 1]);
 
 int net_init_l2tpv3(const Netdev *netdev, const char *name,
-                    NetClientState *peer, Error **errp);
+                    NetClientState *peer, Error *errp[static 1]);
 #ifdef CONFIG_VDE
 int net_init_vde(const Netdev *netdev, const char *name,
-                 NetClientState *peer, Error **errp);
+                 NetClientState *peer, Error *errp[static 1]);
 #endif
 
 #ifdef CONFIG_NETMAP
 int net_init_netmap(const Netdev *netdev, const char *name,
-                    NetClientState *peer, Error **errp);
+                    NetClientState *peer, Error *errp[static 1]);
 #endif
 
 int net_init_vhost_user(const Netdev *netdev, const char *name,
-                        NetClientState *peer, Error **errp);
+                        NetClientState *peer, Error *errp[static 1]);
 
 #endif /* QEMU_NET_CLIENTS_H */
diff --git a/net/tap_int.h b/net/tap_int.h
index ae6888f74a..deb2b0fe1d 100644
--- a/net/tap_int.h
+++ b/net/tap_int.h
@@ -30,11 +30,12 @@
 #include "qapi-types.h"
 
 int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
-             int vnet_hdr_required, int mq_required, Error **errp);
+             int vnet_hdr_required, int mq_required, Error *errp[static 1]);
 
 ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen);
 
-void tap_set_sndbuf(int fd, const NetdevTapOptions *tap, Error **errp);
+void tap_set_sndbuf(int fd, const NetdevTapOptions *tap,
+		    Error *errp[static 1]);
 int tap_probe_vnet_hdr(int fd);
 int tap_probe_vnet_hdr_len(int fd, int len);
 int tap_probe_has_ufo(int fd);
diff --git a/qga/guest-agent-core.h b/qga/guest-agent-core.h
index 3e8a4acff2..b01321ae7e 100644
--- a/qga/guest-agent-core.h
+++ b/qga/guest-agent-core.h
@@ -40,8 +40,8 @@ bool ga_is_frozen(GAState *s);
 void ga_set_frozen(GAState *s);
 void ga_unset_frozen(GAState *s);
 const char *ga_fsfreeze_hook(GAState *s);
-int64_t ga_get_fd_handle(GAState *s, Error **errp);
-int ga_parse_whence(GuestFileWhence *whence, Error **errp);
+int64_t ga_get_fd_handle(GAState *s, Error *errp[static 1]);
+int ga_parse_whence(GuestFileWhence *whence, Error *errp[static 1]);
 
 #ifndef _WIN32
 void reopen_fd_to_null(int fd);
diff --git a/qga/vss-win32.h b/qga/vss-win32.h
index 4f8e39aa5c..52fe12cdbd 100644
--- a/qga/vss-win32.h
+++ b/qga/vss-win32.h
@@ -22,6 +22,6 @@ bool vss_initialized(void);
 int ga_install_vss_provider(void);
 void ga_uninstall_vss_provider(void);
 
-void qga_vss_fsfreeze(int *nr_volume, bool freeze, Error **errp);
+void qga_vss_fsfreeze(int *nr_volume, bool freeze, Error *errp[static 1]);
 
 #endif
diff --git a/replication.h b/replication.h
index ece6ca6133..e31f1e5aa3 100644
--- a/replication.h
+++ b/replication.h
@@ -143,7 +143,7 @@ void replication_remove(ReplicationState *rs);
  *
  * Note: the caller of the function MUST make sure vm stopped
  */
-void replication_start_all(ReplicationMode mode, Error **errp);
+void replication_start_all(ReplicationMode mode, Error *errp[static 1]);
 
 /**
  * replication_do_checkpoint_all:
@@ -151,7 +151,7 @@ void replication_start_all(ReplicationMode mode, Error **errp);
  *
  * This interface is called after all VM state is transferred to Secondary QEMU
  */
-void replication_do_checkpoint_all(Error **errp);
+void replication_do_checkpoint_all(Error *errp[static 1]);
 
 /**
  * replication_get_error_all:
@@ -159,7 +159,7 @@ void replication_do_checkpoint_all(Error **errp);
  *
  * This interface is called to check if error occurred during replication
  */
-void replication_get_error_all(Error **errp);
+void replication_get_error_all(Error *errp[static 1]);
 
 /**
  * replication_stop_all:
@@ -169,6 +169,6 @@ void replication_get_error_all(Error **errp);
  * It is called on failover. The vm should be stopped before calling it, if you
  * use this API to shutdown the guest, or other things except failover
  */
-void replication_stop_all(bool failover, Error **errp);
+void replication_stop_all(bool failover, Error *errp[static 1]);
 
 #endif /* REPLICATION_H */
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index de0551f775..cdf77dc82a 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1311,7 +1311,7 @@ int x86_cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cpu,
                                  void *opaque);
 
 void x86_cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list,
-                                Error **errp);
+                                Error *errp[static 1]);
 
 void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
                         int flags);
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index d10808d9f4..fdaeacffce 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -1370,9 +1370,10 @@ static inline int cpu_mmu_index (CPUPPCState *env, bool ifetch)
 #if defined(TARGET_PPC64)
 bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr,
                       uint32_t min_compat_pvr, uint32_t max_compat_pvr);
-void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp);
+void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr,
+		    Error *errp[static 1]);
 #if !defined(CONFIG_USER_ONLY)
-void ppc_set_compat_all(uint32_t compat_pvr, Error **errp);
+void ppc_set_compat_all(uint32_t compat_pvr, Error *errp[static 1]);
 #endif
 int ppc_compat_max_threads(PowerPCCPU *cpu);
 #endif /* defined(TARGET_PPC64) */
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 2ce509f601..b988708249 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -470,8 +470,9 @@ void trigger_pgm_exception(CPUS390XState *env, uint32_t code, uint32_t ilen);
 #endif
 
 S390CPU *cpu_s390x_init(const char *cpu_model);
-S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp);
-S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp);
+S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id,
+		       Error *errp[static 1]);
+S390CPU *cpu_s390x_create(const char *cpu_model, Error *errp[static 1]);
 void s390x_translate_init(void);
 
 /* you can call this signal handler from your SIGBUS and SIGSEGV
@@ -640,7 +641,7 @@ void s390_cpu_list(FILE *f, fprintf_function cpu_fprintf);
 #define cpu_list s390_cpu_list
 void s390_cpu_model_register_props(Object *obj);
 void s390_cpu_model_class_register_props(ObjectClass *oc);
-void s390_realize_cpu_model(CPUState *cs, Error **errp);
+void s390_realize_cpu_model(CPUState *cs, Error *errp[static 1]);
 ObjectClass *s390_cpu_class_by_name(const char *name);
 
 #define EXCP_EXT 1 /* external interrupt */
diff --git a/target/s390x/cpu_models.h b/target/s390x/cpu_models.h
index 136a602313..15f64f08ed 100644
--- a/target/s390x/cpu_models.h
+++ b/target/s390x/cpu_models.h
@@ -99,15 +99,16 @@ S390CPUDef const *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga,
 
 #ifdef CONFIG_KVM
 bool kvm_s390_cpu_models_supported(void);
-void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp);
-void kvm_s390_apply_cpu_model(const S390CPUModel *model,  Error **errp);
+void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error *errp[static 1]);
+void kvm_s390_apply_cpu_model(const S390CPUModel *model,
+			        Error *errp[static 1]);
 #else
 static inline void kvm_s390_get_host_cpu_model(S390CPUModel *model,
-                                               Error **errp)
+                                               Error *errp[static 1])
 {
 }
 static inline void kvm_s390_apply_cpu_model(const S390CPUModel *model,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
 }
 static inline bool kvm_s390_cpu_models_supported(void)
diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
index e4700d3ff9..43910029f3 100644
--- a/qapi/qapi-visit-core.c
+++ b/qapi/qapi-visit-core.c
@@ -39,7 +39,7 @@ void visit_free(Visitor *v)
 }
 
 void visit_start_struct(Visitor *v, const char *name, void **obj,
-                        size_t size, Error **errp)
+                        size_t size, Error *errp[static 1])
 {
     Error *err = NULL;
 
@@ -55,7 +55,7 @@ void visit_start_struct(Visitor *v, const char *name, void **obj,
     error_propagate(errp, err);
 }
 
-void visit_check_struct(Visitor *v, Error **errp)
+void visit_check_struct(Visitor *v, Error *errp[static 1])
 {
     trace_visit_check_struct(v);
     if (v->check_struct) {
@@ -70,7 +70,7 @@ void visit_end_struct(Visitor *v, void **obj)
 }
 
 void visit_start_list(Visitor *v, const char *name, GenericList **list,
-                      size_t size, Error **errp)
+                      size_t size, Error *errp[static 1])
 {
     Error *err = NULL;
 
@@ -90,7 +90,7 @@ GenericList *visit_next_list(Visitor *v, GenericList *tail, size_t size)
     return v->next_list(v, tail, size);
 }
 
-void visit_check_list(Visitor *v, Error **errp)
+void visit_check_list(Visitor *v, Error *errp[static 1])
 {
     trace_visit_check_list(v);
     if (v->check_list) {
@@ -106,7 +106,7 @@ void visit_end_list(Visitor *v, void **obj)
 
 void visit_start_alternate(Visitor *v, const char *name,
                            GenericAlternate **obj, size_t size,
-                           bool promote_int, Error **errp)
+                           bool promote_int, Error *errp[static 1])
 {
     Error *err = NULL;
 
@@ -144,7 +144,8 @@ bool visit_is_input(Visitor *v)
     return v->type == VISITOR_INPUT;
 }
 
-void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp)
+void visit_type_int(Visitor *v, const char *name, int64_t *obj,
+                    Error *errp[static 1])
 {
     assert(obj);
     trace_visit_type_int(v, name, obj);
@@ -152,7 +153,8 @@ void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp)
 }
 
 static void visit_type_uintN(Visitor *v, uint64_t *obj, const char *name,
-                             uint64_t max, const char *type, Error **errp)
+                             uint64_t max, const char *type,
+                             Error *errp[static 1])
 {
     Error *err = NULL;
     uint64_t value = *obj;
@@ -169,7 +171,7 @@ static void visit_type_uintN(Visitor *v, uint64_t *obj, const char *name,
 }
 
 void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     uint64_t value;
 
@@ -180,7 +182,7 @@ void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj,
 }
 
 void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     uint64_t value;
 
@@ -191,7 +193,7 @@ void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj,
 }
 
 void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     uint64_t value;
 
@@ -202,7 +204,7 @@ void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
 }
 
 void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     assert(obj);
     trace_visit_type_uint64(v, name, obj);
@@ -211,7 +213,7 @@ void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj,
 
 static void visit_type_intN(Visitor *v, int64_t *obj, const char *name,
                             int64_t min, int64_t max, const char *type,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     Error *err = NULL;
     int64_t value = *obj;
@@ -227,7 +229,8 @@ static void visit_type_intN(Visitor *v, int64_t *obj, const char *name,
     }
 }
 
-void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp)
+void visit_type_int8(Visitor *v, const char *name, int8_t *obj,
+                     Error *errp[static 1])
 {
     int64_t value;
 
@@ -238,7 +241,7 @@ void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp)
 }
 
 void visit_type_int16(Visitor *v, const char *name, int16_t *obj,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     int64_t value;
 
@@ -249,7 +252,7 @@ void visit_type_int16(Visitor *v, const char *name, int16_t *obj,
 }
 
 void visit_type_int32(Visitor *v, const char *name, int32_t *obj,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     int64_t value;
 
@@ -260,7 +263,7 @@ void visit_type_int32(Visitor *v, const char *name, int32_t *obj,
 }
 
 void visit_type_int64(Visitor *v, const char *name, int64_t *obj,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     assert(obj);
     trace_visit_type_int64(v, name, obj);
@@ -268,7 +271,7 @@ void visit_type_int64(Visitor *v, const char *name, int64_t *obj,
 }
 
 void visit_type_size(Visitor *v, const char *name, uint64_t *obj,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     assert(obj);
     trace_visit_type_size(v, name, obj);
@@ -279,14 +282,16 @@ void visit_type_size(Visitor *v, const char *name, uint64_t *obj,
     }
 }
 
-void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
+void visit_type_bool(Visitor *v, const char *name, bool *obj,
+                     Error *errp[static 1])
 {
     assert(obj);
     trace_visit_type_bool(v, name, obj);
     v->type_bool(v, name, obj, errp);
 }
 
-void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp)
+void visit_type_str(Visitor *v, const char *name, char **obj,
+                    Error *errp[static 1])
 {
     Error *err = NULL;
 
@@ -304,14 +309,15 @@ void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp)
 }
 
 void visit_type_number(Visitor *v, const char *name, double *obj,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     assert(obj);
     trace_visit_type_number(v, name, obj);
     v->type_number(v, name, obj, errp);
 }
 
-void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp)
+void visit_type_any(Visitor *v, const char *name, QObject **obj,
+                    Error *errp[static 1])
 {
     Error *err = NULL;
 
@@ -325,14 +331,15 @@ void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp)
     error_propagate(errp, err);
 }
 
-void visit_type_null(Visitor *v, const char *name, Error **errp)
+void visit_type_null(Visitor *v, const char *name, Error *errp[static 1])
 {
     trace_visit_type_null(v, name);
     v->type_null(v, name, errp);
 }
 
 static void output_type_enum(Visitor *v, const char *name, int *obj,
-                             const char *const strings[], Error **errp)
+                             const char *const strings[],
+                             Error *errp[static 1])
 {
     int i = 0;
     int value = *obj;
@@ -349,7 +356,8 @@ static void output_type_enum(Visitor *v, const char *name, int *obj,
 }
 
 static void input_type_enum(Visitor *v, const char *name, int *obj,
-                            const char *const strings[], Error **errp)
+                            const char *const strings[],
+                            Error *errp[static 1])
 {
     int64_t value = 0;
     char *enum_str;
@@ -377,7 +385,7 @@ static void input_type_enum(Visitor *v, const char *name, int *obj,
 }
 
 void visit_type_enum(Visitor *v, const char *name, int *obj,
-                     const char *const strings[], Error **errp)
+                     const char *const strings[], Error *errp[static 1])
 {
     assert(obj && strings);
     trace_visit_type_enum(v, name, obj);
diff --git a/arch_init.c b/arch_init.c
index a0b8ed6167..2e92cb6060 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -104,7 +104,7 @@ int xen_available(void)
 }
 
 
-TargetInfo *qmp_query_target(Error **errp)
+TargetInfo *qmp_query_target(Error *errp[static 1])
 {
     TargetInfo *info = g_malloc0(sizeof(*info));
 
diff --git a/backends/cryptodev-builtin.c b/backends/cryptodev-builtin.c
index 657c0ba2f3..fe644633ac 100644
--- a/backends/cryptodev-builtin.c
+++ b/backends/cryptodev-builtin.c
@@ -62,7 +62,7 @@ struct CryptoDevBackendBuiltin {
 };
 
 static void cryptodev_builtin_init(
-             CryptoDevBackend *backend, Error **errp)
+             CryptoDevBackend *backend, Error *errp[static 1])
 {
     /* Only support one queue */
     int queues = backend->conf.peers.queues;
@@ -120,7 +120,8 @@ cryptodev_builtin_get_unused_session_index(
 #define AES_KEYSIZE_256_XTS 64
 
 static int
-cryptodev_builtin_get_aes_algo(uint32_t key_len, int mode, Error **errp)
+cryptodev_builtin_get_aes_algo(uint32_t key_len, int mode,
+                               Error *errp[static 1])
 {
     int algo;
 
@@ -154,7 +155,7 @@ err:
 static int cryptodev_builtin_create_cipher_session(
                     CryptoDevBackendBuiltin *builtin,
                     CryptoDevBackendSymSessionInfo *sess_info,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     int algo;
     int mode;
@@ -246,7 +247,7 @@ static int cryptodev_builtin_create_cipher_session(
 static int64_t cryptodev_builtin_sym_create_session(
            CryptoDevBackend *backend,
            CryptoDevBackendSymSessionInfo *sess_info,
-           uint32_t queue_index, Error **errp)
+           uint32_t queue_index, Error *errp[static 1])
 {
     CryptoDevBackendBuiltin *builtin =
                       CRYPTODEV_BACKEND_BUILTIN(backend);
@@ -277,7 +278,7 @@ static int64_t cryptodev_builtin_sym_create_session(
 static int cryptodev_builtin_sym_close_session(
            CryptoDevBackend *backend,
            uint64_t session_id,
-           uint32_t queue_index, Error **errp)
+           uint32_t queue_index, Error *errp[static 1])
 {
     CryptoDevBackendBuiltin *builtin =
                       CRYPTODEV_BACKEND_BUILTIN(backend);
@@ -298,7 +299,7 @@ static int cryptodev_builtin_sym_close_session(
 static int cryptodev_builtin_sym_operation(
                  CryptoDevBackend *backend,
                  CryptoDevBackendSymOpInfo *op_info,
-                 uint32_t queue_index, Error **errp)
+                 uint32_t queue_index, Error *errp[static 1])
 {
     CryptoDevBackendBuiltin *builtin =
                       CRYPTODEV_BACKEND_BUILTIN(backend);
@@ -346,7 +347,7 @@ static int cryptodev_builtin_sym_operation(
 
 static void cryptodev_builtin_cleanup(
              CryptoDevBackend *backend,
-             Error **errp)
+             Error *errp[static 1])
 {
     CryptoDevBackendBuiltin *builtin =
                       CRYPTODEV_BACKEND_BUILTIN(backend);
diff --git a/backends/cryptodev.c b/backends/cryptodev.c
index 03a78f269f..4bca763e58 100644
--- a/backends/cryptodev.c
+++ b/backends/cryptodev.c
@@ -65,7 +65,7 @@ void cryptodev_backend_free_client(
 
 void cryptodev_backend_cleanup(
              CryptoDevBackend *backend,
-             Error **errp)
+             Error *errp[static 1])
 {
     CryptoDevBackendClass *bc =
                   CRYPTODEV_BACKEND_GET_CLASS(backend);
@@ -78,7 +78,7 @@ void cryptodev_backend_cleanup(
 int64_t cryptodev_backend_sym_create_session(
            CryptoDevBackend *backend,
            CryptoDevBackendSymSessionInfo *sess_info,
-           uint32_t queue_index, Error **errp)
+           uint32_t queue_index, Error *errp[static 1])
 {
     CryptoDevBackendClass *bc =
                       CRYPTODEV_BACKEND_GET_CLASS(backend);
@@ -93,7 +93,7 @@ int64_t cryptodev_backend_sym_create_session(
 int cryptodev_backend_sym_close_session(
            CryptoDevBackend *backend,
            uint64_t session_id,
-           uint32_t queue_index, Error **errp)
+           uint32_t queue_index, Error *errp[static 1])
 {
     CryptoDevBackendClass *bc =
                       CRYPTODEV_BACKEND_GET_CLASS(backend);
@@ -108,7 +108,7 @@ int cryptodev_backend_sym_close_session(
 static int cryptodev_backend_sym_operation(
                  CryptoDevBackend *backend,
                  CryptoDevBackendSymOpInfo *op_info,
-                 uint32_t queue_index, Error **errp)
+                 uint32_t queue_index, Error *errp[static 1])
 {
     CryptoDevBackendClass *bc =
                       CRYPTODEV_BACKEND_GET_CLASS(backend);
@@ -123,7 +123,7 @@ static int cryptodev_backend_sym_operation(
 int cryptodev_backend_crypto_operation(
                  CryptoDevBackend *backend,
                  void *opaque,
-                 uint32_t queue_index, Error **errp)
+                 uint32_t queue_index, Error *errp[static 1])
 {
     VirtIOCryptoReq *req = opaque;
 
@@ -144,7 +144,7 @@ int cryptodev_backend_crypto_operation(
 
 static void
 cryptodev_backend_get_queues(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     CryptoDevBackend *backend = CRYPTODEV_BACKEND(obj);
     uint32_t value = backend->conf.peers.queues;
@@ -154,7 +154,7 @@ cryptodev_backend_get_queues(Object *obj, Visitor *v, const char *name,
 
 static void
 cryptodev_backend_set_queues(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     CryptoDevBackend *backend = CRYPTODEV_BACKEND(obj);
     Error *local_err = NULL;
@@ -175,7 +175,7 @@ out:
 }
 
 static void
-cryptodev_backend_complete(UserCreatable *uc, Error **errp)
+cryptodev_backend_complete(UserCreatable *uc, Error *errp[static 1])
 {
     CryptoDevBackend *backend = CRYPTODEV_BACKEND(uc);
     CryptoDevBackendClass *bc = CRYPTODEV_BACKEND_GET_CLASS(uc);
@@ -215,7 +215,7 @@ bool cryptodev_backend_is_ready(CryptoDevBackend *backend)
 }
 
 static bool
-cryptodev_backend_can_be_deleted(UserCreatable *uc, Error **errp)
+cryptodev_backend_can_be_deleted(UserCreatable *uc, Error *errp[static 1])
 {
     return !cryptodev_backend_is_used(CRYPTODEV_BACKEND(uc));
 }
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index fc4ef46d11..8da1cf3c14 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -36,7 +36,7 @@ struct HostMemoryBackendFile {
 };
 
 static void
-file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
+file_backend_memory_alloc(HostMemoryBackend *backend, Error *errp[static 1])
 {
     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(backend);
 
@@ -64,14 +64,14 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
 #endif
 }
 
-static char *get_mem_path(Object *o, Error **errp)
+static char *get_mem_path(Object *o, Error *errp[static 1])
 {
     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
 
     return g_strdup(fb->mem_path);
 }
 
-static void set_mem_path(Object *o, const char *str, Error **errp)
+static void set_mem_path(Object *o, const char *str, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(o);
     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
@@ -84,14 +84,15 @@ static void set_mem_path(Object *o, const char *str, Error **errp)
     fb->mem_path = g_strdup(str);
 }
 
-static bool file_memory_backend_get_share(Object *o, Error **errp)
+static bool file_memory_backend_get_share(Object *o, Error *errp[static 1])
 {
     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
 
     return fb->share;
 }
 
-static void file_memory_backend_set_share(Object *o, bool value, Error **errp)
+static void file_memory_backend_set_share(Object *o, bool value,
+                                          Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(o);
     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
index 04a7ac362b..9f0472b937 100644
--- a/backends/hostmem-ram.c
+++ b/backends/hostmem-ram.c
@@ -18,7 +18,7 @@
 
 
 static void
-ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
+ram_backend_memory_alloc(HostMemoryBackend *backend, Error *errp[static 1])
 {
     char *path;
 
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 8fcc5d68c9..6ff73a3d86 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -29,7 +29,7 @@ QEMU_BUILD_BUG_ON(HOST_MEM_POLICY_INTERLEAVE != MPOL_INTERLEAVE);
 
 static void
 host_memory_backend_get_size(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     uint64_t value = backend->size;
@@ -39,7 +39,7 @@ host_memory_backend_get_size(Object *obj, Visitor *v, const char *name,
 
 static void
 host_memory_backend_set_size(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     Error *local_err = NULL;
@@ -66,7 +66,7 @@ out:
 
 static void
 host_memory_backend_get_host_nodes(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     uint16List *host_nodes = NULL;
@@ -98,7 +98,7 @@ host_memory_backend_get_host_nodes(Object *obj, Visitor *v, const char *name,
 
 static void
 host_memory_backend_set_host_nodes(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
 #ifdef CONFIG_NUMA
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
@@ -116,14 +116,15 @@ host_memory_backend_set_host_nodes(Object *obj, Visitor *v, const char *name,
 }
 
 static int
-host_memory_backend_get_policy(Object *obj, Error **errp G_GNUC_UNUSED)
+host_memory_backend_get_policy(Object *obj,
+                               Error *errp[static 1] G_GNUC_UNUSED)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     return backend->policy;
 }
 
 static void
-host_memory_backend_set_policy(Object *obj, int policy, Error **errp)
+host_memory_backend_set_policy(Object *obj, int policy, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     backend->policy = policy;
@@ -135,14 +136,15 @@ host_memory_backend_set_policy(Object *obj, int policy, Error **errp)
 #endif
 }
 
-static bool host_memory_backend_get_merge(Object *obj, Error **errp)
+static bool host_memory_backend_get_merge(Object *obj, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
     return backend->merge;
 }
 
-static void host_memory_backend_set_merge(Object *obj, bool value, Error **errp)
+static void host_memory_backend_set_merge(Object *obj, bool value,
+                                          Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
@@ -161,14 +163,15 @@ static void host_memory_backend_set_merge(Object *obj, bool value, Error **errp)
     }
 }
 
-static bool host_memory_backend_get_dump(Object *obj, Error **errp)
+static bool host_memory_backend_get_dump(Object *obj, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
     return backend->dump;
 }
 
-static void host_memory_backend_set_dump(Object *obj, bool value, Error **errp)
+static void host_memory_backend_set_dump(Object *obj, bool value,
+                                         Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
@@ -187,7 +190,8 @@ static void host_memory_backend_set_dump(Object *obj, bool value, Error **errp)
     }
 }
 
-static bool host_memory_backend_get_prealloc(Object *obj, Error **errp)
+static bool host_memory_backend_get_prealloc(Object *obj,
+                                             Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
@@ -195,7 +199,7 @@ static bool host_memory_backend_get_prealloc(Object *obj, Error **errp)
 }
 
 static void host_memory_backend_set_prealloc(Object *obj, bool value,
-                                             Error **errp)
+                                             Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
@@ -245,7 +249,8 @@ bool host_memory_backend_mr_inited(HostMemoryBackend *backend)
 }
 
 MemoryRegion *
-host_memory_backend_get_memory(HostMemoryBackend *backend, Error **errp)
+host_memory_backend_get_memory(HostMemoryBackend *backend,
+                               Error *errp[static 1])
 {
     return host_memory_backend_mr_inited(backend) ? &backend->mr : NULL;
 }
@@ -261,7 +266,7 @@ bool host_memory_backend_is_mapped(HostMemoryBackend *backend)
 }
 
 static void
-host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
+host_memory_backend_memory_complete(UserCreatable *uc, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(uc);
     HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
@@ -340,7 +345,7 @@ out:
 }
 
 static bool
-host_memory_backend_can_be_deleted(UserCreatable *uc, Error **errp)
+host_memory_backend_can_be_deleted(UserCreatable *uc, Error *errp[static 1])
 {
     if (host_memory_backend_is_mapped(MEMORY_BACKEND(uc))) {
         return false;
@@ -349,14 +354,14 @@ host_memory_backend_can_be_deleted(UserCreatable *uc, Error **errp)
     }
 }
 
-static char *get_id(Object *o, Error **errp)
+static char *get_id(Object *o, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(o);
 
     return g_strdup(backend->id);
 }
 
-static void set_id(Object *o, const char *str, Error **errp)
+static void set_id(Object *o, const char *str, Error *errp[static 1])
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(o);
 
diff --git a/backends/rng-egd.c b/backends/rng-egd.c
index 8c2acae177..3a8ac2cf7d 100644
--- a/backends/rng-egd.c
+++ b/backends/rng-egd.c
@@ -83,7 +83,7 @@ static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size)
     }
 }
 
-static void rng_egd_opened(RngBackend *b, Error **errp)
+static void rng_egd_opened(RngBackend *b, Error *errp[static 1])
 {
     RngEgd *s = RNG_EGD(b);
     Chardev *chr;
@@ -109,7 +109,8 @@ static void rng_egd_opened(RngBackend *b, Error **errp)
                              rng_egd_chr_read, NULL, s, NULL, true);
 }
 
-static void rng_egd_set_chardev(Object *obj, const char *value, Error **errp)
+static void rng_egd_set_chardev(Object *obj, const char *value,
+                                Error *errp[static 1])
 {
     RngBackend *b = RNG_BACKEND(obj);
     RngEgd *s = RNG_EGD(b);
@@ -122,7 +123,7 @@ static void rng_egd_set_chardev(Object *obj, const char *value, Error **errp)
     }
 }
 
-static char *rng_egd_get_chardev(Object *obj, Error **errp)
+static char *rng_egd_get_chardev(Object *obj, Error *errp[static 1])
 {
     RngEgd *s = RNG_EGD(obj);
     Chardev *chr = qemu_chr_fe_get_driver(&s->chr);
diff --git a/backends/rng-random.c b/backends/rng-random.c
index 029f6b9b01..eaf91d9b5a 100644
--- a/backends/rng-random.c
+++ b/backends/rng-random.c
@@ -66,7 +66,7 @@ static void rng_random_request_entropy(RngBackend *b, RngRequest *req)
     }
 }
 
-static void rng_random_opened(RngBackend *b, Error **errp)
+static void rng_random_opened(RngBackend *b, Error *errp[static 1])
 {
     RngRandom *s = RNG_RANDOM(b);
 
@@ -81,7 +81,7 @@ static void rng_random_opened(RngBackend *b, Error **errp)
     }
 }
 
-static char *rng_random_get_filename(Object *obj, Error **errp)
+static char *rng_random_get_filename(Object *obj, Error *errp[static 1])
 {
     RngRandom *s = RNG_RANDOM(obj);
 
@@ -89,7 +89,7 @@ static char *rng_random_get_filename(Object *obj, Error **errp)
 }
 
 static void rng_random_set_filename(Object *obj, const char *filename,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     RngBackend *b = RNG_BACKEND(obj);
     RngRandom *s = RNG_RANDOM(obj);
diff --git a/backends/rng.c b/backends/rng.c
index c5f4f01642..73191bddd2 100644
--- a/backends/rng.c
+++ b/backends/rng.c
@@ -38,19 +38,20 @@ void rng_backend_request_entropy(RngBackend *s, size_t size,
     }
 }
 
-static bool rng_backend_prop_get_opened(Object *obj, Error **errp)
+static bool rng_backend_prop_get_opened(Object *obj, Error *errp[static 1])
 {
     RngBackend *s = RNG_BACKEND(obj);
 
     return s->opened;
 }
 
-static void rng_backend_complete(UserCreatable *uc, Error **errp)
+static void rng_backend_complete(UserCreatable *uc, Error *errp[static 1])
 {
     object_property_set_bool(OBJECT(uc), true, "opened", errp);
 }
 
-static void rng_backend_prop_set_opened(Object *obj, bool value, Error **errp)
+static void rng_backend_prop_set_opened(Object *obj, bool value,
+                                        Error *errp[static 1])
 {
     RngBackend *s = RNG_BACKEND(obj);
     RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
diff --git a/backends/tpm.c b/backends/tpm.c
index 5b9788faf4..05a3303305 100644
--- a/backends/tpm.c
+++ b/backends/tpm.c
@@ -112,19 +112,20 @@ TPMVersion tpm_backend_get_tpm_version(TPMBackend *s)
     return k->ops->get_tpm_version(s);
 }
 
-static bool tpm_backend_prop_get_opened(Object *obj, Error **errp)
+static bool tpm_backend_prop_get_opened(Object *obj, Error *errp[static 1])
 {
     TPMBackend *s = TPM_BACKEND(obj);
 
     return s->opened;
 }
 
-void tpm_backend_open(TPMBackend *s, Error **errp)
+void tpm_backend_open(TPMBackend *s, Error *errp[static 1])
 {
     object_property_set_bool(OBJECT(s), true, "opened", errp);
 }
 
-static void tpm_backend_prop_set_opened(Object *obj, bool value, Error **errp)
+static void tpm_backend_prop_set_opened(Object *obj, bool value,
+                                        Error *errp[static 1])
 {
     TPMBackend *s = TPM_BACKEND(obj);
     TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
diff --git a/balloon.c b/balloon.c
index 1d720fff81..a9ed1ebde6 100644
--- a/balloon.c
+++ b/balloon.c
@@ -49,7 +49,7 @@ void qemu_balloon_inhibit(bool state)
     balloon_inhibited = state;
 }
 
-static bool have_balloon(Error **errp)
+static bool have_balloon(Error *errp[static 1])
 {
     if (kvm_enabled() && !kvm_has_sync_mmu()) {
         error_set(errp, ERROR_CLASS_KVM_MISSING_CAP,
@@ -89,7 +89,7 @@ void qemu_remove_balloon_handler(void *opaque)
     balloon_opaque = NULL;
 }
 
-BalloonInfo *qmp_query_balloon(Error **errp)
+BalloonInfo *qmp_query_balloon(Error *errp[static 1])
 {
     BalloonInfo *info;
 
@@ -102,7 +102,7 @@ BalloonInfo *qmp_query_balloon(Error **errp)
     return info;
 }
 
-void qmp_balloon(int64_t target, Error **errp)
+void qmp_balloon(int64_t target, Error *errp[static 1])
 {
     if (!have_balloon(errp)) {
         return;
diff --git a/block.c b/block.c
index 1a6776447a..ea9b2f2396 100644
--- a/block.c
+++ b/block.c
@@ -72,7 +72,7 @@ static BlockDriverState *bdrv_open_inherit(const char *filename,
                                            QDict *options, int flags,
                                            BlockDriverState *parent,
                                            const BdrvChildRole *child_role,
-                                           Error **errp);
+                                           Error *errp[static 1]);
 
 /* If non-zero, use only whitelisted block drivers */
 static int use_bdrv_whitelist;
@@ -246,7 +246,8 @@ bool bdrv_is_writable(BlockDriverState *bs)
     return !bdrv_is_read_only(bs) && !(bs->open_flags & BDRV_O_INACTIVE);
 }
 
-int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
+int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
+                           Error *errp[static 1])
 {
     /* Do not set read_only if copy_on_read is enabled */
     if (bs->copy_on_read && read_only) {
@@ -265,7 +266,8 @@ int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
     return 0;
 }
 
-int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
+int bdrv_set_read_only(BlockDriverState *bs, bool read_only,
+                       Error *errp[static 1])
 {
     int ret = 0;
 
@@ -281,7 +283,7 @@ int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
 void bdrv_get_full_backing_filename_from_filename(const char *backed,
                                                   const char *backing,
                                                   char *dest, size_t sz,
-                                                  Error **errp)
+                                                  Error *errp[static 1])
 {
     if (backing[0] == '\0' || path_has_protocol(backing) ||
         path_is_absolute(backing))
@@ -296,7 +298,7 @@ void bdrv_get_full_backing_filename_from_filename(const char *backed,
 }
 
 void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     char *backed = bs->exact_filename[0] ? bs->exact_filename : bs->filename;
 
@@ -420,7 +422,7 @@ static void coroutine_fn bdrv_create_co_entry(void *opaque)
 }
 
 int bdrv_create(BlockDriver *drv, const char* filename,
-                QemuOpts *opts, Error **errp)
+                QemuOpts *opts, Error *errp[static 1])
 {
     int ret;
 
@@ -464,7 +466,8 @@ out:
     return ret;
 }
 
-int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
+int bdrv_create_file(const char *filename, QemuOpts *opts,
+                     Error *errp[static 1])
 {
     BlockDriver *drv;
     Error *local_err = NULL;
@@ -587,7 +590,7 @@ static BlockDriver *bdrv_do_find_protocol(const char *protocol)
 
 BlockDriver *bdrv_find_protocol(const char *filename,
                                 bool allow_protocol_prefix,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     BlockDriver *drv1;
     char protocol[128];
@@ -675,7 +678,7 @@ BlockDriver *bdrv_probe_all(const uint8_t *buf, int buf_size,
 }
 
 static int find_image_format(BlockBackend *file, const char *filename,
-                             BlockDriver **pdrv, Error **errp)
+                             BlockDriver **pdrv, Error *errp[static 1])
 {
     BlockDriver *drv;
     uint8_t buf[BLOCK_PROBE_BUF_SIZE];
@@ -1048,7 +1051,7 @@ static void update_options_from_flags(QDict *options, int flags)
 
 static void bdrv_assign_node_name(BlockDriverState *bs,
                                   const char *node_name,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     char *gen_node_name = NULL;
 
@@ -1085,7 +1088,7 @@ out:
 
 static int bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv,
                             const char *node_name, QDict *options,
-                            int open_flags, Error **errp)
+                            int open_flags, Error *errp[static 1])
 {
     Error *local_err = NULL;
     int ret;
@@ -1148,7 +1151,7 @@ free_and_fail:
 }
 
 BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_name,
-                                       int flags, Error **errp)
+                                       int flags, Error *errp[static 1])
 {
     BlockDriverState *bs;
     int ret;
@@ -1226,7 +1229,7 @@ QemuOptsList bdrv_runtime_opts = {
  * Removes all processed options from *options.
  */
 static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,
-                            QDict *options, Error **errp)
+                            QDict *options, Error *errp[static 1])
 {
     int ret, open_flags;
     const char *filename;
@@ -1371,7 +1374,7 @@ fail_opts:
     return ret;
 }
 
-static QDict *parse_json_filename(const char *filename, Error **errp)
+static QDict *parse_json_filename(const char *filename, Error *errp[static 1])
 {
     QObject *options_obj;
     QDict *options;
@@ -1404,7 +1407,7 @@ static QDict *parse_json_filename(const char *filename, Error **errp)
 }
 
 static void parse_json_protocol(QDict *options, const char **pfilename,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     QDict *json_options;
     Error *local_err = NULL;
@@ -1434,7 +1437,7 @@ static void parse_json_protocol(QDict *options, const char **pfilename,
  * block driver has been specified explicitly.
  */
 static int bdrv_fill_options(QDict **options, const char *filename,
-                             int *flags, Error **errp)
+                             int *flags, Error *errp[static 1])
 {
     const char *drvname;
     bool protocol = *flags & BDRV_O_PROTOCOL;
@@ -1518,7 +1521,8 @@ static int bdrv_fill_options(QDict **options, const char *filename,
 }
 
 static int bdrv_child_check_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
-                                 GSList *ignore_children, Error **errp);
+                                 GSList *ignore_children,
+                                 Error *errp[static 1]);
 static void bdrv_child_abort_perm_update(BdrvChild *c);
 static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared);
 
@@ -1549,7 +1553,7 @@ static void bdrv_child_perm(BlockDriverState *bs, BlockDriverState *child_bs,
  */
 static int bdrv_check_perm(BlockDriverState *bs, uint64_t cumulative_perms,
                            uint64_t cumulative_shared_perms,
-                           GSList *ignore_children, Error **errp)
+                           GSList *ignore_children, Error *errp[static 1])
 {
     BlockDriver *drv = bs->drv;
     BdrvChild *c;
@@ -1714,7 +1718,8 @@ char *bdrv_perm_names(uint64_t perm)
  * bdrv_abort_perm_update(). */
 static int bdrv_check_update_perm(BlockDriverState *bs, uint64_t new_used_perm,
                                   uint64_t new_shared_perm,
-                                  GSList *ignore_children, Error **errp)
+                                  GSList *ignore_children,
+                                  Error *errp[static 1])
 {
     BdrvChild *c;
     uint64_t cumulative_perms = new_used_perm;
@@ -1761,7 +1766,8 @@ static int bdrv_check_update_perm(BlockDriverState *bs, uint64_t new_used_perm,
 /* Needs to be followed by a call to either bdrv_child_set_perm() or
  * bdrv_child_abort_perm_update(). */
 static int bdrv_child_check_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
-                                 GSList *ignore_children, Error **errp)
+                                 GSList *ignore_children,
+                                 Error *errp[static 1])
 {
     int ret;
 
@@ -1790,7 +1796,7 @@ static void bdrv_child_abort_perm_update(BdrvChild *c)
 }
 
 int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     int ret;
 
@@ -1945,7 +1951,7 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
                                   const char *child_name,
                                   const BdrvChildRole *child_role,
                                   uint64_t perm, uint64_t shared_perm,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     BdrvChild *child;
     int ret;
@@ -1976,7 +1982,7 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
                              BlockDriverState *child_bs,
                              const char *child_name,
                              const BdrvChildRole *child_role,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     BdrvChild *child;
     uint64_t perm, shared_perm;
@@ -2070,7 +2076,7 @@ static void bdrv_parent_cb_resize(BlockDriverState *bs)
  * which don't need their own reference any more must call bdrv_unref().
  */
 void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     if (backing_hd) {
         bdrv_ref(backing_hd);
@@ -2108,7 +2114,7 @@ out:
  * TODO Can this be unified with bdrv_open_image()?
  */
 int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
-                           const char *bdref_key, Error **errp)
+                           const char *bdref_key, Error *errp[static 1])
 {
     char *backing_filename = g_malloc0(PATH_MAX);
     char *bdref_key_dot;
@@ -2198,7 +2204,7 @@ free_exit:
 static BlockDriverState *
 bdrv_open_child_bs(const char *filename, QDict *options, const char *bdref_key,
                    BlockDriverState *parent, const BdrvChildRole *child_role,
-                   bool allow_none, Error **errp)
+                   bool allow_none, Error *errp[static 1])
 {
     BlockDriverState *bs = NULL;
     QDict *image_options;
@@ -2257,7 +2263,7 @@ BdrvChild *bdrv_open_child(const char *filename,
                            QDict *options, const char *bdref_key,
                            BlockDriverState *parent,
                            const BdrvChildRole *child_role,
-                           bool allow_none, Error **errp)
+                           bool allow_none, Error *errp[static 1])
 {
     BdrvChild *c;
     BlockDriverState *bs;
@@ -2280,7 +2286,7 @@ BdrvChild *bdrv_open_child(const char *filename,
 static BlockDriverState *bdrv_append_temp_snapshot(BlockDriverState *bs,
                                                    int flags,
                                                    QDict *snapshot_options,
-                                                   Error **errp)
+                                                   Error *errp[static 1])
 {
     /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
     char *tmp_filename = g_malloc0(PATH_MAX + 1);
@@ -2365,7 +2371,7 @@ static BlockDriverState *bdrv_open_inherit(const char *filename,
                                            QDict *options, int flags,
                                            BlockDriverState *parent,
                                            const BdrvChildRole *child_role,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     int ret;
     BlockBackend *file = NULL;
@@ -2617,7 +2623,7 @@ close_and_fail:
 }
 
 BlockDriverState *bdrv_open(const char *filename, const char *reference,
-                            QDict *options, int flags, Error **errp)
+                            QDict *options, int flags, Error *errp[static 1])
 {
     return bdrv_open_inherit(filename, reference, options, flags, NULL,
                              NULL, errp);
@@ -2782,7 +2788,8 @@ BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
  * to all devices.
  *
  */
-int bdrv_reopen_multiple(AioContext *ctx, BlockReopenQueue *bs_queue, Error **errp)
+int bdrv_reopen_multiple(AioContext *ctx, BlockReopenQueue *bs_queue,
+                         Error *errp[static 1])
 {
     int ret = -1;
     BlockReopenQueueEntry *bs_entry, *next;
@@ -2830,7 +2837,7 @@ cleanup:
 
 
 /* Reopen a single BlockDriverState with the specified flags. */
-int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
+int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error *errp[static 1])
 {
     int ret = -1;
     Error *local_err = NULL;
@@ -2862,7 +2869,7 @@ int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp)
  *
  */
 int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     int ret = -1;
     Error *local_err = NULL;
@@ -3118,7 +3125,7 @@ static bool should_update_child(BdrvChild *c, BlockDriverState *to)
 }
 
 void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     BdrvChild *c, *next;
     GSList *list = NULL, *p;
@@ -3187,7 +3194,7 @@ out:
  * reference of its own, it must call bdrv_ref().
  */
 void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
-                 Error **errp)
+                 Error *errp[static 1])
 {
     bdrv_set_backing_hd(bs_new, bs_top, errp);
     if (ERR_IS_SET(errp)) {
@@ -3383,7 +3390,7 @@ exit:
 /**
  * Truncate file to 'offset' bytes (needed only for file protocols)
  */
-int bdrv_truncate(BdrvChild *child, int64_t offset, Error **errp)
+int bdrv_truncate(BdrvChild *child, int64_t offset, Error *errp[static 1])
 {
     BlockDriverState *bs = child->bs;
     BlockDriver *drv = bs->drv;
@@ -3534,7 +3541,8 @@ int bdrv_set_key(BlockDriverState *bs, const char *key)
  *     Else do nothing.
  * On failure, store an error object through @errp if non-null.
  */
-void bdrv_add_key(BlockDriverState *bs, const char *key, Error **errp)
+void bdrv_add_key(BlockDriverState *bs, const char *key,
+                  Error *errp[static 1])
 {
     if (key) {
         if (!bdrv_is_encrypted(bs)) {
@@ -3629,7 +3637,7 @@ BlockDriverState *bdrv_find_node(const char *node_name)
 }
 
 /* Put this QMP function here so it can access the static graph_bdrv_states. */
-BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
+BlockDeviceInfoList *bdrv_named_nodes_list(Error *errp[static 1])
 {
     BlockDeviceInfoList *list, *entry;
     BlockDriverState *bs;
@@ -3652,7 +3660,7 @@ BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp)
 
 BlockDriverState *bdrv_lookup_bs(const char *device,
                                  const char *node_name,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     BlockBackend *blk;
     BlockDriverState *bs;
@@ -3999,7 +4007,7 @@ void bdrv_init_with_whitelist(void)
     bdrv_init();
 }
 
-void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
+void bdrv_invalidate_cache(BlockDriverState *bs, Error *errp[static 1])
 {
     BdrvChild *child, *parent;
     uint64_t perm, shared_perm;
@@ -4060,7 +4068,7 @@ void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp)
     }
 }
 
-void bdrv_invalidate_cache_all(Error **errp)
+void bdrv_invalidate_cache_all(Error *errp[static 1])
 {
     BlockDriverState *bs;
     BdrvNextIterator it;
@@ -4244,7 +4252,8 @@ struct BdrvOpBlocker {
     QLIST_ENTRY(BdrvOpBlocker) list;
 };
 
-bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
+bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op,
+                        Error *errp[static 1])
 {
     BdrvOpBlocker *blocker;
     assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX);
@@ -4311,7 +4320,7 @@ bool bdrv_op_blocker_is_empty(BlockDriverState *bs)
 void bdrv_img_create(const char *filename, const char *fmt,
                      const char *base_filename, const char *base_fmt,
                      char *options, uint64_t img_size, int flags, bool quiet,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     QemuOptsList *create_opts = NULL;
     QemuOpts *opts = NULL;
@@ -4683,7 +4692,8 @@ bool bdrv_is_first_non_filter(BlockDriverState *candidate)
 }
 
 BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
-                                        const char *node_name, Error **errp)
+                                        const char *node_name,
+                                        Error *errp[static 1])
 {
     BlockDriverState *to_replace_bs = bdrv_find_node(node_name);
     AioContext *aio_context;
@@ -4871,7 +4881,7 @@ void bdrv_refresh_filename(BlockDriverState *bs)
  * it is broken and take a new child online
  */
 void bdrv_add_child(BlockDriverState *parent_bs, BlockDriverState *child_bs,
-                    Error **errp)
+                    Error *errp[static 1])
 {
 
     if (!parent_bs->drv || !parent_bs->drv->bdrv_add_child) {
@@ -4889,7 +4899,8 @@ void bdrv_add_child(BlockDriverState *parent_bs, BlockDriverState *child_bs,
     parent_bs->drv->bdrv_add_child(parent_bs, child_bs, errp);
 }
 
-void bdrv_del_child(BlockDriverState *parent_bs, BdrvChild *child, Error **errp)
+void bdrv_del_child(BlockDriverState *parent_bs, BdrvChild *child,
+                    Error *errp[static 1])
 {
     BdrvChild *tmp;
 
diff --git a/block/backup.c b/block/backup.c
index 6976129e7d..5e5d45c5a1 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -200,7 +200,8 @@ static int coroutine_fn backup_before_write_notify(
     return backup_do_cow(job, sector_num, nb_sectors, NULL, true);
 }
 
-static void backup_set_speed(BlockJob *job, int64_t speed, Error **errp)
+static void backup_set_speed(BlockJob *job, int64_t speed,
+                             Error *errp[static 1])
 {
     BackupBlockJob *s = container_of(job, BackupBlockJob, common);
 
@@ -258,7 +259,7 @@ static void backup_attached_aio_context(BlockJob *job, AioContext *aio_context)
     blk_set_aio_context(s->target, aio_context);
 }
 
-void backup_do_checkpoint(BlockJob *job, Error **errp)
+void backup_do_checkpoint(BlockJob *job, Error *errp[static 1])
 {
     BackupBlockJob *backup_job = container_of(job, BackupBlockJob, common);
     int64_t len;
@@ -558,7 +559,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
                   BlockdevOnError on_target_error,
                   int creation_flags,
                   BlockCompletionFunc *cb, void *opaque,
-                  BlockJobTxn *txn, Error **errp)
+                  BlockJobTxn *txn, Error *errp[static 1])
 {
     int64_t len;
     BlockDriverInfo bdi;
diff --git a/block/blkdebug.c b/block/blkdebug.c
index 57cd23d94a..f6ff0e7b38 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -169,7 +169,7 @@ struct add_rule_data {
     int action;
 };
 
-static int add_rule(void *opaque, QemuOpts *opts, Error **errp)
+static int add_rule(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     struct add_rule_data *d = opaque;
     BDRVBlkdebugState *s = d->s;
@@ -241,7 +241,7 @@ static void remove_rule(BlkdebugRule *rule)
 }
 
 static int read_config(BDRVBlkdebugState *s, const char *filename,
-                       QDict *options, Error **errp)
+                       QDict *options, Error *errp[static 1])
 {
     FILE *f = NULL;
     int ret;
@@ -295,7 +295,7 @@ fail:
 
 /* Valid blkdebug filenames look like blkdebug:path/to/config:path/to/image */
 static void blkdebug_parse_filename(const char *filename, QDict *options,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     const char *c;
 
@@ -374,7 +374,7 @@ static QemuOptsList runtime_opts = {
 };
 
 static int blkdebug_open(BlockDriverState *bs, QDict *options, int flags,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     BDRVBlkdebugState *s = bs->opaque;
     QemuOpts *opts;
@@ -808,7 +808,8 @@ static int64_t blkdebug_getlength(BlockDriverState *bs)
     return bdrv_getlength(bs->file->bs);
 }
 
-static int blkdebug_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int blkdebug_truncate(BlockDriverState *bs, int64_t offset,
+                             Error *errp[static 1])
 {
     return bdrv_truncate(bs->file, offset, errp);
 }
@@ -857,7 +858,8 @@ static void blkdebug_refresh_filename(BlockDriverState *bs, QDict *options)
     bs->full_open_options = opts;
 }
 
-static void blkdebug_refresh_limits(BlockDriverState *bs, Error **errp)
+static void blkdebug_refresh_limits(BlockDriverState *bs,
+                                    Error *errp[static 1])
 {
     BDRVBlkdebugState *s = bs->opaque;
 
@@ -882,7 +884,8 @@ static void blkdebug_refresh_limits(BlockDriverState *bs, Error **errp)
 }
 
 static int blkdebug_reopen_prepare(BDRVReopenState *reopen_state,
-                                   BlockReopenQueue *queue, Error **errp)
+                                   BlockReopenQueue *queue,
+                                   Error *errp[static 1])
 {
     return 0;
 }
diff --git a/block/blkreplay.c b/block/blkreplay.c
index 6aa5fd4156..f28de446a7 100755
--- a/block/blkreplay.c
+++ b/block/blkreplay.c
@@ -21,7 +21,7 @@ typedef struct Request {
 } Request;
 
 static int blkreplay_open(BlockDriverState *bs, QDict *options, int flags,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     Error *local_err = NULL;
     int ret;
diff --git a/block/blkverify.c b/block/blkverify.c
index 6b0a603cf0..78adc24a76 100644
--- a/block/blkverify.c
+++ b/block/blkverify.c
@@ -57,7 +57,7 @@ static void GCC_FMT_ATTR(2, 3) blkverify_err(BlkverifyRequest *r,
 
 /* Valid blkverify filenames look like blkverify:path/to/raw_image:path/to/image */
 static void blkverify_parse_filename(const char *filename, QDict *options,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     const char *c;
     QString *raw_path;
@@ -106,7 +106,7 @@ static QemuOptsList runtime_opts = {
 };
 
 static int blkverify_open(BlockDriverState *bs, QDict *options, int flags,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     BDRVBlkverifyState *s = bs->opaque;
     QemuOpts *opts;
diff --git a/block/block-backend.c b/block/block-backend.c
index 0725cd84a4..1fab9ec0b0 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -138,7 +138,7 @@ static const char *blk_root_get_name(BdrvChild *child)
  *
  * If an error is returned, the VM cannot be allowed to be resumed.
  */
-static void blk_root_activate(BdrvChild *child, Error **errp)
+static void blk_root_activate(BdrvChild *child, Error *errp[static 1])
 {
     BlockBackend *blk = child->opaque;
 
@@ -238,7 +238,7 @@ BlockBackend *blk_new(uint64_t perm, uint64_t shared_perm)
  * @flags.
  */
 BlockBackend *blk_new_open(const char *filename, const char *reference,
-                           QDict *options, int flags, Error **errp)
+                           QDict *options, int flags, Error *errp[static 1])
 {
     BlockBackend *blk;
     BlockDriverState *bs;
@@ -428,7 +428,8 @@ BlockDriverState *bdrv_first(BdrvNextIterator *it)
  * Returns true on success and false on failure. In the latter case, an Error
  * object is returned through @errp.
  */
-bool monitor_add_blk(BlockBackend *blk, const char *name, Error **errp)
+bool monitor_add_blk(BlockBackend *blk, const char *name,
+                     Error *errp[static 1])
 {
     assert(!blk->name);
     assert(name && name[0]);
@@ -608,7 +609,8 @@ void blk_remove_bs(BlockBackend *blk)
 /*
  * Associates a new BlockDriverState with @blk.
  */
-int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp)
+int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs,
+                  Error *errp[static 1])
 {
     blk->root = bdrv_root_attach_child(bs, "root", &child_root,
                                        blk->perm, blk->shared_perm, blk, errp);
@@ -630,7 +632,7 @@ int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp)
  * Sets the permission bitmasks that the user of the BlockBackend needs.
  */
 int blk_set_perm(BlockBackend *blk, uint64_t perm, uint64_t shared_perm,
-                 Error **errp)
+                 Error *errp[static 1])
 {
     int ret;
 
@@ -789,7 +791,8 @@ void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops,
  *
  * Also send DEVICE_TRAY_MOVED events as appropriate.
  */
-void blk_dev_change_media_cb(BlockBackend *blk, bool load, Error **errp)
+void blk_dev_change_media_cb(BlockBackend *blk, bool load,
+                             Error *errp[static 1])
 {
     if (blk->dev_ops && blk->dev_ops->change_media_cb) {
         bool tray_was_open, tray_is_open;
@@ -1524,7 +1527,7 @@ void blk_set_enable_write_cache(BlockBackend *blk, bool wce)
     blk->enable_write_cache = wce;
 }
 
-void blk_invalidate_cache(BlockBackend *blk, Error **errp)
+void blk_invalidate_cache(BlockBackend *blk, Error *errp[static 1])
 {
     BlockDriverState *bs = blk_bs(blk);
 
@@ -1620,7 +1623,8 @@ void *blk_blockalign(BlockBackend *blk, size_t size)
     return qemu_blockalign(blk ? blk_bs(blk) : NULL, size);
 }
 
-bool blk_op_is_blocked(BlockBackend *blk, BlockOpType op, Error **errp)
+bool blk_op_is_blocked(BlockBackend *blk, BlockOpType op,
+                       Error *errp[static 1])
 {
     BlockDriverState *bs = blk_bs(blk);
 
@@ -1770,7 +1774,7 @@ int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, const void *buf,
                    BDRV_REQ_WRITE_COMPRESSED);
 }
 
-int blk_truncate(BlockBackend *blk, int64_t offset, Error **errp)
+int blk_truncate(BlockBackend *blk, int64_t offset, Error *errp[static 1])
 {
     if (!blk_is_available(blk)) {
         error_setg(errp, "No medium inserted");
diff --git a/block/bochs.c b/block/bochs.c
index a759b6eff0..be02ab4b34 100644
--- a/block/bochs.c
+++ b/block/bochs.c
@@ -97,7 +97,7 @@ static int bochs_probe(const uint8_t *buf, int buf_size, const char *filename)
 }
 
 static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     BDRVBochsState *s = bs->opaque;
     uint32_t i;
@@ -197,7 +197,7 @@ fail:
     return ret;
 }
 
-static void bochs_refresh_limits(BlockDriverState *bs, Error **errp)
+static void bochs_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     bs->bl.request_alignment = BDRV_SECTOR_SIZE; /* No sub-sector I/O */
 }
diff --git a/block/cloop.c b/block/cloop.c
index d6597fcf78..981c6e23b0 100644
--- a/block/cloop.c
+++ b/block/cloop.c
@@ -60,7 +60,7 @@ static int cloop_probe(const uint8_t *buf, int buf_size, const char *filename)
 }
 
 static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     BDRVCloopState *s = bs->opaque;
     uint32_t offsets_size, max_compressed_block_size = 1, i;
@@ -207,7 +207,7 @@ fail:
     return ret;
 }
 
-static void cloop_refresh_limits(BlockDriverState *bs, Error **errp)
+static void cloop_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     bs->bl.request_alignment = BDRV_SECTOR_SIZE; /* No sub-sector I/O */
 }
diff --git a/block/commit.c b/block/commit.c
index 08ab3ce7de..4c2354359f 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -216,7 +216,8 @@ out:
     block_job_defer_to_main_loop(&s->common, commit_complete, data);
 }
 
-static void commit_set_speed(BlockJob *job, int64_t speed, Error **errp)
+static void commit_set_speed(BlockJob *job, int64_t speed,
+                             Error *errp[static 1])
 {
     CommitBlockJob *s = container_of(job, CommitBlockJob, common);
 
@@ -284,7 +285,7 @@ static BlockDriver bdrv_commit_top = {
 void commit_start(const char *job_id, BlockDriverState *bs,
                   BlockDriverState *base, BlockDriverState *top, int64_t speed,
                   BlockdevOnError on_error, const char *backing_file_str,
-                  const char *filter_node_name, Error **errp)
+                  const char *filter_node_name, Error *errp[static 1])
 {
     CommitBlockJob *s;
     BlockReopenQueue *reopen_queue = NULL;
diff --git a/block/crypto.c b/block/crypto.c
index d98ae60c48..69a6601b8f 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -60,7 +60,7 @@ static ssize_t block_crypto_read_func(QCryptoBlock *block,
                                       uint8_t *buf,
                                       size_t buflen,
                                       void *opaque,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     BlockDriverState *bs = opaque;
     ssize_t ret;
@@ -87,7 +87,7 @@ static ssize_t block_crypto_write_func(QCryptoBlock *block,
                                        const uint8_t *buf,
                                        size_t buflen,
                                        void *opaque,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     struct BlockCryptoCreateData *data = opaque;
     ssize_t ret;
@@ -104,7 +104,7 @@ static ssize_t block_crypto_write_func(QCryptoBlock *block,
 static ssize_t block_crypto_init_func(QCryptoBlock *block,
                                       size_t headerlen,
                                       void *opaque,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     struct BlockCryptoCreateData *data = opaque;
     int ret;
@@ -197,7 +197,7 @@ static QemuOptsList block_crypto_create_opts_luks = {
 static QCryptoBlockOpenOptions *
 block_crypto_open_opts_init(QCryptoBlockFormat format,
                             QemuOpts *opts,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     Visitor *v;
     QCryptoBlockOpenOptions *ret = NULL;
@@ -243,7 +243,7 @@ block_crypto_open_opts_init(QCryptoBlockFormat format,
 static QCryptoBlockCreateOptions *
 block_crypto_create_opts_init(QCryptoBlockFormat format,
                               QemuOpts *opts,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     Visitor *v;
     QCryptoBlockCreateOptions *ret = NULL;
@@ -291,7 +291,7 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
                                      BlockDriverState *bs,
                                      QDict *options,
                                      int flags,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     BlockCrypto *crypto = bs->opaque;
     QemuOpts *opts = NULL;
@@ -343,7 +343,7 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
 static int block_crypto_create_generic(QCryptoBlockFormat format,
                                        const char *filename,
                                        QemuOpts *opts,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     int ret = -EINVAL;
     QCryptoBlockCreateOptions *create_opts = NULL;
@@ -380,7 +380,7 @@ static int block_crypto_create_generic(QCryptoBlockFormat format,
 }
 
 static int block_crypto_truncate(BlockDriverState *bs, int64_t offset,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     BlockCrypto *crypto = bs->opaque;
     size_t payload_offset =
@@ -559,7 +559,7 @@ static int block_crypto_probe_luks(const uint8_t *buf,
 static int block_crypto_open_luks(BlockDriverState *bs,
                                   QDict *options,
                                   int flags,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     return block_crypto_open_generic(Q_CRYPTO_BLOCK_FORMAT_LUKS,
                                      &block_crypto_runtime_opts_luks,
@@ -568,7 +568,7 @@ static int block_crypto_open_luks(BlockDriverState *bs,
 
 static int block_crypto_create_luks(const char *filename,
                                     QemuOpts *opts,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     return block_crypto_create_generic(Q_CRYPTO_BLOCK_FORMAT_LUKS,
                                        filename, opts, errp);
diff --git a/block/curl.c b/block/curl.c
index 05ed2e82c6..5c67b40545 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -564,7 +564,7 @@ static void curl_clean_state(CURLState *s)
 }
 
 static void curl_parse_filename(const char *filename, QDict *options,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     qdict_put_str(options, CURL_BLOCK_OPT_URL, filename);
 }
@@ -674,7 +674,7 @@ static QemuOptsList runtime_opts = {
 
 
 static int curl_open(BlockDriverState *bs, QDict *options, int flags,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     BDRVCURLState *s = bs->opaque;
     CURLState *state = NULL;
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
index 519737c8d3..50d26a74dc 100644
--- a/block/dirty-bitmap.c
+++ b/block/dirty-bitmap.c
@@ -75,7 +75,7 @@ void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap)
 BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
                                           uint32_t granularity,
                                           const char *name,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     int64_t bitmap_size;
     BdrvDirtyBitmap *bitmap;
@@ -190,7 +190,8 @@ DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap)
  * Requires that the bitmap is not frozen and has no successor.
  */
 int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
-                                       BdrvDirtyBitmap *bitmap, Error **errp)
+                                       BdrvDirtyBitmap *bitmap,
+                                       Error *errp[static 1])
 {
     uint64_t granularity;
     BdrvDirtyBitmap *child;
@@ -223,7 +224,7 @@ int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
  */
 BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
                                             BdrvDirtyBitmap *bitmap,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     char *name;
     BdrvDirtyBitmap *successor = bitmap->successor;
@@ -250,7 +251,7 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
  */
 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
                                            BdrvDirtyBitmap *parent,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     BdrvDirtyBitmap *successor = parent->successor;
 
diff --git a/block/dmg.c b/block/dmg.c
index 900ae5a678..d911a61291 100644
--- a/block/dmg.c
+++ b/block/dmg.c
@@ -128,7 +128,7 @@ static void update_max_chunk_size(BDRVDMGState *s, uint32_t chunk,
     }
 }
 
-static int64_t dmg_find_koly_offset(BdrvChild *file, Error **errp)
+static int64_t dmg_find_koly_offset(BdrvChild *file, Error *errp[static 1])
 {
     BlockDriverState *file_bs = file->bs;
     int64_t length;
@@ -404,7 +404,7 @@ fail:
 }
 
 static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     BDRVDMGState *s = bs->opaque;
     DmgHeaderState ds;
@@ -532,7 +532,7 @@ fail:
     return ret;
 }
 
-static void dmg_refresh_limits(BlockDriverState *bs, Error **errp)
+static void dmg_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     bs->bl.request_alignment = BDRV_SECTOR_SIZE; /* No sub-sector I/O */
 }
diff --git a/block/file-posix.c b/block/file-posix.c
index ba49f0b528..91948957ff 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -297,7 +297,8 @@ static bool raw_is_io_aligned(int fd, void *buf, size_t len)
     return false;
 }
 
-static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
+static void raw_probe_alignment(BlockDriverState *bs, int fd,
+                                Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     char *buf;
@@ -379,7 +380,7 @@ static void raw_parse_flags(int bdrv_flags, int *open_flags)
 }
 
 static void raw_parse_filename(const char *filename, QDict *options,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     bdrv_parse_filename_strip_prefix(filename, "file:", options);
 }
@@ -408,7 +409,8 @@ static QemuOptsList raw_runtime_opts = {
 };
 
 static int raw_open_common(BlockDriverState *bs, QDict *options,
-                           int bdrv_flags, int open_flags, Error **errp)
+                           int bdrv_flags, int open_flags,
+                           Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     QemuOpts *opts;
@@ -587,7 +589,7 @@ fail:
 }
 
 static int raw_open(BlockDriverState *bs, QDict *options, int flags,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
 
@@ -611,7 +613,7 @@ typedef enum {
 static int raw_apply_lock_bytes(BDRVRawState *s,
                                 uint64_t perm_lock_bits,
                                 uint64_t shared_perm_lock_bits,
-                                bool unlock, Error **errp)
+                                bool unlock, Error *errp[static 1])
 {
     int ret;
     int i;
@@ -654,7 +656,7 @@ static int raw_apply_lock_bytes(BDRVRawState *s,
 /* Check "unshared" bytes implied by @perm and ~@shared_perm in the file. */
 static int raw_check_lock_bytes(BDRVRawState *s,
                                 uint64_t perm, uint64_t shared_perm,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     int ret;
     int i;
@@ -699,7 +701,7 @@ static int raw_check_lock_bytes(BDRVRawState *s,
 static int raw_handle_perm_lock(BlockDriverState *bs,
                                 RawPermLockOp op,
                                 uint64_t new_perm, uint64_t new_shared,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     int ret = 0;
@@ -751,7 +753,7 @@ static int raw_handle_perm_lock(BlockDriverState *bs,
 }
 
 static int raw_reopen_prepare(BDRVReopenState *state,
-                              BlockReopenQueue *queue, Error **errp)
+                              BlockReopenQueue *queue, Error *errp[static 1])
 {
     BDRVRawState *s;
     BDRVRawReopenState *rs;
@@ -923,7 +925,7 @@ out:
 #endif
 }
 
-static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
+static void raw_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     struct stat st;
@@ -1622,7 +1624,8 @@ static void raw_close(BlockDriverState *bs)
     }
 }
 
-static int raw_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int raw_truncate(BlockDriverState *bs, int64_t offset,
+                        Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     struct stat st;
@@ -1833,7 +1836,8 @@ static int64_t raw_get_allocated_file_size(BlockDriverState *bs)
     return (int64_t)st.st_blocks * 512;
 }
 
-static int raw_create(const char *filename, QemuOpts *opts, Error **errp)
+static int raw_create(const char *filename, QemuOpts *opts,
+                      Error *errp[static 1])
 {
     int fd;
     int result = 0;
@@ -2165,7 +2169,7 @@ static QemuOptsList raw_create_opts = {
 };
 
 static int raw_check_perm(BlockDriverState *bs, uint64_t perm, uint64_t shared,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     return raw_handle_perm_lock(bs, RAW_PL_PREPARE, perm, shared, errp);
 }
@@ -2296,7 +2300,7 @@ kern_return_t GetBSDPath(io_iterator_t mediaIterator, char *bsdPath,
 }
 
 /* Sets up a real cdrom for use in QEMU */
-static bool setup_cdrom(char *bsd_path, Error **errp)
+static bool setup_cdrom(char *bsd_path, Error *errp[static 1])
 {
     int index, num_of_test_partitions = 2, fd;
     char test_partition[MAXPATHLEN];
@@ -2386,7 +2390,7 @@ static int check_hdev_writable(BDRVRawState *s)
 }
 
 static void hdev_parse_filename(const char *filename, QDict *options,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     bdrv_parse_filename_strip_prefix(filename, "host_device:", options);
 }
@@ -2424,7 +2428,7 @@ static bool hdev_is_sg(BlockDriverState *bs)
 }
 
 static int hdev_open(BlockDriverState *bs, QDict *options, int flags,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     Error *local_err = NULL;
@@ -2591,7 +2595,7 @@ static coroutine_fn int hdev_co_pwrite_zeroes(BlockDriverState *bs,
 }
 
 static int hdev_create(const char *filename, QemuOpts *opts,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     int fd;
     int ret = 0;
@@ -2685,7 +2689,7 @@ static BlockDriver bdrv_host_device = {
 
 #if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
 static void cdrom_parse_filename(const char *filename, QDict *options,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     bdrv_parse_filename_strip_prefix(filename, "host_cdrom:", options);
 }
@@ -2693,7 +2697,7 @@ static void cdrom_parse_filename(const char *filename, QDict *options,
 
 #ifdef __linux__
 static int cdrom_open(BlockDriverState *bs, QDict *options, int flags,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
 
@@ -2805,7 +2809,7 @@ static BlockDriver bdrv_host_cdrom = {
 
 #if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
 static int cdrom_open(BlockDriverState *bs, QDict *options, int flags,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     Error *local_err = NULL;
diff --git a/block/file-win32.c b/block/file-win32.c
index ef2910b03f..ae83637dde 100644
--- a/block/file-win32.c
+++ b/block/file-win32.c
@@ -223,7 +223,7 @@ static void raw_attach_aio_context(BlockDriverState *bs,
     }
 }
 
-static void raw_probe_alignment(BlockDriverState *bs, Error **errp)
+static void raw_probe_alignment(BlockDriverState *bs, Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     DWORD sectorsPerCluster, freeClusters, totalClusters, count;
@@ -274,7 +274,7 @@ static void raw_parse_flags(int flags, bool use_aio, int *access_flags,
 }
 
 static void raw_parse_filename(const char *filename, QDict *options,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     bdrv_parse_filename_strip_prefix(filename, "file:", options);
 }
@@ -297,7 +297,7 @@ static QemuOptsList raw_runtime_opts = {
     },
 };
 
-static bool get_aio_option(QemuOpts *opts, int flags, Error **errp)
+static bool get_aio_option(QemuOpts *opts, int flags, Error *errp[static 1])
 {
     BlockdevAioOptions aio, aio_default;
 
@@ -318,7 +318,7 @@ static bool get_aio_option(QemuOpts *opts, int flags, Error **errp)
 }
 
 static int raw_open(BlockDriverState *bs, QDict *options, int flags,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     int access_flags;
@@ -461,7 +461,8 @@ static void raw_close(BlockDriverState *bs)
     }
 }
 
-static int raw_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int raw_truncate(BlockDriverState *bs, int64_t offset,
+                        Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     LONG low, high;
@@ -544,7 +545,8 @@ static int64_t raw_get_allocated_file_size(BlockDriverState *bs)
     return st.st_size;
 }
 
-static int raw_create(const char *filename, QemuOpts *opts, Error **errp)
+static int raw_create(const char *filename, QemuOpts *opts,
+                      Error *errp[static 1])
 {
     int fd;
     int64_t total_size = 0;
@@ -664,13 +666,13 @@ static int hdev_probe_device(const char *filename)
 }
 
 static void hdev_parse_filename(const char *filename, QDict *options,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     bdrv_parse_filename_strip_prefix(filename, "host_device:", options);
 }
 
 static int hdev_open(BlockDriverState *bs, QDict *options, int flags,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     int access_flags, create_flags;
diff --git a/block/gluster.c b/block/gluster.c
index 30ac978a89..432e2a7f63 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -391,7 +391,7 @@ out:
 }
 
 static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     struct glfs *glfs;
     int ret;
@@ -484,7 +484,7 @@ out:
  * Convert the json formatted command line into qapi.
 */
 static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
-                                  QDict *options, Error **errp)
+                                  QDict *options, Error *errp[static 1])
 {
     QemuOpts *opts;
     SocketAddress *gsconf = NULL;
@@ -658,7 +658,7 @@ out:
 
 static struct glfs *qemu_gluster_init(BlockdevOptionsGluster *gconf,
                                       const char *filename,
-                                      QDict *options, Error **errp)
+                                      QDict *options, Error *errp[static 1])
 {
     int ret;
     if (filename) {
@@ -758,7 +758,7 @@ static bool qemu_gluster_test_seek(struct glfs_fd *fd)
 }
 
 static int qemu_gluster_open(BlockDriverState *bs,  QDict *options,
-                             int bdrv_flags, Error **errp)
+                             int bdrv_flags, Error *errp[static 1])
 {
     BDRVGlusterState *s = bs->opaque;
     int open_flags = 0;
@@ -843,7 +843,8 @@ out:
 }
 
 static int qemu_gluster_reopen_prepare(BDRVReopenState *state,
-                                       BlockReopenQueue *queue, Error **errp)
+                                       BlockReopenQueue *queue,
+                                       Error *errp[static 1])
 {
     int ret = 0;
     BDRVGlusterState *s;
@@ -965,7 +966,7 @@ static coroutine_fn int qemu_gluster_co_pwrite_zeroes(BlockDriverState *bs,
 #endif
 
 static int qemu_gluster_create(const char *filename,
-                               QemuOpts *opts, Error **errp)
+                               QemuOpts *opts, Error *errp[static 1])
 {
     BlockdevOptionsGluster *gconf;
     struct glfs *glfs;
@@ -1095,7 +1096,7 @@ static coroutine_fn int qemu_gluster_co_rw(BlockDriverState *bs,
 }
 
 static int qemu_gluster_truncate(BlockDriverState *bs, int64_t offset,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     int ret;
     BDRVGlusterState *s = bs->opaque;
diff --git a/block/io.c b/block/io.c
index cc3fd997a7..43faf4085d 100644
--- a/block/io.c
+++ b/block/io.c
@@ -78,7 +78,7 @@ static void bdrv_merge_limits(BlockLimits *dst, const BlockLimits *src)
     dst->max_iov = MIN_NON_ZERO(dst->max_iov, src->max_iov);
 }
 
-void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
+void bdrv_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     BlockDriver *drv = bs->drv;
 
diff --git a/block/iscsi.c b/block/iscsi.c
index 6b3939585c..8359479a20 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1293,7 +1293,7 @@ out_unlock:
 }
 
 static void apply_chap(struct iscsi_context *iscsi, QemuOpts *opts,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     const char *user = NULL;
     const char *password = NULL;
@@ -1331,7 +1331,7 @@ static void apply_chap(struct iscsi_context *iscsi, QemuOpts *opts,
 }
 
 static void apply_header_digest(struct iscsi_context *iscsi, QemuOpts *opts,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     const char *digest = NULL;
 
@@ -1394,7 +1394,7 @@ out:
     qemu_mutex_unlock(&iscsilun->mutex);
 }
 
-static void iscsi_readcapacity_sync(IscsiLun *iscsilun, Error **errp)
+static void iscsi_readcapacity_sync(IscsiLun *iscsilun, Error *errp[static 1])
 {
     struct scsi_task *task = NULL;
     struct scsi_readcapacity10 *rc10 = NULL;
@@ -1465,7 +1465,8 @@ static void iscsi_readcapacity_sync(IscsiLun *iscsilun, Error **errp)
 }
 
 static struct scsi_task *iscsi_do_inquiry(struct iscsi_context *iscsi, int lun,
-                                          int evpd, int pc, void **inq, Error **errp)
+                                          int evpd, int pc, void **inq,
+                                          Error *errp[static 1])
 {
     int full_size;
     struct scsi_task *task = NULL;
@@ -1641,7 +1642,7 @@ static void iscsi_parse_iscsi_option(const char *target, QDict *options)
  * iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
  */
 static void iscsi_parse_filename(const char *filename, QDict *options,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     struct iscsi_url *iscsi_url;
     const char *transport_name;
@@ -1738,7 +1739,7 @@ static QemuOptsList runtime_opts = {
 };
 
 static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     IscsiLun *iscsilun = bs->opaque;
     struct iscsi_context *iscsi = NULL;
@@ -1982,7 +1983,7 @@ static void iscsi_close(BlockDriverState *bs)
     memset(iscsilun, 0, sizeof(IscsiLun));
 }
 
-static void iscsi_refresh_limits(BlockDriverState *bs, Error **errp)
+static void iscsi_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     /* We don't actually refresh here, but just return data queried in
      * iscsi_open(): iscsi targets don't change their limits. */
@@ -2034,7 +2035,8 @@ static void iscsi_refresh_limits(BlockDriverState *bs, Error **errp)
 /* Note that this will not re-establish a connection with an iSCSI target - it
  * is effectively a NOP.  */
 static int iscsi_reopen_prepare(BDRVReopenState *state,
-                                BlockReopenQueue *queue, Error **errp)
+                                BlockReopenQueue *queue,
+                                Error *errp[static 1])
 {
     IscsiLun *iscsilun = state->bs->opaque;
 
@@ -2055,7 +2057,8 @@ static void iscsi_reopen_commit(BDRVReopenState *reopen_state)
     }
 }
 
-static int iscsi_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int iscsi_truncate(BlockDriverState *bs, int64_t offset,
+                          Error *errp[static 1])
 {
     IscsiLun *iscsilun = bs->opaque;
 
@@ -2081,7 +2084,8 @@ static int iscsi_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
     return 0;
 }
 
-static int iscsi_create(const char *filename, QemuOpts *opts, Error **errp)
+static int iscsi_create(const char *filename, QemuOpts *opts,
+                        Error *errp[static 1])
 {
     int ret = 0;
     int64_t total_size = 0;
@@ -2142,7 +2146,7 @@ static int iscsi_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
 }
 
 static void iscsi_invalidate_cache(BlockDriverState *bs,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     IscsiLun *iscsilun = bs->opaque;
     iscsi_allocmap_invalidate(iscsilun);
diff --git a/block/mirror.c b/block/mirror.c
index addafec0ee..6007fc1293 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -915,7 +915,8 @@ immediate_exit:
     block_job_defer_to_main_loop(&s->common, mirror_exit, data);
 }
 
-static void mirror_set_speed(BlockJob *job, int64_t speed, Error **errp)
+static void mirror_set_speed(BlockJob *job, int64_t speed,
+                             Error *errp[static 1])
 {
     MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
 
@@ -926,7 +927,7 @@ static void mirror_set_speed(BlockJob *job, int64_t speed, Error **errp)
     ratelimit_set_speed(&s->limit, speed / BDRV_SECTOR_SIZE, SLICE_TIME);
 }
 
-static void mirror_complete(BlockJob *job, Error **errp)
+static void mirror_complete(BlockJob *job, Error *errp[static 1])
 {
     MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
     BlockDriverState *target;
@@ -1121,7 +1122,7 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
                              const BlockJobDriver *driver,
                              bool is_none_mode, BlockDriverState *base,
                              bool auto_complete, const char *filter_node_name,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     MirrorBlockJob *s;
     BlockDriverState *mirror_top_bs;
@@ -1271,7 +1272,8 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
                   MirrorSyncMode mode, BlockMirrorBackingMode backing_mode,
                   BlockdevOnError on_source_error,
                   BlockdevOnError on_target_error,
-                  bool unmap, const char *filter_node_name, Error **errp)
+                  bool unmap, const char *filter_node_name,
+                  Error *errp[static 1])
 {
     bool is_none_mode;
     BlockDriverState *base;
@@ -1294,7 +1296,7 @@ void commit_active_start(const char *job_id, BlockDriverState *bs,
                          int64_t speed, BlockdevOnError on_error,
                          const char *filter_node_name,
                          BlockCompletionFunc *cb, void *opaque,
-                         bool auto_complete, Error **errp)
+                         bool auto_complete, Error *errp[static 1])
 {
     int orig_base_flags;
 
diff --git a/block/nbd-client.c b/block/nbd-client.c
index ac3f735d27..6d1012cc73 100644
--- a/block/nbd-client.c
+++ b/block/nbd-client.c
@@ -375,7 +375,7 @@ int nbd_client_init(BlockDriverState *bs,
                     const char *export,
                     QCryptoTLSCreds *tlscreds,
                     const char *hostname,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     NBDClientSession *client = nbd_get_client_session(bs);
     int ret;
diff --git a/block/nbd.c b/block/nbd.c
index 6644c0e75f..8b02e8ab5e 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -130,7 +130,8 @@ out:
     return ret;
 }
 
-static bool nbd_has_filename_options_conflict(QDict *options, Error **errp)
+static bool nbd_has_filename_options_conflict(QDict *options,
+                                              Error *errp[static 1])
 {
     const QDictEntry *e;
 
@@ -151,7 +152,7 @@ static bool nbd_has_filename_options_conflict(QDict *options, Error **errp)
 }
 
 static void nbd_parse_filename(const char *filename, QDict *options,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     char *file;
     char *export_name;
@@ -217,7 +218,7 @@ out:
 
 static bool nbd_process_legacy_socket_options(QDict *output_options,
                                               QemuOpts *legacy_opts,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     const char *path = qemu_opt_get(legacy_opts, "path");
     const char *host = qemu_opt_get(legacy_opts, "host");
@@ -259,7 +260,7 @@ static bool nbd_process_legacy_socket_options(QDict *output_options,
 }
 
 static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     SocketAddress *saddr = NULL;
     QDict *addr = NULL;
@@ -305,7 +306,7 @@ NBDClientSession *nbd_get_client_session(BlockDriverState *bs)
 }
 
 static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr,
-                                                  Error **errp)
+                                                  Error *errp[static 1])
 {
     QIOChannelSocket *sioc;
 
@@ -326,7 +327,8 @@ static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr,
 }
 
 
-static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
+static QCryptoTLSCreds *nbd_get_tls_creds(const char *id,
+                                          Error *errp[static 1])
 {
     Object *obj;
     QCryptoTLSCreds *creds;
@@ -389,7 +391,7 @@ static QemuOptsList nbd_runtime_opts = {
 };
 
 static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     BDRVNBDState *s = bs->opaque;
     QemuOpts *opts = NULL;
@@ -465,7 +467,7 @@ static int nbd_co_flush(BlockDriverState *bs)
     return nbd_client_co_flush(bs);
 }
 
-static void nbd_refresh_limits(BlockDriverState *bs, Error **errp)
+static void nbd_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     bs->bl.max_pdiscard = NBD_MAX_BUFFER_SIZE;
     bs->bl.max_pwrite_zeroes = NBD_MAX_BUFFER_SIZE;
diff --git a/block/nfs.c b/block/nfs.c
index 7792b3ad01..1aaec98ebc 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -72,7 +72,8 @@ typedef struct NFSRPC {
     NFSClient *client;
 } NFSRPC;
 
-static int nfs_parse_uri(const char *filename, QDict *options, Error **errp)
+static int nfs_parse_uri(const char *filename, QDict *options,
+                         Error *errp[static 1])
 {
     URI *uri = NULL;
     QueryParams *qp = NULL;
@@ -149,7 +150,8 @@ out:
     return ret;
 }
 
-static bool nfs_has_filename_options_conflict(QDict *options, Error **errp)
+static bool nfs_has_filename_options_conflict(QDict *options,
+                                              Error *errp[static 1])
 {
     const QDictEntry *qe;
 
@@ -174,7 +176,7 @@ static bool nfs_has_filename_options_conflict(QDict *options, Error **errp)
 }
 
 static void nfs_parse_filename(const char *filename, QDict *options,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     if (nfs_has_filename_options_conflict(options, errp)) {
         return;
@@ -449,7 +451,7 @@ static void nfs_file_close(BlockDriverState *bs)
     qemu_mutex_destroy(&client->mutex);
 }
 
-static NFSServer *nfs_config(QDict *options, Error **errp)
+static NFSServer *nfs_config(QDict *options, Error *errp[static 1])
 {
     NFSServer *server = NULL;
     QDict *addr = NULL;
@@ -489,7 +491,8 @@ out:
 
 
 static int64_t nfs_client_open(NFSClient *client, QDict *options,
-                               int flags, int open_flags, Error **errp)
+                               int flags, int open_flags,
+                               Error *errp[static 1])
 {
     int ret = -EINVAL;
     QemuOpts *opts = NULL;
@@ -645,7 +648,7 @@ out:
 }
 
 static int nfs_file_open(BlockDriverState *bs, QDict *options, int flags,
-                         Error **errp) {
+                         Error *errp[static 1]) {
     NFSClient *client = bs->opaque;
     int64_t ret;
 
@@ -676,7 +679,8 @@ static QemuOptsList nfs_create_opts = {
     }
 };
 
-static int nfs_file_create(const char *url, QemuOpts *opts, Error **errp)
+static int nfs_file_create(const char *url, QemuOpts *opts,
+                           Error *errp[static 1])
 {
     int ret = 0;
     int64_t total_size = 0;
@@ -754,7 +758,8 @@ static int64_t nfs_get_allocated_file_size(BlockDriverState *bs)
     return (task.ret < 0 ? task.ret : st.st_blocks * 512);
 }
 
-static int nfs_file_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int nfs_file_truncate(BlockDriverState *bs, int64_t offset,
+                             Error *errp[static 1])
 {
     NFSClient *client = bs->opaque;
     int ret;
@@ -771,7 +776,7 @@ static int nfs_file_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
 /* Note that this will not re-establish a connection with the NFS server
  * - it is effectively a NOP.  */
 static int nfs_reopen_prepare(BDRVReopenState *state,
-                              BlockReopenQueue *queue, Error **errp)
+                              BlockReopenQueue *queue, Error *errp[static 1])
 {
     NFSClient *client = state->bs->opaque;
     struct stat st;
@@ -860,7 +865,7 @@ static void nfs_refresh_filename(BlockDriverState *bs, QDict *options)
 
 #ifdef LIBNFS_FEATURE_PAGECACHE
 static void nfs_invalidate_cache(BlockDriverState *bs,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     NFSClient *client = bs->opaque;
     nfs_pagecache_invalidate(client->context, client->fh);
diff --git a/block/null.c b/block/null.c
index 876f90965b..d9ed68a3f6 100644
--- a/block/null.c
+++ b/block/null.c
@@ -55,7 +55,7 @@ static QemuOptsList runtime_opts = {
 };
 
 static int null_file_open(BlockDriverState *bs, QDict *options, int flags,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     QemuOpts *opts;
     BDRVNullState *s = bs->opaque;
@@ -199,7 +199,7 @@ static BlockAIOCB *null_aio_flush(BlockDriverState *bs,
 }
 
 static int null_reopen_prepare(BDRVReopenState *reopen_state,
-                               BlockReopenQueue *queue, Error **errp)
+                               BlockReopenQueue *queue, Error *errp[static 1])
 {
     return 0;
 }
diff --git a/block/parallels.c b/block/parallels.c
index d4125a6220..506341853d 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -472,7 +472,8 @@ static int parallels_check(BlockDriverState *bs, BdrvCheckResult *res,
 }
 
 
-static int parallels_create(const char *filename, QemuOpts *opts, Error **errp)
+static int parallels_create(const char *filename, QemuOpts *opts,
+                            Error *errp[static 1])
 {
     int64_t total_size, cl_size;
     uint8_t tmp[BDRV_SECTOR_SIZE];
@@ -583,7 +584,7 @@ static int parallels_update_header(BlockDriverState *bs)
 }
 
 static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     BDRVParallelsState *s = bs->opaque;
     ParallelsHeader ph;
diff --git a/block/qapi.c b/block/qapi.c
index 423934f0bf..e4c95912e8 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -35,7 +35,8 @@
 #include "qemu/cutils.h"
 
 BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
-                                        BlockDriverState *bs, Error **errp)
+                                        BlockDriverState *bs,
+                                        Error *errp[static 1])
 {
     ImageInfo **p_image_info;
     BlockDriverState *bs0;
@@ -152,7 +153,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
  */
 int bdrv_query_snapshot_info_list(BlockDriverState *bs,
                                   SnapshotInfoList **p_list,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     int i, sn_count;
     QEMUSnapshotInfo *sn_tab = NULL;
@@ -224,7 +225,7 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs,
  */
 void bdrv_query_image_info(BlockDriverState *bs,
                            ImageInfo **p_info,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     int64_t size;
     const char *backing_filename;
@@ -318,7 +319,7 @@ out:
 
 /* @p_info will be set only on success. */
 static void bdrv_query_info(BlockBackend *blk, BlockInfo **p_info,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     BlockInfo *info = g_malloc0(sizeof(*info));
     BlockDriverState *bs = blk_bs(blk);
@@ -456,7 +457,7 @@ static BlockStats *bdrv_query_bds_stats(const BlockDriverState *bs,
     return s;
 }
 
-BlockInfoList *qmp_query_block(Error **errp)
+BlockInfoList *qmp_query_block(Error *errp[static 1])
 {
     BlockInfoList *head = NULL, **p_next = &head;
     BlockBackend *blk;
@@ -479,7 +480,7 @@ BlockInfoList *qmp_query_block(Error **errp)
 
 BlockStatsList *qmp_query_blockstats(bool has_query_nodes,
                                      bool query_nodes,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     BlockStatsList *head = NULL, **p_next = &head;
     BlockBackend *blk;
diff --git a/block/qcow.c b/block/qcow.c
index 13d7842db3..df81e9450a 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -98,7 +98,7 @@ static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename)
 }
 
 static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     BDRVQcowState *s = bs->opaque;
     unsigned int len, i, shift;
@@ -281,7 +281,7 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
 /* We have nothing to do for QCOW reopen, stubs just return
  * success */
 static int qcow_reopen_prepare(BDRVReopenState *state,
-                               BlockReopenQueue *queue, Error **errp)
+                               BlockReopenQueue *queue, Error *errp[static 1])
 {
     return 0;
 }
@@ -326,7 +326,7 @@ static int qcow_set_key(BlockDriverState *bs, const char *key)
    supported */
 static int encrypt_sectors(BDRVQcowState *s, int64_t sector_num,
                            uint8_t *out_buf, const uint8_t *in_buf,
-                           int nb_sectors, bool enc, Error **errp)
+                           int nb_sectors, bool enc, Error *errp[static 1])
 {
     union {
         uint64_t ll[2];
@@ -797,7 +797,8 @@ static void qcow_close(BlockDriverState *bs)
     error_free(s->migration_blocker);
 }
 
-static int qcow_create(const char *filename, QemuOpts *opts, Error **errp)
+static int qcow_create(const char *filename, QemuOpts *opts,
+                       Error *errp[static 1])
 {
     int header_size, backing_filename_len, l1_size, shift, i;
     QCowHeader header;
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index d779ea19cf..3133901fc8 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -363,7 +363,7 @@ static int count_contiguous_clusters_unallocated(int nb_clusters,
 int qcow2_encrypt_sectors(BDRVQcow2State *s, int64_t sector_num,
                           uint8_t *out_buf, const uint8_t *in_buf,
                           int nb_sectors, bool enc,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     union {
         uint64_t ll[2];
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 7c06061aae..b6c840cc99 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -2507,7 +2507,7 @@ typedef int (RefblockFinishOp)(BlockDriverState *bs, uint64_t **reftable,
 static int alloc_refblock(BlockDriverState *bs, uint64_t **reftable,
                           uint64_t reftable_index, uint64_t *reftable_size,
                           void *refblock, bool refblock_empty, bool *allocated,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     int64_t offset;
@@ -2560,7 +2560,7 @@ static int alloc_refblock(BlockDriverState *bs, uint64_t **reftable,
 static int flush_refblock(BlockDriverState *bs, uint64_t **reftable,
                           uint64_t reftable_index, uint64_t *reftable_size,
                           void *refblock, bool refblock_empty, bool *allocated,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     int64_t offset;
@@ -2609,7 +2609,7 @@ static int walk_over_reftable(BlockDriverState *bs, uint64_t **new_reftable,
                               Qcow2SetRefcountFunc *new_set_refcount,
                               BlockDriverAmendStatusCB *status_cb,
                               void *cb_opaque, int index, int total,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     uint64_t reftable_index;
@@ -2749,7 +2749,7 @@ static int walk_over_reftable(BlockDriverState *bs, uint64_t **new_reftable,
 
 int qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order,
                                 BlockDriverAmendStatusCB *status_cb,
-                                void *cb_opaque, Error **errp)
+                                void *cb_opaque, Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     Qcow2GetRefcountFunc *new_get_refcount;
diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c
index 44243e0e95..62ecd1327b 100644
--- a/block/qcow2-snapshot.c
+++ b/block/qcow2-snapshot.c
@@ -588,7 +588,7 @@ fail:
 int qcow2_snapshot_delete(BlockDriverState *bs,
                           const char *snapshot_id,
                           const char *name,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     QCowSnapshot sn;
@@ -683,7 +683,7 @@ int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
 int qcow2_snapshot_load_tmp(BlockDriverState *bs,
                             const char *snapshot_id,
                             const char *name,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     int i, snapshot_index;
     BDRVQcow2State *s = bs->opaque;
diff --git a/block/qcow2.c b/block/qcow2.c
index 5e7e5bf292..7f7ee7a7a9 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -86,7 +86,7 @@ static int qcow2_probe(const uint8_t *buf, int buf_size, const char *filename)
  */
 static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
                                  uint64_t end_offset, void **p_feature_table,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     QCowExtension ext;
@@ -521,7 +521,8 @@ static void qcow2_attach_aio_context(BlockDriverState *bs,
 
 static void read_cache_sizes(BlockDriverState *bs, QemuOpts *opts,
                              uint64_t *l2_cache_size,
-                             uint64_t *refcount_cache_size, Error **errp)
+                             uint64_t *refcount_cache_size,
+                             Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     uint64_t combined_cache_size;
@@ -590,7 +591,7 @@ typedef struct Qcow2ReopenState {
 static int qcow2_update_options_prepare(BlockDriverState *bs,
                                         Qcow2ReopenState *r,
                                         QDict *options, int flags,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     QemuOpts *opts = NULL;
@@ -796,7 +797,7 @@ static void qcow2_update_options_abort(BlockDriverState *bs,
 }
 
 static int qcow2_update_options(BlockDriverState *bs, QDict *options,
-                                int flags, Error **errp)
+                                int flags, Error *errp[static 1])
 {
     Qcow2ReopenState r = {};
     int ret;
@@ -812,7 +813,7 @@ static int qcow2_update_options(BlockDriverState *bs, QDict *options,
 }
 
 static int qcow2_do_open(BlockDriverState *bs, QDict *options, int flags,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     unsigned int len, i;
@@ -1203,7 +1204,7 @@ static int qcow2_do_open(BlockDriverState *bs, QDict *options, int flags,
 }
 
 static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
                                false, errp);
@@ -1214,7 +1215,7 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
     return qcow2_do_open(bs, options, flags, errp);
 }
 
-static void qcow2_refresh_limits(BlockDriverState *bs, Error **errp)
+static void qcow2_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
 
@@ -1262,7 +1263,8 @@ static int qcow2_set_key(BlockDriverState *bs, const char *key)
 }
 
 static int qcow2_reopen_prepare(BDRVReopenState *state,
-                                BlockReopenQueue *queue, Error **errp)
+                                BlockReopenQueue *queue,
+                                Error *errp[static 1])
 {
     Qcow2ReopenState *r;
     int ret;
@@ -1772,7 +1774,8 @@ static void qcow2_close(BlockDriverState *bs)
     qcow2_free_snapshots(bs);
 }
 
-static void qcow2_invalidate_cache(BlockDriverState *bs, Error **errp)
+static void qcow2_invalidate_cache(BlockDriverState *bs,
+                                   Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     int flags = s->flags;
@@ -2097,7 +2100,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
                          const char *backing_file, const char *backing_format,
                          int flags, size_t cluster_size, PreallocMode prealloc,
                          QemuOpts *opts, int version, int refcount_order,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     int cluster_bits;
     QDict *options;
@@ -2343,7 +2346,8 @@ out:
     return ret;
 }
 
-static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
+static int qcow2_create(const char *filename, QemuOpts *opts,
+                        Error *errp[static 1])
 {
     char *backing_file = NULL;
     char *backing_fmt = NULL;
@@ -2538,7 +2542,8 @@ static coroutine_fn int qcow2_co_pdiscard(BlockDriverState *bs,
     return ret;
 }
 
-static int qcow2_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int qcow2_truncate(BlockDriverState *bs, int64_t offset,
+                          Error *errp[static 1])
 {
     BDRVQcow2State *s = bs->opaque;
     int64_t new_l1_size;
diff --git a/block/qed.c b/block/qed.c
index 8d899fd479..86fc1fbc1a 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -415,7 +415,7 @@ static void bdrv_qed_drain(BlockDriverState *bs)
 }
 
 static int bdrv_qed_do_open(BlockDriverState *bs, QDict *options, int flags,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     BDRVQEDState *s = bs->opaque;
     QEDHeader le_header;
@@ -550,7 +550,7 @@ out:
 }
 
 static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
                                false, errp);
@@ -561,7 +561,8 @@ static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags,
     return bdrv_qed_do_open(bs, options, flags, errp);
 }
 
-static void bdrv_qed_refresh_limits(BlockDriverState *bs, Error **errp)
+static void bdrv_qed_refresh_limits(BlockDriverState *bs,
+                                    Error *errp[static 1])
 {
     BDRVQEDState *s = bs->opaque;
 
@@ -571,7 +572,8 @@ static void bdrv_qed_refresh_limits(BlockDriverState *bs, Error **errp)
 /* We have nothing to do for QED reopen, stubs just return
  * success */
 static int bdrv_qed_reopen_prepare(BDRVReopenState *state,
-                                   BlockReopenQueue *queue, Error **errp)
+                                   BlockReopenQueue *queue,
+                                   Error *errp[static 1])
 {
     return 0;
 }
@@ -598,7 +600,7 @@ static void bdrv_qed_close(BlockDriverState *bs)
 static int qed_create(const char *filename, uint32_t cluster_size,
                       uint64_t image_size, uint32_t table_size,
                       const char *backing_file, const char *backing_fmt,
-                      QemuOpts *opts, Error **errp)
+                      QemuOpts *opts, Error *errp[static 1])
 {
     QEDHeader header = {
         .magic = QED_MAGIC,
@@ -673,7 +675,8 @@ out:
     return ret;
 }
 
-static int bdrv_qed_create(const char *filename, QemuOpts *opts, Error **errp)
+static int bdrv_qed_create(const char *filename, QemuOpts *opts,
+                           Error *errp[static 1])
 {
     uint64_t image_size = 0;
     uint32_t cluster_size = QED_DEFAULT_CLUSTER_SIZE;
@@ -1517,7 +1520,8 @@ static int coroutine_fn bdrv_qed_co_pwrite_zeroes(BlockDriverState *bs,
     return cb.ret;
 }
 
-static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset,
+                             Error *errp[static 1])
 {
     BDRVQEDState *s = bs->opaque;
     uint64_t old_image_size;
@@ -1634,7 +1638,8 @@ static int bdrv_qed_change_backing_file(BlockDriverState *bs,
     return ret;
 }
 
-static void bdrv_qed_invalidate_cache(BlockDriverState *bs, Error **errp)
+static void bdrv_qed_invalidate_cache(BlockDriverState *bs,
+                                      Error *errp[static 1])
 {
     BDRVQEDState *s = bs->opaque;
     Error *local_err = NULL;
diff --git a/block/quorum.c b/block/quorum.c
index ab9f253c96..7e38e197de 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -824,7 +824,8 @@ static bool quorum_recurse_is_first_non_filter(BlockDriverState *bs,
     return false;
 }
 
-static int quorum_valid_threshold(int threshold, int num_children, Error **errp)
+static int quorum_valid_threshold(int threshold, int num_children,
+                                  Error *errp[static 1])
 {
 
     if (threshold < 1) {
@@ -888,7 +889,7 @@ static int parse_read_pattern(const char *opt)
 }
 
 static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     BDRVQuorumState *s = bs->opaque;
     Error *local_err = NULL;
@@ -1007,7 +1008,7 @@ static void quorum_close(BlockDriverState *bs)
 }
 
 static void quorum_add_child(BlockDriverState *bs, BlockDriverState *child_bs,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     BDRVQuorumState *s = bs->opaque;
     BdrvChild *child;
@@ -1047,7 +1048,7 @@ out:
 }
 
 static void quorum_del_child(BlockDriverState *bs, BdrvChild *child,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     BDRVQuorumState *s = bs->opaque;
     int i;
diff --git a/block/raw-format.c b/block/raw-format.c
index 5134373fbf..39ee2cc817 100644
--- a/block/raw-format.c
+++ b/block/raw-format.c
@@ -69,7 +69,7 @@ static QemuOptsList raw_create_opts = {
 };
 
 static int raw_read_options(QDict *options, BlockDriverState *bs,
-    BDRVRawState *s, Error **errp)
+    BDRVRawState *s, Error *errp[static 1])
 {
     QemuOpts *opts = NULL;
     int64_t real_size = 0;
@@ -134,7 +134,7 @@ end:
 }
 
 static int raw_reopen_prepare(BDRVReopenState *reopen_state,
-                              BlockReopenQueue *queue, Error **errp)
+                              BlockReopenQueue *queue, Error *errp[static 1])
 {
     assert(reopen_state != NULL);
     assert(reopen_state->bs != NULL);
@@ -315,7 +315,7 @@ static int raw_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
     return bdrv_get_info(bs->file->bs, bdi);
 }
 
-static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
+static void raw_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     if (bs->probed) {
         /* To make it easier to protect the first sector, any probed
@@ -325,7 +325,8 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
     }
 }
 
-static int raw_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int raw_truncate(BlockDriverState *bs, int64_t offset,
+                        Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
 
@@ -373,13 +374,14 @@ static int raw_has_zero_init(BlockDriverState *bs)
     return bdrv_has_zero_init(bs->file->bs);
 }
 
-static int raw_create(const char *filename, QemuOpts *opts, Error **errp)
+static int raw_create(const char *filename, QemuOpts *opts,
+                      Error *errp[static 1])
 {
     return bdrv_create_file(filename, opts, errp);
 }
 
 static int raw_open(BlockDriverState *bs, QDict *options, int flags,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     BDRVRawState *s = bs->opaque;
     int ret;
diff --git a/block/rbd.c b/block/rbd.c
index 25149e776b..16f07da6f3 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -133,7 +133,7 @@ static void qemu_rbd_unescape(char *src)
 }
 
 static void qemu_rbd_parse_filename(const char *filename, QDict *options,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     const char *start;
     char *p, *buf;
@@ -222,7 +222,7 @@ done:
 
 
 static int qemu_rbd_set_auth(rados_t cluster, const char *secretid,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     if (secretid == 0) {
         return 0;
@@ -241,7 +241,7 @@ static int qemu_rbd_set_auth(rados_t cluster, const char *secretid,
 }
 
 static int qemu_rbd_set_keypairs(rados_t cluster, const char *keypairs_json,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     QList *keypairs;
     QString *name;
@@ -344,7 +344,8 @@ static QemuOptsList runtime_opts = {
     },
 };
 
-static int qemu_rbd_create(const char *filename, QemuOpts *opts, Error **errp)
+static int qemu_rbd_create(const char *filename, QemuOpts *opts,
+                           Error *errp[static 1])
 {
     int64_t bytes = 0;
     int64_t objsize;
@@ -494,7 +495,7 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
     qemu_aio_unref(acb);
 }
 
-static char *qemu_rbd_mon_host(QDict *options, Error **errp)
+static char *qemu_rbd_mon_host(QDict *options, Error *errp[static 1])
 {
     const char **vals = g_new(const char *, qdict_size(options) + 1);
     char keybuf[32];
@@ -535,7 +536,7 @@ out:
 }
 
 static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     BDRVRBDState *s = bs->opaque;
     const char *pool, *snap, *conf, *user, *image_name, *keypairs;
@@ -671,7 +672,8 @@ failed_opts:
  * we just need to check if we are using a snapshot or not, in
  * order to determine if we will allow it to be R/W */
 static int qemu_rbd_reopen_prepare(BDRVReopenState *state,
-                                   BlockReopenQueue *queue, Error **errp)
+                                   BlockReopenQueue *queue,
+                                   Error *errp[static 1])
 {
     BDRVRBDState *s = state->bs->opaque;
     int ret = 0;
@@ -914,7 +916,8 @@ static int64_t qemu_rbd_getlength(BlockDriverState *bs)
     return info.size;
 }
 
-static int qemu_rbd_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int qemu_rbd_truncate(BlockDriverState *bs, int64_t offset,
+                             Error *errp[static 1])
 {
     BDRVRBDState *s = bs->opaque;
     int r;
@@ -963,7 +966,7 @@ static int qemu_rbd_snap_create(BlockDriverState *bs,
 static int qemu_rbd_snap_remove(BlockDriverState *bs,
                                 const char *snapshot_id,
                                 const char *snapshot_name,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     BDRVRBDState *s = bs->opaque;
     int r;
@@ -1054,7 +1057,7 @@ static BlockAIOCB *qemu_rbd_aio_pdiscard(BlockDriverState *bs,
 
 #ifdef LIBRBD_SUPPORTS_INVALIDATE
 static void qemu_rbd_invalidate_cache(BlockDriverState *bs,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     BDRVRBDState *s = bs->opaque;
     int r = rbd_invalidate_cache(s->image);
diff --git a/block/replication.c b/block/replication.c
index c7ea016af9..552c5d22f8 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -45,11 +45,12 @@ typedef struct BDRVReplicationState {
 } BDRVReplicationState;
 
 static void replication_start(ReplicationState *rs, ReplicationMode mode,
-                              Error **errp);
-static void replication_do_checkpoint(ReplicationState *rs, Error **errp);
-static void replication_get_error(ReplicationState *rs, Error **errp);
+                              Error *errp[static 1]);
+static void replication_do_checkpoint(ReplicationState *rs,
+				      Error *errp[static 1]);
+static void replication_get_error(ReplicationState *rs, Error *errp[static 1]);
 static void replication_stop(ReplicationState *rs, bool failover,
-                             Error **errp);
+                             Error *errp[static 1]);
 
 #define REPLICATION_MODE        "mode"
 #define REPLICATION_TOP_ID      "top-id"
@@ -77,7 +78,7 @@ static ReplicationOps replication_ops = {
 };
 
 static int replication_open(BlockDriverState *bs, QDict *options,
-                            int flags, Error **errp)
+                            int flags, Error *errp[static 1])
 {
     int ret;
     BDRVReplicationState *s = bs->opaque;
@@ -311,7 +312,8 @@ static bool replication_recurse_is_first_non_filter(BlockDriverState *bs,
     return bdrv_recurse_is_first_non_filter(bs->file->bs, candidate);
 }
 
-static void secondary_do_checkpoint(BDRVReplicationState *s, Error **errp)
+static void secondary_do_checkpoint(BDRVReplicationState *s,
+                                    Error *errp[static 1])
 {
     int ret;
 
@@ -339,7 +341,7 @@ static void secondary_do_checkpoint(BDRVReplicationState *s, Error **errp)
 }
 
 static void reopen_backing_file(BlockDriverState *bs, bool writable,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     BDRVReplicationState *s = bs->opaque;
     BlockReopenQueue *reopen_queue = NULL;
@@ -427,7 +429,7 @@ static bool check_top_bs(BlockDriverState *top_bs, BlockDriverState *bs)
 }
 
 static void replication_start(ReplicationState *rs, ReplicationMode mode,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     BlockDriverState *bs = rs->opaque;
     BDRVReplicationState *s;
@@ -551,7 +553,8 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
     aio_context_release(aio_context);
 }
 
-static void replication_do_checkpoint(ReplicationState *rs, Error **errp)
+static void replication_do_checkpoint(ReplicationState *rs,
+                                      Error *errp[static 1])
 {
     BlockDriverState *bs = rs->opaque;
     BDRVReplicationState *s;
@@ -567,7 +570,7 @@ static void replication_do_checkpoint(ReplicationState *rs, Error **errp)
     aio_context_release(aio_context);
 }
 
-static void replication_get_error(ReplicationState *rs, Error **errp)
+static void replication_get_error(ReplicationState *rs, Error *errp[static 1])
 {
     BlockDriverState *bs = rs->opaque;
     BDRVReplicationState *s;
@@ -611,7 +614,8 @@ static void replication_done(void *opaque, int ret)
     }
 }
 
-static void replication_stop(ReplicationState *rs, bool failover, Error **errp)
+static void replication_stop(ReplicationState *rs, bool failover,
+                             Error *errp[static 1])
 {
     BlockDriverState *bs = rs->opaque;
     BDRVReplicationState *s;
diff --git a/block/sheepdog.c b/block/sheepdog.c
index 6160fa6717..eca6f29419 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -547,7 +547,7 @@ static SocketAddress *sd_socket_address(const char *path,
     return addr;
 }
 
-static SocketAddress *sd_server_config(QDict *options, Error **errp)
+static SocketAddress *sd_server_config(QDict *options, Error *errp[static 1])
 {
     QDict *server = NULL;
     QObject *crumpled_server = NULL;
@@ -583,7 +583,7 @@ done:
 }
 
 /* Return -EIO in case of error, file descriptor on success */
-static int connect_to_sdog(BDRVSheepdogState *s, Error **errp)
+static int connect_to_sdog(BDRVSheepdogState *s, Error *errp[static 1])
 {
     int fd;
 
@@ -746,7 +746,7 @@ static void coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req,
                                          enum AIOCBState aiocb_type);
 static void coroutine_fn resend_aioreq(BDRVSheepdogState *s, AIOReq *aio_req);
 static int reload_inode(BDRVSheepdogState *s, uint32_t snapid, const char *tag);
-static int get_sheep_fd(BDRVSheepdogState *s, Error **errp);
+static int get_sheep_fd(BDRVSheepdogState *s, Error *errp[static 1]);
 static void co_write_request(void *opaque);
 
 static coroutine_fn void reconnect_to_sdog(void *opaque)
@@ -950,7 +950,7 @@ static void co_write_request(void *opaque)
  * We cannot use this descriptor for other operations because
  * the block driver may be on waiting response from the server.
  */
-static int get_sheep_fd(BDRVSheepdogState *s, Error **errp)
+static int get_sheep_fd(BDRVSheepdogState *s, Error *errp[static 1])
 {
     int fd;
 
@@ -1028,7 +1028,7 @@ static void sd_config_done(SheepdogConfig *cfg)
 }
 
 static void sd_parse_uri(SheepdogConfig *cfg, const char *filename,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     Error *err = NULL;
     QueryParams *qp = NULL;
@@ -1133,7 +1133,7 @@ out:
  * `hostname' and `port' (experimental).
  */
 static void parse_vdiname(SheepdogConfig *cfg, const char *filename,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     Error *err = NULL;
     char *p, *q, *uri;
@@ -1193,7 +1193,7 @@ static void parse_vdiname(SheepdogConfig *cfg, const char *filename,
 }
 
 static void sd_parse_filename(const char *filename, QDict *options,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     SheepdogConfig cfg;
     char buf[32];
@@ -1229,7 +1229,7 @@ static void sd_parse_filename(const char *filename, QDict *options,
 
 static int find_vdi_name(BDRVSheepdogState *s, const char *filename,
                          uint32_t snapid, const char *tag, uint32_t *vid,
-                         bool lock, Error **errp)
+                         bool lock, Error *errp[static 1])
 {
     int ret, fd;
     SheepdogVdiReq hdr;
@@ -1559,7 +1559,7 @@ static QemuOptsList runtime_opts = {
 };
 
 static int sd_open(BlockDriverState *bs, QDict *options, int flags,
-                   Error **errp)
+                   Error *errp[static 1])
 {
     int ret, fd;
     uint32_t vid = 0;
@@ -1688,7 +1688,7 @@ err_no_fd:
 }
 
 static int sd_reopen_prepare(BDRVReopenState *state, BlockReopenQueue *queue,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     BDRVSheepdogState *s = state->bs->opaque;
     BDRVSheepdogReopenState *re_s;
@@ -1752,7 +1752,7 @@ static void sd_reopen_abort(BDRVReopenState *state)
 }
 
 static int do_sd_create(BDRVSheepdogState *s, uint32_t *vdi_id, int snapshot,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     SheepdogVdiReq hdr;
     SheepdogVdiRsp *rsp = (SheepdogVdiRsp *)&hdr;
@@ -1807,7 +1807,7 @@ static int do_sd_create(BDRVSheepdogState *s, uint32_t *vdi_id, int snapshot,
     return 0;
 }
 
-static int sd_prealloc(const char *filename, Error **errp)
+static int sd_prealloc(const char *filename, Error *errp[static 1])
 {
     BlockBackend *blk = NULL;
     BDRVSheepdogState *base = NULL;
@@ -1947,7 +1947,7 @@ static int parse_block_size_shift(BDRVSheepdogState *s, QemuOpts *opt)
 }
 
 static int sd_create(const char *filename, QemuOpts *opts,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     int ret = 0;
     uint32_t vid = 0;
@@ -2145,7 +2145,8 @@ static int64_t sd_getlength(BlockDriverState *bs)
     return s->inode.vdi_size;
 }
 
-static int sd_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
+static int sd_truncate(BlockDriverState *bs, int64_t offset,
+                       Error *errp[static 1])
 {
     BDRVSheepdogState *s = bs->opaque;
     int ret, fd;
@@ -2613,7 +2614,7 @@ out:
 
 #define NR_BATCHED_DISCARD 128
 
-static int remove_objects(BDRVSheepdogState *s, Error **errp)
+static int remove_objects(BDRVSheepdogState *s, Error *errp[static 1])
 {
     int fd, i = 0, nr_objs = 0;
     int ret;
@@ -2665,7 +2666,7 @@ out:
 static int sd_snapshot_delete(BlockDriverState *bs,
                               const char *snapshot_id,
                               const char *name,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     /*
      * FIXME should delete the snapshot matching both @snapshot_id and
diff --git a/block/snapshot.c b/block/snapshot.c
index 244fdc2bb6..4f50409edd 100644
--- a/block/snapshot.c
+++ b/block/snapshot.c
@@ -94,7 +94,7 @@ bool bdrv_snapshot_find_by_id_and_name(BlockDriverState *bs,
                                        const char *id,
                                        const char *name,
                                        QEMUSnapshotInfo *sn_info,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     QEMUSnapshotInfo *sn_tab, *sn;
     int nb_sns, i;
@@ -248,7 +248,7 @@ int bdrv_snapshot_goto(BlockDriverState *bs,
 int bdrv_snapshot_delete(BlockDriverState *bs,
                          const char *snapshot_id,
                          const char *name,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     BlockDriver *drv = bs->drv;
     int ret;
@@ -282,7 +282,7 @@ int bdrv_snapshot_delete(BlockDriverState *bs,
 
 int bdrv_snapshot_delete_by_id_or_name(BlockDriverState *bs,
                                        const char *id_or_name,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     int ret;
     Error *local_err = NULL;
@@ -339,7 +339,7 @@ int bdrv_snapshot_list(BlockDriverState *bs,
 int bdrv_snapshot_load_tmp(BlockDriverState *bs,
                            const char *snapshot_id,
                            const char *name,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     BlockDriver *drv = bs->drv;
 
@@ -366,7 +366,7 @@ int bdrv_snapshot_load_tmp(BlockDriverState *bs,
 
 int bdrv_snapshot_load_tmp_by_id_or_name(BlockDriverState *bs,
                                          const char *id_or_name,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     int ret;
     Error *local_err = NULL;
@@ -413,7 +413,7 @@ fail:
 }
 
 int bdrv_all_delete_snapshot(const char *name, BlockDriverState **first_bad_bs,
-                             Error **err)
+                             Error *err[static 1])
 {
     int ret = 0;
     BlockDriverState *bs;
diff --git a/block/ssh.c b/block/ssh.c
index 008e256ad1..3c6e140763 100644
--- a/block/ssh.c
+++ b/block/ssh.c
@@ -193,7 +193,8 @@ sftp_error_report(BDRVSSHState *s, const char *fs, ...)
     error_printf("\n");
 }
 
-static int parse_uri(const char *filename, QDict *options, Error **errp)
+static int parse_uri(const char *filename, QDict *options,
+                     Error *errp[static 1])
 {
     URI *uri = NULL;
     QueryParams *qp;
@@ -258,7 +259,8 @@ static int parse_uri(const char *filename, QDict *options, Error **errp)
     return -EINVAL;
 }
 
-static bool ssh_has_filename_options_conflict(QDict *options, Error **errp)
+static bool ssh_has_filename_options_conflict(QDict *options,
+                                              Error *errp[static 1])
 {
     const QDictEntry *qe;
 
@@ -280,7 +282,7 @@ static bool ssh_has_filename_options_conflict(QDict *options, Error **errp)
 }
 
 static void ssh_parse_filename(const char *filename, QDict *options,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     if (ssh_has_filename_options_conflict(options, errp)) {
         return;
@@ -290,7 +292,8 @@ static void ssh_parse_filename(const char *filename, QDict *options,
 }
 
 static int check_host_key_knownhosts(BDRVSSHState *s,
-                                     const char *host, int port, Error **errp)
+                                     const char *host, int port,
+                                     Error *errp[static 1])
 {
     const char *home;
     char *knh_file = NULL;
@@ -408,7 +411,8 @@ static int compare_fingerprint(const unsigned char *fingerprint, size_t len,
 
 static int
 check_host_key_hash(BDRVSSHState *s, const char *hash,
-                    int hash_type, size_t fingerprint_len, Error **errp)
+                    int hash_type, size_t fingerprint_len,
+                    Error *errp[static 1])
 {
     const char *fingerprint;
 
@@ -429,7 +433,7 @@ check_host_key_hash(BDRVSSHState *s, const char *hash,
 }
 
 static int check_host_key(BDRVSSHState *s, const char *host, int port,
-                          const char *host_key_check, Error **errp)
+                          const char *host_key_check, Error *errp[static 1])
 {
     /* host_key_check=no */
     if (strcmp(host_key_check, "no") == 0) {
@@ -457,7 +461,8 @@ static int check_host_key(BDRVSSHState *s, const char *host, int port,
     return -EINVAL;
 }
 
-static int authenticate(BDRVSSHState *s, const char *user, Error **errp)
+static int authenticate(BDRVSSHState *s, const char *user,
+                        Error *errp[static 1])
 {
     int r, ret;
     const char *userauthlist;
@@ -562,7 +567,7 @@ static QemuOptsList ssh_runtime_opts = {
 
 static bool ssh_process_legacy_socket_options(QDict *output_opts,
                                               QemuOpts *legacy_opts,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     const char *host = qemu_opt_get(legacy_opts, "host");
     const char *port = qemu_opt_get(legacy_opts, "port");
@@ -580,7 +585,7 @@ static bool ssh_process_legacy_socket_options(QDict *output_opts,
     return true;
 }
 
-static InetSocketAddress *ssh_config(QDict *options, Error **errp)
+static InetSocketAddress *ssh_config(QDict *options, Error *errp[static 1])
 {
     InetSocketAddress *inet = NULL;
     QDict *addr = NULL;
@@ -620,7 +625,8 @@ out:
 }
 
 static int connect_to_ssh(BDRVSSHState *s, QDict *options,
-                          int ssh_flags, int creat_mode, Error **errp)
+                          int ssh_flags, int creat_mode,
+                          Error *errp[static 1])
 {
     int r, ret;
     QemuOpts *opts = NULL;
@@ -764,7 +770,7 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options,
 }
 
 static int ssh_file_open(BlockDriverState *bs, QDict *options, int bdrv_flags,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     BDRVSSHState *s = bs->opaque;
     int ret;
@@ -810,7 +816,8 @@ static QemuOptsList ssh_create_opts = {
     }
 };
 
-static int ssh_create(const char *filename, QemuOpts *opts, Error **errp)
+static int ssh_create(const char *filename, QemuOpts *opts,
+                      Error *errp[static 1])
 {
     int r, ret;
     int64_t total_size = 0;
diff --git a/block/stream.c b/block/stream.c
index 826783635a..e084585eff 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -212,7 +212,8 @@ out:
     block_job_defer_to_main_loop(&s->common, stream_complete, data);
 }
 
-static void stream_set_speed(BlockJob *job, int64_t speed, Error **errp)
+static void stream_set_speed(BlockJob *job, int64_t speed,
+                             Error *errp[static 1])
 {
     StreamBlockJob *s = container_of(job, StreamBlockJob, common);
 
@@ -232,7 +233,8 @@ static const BlockJobDriver stream_job_driver = {
 
 void stream_start(const char *job_id, BlockDriverState *bs,
                   BlockDriverState *base, const char *backing_file_str,
-                  int64_t speed, BlockdevOnError on_error, Error **errp)
+                  int64_t speed, BlockdevOnError on_error,
+                  Error *errp[static 1])
 {
     StreamBlockJob *s;
     BlockDriverState *iter;
diff --git a/block/vdi.c b/block/vdi.c
index 79af47763b..a385ba4a94 100644
--- a/block/vdi.c
+++ b/block/vdi.c
@@ -355,7 +355,7 @@ static int vdi_probe(const uint8_t *buf, int buf_size, const char *filename)
 }
 
 static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     BDRVVdiState *s = bs->opaque;
     VdiHeader header;
@@ -497,7 +497,7 @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
 }
 
 static int vdi_reopen_prepare(BDRVReopenState *state,
-                              BlockReopenQueue *queue, Error **errp)
+                              BlockReopenQueue *queue, Error *errp[static 1])
 {
     return 0;
 }
@@ -716,7 +716,8 @@ vdi_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
     return ret;
 }
 
-static int vdi_create(const char *filename, QemuOpts *opts, Error **errp)
+static int vdi_create(const char *filename, QemuOpts *opts,
+                      Error *errp[static 1])
 {
     int ret = 0;
     uint64_t bytes = 0;
diff --git a/block/vhdx-log.c b/block/vhdx-log.c
index 906d5439fb..5ca149527e 100644
--- a/block/vhdx-log.c
+++ b/block/vhdx-log.c
@@ -730,7 +730,7 @@ exit:
  * If read-only, we must replay the log in RAM (or refuse to open
  * a dirty VHDX file read-only) */
 int vhdx_parse_log(BlockDriverState *bs, BDRVVHDXState *s, bool *flushed,
-                   Error **errp)
+                   Error *errp[static 1])
 {
     int ret = 0;
     VHDXHeader *hdr;
diff --git a/block/vhdx.c b/block/vhdx.c
index 890afe064b..cc93b21591 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -407,7 +407,7 @@ int vhdx_update_headers(BlockDriverState *bs, BDRVVHDXState *s,
 
 /* opens the specified header block from the VHDX file header section */
 static void vhdx_parse_header(BlockDriverState *bs, BDRVVHDXState *s,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     int ret;
     VHDXHeader *header1;
@@ -890,7 +890,7 @@ static void vhdx_close(BlockDriverState *bs)
 }
 
 static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     BDRVVHDXState *s = bs->opaque;
     int ret = 0;
@@ -1024,7 +1024,7 @@ fail:
 }
 
 static int vhdx_reopen_prepare(BDRVReopenState *state,
-                               BlockReopenQueue *queue, Error **errp)
+                               BlockReopenQueue *queue, Error *errp[static 1])
 {
     return 0;
 }
@@ -1675,7 +1675,7 @@ static int vhdx_create_new_region_table(BlockBackend *blk,
                                         bool use_zero_blocks,
                                         VHDXImageType type,
                                         uint64_t *metadata_offset,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     int ret = 0;
     uint32_t offset = 0;
@@ -1787,7 +1787,8 @@ exit:
  *    .---- ~ ----------- ~ ------------ ~ ---------------- ~ -----------.
  *   1MB
  */
-static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp)
+static int vhdx_create(const char *filename, QemuOpts *opts,
+                       Error *errp[static 1])
 {
     int ret = 0;
     uint64_t image_size = (uint64_t) 2 * GiB;
diff --git a/block/vmdk.c b/block/vmdk.c
index 55581b03fe..0adf212ace 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -335,7 +335,7 @@ static int vmdk_is_cid_valid(BlockDriverState *bs)
 
 /* We have nothing to do for VMDK reopen, stubs just return success */
 static int vmdk_reopen_prepare(BDRVReopenState *state,
-                               BlockReopenQueue *queue, Error **errp)
+                               BlockReopenQueue *queue, Error *errp[static 1])
 {
     assert(state != NULL);
     assert(state->bs != NULL);
@@ -387,7 +387,7 @@ static int vmdk_add_extent(BlockDriverState *bs,
                            uint32_t l1_size,
                            int l2_size, uint64_t cluster_sectors,
                            VmdkExtent **new_extent,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     VmdkExtent *extent;
     BDRVVmdkState *s = bs->opaque;
@@ -441,7 +441,7 @@ static int vmdk_add_extent(BlockDriverState *bs,
 }
 
 static int vmdk_init_tables(BlockDriverState *bs, VmdkExtent *extent,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     int ret;
     size_t l1_size;
@@ -501,7 +501,7 @@ static int vmdk_init_tables(BlockDriverState *bs, VmdkExtent *extent,
 
 static int vmdk_open_vmfs_sparse(BlockDriverState *bs,
                                  BdrvChild *file,
-                                 int flags, Error **errp)
+                                 int flags, Error *errp[static 1])
 {
     int ret;
     uint32_t magic;
@@ -536,9 +536,10 @@ static int vmdk_open_vmfs_sparse(BlockDriverState *bs,
 }
 
 static int vmdk_open_desc_file(BlockDriverState *bs, int flags, char *buf,
-                               QDict *options, Error **errp);
+                               QDict *options, Error *errp[static 1]);
 
-static char *vmdk_read_desc(BdrvChild *file, uint64_t desc_offset, Error **errp)
+static char *vmdk_read_desc(BdrvChild *file, uint64_t desc_offset,
+                            Error *errp[static 1])
 {
     int64_t size;
     char *buf;
@@ -574,7 +575,7 @@ static char *vmdk_read_desc(BdrvChild *file, uint64_t desc_offset, Error **errp)
 
 static int vmdk_open_vmdk4(BlockDriverState *bs,
                            BdrvChild *file,
-                           int flags, QDict *options, Error **errp)
+                           int flags, QDict *options, Error *errp[static 1])
 {
     int ret;
     uint32_t magic;
@@ -755,7 +756,7 @@ static int vmdk_parse_description(const char *desc, const char *opt_name,
 
 /* Open an extent file and append to bs array */
 static int vmdk_open_sparse(BlockDriverState *bs, BdrvChild *file, int flags,
-                            char *buf, QDict *options, Error **errp)
+                            char *buf, QDict *options, Error *errp[static 1])
 {
     uint32_t magic;
 
@@ -787,7 +788,7 @@ static const char *next_line(const char *s)
 
 static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
                               const char *desc_file_path, QDict *options,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     int ret;
     int matches;
@@ -906,7 +907,7 @@ invalid:
 }
 
 static int vmdk_open_desc_file(BlockDriverState *bs, int flags, char *buf,
-                               QDict *options, Error **errp)
+                               QDict *options, Error *errp[static 1])
 {
     int ret;
     char ct[128];
@@ -935,7 +936,7 @@ exit:
 }
 
 static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     char *buf;
     int ret;
@@ -1002,7 +1003,7 @@ fail:
 }
 
 
-static void vmdk_refresh_limits(BlockDriverState *bs, Error **errp)
+static void vmdk_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     BDRVVmdkState *s = bs->opaque;
     int i;
@@ -1686,7 +1687,7 @@ static int coroutine_fn vmdk_co_pwrite_zeroes(BlockDriverState *bs,
 
 static int vmdk_create_extent(const char *filename, int64_t filesize,
                               bool flat, bool compress, bool zeroed_grain,
-                              QemuOpts *opts, Error **errp)
+                              QemuOpts *opts, Error *errp[static 1])
 {
     int ret, i;
     BlockBackend *blk = NULL;
@@ -1818,7 +1819,8 @@ exit:
 }
 
 static int filename_decompose(const char *filename, char *path, char *prefix,
-                              char *postfix, size_t buf_len, Error **errp)
+                              char *postfix, size_t buf_len,
+                              Error *errp[static 1])
 {
     const char *p, *q;
 
@@ -1857,7 +1859,8 @@ static int filename_decompose(const char *filename, char *path, char *prefix,
     return VMDK_OK;
 }
 
-static int vmdk_create(const char *filename, QemuOpts *opts, Error **errp)
+static int vmdk_create(const char *filename, QemuOpts *opts,
+                       Error *errp[static 1])
 {
     int idx = 0;
     BlockBackend *new_blk = NULL;
diff --git a/block/vpc.c b/block/vpc.c
index 4240ba9d1c..edb7f7f672 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -185,7 +185,7 @@ static int vpc_probe(const uint8_t *buf, int buf_size, const char *filename)
 }
 
 static void vpc_parse_options(BlockDriverState *bs, QemuOpts *opts,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     BDRVVPCState *s = bs->opaque;
     const char *size_calc;
@@ -204,7 +204,7 @@ static void vpc_parse_options(BlockDriverState *bs, QemuOpts *opts,
 }
 
 static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     BDRVVPCState *s = bs->opaque;
     int i;
@@ -452,7 +452,7 @@ fail:
 }
 
 static int vpc_reopen_prepare(BDRVReopenState *state,
-                              BlockReopenQueue *queue, Error **errp)
+                              BlockReopenQueue *queue, Error *errp[static 1])
 {
     return 0;
 }
@@ -851,7 +851,7 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
 }
 
 static int create_fixed_disk(BlockBackend *blk, uint8_t *buf,
-                             int64_t total_size, Error **errp)
+                             int64_t total_size, Error *errp[static 1])
 {
     int ret;
 
@@ -872,7 +872,8 @@ static int create_fixed_disk(BlockBackend *blk, uint8_t *buf,
     return ret;
 }
 
-static int vpc_create(const char *filename, QemuOpts *opts, Error **errp)
+static int vpc_create(const char *filename, QemuOpts *opts,
+                      Error *errp[static 1])
 {
     uint8_t buf[1024];
     VHDFooter *footer = (VHDFooter *) buf;
diff --git a/block/vvfat.c b/block/vvfat.c
index 426ca70e35..dbbea9e944 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -830,7 +830,7 @@ static inline off_t cluster2sector(BDRVVVFATState* s, uint32_t cluster_num)
 
 static int init_directories(BDRVVVFATState* s,
                             const char *dirname, int heads, int secs,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     bootsector_t* bootsector;
     mapping_t* mapping;
@@ -980,7 +980,7 @@ static int init_directories(BDRVVVFATState* s,
 static BDRVVVFATState *vvv = NULL;
 #endif
 
-static int enable_write_target(BlockDriverState *bs, Error **errp);
+static int enable_write_target(BlockDriverState *bs, Error *errp[static 1]);
 static int is_consistent(BDRVVVFATState *s);
 
 static QemuOptsList runtime_opts = {
@@ -1017,7 +1017,7 @@ static QemuOptsList runtime_opts = {
 };
 
 static void vvfat_parse_filename(const char *filename, QDict *options,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     int fat_type = 0;
     bool floppy = false;
@@ -1064,7 +1064,7 @@ static void vvfat_parse_filename(const char *filename, QDict *options,
 }
 
 static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     BDRVVVFATState *s = bs->opaque;
     int cyls, heads, secs;
@@ -1222,7 +1222,7 @@ fail:
     return ret;
 }
 
-static void vvfat_refresh_limits(BlockDriverState *bs, Error **errp)
+static void vvfat_refresh_limits(BlockDriverState *bs, Error *errp[static 1])
 {
     bs->bl.request_alignment = BDRV_SECTOR_SIZE; /* No sub-sector I/O */
 }
@@ -3011,7 +3011,7 @@ static const BdrvChildRole child_vvfat_qcow = {
     .inherit_options    = vvfat_qcow_options,
 };
 
-static int enable_write_target(BlockDriverState *bs, Error **errp)
+static int enable_write_target(BlockDriverState *bs, Error *errp[static 1])
 {
     BDRVVVFATState *s = bs->opaque;
     BlockDriver *bdrv_qcow = NULL;
diff --git a/block/vxhs.c b/block/vxhs.c
index 75cc6c8672..35c7608949 100644
--- a/block/vxhs.c
+++ b/block/vxhs.c
@@ -199,7 +199,7 @@ static int vxhs_parse_uri(const char *filename, QDict *options)
 }
 
 static void vxhs_parse_filename(const char *filename, QDict *options,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     if (qdict_haskey(options, "vdisk-id") || qdict_haskey(options, "server")) {
         error_setg(errp, "vdisk-id/server and a file name may not be specified "
@@ -234,7 +234,7 @@ static void vxhs_unref(void)
 }
 
 static void vxhs_get_tls_creds(const char *id, char **cacert,
-                               char **key, char **cert, Error **errp)
+                               char **key, char **cert, Error *errp[static 1])
 {
     Object *obj;
     QCryptoTLSCreds *creds;
@@ -283,7 +283,7 @@ static void vxhs_get_tls_creds(const char *id, char **cacert,
 }
 
 static int vxhs_open(BlockDriverState *bs, QDict *options,
-                     int bdrv_flags, Error **errp)
+                     int bdrv_flags, Error *errp[static 1])
 {
     BDRVVXHSState *s = bs->opaque;
     void *dev_handlep;
diff --git a/block/write-threshold.c b/block/write-threshold.c
index 0bd1a01c86..184addaa5d 100644
--- a/block/write-threshold.c
+++ b/block/write-threshold.c
@@ -105,7 +105,7 @@ void bdrv_write_threshold_set(BlockDriverState *bs, uint64_t threshold_bytes)
 
 void qmp_block_set_write_threshold(const char *node_name,
                                    uint64_t threshold_bytes,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     BlockDriverState *bs;
     AioContext *aio_context;
diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index e7bf14a8ed..53f03d371f 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -69,7 +69,8 @@ static void nbd_server_free(NBDServerData *server)
     g_free(server);
 }
 
-static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
+static QCryptoTLSCreds *nbd_get_tls_creds(const char *id,
+                                          Error *errp[static 1])
 {
     Object *obj;
     QCryptoTLSCreds *creds;
@@ -100,7 +101,7 @@ static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
 
 
 void nbd_server_start(SocketAddress *addr, const char *tls_creds,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     if (nbd_server) {
         error_setg(errp, "NBD server already running");
@@ -146,7 +147,7 @@ void nbd_server_start(SocketAddress *addr, const char *tls_creds,
 
 void qmp_nbd_server_start(SocketAddressLegacy *addr,
                           bool has_tls_creds, const char *tls_creds,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     SocketAddress *addr_flat = socket_address_flatten(addr);
 
@@ -155,7 +156,7 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
 }
 
 void qmp_nbd_server_add(const char *device, bool has_writable, bool writable,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     BlockDriverState *bs = NULL;
     BlockBackend *on_eject_blk;
@@ -199,7 +200,7 @@ void qmp_nbd_server_add(const char *device, bool has_writable, bool writable,
     nbd_export_put(exp);
 }
 
-void qmp_nbd_server_stop(Error **errp)
+void qmp_nbd_server_stop(Error *errp[static 1])
 {
     nbd_export_close_all();
 
diff --git a/blockdev.c b/blockdev.c
index 3ce592d4af..16a576ba28 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -58,7 +58,7 @@ static QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states =
     QTAILQ_HEAD_INITIALIZER(monitor_bdrv_states);
 
 static int do_open_tray(const char *blk_name, const char *qdev_id,
-                        bool force, Error **errp);
+                        bool force, Error *errp[static 1]);
 
 static const char *const if_name[IF_COUNT] = {
     [IF_NONE] = "none",
@@ -297,7 +297,8 @@ typedef struct {
     BlockDriverState *bs;
 } BDRVPutRefBH;
 
-static int parse_block_error_action(const char *buf, bool is_read, Error **errp)
+static int parse_block_error_action(const char *buf, bool is_read,
+                                    Error *errp[static 1])
 {
     if (!strcmp(buf, "ignore")) {
         return BLOCKDEV_ON_ERROR_IGNORE;
@@ -315,7 +316,7 @@ static int parse_block_error_action(const char *buf, bool is_read, Error **errp)
 }
 
 static bool parse_stats_intervals(BlockAcctStats *stats, QList *intervals,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     const QListEntry *entry;
     for (entry = qlist_first(intervals); entry; entry = qlist_next(entry)) {
@@ -358,7 +359,7 @@ typedef enum { MEDIA_DISK, MEDIA_CDROM } DriveMediaType;
 /* All parameters but @opts are optional and may be set to NULL. */
 static void extract_common_blockdev_options(QemuOpts *opts, int *bdrv_flags,
     const char **throttling_group, ThrottleConfig *throttle_cfg,
-    BlockdevDetectZeroesOptions *detect_zeroes, Error **errp)
+    BlockdevDetectZeroesOptions *detect_zeroes, Error *errp[static 1])
 {
     Error *local_error = NULL;
     const char *aio;
@@ -450,7 +451,7 @@ static void extract_common_blockdev_options(QemuOpts *opts, int *bdrv_flags,
 
 /* Takes the ownership of bs_opts */
 static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     const char *buf;
     int bdrv_flags = 0;
@@ -638,7 +639,7 @@ err_no_opts:
 }
 
 /* Takes the ownership of bs_opts */
-static BlockDriverState *bds_tree_init(QDict *bs_opts, Error **errp)
+static BlockDriverState *bds_tree_init(QDict *bs_opts, Error *errp[static 1])
 {
     int bdrv_flags = 0;
 
@@ -677,7 +678,7 @@ BlockDriverState *bdrv_next_monitor_owned(BlockDriverState *bs)
 }
 
 static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     const char *value;
 
@@ -1124,7 +1125,8 @@ fail:
     return dinfo;
 }
 
-static BlockDriverState *qmp_get_root_bs(const char *name, Error **errp)
+static BlockDriverState *qmp_get_root_bs(const char *name,
+                                         Error *errp[static 1])
 {
     BlockDriverState *bs;
 
@@ -1147,7 +1149,7 @@ static BlockDriverState *qmp_get_root_bs(const char *name, Error **errp)
 }
 
 static BlockBackend *qmp_get_blk(const char *blk_name, const char *qdev_id,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     BlockBackend *blk;
 
@@ -1205,7 +1207,8 @@ void hmp_commit(Monitor *mon, const QDict *qdict)
     }
 }
 
-static void blockdev_do_action(TransactionAction *action, Error **errp)
+static void blockdev_do_action(TransactionAction *action,
+                               Error *errp[static 1])
 {
     TransactionActionList list;
 
@@ -1220,7 +1223,8 @@ void qmp_blockdev_snapshot_sync(bool has_device, const char *device,
                                 bool has_snapshot_node_name,
                                 const char *snapshot_node_name,
                                 bool has_format, const char *format,
-                                bool has_mode, NewImageMode mode, Error **errp)
+                                bool has_mode, NewImageMode mode,
+                                Error *errp[static 1])
 {
     BlockdevSnapshotSync snapshot = {
         .has_device = has_device,
@@ -1243,7 +1247,7 @@ void qmp_blockdev_snapshot_sync(bool has_device, const char *device,
 }
 
 void qmp_blockdev_snapshot(const char *node, const char *overlay,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     BlockdevSnapshot snapshot_data = {
         .node = (char *) node,
@@ -1258,7 +1262,7 @@ void qmp_blockdev_snapshot(const char *node, const char *overlay,
 
 void qmp_blockdev_snapshot_internal_sync(const char *device,
                                          const char *name,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     BlockdevSnapshotInternal snapshot = {
         .device = (char *) device,
@@ -1276,7 +1280,7 @@ SnapshotInfo *qmp_blockdev_snapshot_delete_internal_sync(const char *device,
                                                          const char *id,
                                                          bool has_name,
                                                          const char *name,
-                                                         Error **errp)
+                                                         Error *errp[static 1])
 {
     BlockDriverState *bs;
     AioContext *aio_context;
@@ -1363,7 +1367,7 @@ static BdrvDirtyBitmap *block_dirty_bitmap_lookup(const char *node,
                                                   const char *name,
                                                   BlockDriverState **pbs,
                                                   AioContext **paio,
-                                                  Error **errp)
+                                                  Error *errp[static 1])
 {
     BlockDriverState *bs;
     BdrvDirtyBitmap *bitmap;
@@ -1465,7 +1469,8 @@ typedef struct InternalSnapshotState {
 } InternalSnapshotState;
 
 
-static int action_check_completion_mode(BlkActionState *s, Error **errp)
+static int action_check_completion_mode(BlkActionState *s,
+                                        Error *errp[static 1])
 {
     if (s->txn_props->completion_mode != ACTION_COMPLETION_MODE_INDIVIDUAL) {
         error_setg(errp,
@@ -1479,7 +1484,7 @@ static int action_check_completion_mode(BlkActionState *s, Error **errp)
 }
 
 static void internal_snapshot_prepare(BlkActionState *common,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     Error *local_err = NULL;
     const char *device;
@@ -1616,7 +1621,7 @@ typedef struct ExternalSnapshotState {
 } ExternalSnapshotState;
 
 static void external_snapshot_prepare(BlkActionState *common,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     int flags = 0;
     QDict *options = NULL;
@@ -1828,9 +1833,10 @@ typedef struct DriveBackupState {
 } DriveBackupState;
 
 static BlockJob *do_drive_backup(DriveBackup *backup, BlockJobTxn *txn,
-                            Error **errp);
+                            Error *errp[static 1]);
 
-static void drive_backup_prepare(BlkActionState *common, Error **errp)
+static void drive_backup_prepare(BlkActionState *common,
+                                 Error *errp[static 1])
 {
     DriveBackupState *state = DO_UPCAST(DriveBackupState, common, common);
     BlockDriverState *bs;
@@ -1892,9 +1898,10 @@ typedef struct BlockdevBackupState {
 } BlockdevBackupState;
 
 static BlockJob *do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn,
-                                    Error **errp);
+                                    Error *errp[static 1]);
 
-static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
+static void blockdev_backup_prepare(BlkActionState *common,
+                                    Error *errp[static 1])
 {
     BlockdevBackupState *state = DO_UPCAST(BlockdevBackupState, common, common);
     BlockdevBackup *backup;
@@ -1968,7 +1975,7 @@ typedef struct BlockDirtyBitmapState {
 } BlockDirtyBitmapState;
 
 static void block_dirty_bitmap_add_prepare(BlkActionState *common,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     Error *local_err = NULL;
     BlockDirtyBitmapAdd *action;
@@ -2008,7 +2015,7 @@ static void block_dirty_bitmap_add_abort(BlkActionState *common)
 }
 
 static void block_dirty_bitmap_clear_prepare(BlkActionState *common,
-                                             Error **errp)
+                                             Error *errp[static 1])
 {
     BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
                                              common, common);
@@ -2068,7 +2075,7 @@ static void block_dirty_bitmap_clear_clean(BlkActionState *common)
     }
 }
 
-static void abort_prepare(BlkActionState *common, Error **errp)
+static void abort_prepare(BlkActionState *common, Error *errp[static 1])
 {
     error_setg(errp, "Transaction aborted using Abort action");
 }
@@ -2158,7 +2165,7 @@ static TransactionProperties *get_transaction_properties(
 void qmp_transaction(TransactionActionList *dev_list,
                      bool has_props,
                      struct TransactionProperties *props,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     TransactionActionList *dev_entry = dev_list;
     BlockJobTxn *block_job_txn = NULL;
@@ -2235,7 +2242,7 @@ exit:
 
 void qmp_eject(bool has_device, const char *device,
                bool has_id, const char *id,
-               bool has_force, bool force, Error **errp)
+               bool has_force, bool force, Error *errp[static 1])
 {
     Error *local_err = NULL;
     int rc;
@@ -2258,7 +2265,7 @@ void qmp_eject(bool has_device, const char *device,
 
 void qmp_block_passwd(bool has_device, const char *device,
                       bool has_node_name, const char *node_name,
-                      const char *password, Error **errp)
+                      const char *password, Error *errp[static 1])
 {
     Error *local_err = NULL;
     BlockDriverState *bs;
@@ -2292,7 +2299,7 @@ void qmp_block_passwd(bool has_device, const char *device,
  * Else, return 0.
  */
 static int do_open_tray(const char *blk_name, const char *qdev_id,
-                        bool force, Error **errp)
+                        bool force, Error *errp[static 1])
 {
     BlockBackend *blk;
     const char *device = qdev_id ?: blk_name;
@@ -2338,7 +2345,7 @@ static int do_open_tray(const char *blk_name, const char *qdev_id,
 void qmp_blockdev_open_tray(bool has_device, const char *device,
                             bool has_id, const char *id,
                             bool has_force, bool force,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     Error *local_err = NULL;
     int rc;
@@ -2358,7 +2365,7 @@ void qmp_blockdev_open_tray(bool has_device, const char *device,
 
 void qmp_blockdev_close_tray(bool has_device, const char *device,
                              bool has_id, const char *id,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     BlockBackend *blk;
 
@@ -2391,7 +2398,8 @@ void qmp_blockdev_close_tray(bool has_device, const char *device,
 }
 
 void qmp_x_blockdev_remove_medium(bool has_device, const char *device,
-                                  bool has_id, const char *id, Error **errp)
+                                  bool has_id, const char *id,
+                                  Error *errp[static 1])
 {
     BlockBackend *blk;
     BlockDriverState *bs;
@@ -2448,7 +2456,8 @@ out:
 }
 
 static void qmp_blockdev_insert_anon_medium(BlockBackend *blk,
-                                            BlockDriverState *bs, Error **errp)
+                                            BlockDriverState *bs,
+                                            Error *errp[static 1])
 {
     bool has_device;
     int ret;
@@ -2492,7 +2501,8 @@ static void qmp_blockdev_insert_anon_medium(BlockBackend *blk,
 
 void qmp_x_blockdev_insert_medium(bool has_device, const char *device,
                                   bool has_id, const char *id,
-                                  const char *node_name, Error **errp)
+                                  const char *node_name,
+                                  Error *errp[static 1])
 {
     BlockBackend *blk;
     BlockDriverState *bs;
@@ -2524,7 +2534,7 @@ void qmp_blockdev_change_medium(bool has_device, const char *device,
                                 bool has_format, const char *format,
                                 bool has_read_only,
                                 BlockdevChangeReadOnlyMode read_only,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     BlockBackend *blk;
     BlockDriverState *medium_bs = NULL;
@@ -2722,7 +2732,7 @@ out:
 
 void qmp_block_dirty_bitmap_add(const char *node, const char *name,
                                 bool has_granularity, uint32_t granularity,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     AioContext *aio_context;
     BlockDriverState *bs;
@@ -2758,7 +2768,7 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
 }
 
 void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     AioContext *aio_context;
     BlockDriverState *bs;
@@ -2787,7 +2797,7 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
  * immediately after a full backup operation.
  */
 void qmp_block_dirty_bitmap_clear(const char *node, const char *name,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     AioContext *aio_context;
     BdrvDirtyBitmap *bitmap;
@@ -2878,7 +2888,7 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
 
 void qmp_block_resize(bool has_device, const char *device,
                       bool has_node_name, const char *node_name,
-                      int64_t size, Error **errp)
+                      int64_t size, Error *errp[static 1])
 {
     Error *local_err = NULL;
     BlockBackend *blk = NULL;
@@ -2933,7 +2943,7 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
                       bool has_backing_file, const char *backing_file,
                       bool has_speed, int64_t speed,
                       bool has_on_error, BlockdevOnError on_error,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     BlockDriverState *bs, *iter;
     BlockDriverState *base_bs = NULL;
@@ -3018,7 +3028,7 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device,
                       bool has_backing_file, const char *backing_file,
                       bool has_speed, int64_t speed,
                       bool has_filter_node_name, const char *filter_node_name,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     BlockDriverState *bs;
     BlockDriverState *iter;
@@ -3131,7 +3141,7 @@ out:
 }
 
 static BlockJob *do_drive_backup(DriveBackup *backup, BlockJobTxn *txn,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     BlockDriverState *bs;
     BlockDriverState *target_bs;
@@ -3267,7 +3277,7 @@ out:
     return job;
 }
 
-void qmp_drive_backup(DriveBackup *arg, Error **errp)
+void qmp_drive_backup(DriveBackup *arg, Error *errp[static 1])
 {
 
     BlockJob *job;
@@ -3277,13 +3287,13 @@ void qmp_drive_backup(DriveBackup *arg, Error **errp)
     }
 }
 
-BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp)
+BlockDeviceInfoList *qmp_query_named_block_nodes(Error *errp[static 1])
 {
     return bdrv_named_nodes_list(errp);
 }
 
 BlockJob *do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     BlockDriverState *bs;
     BlockDriverState *target_bs;
@@ -3343,7 +3353,7 @@ out:
     return job;
 }
 
-void qmp_blockdev_backup(BlockdevBackup *arg, Error **errp)
+void qmp_blockdev_backup(BlockdevBackup *arg, Error *errp[static 1])
 {
     BlockJob *job;
     job = do_blockdev_backup(arg, NULL, errp);
@@ -3370,7 +3380,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
                                    bool has_unmap, bool unmap,
                                    bool has_filter_node_name,
                                    const char *filter_node_name,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
 
     if (!has_speed) {
@@ -3583,7 +3593,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
                          BlockdevOnError on_target_error,
                          bool has_filter_node_name,
                          const char *filter_node_name,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     BlockDriverState *bs;
     BlockDriverState *target_bs;
@@ -3621,7 +3631,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
 
 /* Get a block job using its ID and acquire its AioContext */
 static BlockJob *find_block_job(const char *id, AioContext **aio_context,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     BlockJob *job;
 
@@ -3643,7 +3653,8 @@ static BlockJob *find_block_job(const char *id, AioContext **aio_context,
     return job;
 }
 
-void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp)
+void qmp_block_job_set_speed(const char *device, int64_t speed,
+                             Error *errp[static 1])
 {
     AioContext *aio_context;
     BlockJob *job = find_block_job(device, &aio_context, errp);
@@ -3657,7 +3668,7 @@ void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp)
 }
 
 void qmp_block_job_cancel(const char *device,
-                          bool has_force, bool force, Error **errp)
+                          bool has_force, bool force, Error *errp[static 1])
 {
     AioContext *aio_context;
     BlockJob *job = find_block_job(device, &aio_context, errp);
@@ -3682,7 +3693,7 @@ out:
     aio_context_release(aio_context);
 }
 
-void qmp_block_job_pause(const char *device, Error **errp)
+void qmp_block_job_pause(const char *device, Error *errp[static 1])
 {
     AioContext *aio_context;
     BlockJob *job = find_block_job(device, &aio_context, errp);
@@ -3696,7 +3707,7 @@ void qmp_block_job_pause(const char *device, Error **errp)
     aio_context_release(aio_context);
 }
 
-void qmp_block_job_resume(const char *device, Error **errp)
+void qmp_block_job_resume(const char *device, Error *errp[static 1])
 {
     AioContext *aio_context;
     BlockJob *job = find_block_job(device, &aio_context, errp);
@@ -3710,7 +3721,7 @@ void qmp_block_job_resume(const char *device, Error **errp)
     aio_context_release(aio_context);
 }
 
-void qmp_block_job_complete(const char *device, Error **errp)
+void qmp_block_job_complete(const char *device, Error *errp[static 1])
 {
     AioContext *aio_context;
     BlockJob *job = find_block_job(device, &aio_context, errp);
@@ -3727,7 +3738,7 @@ void qmp_block_job_complete(const char *device, Error **errp)
 void qmp_change_backing_file(const char *device,
                              const char *image_node_name,
                              const char *backing_file,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     BlockDriverState *bs = NULL;
     AioContext *aio_context;
@@ -3837,7 +3848,7 @@ out:
     qemu_opts_del(opts);
 }
 
-void qmp_blockdev_add(BlockdevOptions *options, Error **errp)
+void qmp_blockdev_add(BlockdevOptions *options, Error *errp[static 1])
 {
     BlockDriverState *bs;
     QObject *obj;
@@ -3877,7 +3888,7 @@ fail:
     visit_free(v);
 }
 
-void qmp_blockdev_del(const char *node_name, Error **errp)
+void qmp_blockdev_del(const char *node_name, Error *errp[static 1])
 {
     AioContext *aio_context;
     BlockDriverState *bs;
@@ -3933,7 +3944,7 @@ static BdrvChild *bdrv_find_child(BlockDriverState *parent_bs,
 
 void qmp_x_blockdev_change(const char *parent, bool has_child,
                            const char *child, bool has_node,
-                           const char *node, Error **errp)
+                           const char *node, Error *errp[static 1])
 {
     BlockDriverState *parent_bs, *new_bs = NULL;
     BdrvChild *p_child;
@@ -3972,7 +3983,7 @@ void qmp_x_blockdev_change(const char *parent, bool has_child,
     }
 }
 
-BlockJobInfoList *qmp_query_block_jobs(Error **errp)
+BlockJobInfoList *qmp_query_block_jobs(Error *errp[static 1])
 {
     BlockJobInfoList *head = NULL, **p_next = &head;
     BlockJob *job;
diff --git a/blockjob.c b/blockjob.c
index c0b528f1e9..3350fa4dee 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -247,7 +247,8 @@ void block_job_remove_all_bdrv(BlockJob *job)
 }
 
 int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
-                       uint64_t perm, uint64_t shared_perm, Error **errp)
+                       uint64_t perm, uint64_t shared_perm,
+                       Error *errp[static 1])
 {
     BdrvChild *c;
 
@@ -354,7 +355,7 @@ static void block_job_cancel_async(BlockJob *job)
 
 static int block_job_finish_sync(BlockJob *job,
                                  void (*finish)(BlockJob *, Error **errp),
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     int ret;
 
@@ -450,7 +451,7 @@ static void block_job_completed_txn_success(BlockJob *job)
     }
 }
 
-void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
+void block_job_set_speed(BlockJob *job, int64_t speed, Error *errp[static 1])
 {
     if (!job->driver->set_speed) {
         error_setg(errp, QERR_UNSUPPORTED);
@@ -464,7 +465,7 @@ void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
     job->speed = speed;
 }
 
-void block_job_complete(BlockJob *job, Error **errp)
+void block_job_complete(BlockJob *job, Error *errp[static 1])
 {
     /* Should not be reachable via external interface for internal jobs */
     assert(job->id);
@@ -511,7 +512,7 @@ void block_job_cancel(BlockJob *job)
 /* A wrapper around block_job_cancel() taking an Error ** parameter so it may be
  * used with block_job_finish_sync() without the need for (rather nasty)
  * function pointer casts there. */
-static void block_job_cancel_err(BlockJob *job, Error **errp)
+static void block_job_cancel_err(BlockJob *job, Error *errp[static 1])
 {
     block_job_cancel(job);
 }
@@ -534,12 +535,12 @@ void block_job_cancel_sync_all(void)
     }
 }
 
-int block_job_complete_sync(BlockJob *job, Error **errp)
+int block_job_complete_sync(BlockJob *job, Error *errp[static 1])
 {
     return block_job_finish_sync(job, &block_job_complete, errp);
 }
 
-BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
+BlockJobInfo *block_job_query(BlockJob *job, Error *errp[static 1])
 {
     BlockJobInfo *info;
 
@@ -606,7 +607,8 @@ static void block_job_event_completed(BlockJob *job, const char *msg)
 void *block_job_create(const char *job_id, const BlockJobDriver *driver,
                        BlockDriverState *bs, uint64_t perm,
                        uint64_t shared_perm, int64_t speed, int flags,
-                       BlockCompletionFunc *cb, void *opaque, Error **errp)
+                       BlockCompletionFunc *cb, void *opaque,
+                       Error *errp[static 1])
 {
     BlockBackend *blk;
     BlockJob *job;
diff --git a/bootdevice.c b/bootdevice.c
index 92f607d321..7a52fb37f7 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -50,7 +50,7 @@ void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque)
     boot_set_opaque = opaque;
 }
 
-void qemu_boot_set(const char *boot_order, Error **errp)
+void qemu_boot_set(const char *boot_order, Error *errp[static 1])
 {
     if (!boot_set_handler) {
         error_setg(errp, "no function defined to set boot device list for"
@@ -66,7 +66,7 @@ void qemu_boot_set(const char *boot_order, Error **errp)
     boot_set_handler(boot_set_opaque, boot_order, errp);
 }
 
-void validate_bootdevices(const char *devices, Error **errp)
+void validate_bootdevices(const char *devices, Error *errp[static 1])
 {
     /* We just do some generic consistency checks */
     const char *p;
@@ -113,7 +113,7 @@ void restore_boot_order(void *opaque)
     g_free(normal_boot_order);
 }
 
-void check_boot_index(int32_t bootindex, Error **errp)
+void check_boot_index(int32_t bootindex, Error *errp[static 1])
 {
     FWBootEntry *i;
 
@@ -271,14 +271,14 @@ typedef struct {
 } BootIndexProperty;
 
 static void device_get_bootindex(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     BootIndexProperty *prop = opaque;
     visit_type_int32(v, name, prop->bootindex, errp);
 }
 
 static void device_set_bootindex(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     BootIndexProperty *prop = opaque;
     int32_t boot_index;
@@ -314,7 +314,7 @@ static void property_release_bootindex(Object *obj, const char *name,
 
 void device_add_bootindex_property(Object *obj, int32_t *bootindex,
                                    const char *name, const char *suffix,
-                                   DeviceState *dev, Error **errp)
+                                   DeviceState *dev, Error *errp[static 1])
 {
     BootIndexProperty *prop = g_malloc0(sizeof(*prop));
 
diff --git a/chardev/baum.c b/chardev/baum.c
index 302dd9666c..ad96d7196d 100644
--- a/chardev/baum.c
+++ b/chardev/baum.c
@@ -630,7 +630,7 @@ static void char_braille_finalize(Object *obj)
 static void baum_chr_open(Chardev *chr,
                           ChardevBackend *backend,
                           bool *be_opened,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     BaumChardev *baum = BAUM_CHARDEV(chr);
     brlapi_handle_t *handle;
diff --git a/chardev/char-console.c b/chardev/char-console.c
index 535ed65136..53510efeb3 100644
--- a/chardev/char-console.c
+++ b/chardev/char-console.c
@@ -27,7 +27,7 @@
 static void qemu_chr_open_win_con(Chardev *chr,
                                   ChardevBackend *backend,
                                   bool *be_opened,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     win_chr_set_file(chr, GetStdHandle(STD_OUTPUT_HANDLE), true);
 }
diff --git a/chardev/char-fd.c b/chardev/char-fd.c
index b0ebccf0c6..d81865f36a 100644
--- a/chardev/char-fd.c
+++ b/chardev/char-fd.c
@@ -114,7 +114,7 @@ static void char_fd_finalize(Object *obj)
     qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
 }
 
-int qmp_chardev_open_file_source(char *src, int flags, Error **errp)
+int qmp_chardev_open_file_source(char *src, int flags, Error *errp[static 1])
 {
     int fd = -1;
 
diff --git a/chardev/char-fe.c b/chardev/char-fe.c
index 3f90f0567c..1f1f1c9a1d 100644
--- a/chardev/char-fe.c
+++ b/chardev/char-fe.c
@@ -182,7 +182,7 @@ Chardev *qemu_chr_fe_get_driver(CharBackend *be)
     return be->chr;
 }
 
-bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp)
+bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error *errp[static 1])
 {
     int tag = 0;
 
@@ -292,7 +292,7 @@ void qemu_chr_fe_take_focus(CharBackend *b)
     }
 }
 
-int qemu_chr_fe_wait_connected(CharBackend *be, Error **errp)
+int qemu_chr_fe_wait_connected(CharBackend *be, Error *errp[static 1])
 {
     if (!be->chr) {
         error_setg(errp, "missing associated backend");
diff --git a/chardev/char-file.c b/chardev/char-file.c
index a57b88aaf2..ad0808caf4 100644
--- a/chardev/char-file.c
+++ b/chardev/char-file.c
@@ -35,7 +35,7 @@
 static void qmp_chardev_open_file(Chardev *chr,
                                   ChardevBackend *backend,
                                   bool *be_opened,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     ChardevFile *file = backend->u.file.data;
 #ifdef _WIN32
@@ -95,7 +95,7 @@ static void qmp_chardev_open_file(Chardev *chr,
 }
 
 static void qemu_chr_parse_file_out(QemuOpts *opts, ChardevBackend *backend,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     const char *path = qemu_opt_get(opts, "path");
     ChardevFile *file;
diff --git a/chardev/char-mux.c b/chardev/char-mux.c
index 08570b915e..fba56c1d59 100644
--- a/chardev/char-mux.c
+++ b/chardev/char-mux.c
@@ -300,7 +300,7 @@ void mux_set_focus(Chardev *chr, int focus)
 static void qemu_chr_open_mux(Chardev *chr,
                               ChardevBackend *backend,
                               bool *be_opened,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     ChardevMux *mux = backend->u.mux.data;
     Chardev *drv;
@@ -321,7 +321,7 @@ static void qemu_chr_open_mux(Chardev *chr,
 }
 
 static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     const char *chardev = qemu_opt_get(opts, "chardev");
     ChardevMux *mux;
diff --git a/chardev/char-null.c b/chardev/char-null.c
index 90bafe76f4..1c8be78f2c 100644
--- a/chardev/char-null.c
+++ b/chardev/char-null.c
@@ -27,7 +27,7 @@
 static void null_chr_open(Chardev *chr,
                           ChardevBackend *backend,
                           bool *be_opened,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     *be_opened = false;
 }
diff --git a/chardev/char-parallel.c b/chardev/char-parallel.c
index bce89f8c36..a89b111ffb 100644
--- a/chardev/char-parallel.c
+++ b/chardev/char-parallel.c
@@ -157,7 +157,7 @@ static int pp_ioctl(Chardev *chr, int cmd, void *arg)
 static void qemu_chr_open_pp_fd(Chardev *chr,
                                 int fd,
                                 bool *be_opened,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     ParallelChardev *drv = PARALLEL_CHARDEV(chr);
 
@@ -227,7 +227,7 @@ static int pp_ioctl(Chardev *chr, int cmd, void *arg)
 static void qemu_chr_open_pp_fd(Chardev *chr,
                                 int fd,
                                 bool *be_opened,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     ParallelChardev *drv = PARALLEL_CHARDEV(chr);
     drv->fd = fd;
@@ -239,7 +239,7 @@ static void qemu_chr_open_pp_fd(Chardev *chr,
 static void qmp_chardev_open_parallel(Chardev *chr,
                                       ChardevBackend *backend,
                                       bool *be_opened,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     ChardevHostdev *parallel = backend->u.parallel.data;
     int fd;
@@ -252,7 +252,7 @@ static void qmp_chardev_open_parallel(Chardev *chr,
 }
 
 static void qemu_chr_parse_parallel(QemuOpts *opts, ChardevBackend *backend,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     const char *device = qemu_opt_get(opts, "path");
     ChardevHostdev *parallel;
diff --git a/chardev/char-pipe.c b/chardev/char-pipe.c
index 3a95e4c1b2..05f07b46ae 100644
--- a/chardev/char-pipe.c
+++ b/chardev/char-pipe.c
@@ -36,7 +36,7 @@
 #define NTIMEOUT 5000
 
 static int win_chr_pipe_init(Chardev *chr, const char *filename,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     WinChardev *s = WIN_CHARDEV(chr);
     OVERLAPPED ov;
@@ -102,7 +102,7 @@ static int win_chr_pipe_init(Chardev *chr, const char *filename,
 static void qemu_chr_open_pipe(Chardev *chr,
                                ChardevBackend *backend,
                                bool *be_opened,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     ChardevHostdev *opts = backend->u.pipe.data;
     const char *filename = opts->device;
@@ -117,7 +117,7 @@ static void qemu_chr_open_pipe(Chardev *chr,
 static void qemu_chr_open_pipe(Chardev *chr,
                                ChardevBackend *backend,
                                bool *be_opened,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     ChardevHostdev *opts = backend->u.pipe.data;
     int fd_in, fd_out;
@@ -150,7 +150,7 @@ static void qemu_chr_open_pipe(Chardev *chr,
 #endif /* !_WIN32 */
 
 static void qemu_chr_parse_pipe(QemuOpts *opts, ChardevBackend *backend,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     const char *device = qemu_opt_get(opts, "path");
     ChardevHostdev *dev;
diff --git a/chardev/char-pty.c b/chardev/char-pty.c
index 09609d397d..0ceb0e8280 100644
--- a/chardev/char-pty.c
+++ b/chardev/char-pty.c
@@ -243,7 +243,7 @@ static void char_pty_finalize(Object *obj)
 static void char_pty_open(Chardev *chr,
                           ChardevBackend *backend,
                           bool *be_opened,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     PtyChardev *s;
     int master_fd, slave_fd;
diff --git a/chardev/char-ringbuf.c b/chardev/char-ringbuf.c
index df52b04d22..f99a1423d3 100644
--- a/chardev/char-ringbuf.c
+++ b/chardev/char-ringbuf.c
@@ -89,7 +89,7 @@ static void char_ringbuf_finalize(Object *obj)
 static void qemu_chr_open_ringbuf(Chardev *chr,
                                   ChardevBackend *backend,
                                   bool *be_opened,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     ChardevRingbuf *opts = backend->u.ringbuf.data;
     RingBufChardev *d = RINGBUF_CHARDEV(chr);
@@ -109,7 +109,7 @@ static void qemu_chr_open_ringbuf(Chardev *chr,
 
 void qmp_ringbuf_write(const char *device, const char *data,
                        bool has_format, enum DataFormat format,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     Chardev *chr;
     const uint8_t *write_data;
@@ -153,7 +153,7 @@ void qmp_ringbuf_write(const char *device, const char *data,
 
 char *qmp_ringbuf_read(const char *device, int64_t size,
                        bool has_format, enum DataFormat format,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     Chardev *chr;
     uint8_t *read_data;
@@ -201,7 +201,7 @@ char *qmp_ringbuf_read(const char *device, int64_t size,
 }
 
 static void qemu_chr_parse_ringbuf(QemuOpts *opts, ChardevBackend *backend,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     int val;
     ChardevRingbuf *ringbuf;
diff --git a/chardev/char-serial.c b/chardev/char-serial.c
index 2f8f83821d..fcf507b7f2 100644
--- a/chardev/char-serial.c
+++ b/chardev/char-serial.c
@@ -41,7 +41,7 @@
 static void qmp_chardev_open_serial(Chardev *chr,
                                     ChardevBackend *backend,
                                     bool *be_opened,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     ChardevHostdev *serial = backend->u.serial.data;
 
@@ -253,7 +253,7 @@ static int tty_serial_ioctl(Chardev *chr, int cmd, void *arg)
 static void qmp_chardev_open_serial(Chardev *chr,
                                     ChardevBackend *backend,
                                     bool *be_opened,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     ChardevHostdev *serial = backend->u.serial.data;
     int fd;
@@ -271,7 +271,7 @@ static void qmp_chardev_open_serial(Chardev *chr,
 
 #ifdef HAVE_CHARDEV_SERIAL
 static void qemu_chr_parse_serial(QemuOpts *opts, ChardevBackend *backend,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     const char *device = qemu_opt_get(opts, "path");
     ChardevHostdev *serial;
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 7ca9863631..6faf32345a 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -756,7 +756,7 @@ static gboolean tcp_chr_accept(QIOChannel *channel,
     return TRUE;
 }
 
-static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
+static int tcp_chr_wait_connected(Chardev *chr, Error *errp[static 1])
 {
     SocketChardev *s = SOCKET_CHARDEV(chr);
     QIOChannelSocket *sioc;
@@ -857,7 +857,7 @@ static gboolean socket_reconnect_timeout(gpointer opaque)
 static void qmp_chardev_open_socket(Chardev *chr,
                                     ChardevBackend *backend,
                                     bool *be_opened,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     SocketChardev *s = SOCKET_CHARDEV(chr);
     ChardevSocket *sock = backend->u.socket.data;
@@ -975,7 +975,7 @@ error:
 }
 
 static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     bool is_listen      = qemu_opt_get_bool(opts, "server", false);
     bool is_waitconnect = is_listen && qemu_opt_get_bool(opts, "wait", true);
@@ -1049,7 +1049,7 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
 
 static void
 char_socket_get_addr(Object *obj, Visitor *v, const char *name,
-                     void *opaque, Error **errp)
+                     void *opaque, Error *errp[static 1])
 {
     SocketChardev *s = SOCKET_CHARDEV(obj);
 
@@ -1057,7 +1057,7 @@ char_socket_get_addr(Object *obj, Visitor *v, const char *name,
 }
 
 static bool
-char_socket_get_connected(Object *obj, Error **errp)
+char_socket_get_connected(Object *obj, Error *errp[static 1])
 {
     SocketChardev *s = SOCKET_CHARDEV(obj);
 
diff --git a/chardev/char-stdio.c b/chardev/char-stdio.c
index 6f5d798d7b..bd5c06f50b 100644
--- a/chardev/char-stdio.c
+++ b/chardev/char-stdio.c
@@ -81,7 +81,7 @@ static void term_stdio_handler(int sig)
 static void qemu_chr_open_stdio(Chardev *chr,
                                 ChardevBackend *backend,
                                 bool *be_opened,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     ChardevStdio *opts = backend->u.stdio.data;
     struct sigaction act;
@@ -116,7 +116,7 @@ static void qemu_chr_open_stdio(Chardev *chr,
 #endif
 
 static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     ChardevStdio *stdio;
 
diff --git a/chardev/char-udp.c b/chardev/char-udp.c
index d8766b1fd0..12fde11562 100644
--- a/chardev/char-udp.c
+++ b/chardev/char-udp.c
@@ -127,7 +127,7 @@ static void char_udp_finalize(Object *obj)
 }
 
 static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     const char *host = qemu_opt_get(opts, "host");
     const char *port = qemu_opt_get(opts, "port");
@@ -188,7 +188,7 @@ static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
 static void qmp_chardev_open_udp(Chardev *chr,
                                  ChardevBackend *backend,
                                  bool *be_opened,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     ChardevUdp *udp = backend->u.udp.data;
     SocketAddress *local_addr = socket_address_flatten(udp->local);
diff --git a/chardev/char-win-stdio.c b/chardev/char-win-stdio.c
index efcf7827eb..1cd4c56d90 100644
--- a/chardev/char-win-stdio.c
+++ b/chardev/char-win-stdio.c
@@ -139,7 +139,7 @@ static void qemu_chr_set_echo_win_stdio(Chardev *chr, bool echo)
 static void qemu_chr_open_stdio(Chardev *chr,
                                 ChardevBackend *backend,
                                 bool *be_opened,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     WinStdioChardev *stdio = WIN_STDIO_CHARDEV(chr);
     DWORD              dwMode;
diff --git a/chardev/char-win.c b/chardev/char-win.c
index 05518e0958..14adf57cda 100644
--- a/chardev/char-win.c
+++ b/chardev/char-win.c
@@ -71,7 +71,8 @@ static int win_chr_serial_poll(void *opaque)
     return 0;
 }
 
-int win_chr_serial_init(Chardev *chr, const char *filename, Error **errp)
+int win_chr_serial_init(Chardev *chr, const char *filename,
+                        Error *errp[static 1])
 {
     WinChardev *s = WIN_CHARDEV(chr);
     COMMCONFIG comcfg;
diff --git a/chardev/char.c b/chardev/char.c
index ac3cd2b436..eae1301139 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -187,7 +187,7 @@ int qemu_chr_add_client(Chardev *s, int fd)
 }
 
 static void qemu_char_open(Chardev *chr, ChardevBackend *backend,
-                           bool *be_opened, Error **errp)
+                           bool *be_opened, Error *errp[static 1])
 {
     ChardevClass *cc = CHARDEV_GET_CLASS(chr);
     /* Any ChardevCommon member would work */
@@ -307,7 +307,7 @@ static bool qemu_chr_is_busy(Chardev *s)
     }
 }
 
-int qemu_chr_wait_connected(Chardev *chr, Error **errp)
+int qemu_chr_wait_connected(Chardev *chr, Error *errp[static 1])
 {
     ChardevClass *cc = CHARDEV_GET_CLASS(chr);
 
@@ -476,7 +476,8 @@ void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend)
     backend->logappend = qemu_opt_get_bool(opts, "logappend", false);
 }
 
-static const ChardevClass *char_get_class(const char *driver, Error **errp)
+static const ChardevClass *char_get_class(const char *driver,
+                                          Error *errp[static 1])
 {
     ObjectClass *oc;
     const ChardevClass *cc;
@@ -557,7 +558,7 @@ help_string_append(const char *name, void *opaque)
 }
 
 Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     const ChardevClass *cc;
     Chardev *chr;
@@ -709,7 +710,7 @@ static int qmp_query_chardev_foreach(Object *obj, void *data)
     return 0;
 }
 
-ChardevInfoList *qmp_query_chardev(Error **errp)
+ChardevInfoList *qmp_query_chardev(Error *errp[static 1])
 {
     ChardevInfoList *chr_list = NULL;
 
@@ -731,7 +732,7 @@ qmp_prepend_backend(const char *name, void *opaque)
     *list = info;
 }
 
-ChardevBackendInfoList *qmp_query_chardev_backends(Error **errp)
+ChardevBackendInfoList *qmp_query_chardev_backends(Error *errp[static 1])
 {
     ChardevBackendInfoList *backend_list = NULL;
 
@@ -858,7 +859,7 @@ void qemu_chr_set_feature(Chardev *chr,
 
 Chardev *qemu_chardev_new(const char *id, const char *typename,
                           ChardevBackend *backend,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     Object *obj;
     Chardev *chr = NULL;
@@ -902,7 +903,7 @@ end:
 }
 
 ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     const ChardevClass *cc;
     ChardevReturn *ret;
@@ -928,7 +929,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
     return ret;
 }
 
-void qmp_chardev_remove(const char *id, Error **errp)
+void qmp_chardev_remove(const char *id, Error *errp[static 1])
 {
     Chardev *chr;
 
diff --git a/chardev/msmouse.c b/chardev/msmouse.c
index 0ffd137ce8..5e7ced5d6a 100644
--- a/chardev/msmouse.c
+++ b/chardev/msmouse.c
@@ -156,7 +156,7 @@ static QemuInputHandler msmouse_handler = {
 static void msmouse_chr_open(Chardev *chr,
                              ChardevBackend *backend,
                              bool *be_opened,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     MouseChardev *mouse = MOUSE_CHARDEV(chr);
 
diff --git a/chardev/spice.c b/chardev/spice.c
index a312078812..5cc3765e42 100644
--- a/chardev/spice.c
+++ b/chardev/spice.c
@@ -269,7 +269,7 @@ static void chr_open(Chardev *chr, const char *subtype)
 static void qemu_chr_open_spice_vmc(Chardev *chr,
                                     ChardevBackend *backend,
                                     bool *be_opened,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     ChardevSpiceChannel *spicevmc = backend->u.spicevmc.data;
     const char *type = spicevmc->type;
@@ -300,7 +300,7 @@ static void qemu_chr_open_spice_vmc(Chardev *chr,
 static void qemu_chr_open_spice_port(Chardev *chr,
                                      ChardevBackend *backend,
                                      bool *be_opened,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     ChardevSpicePort *spiceport = backend->u.spiceport.data;
     const char *name = spiceport->fqdn;
@@ -332,7 +332,7 @@ void qemu_spice_register_ports(void)
 #endif
 
 static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     const char *name = qemu_opt_get(opts, "name");
     ChardevSpiceChannel *spicevmc;
@@ -348,7 +348,7 @@ static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,
 }
 
 static void qemu_chr_parse_spice_port(QemuOpts *opts, ChardevBackend *backend,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     const char *name = qemu_opt_get(opts, "name");
     ChardevSpicePort *spiceport;
diff --git a/chardev/wctablet.c b/chardev/wctablet.c
index 6c13c2c58a..8adc34794c 100644
--- a/chardev/wctablet.c
+++ b/chardev/wctablet.c
@@ -328,7 +328,7 @@ static void wctablet_chr_finalize(Object *obj)
 static void wctablet_chr_open(Chardev *chr,
                               ChardevBackend *backend,
                               bool *be_opened,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     TabletChardev *tablet = WCTABLET_CHARDEV(chr);
 
diff --git a/cpus.c b/cpus.c
index 14bb8d552e..4b48ed2652 100644
--- a/cpus.c
+++ b/cpus.c
@@ -193,7 +193,7 @@ static bool default_mttcg_enabled(void)
     }
 }
 
-void qemu_tcg_configure(QemuOpts *opts, Error **errp)
+void qemu_tcg_configure(QemuOpts *opts, Error *errp[static 1])
 {
     const char *t = qemu_opt_get(opts, "thread");
     if (t) {
@@ -738,7 +738,7 @@ void cpu_ticks_init(void)
                                            cpu_throttle_timer_tick, NULL);
 }
 
-void configure_icount(QemuOpts *opts, Error **errp)
+void configure_icount(QemuOpts *opts, Error *errp[static 1])
 {
     const char *option;
     char *rem_str = NULL;
@@ -1873,7 +1873,7 @@ void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
 #endif
 }
 
-CpuInfoList *qmp_query_cpus(Error **errp)
+CpuInfoList *qmp_query_cpus(Error *errp[static 1])
 {
     MachineState *ms = MACHINE(qdev_get_machine());
     MachineClass *mc = MACHINE_GET_CLASS(ms);
@@ -1948,7 +1948,7 @@ CpuInfoList *qmp_query_cpus(Error **errp)
 }
 
 void qmp_memsave(int64_t addr, int64_t size, const char *filename,
-                 bool has_cpu, int64_t cpu_index, Error **errp)
+                 bool has_cpu, int64_t cpu_index, Error *errp[static 1])
 {
     FILE *f;
     uint32_t l;
@@ -1995,7 +1995,7 @@ exit:
 }
 
 void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
-                  Error **errp)
+                  Error *errp[static 1])
 {
     FILE *f;
     uint32_t l;
@@ -2024,7 +2024,7 @@ exit:
     fclose(f);
 }
 
-void qmp_inject_nmi(Error **errp)
+void qmp_inject_nmi(Error *errp[static 1])
 {
     nmi_monitor_handle(monitor_get_cpu_index(), errp);
 }
diff --git a/crypto/afsplit.c b/crypto/afsplit.c
index 825e2cff26..56a59386bb 100644
--- a/crypto/afsplit.c
+++ b/crypto/afsplit.c
@@ -44,7 +44,7 @@ static void qcrypto_afsplit_xor(size_t blocklen,
 static int qcrypto_afsplit_hash(QCryptoHashAlgorithm hash,
                                 size_t blocklen,
                                 uint8_t *block,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     size_t digestlen = qcrypto_hash_digest_len(hash);
 
@@ -92,7 +92,7 @@ int qcrypto_afsplit_encode(QCryptoHashAlgorithm hash,
                            uint32_t stripes,
                            const uint8_t *in,
                            uint8_t *out,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     uint8_t *block = g_new0(uint8_t, blocklen);
     size_t i;
@@ -129,7 +129,7 @@ int qcrypto_afsplit_decode(QCryptoHashAlgorithm hash,
                            uint32_t stripes,
                            const uint8_t *in,
                            uint8_t *out,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     uint8_t *block = g_new0(uint8_t, blocklen);
     size_t i;
diff --git a/crypto/block-luks.c b/crypto/block-luks.c
index 2b97d89a69..dd155ee42b 100644
--- a/crypto/block-luks.c
+++ b/crypto/block-luks.c
@@ -213,7 +213,7 @@ struct QCryptoBlockLUKS {
 static int qcrypto_block_luks_cipher_name_lookup(const char *name,
                                                  QCryptoCipherMode mode,
                                                  uint32_t key_bytes,
-                                                 Error **errp)
+                                                 Error *errp[static 1])
 {
     const QCryptoBlockLUKSCipherNameMap *map =
         qcrypto_block_luks_cipher_name_map;
@@ -242,7 +242,7 @@ static int qcrypto_block_luks_cipher_name_lookup(const char *name,
 
 static const char *
 qcrypto_block_luks_cipher_alg_lookup(QCryptoCipherAlgorithm alg,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     const QCryptoBlockLUKSCipherNameMap *map =
         qcrypto_block_luks_cipher_name_map;
@@ -267,7 +267,7 @@ static int qcrypto_block_luks_name_lookup(const char *name,
                                           const char *const *map,
                                           size_t maplen,
                                           const char *type,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     size_t i;
     for (i = 0; i < maplen; i++) {
@@ -333,7 +333,7 @@ qcrypto_block_luks_has_format(const uint8_t *buf,
 static QCryptoCipherAlgorithm
 qcrypto_block_luks_essiv_cipher(QCryptoCipherAlgorithm cipher,
                                 QCryptoHashAlgorithm hash,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     size_t digestlen = qcrypto_hash_digest_len(hash);
     size_t keylen = qcrypto_cipher_get_key_len(cipher);
@@ -428,7 +428,7 @@ qcrypto_block_luks_load_key(QCryptoBlock *block,
                             size_t masterkeylen,
                             QCryptoBlockReadFunc readfunc,
                             void *opaque,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     QCryptoBlockLUKS *luks = block->opaque;
     uint8_t *splitkey;
@@ -593,7 +593,7 @@ qcrypto_block_luks_find_key(QCryptoBlock *block,
                             size_t *masterkeylen,
                             QCryptoBlockReadFunc readfunc,
                             void *opaque,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     QCryptoBlockLUKS *luks = block->opaque;
     size_t i;
@@ -641,7 +641,7 @@ qcrypto_block_luks_open(QCryptoBlock *block,
                         QCryptoBlockReadFunc readfunc,
                         void *opaque,
                         unsigned int flags,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     QCryptoBlockLUKS *luks;
     Error *local_err = NULL;
@@ -888,7 +888,7 @@ qcrypto_block_luks_create(QCryptoBlock *block,
                           QCryptoBlockInitFunc initfunc,
                           QCryptoBlockWriteFunc writefunc,
                           void *opaque,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     QCryptoBlockLUKS *luks;
     QCryptoBlockCreateOptionsLUKS luks_opts;
@@ -1348,7 +1348,7 @@ qcrypto_block_luks_create(QCryptoBlock *block,
 
 static int qcrypto_block_luks_get_info(QCryptoBlock *block,
                                        QCryptoBlockInfo *info,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     QCryptoBlockLUKS *luks = block->opaque;
     QCryptoBlockInfoLUKSSlot *slot;
@@ -1402,7 +1402,7 @@ qcrypto_block_luks_decrypt(QCryptoBlock *block,
                            uint64_t startsector,
                            uint8_t *buf,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     return qcrypto_block_decrypt_helper(block->cipher,
                                         block->niv, block->ivgen,
@@ -1416,7 +1416,7 @@ qcrypto_block_luks_encrypt(QCryptoBlock *block,
                            uint64_t startsector,
                            uint8_t *buf,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     return qcrypto_block_encrypt_helper(block->cipher,
                                         block->niv, block->ivgen,
diff --git a/crypto/block-qcow.c b/crypto/block-qcow.c
index be88c6f0ef..61b91cde53 100644
--- a/crypto/block-qcow.c
+++ b/crypto/block-qcow.c
@@ -44,7 +44,7 @@ qcrypto_block_qcow_has_format(const uint8_t *buf G_GNUC_UNUSED,
 static int
 qcrypto_block_qcow_init(QCryptoBlock *block,
                         const char *keysecret,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     char *password;
     int ret;
@@ -97,7 +97,7 @@ qcrypto_block_qcow_open(QCryptoBlock *block,
                         QCryptoBlockReadFunc readfunc G_GNUC_UNUSED,
                         void *opaque G_GNUC_UNUSED,
                         unsigned int flags,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     if (flags & QCRYPTO_BLOCK_OPEN_NO_IO) {
         return 0;
@@ -119,7 +119,7 @@ qcrypto_block_qcow_create(QCryptoBlock *block,
                           QCryptoBlockInitFunc initfunc G_GNUC_UNUSED,
                           QCryptoBlockWriteFunc writefunc G_GNUC_UNUSED,
                           void *opaque G_GNUC_UNUSED,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     if (!options->u.qcow.key_secret) {
         error_setg(errp, "Parameter 'key-secret' is required for cipher");
@@ -141,7 +141,7 @@ qcrypto_block_qcow_decrypt(QCryptoBlock *block,
                            uint64_t startsector,
                            uint8_t *buf,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     return qcrypto_block_decrypt_helper(block->cipher,
                                         block->niv, block->ivgen,
@@ -155,7 +155,7 @@ qcrypto_block_qcow_encrypt(QCryptoBlock *block,
                            uint64_t startsector,
                            uint8_t *buf,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     return qcrypto_block_encrypt_helper(block->cipher,
                                         block->niv, block->ivgen,
diff --git a/crypto/block.c b/crypto/block.c
index 64c8420425..f4fb725fd2 100644
--- a/crypto/block.c
+++ b/crypto/block.c
@@ -51,7 +51,7 @@ QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
                                  QCryptoBlockReadFunc readfunc,
                                  void *opaque,
                                  unsigned int flags,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     QCryptoBlock *block = g_new0(QCryptoBlock, 1);
 
@@ -81,7 +81,7 @@ QCryptoBlock *qcrypto_block_create(QCryptoBlockCreateOptions *options,
                                    QCryptoBlockInitFunc initfunc,
                                    QCryptoBlockWriteFunc writefunc,
                                    void *opaque,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     QCryptoBlock *block = g_new0(QCryptoBlock, 1);
 
@@ -108,7 +108,7 @@ QCryptoBlock *qcrypto_block_create(QCryptoBlockCreateOptions *options,
 
 
 QCryptoBlockInfo *qcrypto_block_get_info(QCryptoBlock *block,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QCryptoBlockInfo *info = g_new0(QCryptoBlockInfo, 1);
 
@@ -128,7 +128,7 @@ int qcrypto_block_decrypt(QCryptoBlock *block,
                           uint64_t startsector,
                           uint8_t *buf,
                           size_t len,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     return block->driver->decrypt(block, startsector, buf, len, errp);
 }
@@ -138,7 +138,7 @@ int qcrypto_block_encrypt(QCryptoBlock *block,
                           uint64_t startsector,
                           uint8_t *buf,
                           size_t len,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     return block->driver->encrypt(block, startsector, buf, len, errp);
 }
@@ -189,7 +189,7 @@ int qcrypto_block_decrypt_helper(QCryptoCipher *cipher,
                                  uint64_t startsector,
                                  uint8_t *buf,
                                  size_t len,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     uint8_t *iv;
     int ret = -1;
@@ -238,7 +238,7 @@ int qcrypto_block_encrypt_helper(QCryptoCipher *cipher,
                                  uint64_t startsector,
                                  uint8_t *buf,
                                  size_t len,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     uint8_t *iv;
     int ret = -1;
diff --git a/crypto/cipher-builtin.c b/crypto/cipher-builtin.c
index b4bc2b9ca6..52cf847ea8 100644
--- a/crypto/cipher-builtin.c
+++ b/crypto/cipher-builtin.c
@@ -153,7 +153,7 @@ static int qcrypto_cipher_encrypt_aes(QCryptoCipher *cipher,
                                       const void *in,
                                       void *out,
                                       size_t len,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt = cipher->opaque;
 
@@ -187,7 +187,7 @@ static int qcrypto_cipher_decrypt_aes(QCryptoCipher *cipher,
                                       const void *in,
                                       void *out,
                                       size_t len,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt = cipher->opaque;
 
@@ -218,7 +218,7 @@ static int qcrypto_cipher_decrypt_aes(QCryptoCipher *cipher,
 
 static int qcrypto_cipher_setiv_aes(QCryptoCipher *cipher,
                                      const uint8_t *iv, size_t niv,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt = cipher->opaque;
     if (niv != AES_BLOCK_SIZE) {
@@ -237,7 +237,7 @@ static int qcrypto_cipher_setiv_aes(QCryptoCipher *cipher,
 
 static int qcrypto_cipher_init_aes(QCryptoCipher *cipher,
                                    const uint8_t *key, size_t nkey,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt;
 
@@ -315,7 +315,7 @@ static int qcrypto_cipher_encrypt_des_rfb(QCryptoCipher *cipher,
                                           const void *in,
                                           void *out,
                                           size_t len,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt = cipher->opaque;
     size_t i;
@@ -340,7 +340,7 @@ static int qcrypto_cipher_decrypt_des_rfb(QCryptoCipher *cipher,
                                           const void *in,
                                           void *out,
                                           size_t len,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt = cipher->opaque;
     size_t i;
@@ -363,7 +363,7 @@ static int qcrypto_cipher_decrypt_des_rfb(QCryptoCipher *cipher,
 
 static int qcrypto_cipher_setiv_des_rfb(QCryptoCipher *cipher,
                                         const uint8_t *iv, size_t niv,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     error_setg(errp, "Setting IV is not supported");
     return -1;
@@ -372,7 +372,7 @@ static int qcrypto_cipher_setiv_des_rfb(QCryptoCipher *cipher,
 
 static int qcrypto_cipher_init_des_rfb(QCryptoCipher *cipher,
                                        const uint8_t *key, size_t nkey,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt;
 
@@ -429,7 +429,7 @@ bool qcrypto_cipher_supports(QCryptoCipherAlgorithm alg,
 QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
                                   QCryptoCipherMode mode,
                                   const uint8_t *key, size_t nkey,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     QCryptoCipher *cipher;
 
@@ -497,7 +497,7 @@ int qcrypto_cipher_encrypt(QCryptoCipher *cipher,
                            const void *in,
                            void *out,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt = cipher->opaque;
 
@@ -515,7 +515,7 @@ int qcrypto_cipher_decrypt(QCryptoCipher *cipher,
                            const void *in,
                            void *out,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt = cipher->opaque;
 
@@ -531,7 +531,7 @@ int qcrypto_cipher_decrypt(QCryptoCipher *cipher,
 
 int qcrypto_cipher_setiv(QCryptoCipher *cipher,
                          const uint8_t *iv, size_t niv,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     QCryptoCipherBuiltin *ctxt = cipher->opaque;
 
diff --git a/crypto/cipher-gcrypt.c b/crypto/cipher-gcrypt.c
index 6487ecaf37..10eccc50e4 100644
--- a/crypto/cipher-gcrypt.c
+++ b/crypto/cipher-gcrypt.c
@@ -67,7 +67,7 @@ struct QCryptoCipherGcrypt {
 QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
                                   QCryptoCipherMode mode,
                                   const uint8_t *key, size_t nkey,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     QCryptoCipher *cipher;
     QCryptoCipherGcrypt *ctx;
@@ -279,7 +279,7 @@ int qcrypto_cipher_encrypt(QCryptoCipher *cipher,
                            const void *in,
                            void *out,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QCryptoCipherGcrypt *ctx = cipher->opaque;
     gcry_error_t err;
@@ -314,7 +314,7 @@ int qcrypto_cipher_decrypt(QCryptoCipher *cipher,
                            const void *in,
                            void *out,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QCryptoCipherGcrypt *ctx = cipher->opaque;
     gcry_error_t err;
@@ -346,7 +346,7 @@ int qcrypto_cipher_decrypt(QCryptoCipher *cipher,
 
 int qcrypto_cipher_setiv(QCryptoCipher *cipher,
                          const uint8_t *iv, size_t niv,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     QCryptoCipherGcrypt *ctx = cipher->opaque;
     gcry_error_t err;
diff --git a/crypto/cipher-nettle.c b/crypto/cipher-nettle.c
index dfc9030227..44a230fcd4 100644
--- a/crypto/cipher-nettle.c
+++ b/crypto/cipher-nettle.c
@@ -252,7 +252,7 @@ bool qcrypto_cipher_supports(QCryptoCipherAlgorithm alg,
 QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg,
                                   QCryptoCipherMode mode,
                                   const uint8_t *key, size_t nkey,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     QCryptoCipher *cipher;
     QCryptoCipherNettle *ctx;
@@ -452,7 +452,7 @@ int qcrypto_cipher_encrypt(QCryptoCipher *cipher,
                            const void *in,
                            void *out,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QCryptoCipherNettle *ctx = cipher->opaque;
 
@@ -498,7 +498,7 @@ int qcrypto_cipher_decrypt(QCryptoCipher *cipher,
                            const void *in,
                            void *out,
                            size_t len,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QCryptoCipherNettle *ctx = cipher->opaque;
 
@@ -540,7 +540,7 @@ int qcrypto_cipher_decrypt(QCryptoCipher *cipher,
 
 int qcrypto_cipher_setiv(QCryptoCipher *cipher,
                          const uint8_t *iv, size_t niv,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     QCryptoCipherNettle *ctx = cipher->opaque;
     if (niv != ctx->blocksize) {
diff --git a/crypto/cipher.c b/crypto/cipher.c
index 5a9648942f..1862c267e9 100644
--- a/crypto/cipher.c
+++ b/crypto/cipher.c
@@ -96,7 +96,7 @@ static bool
 qcrypto_cipher_validate_key_length(QCryptoCipherAlgorithm alg,
                                    QCryptoCipherMode mode,
                                    size_t nkey,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     if ((unsigned)alg >= QCRYPTO_CIPHER_ALG__MAX) {
         error_setg(errp, "Cipher algorithm %d out of range",
diff --git a/crypto/hash-gcrypt.c b/crypto/hash-gcrypt.c
index 7690690f70..d1916bd828 100644
--- a/crypto/hash-gcrypt.c
+++ b/crypto/hash-gcrypt.c
@@ -49,7 +49,7 @@ int qcrypto_hash_bytesv(QCryptoHashAlgorithm alg,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     int i, ret;
     gcry_md_hd_t md;
diff --git a/crypto/hash-glib.c b/crypto/hash-glib.c
index ec99ac9df9..5ca293b3de 100644
--- a/crypto/hash-glib.c
+++ b/crypto/hash-glib.c
@@ -52,7 +52,7 @@ int qcrypto_hash_bytesv(QCryptoHashAlgorithm alg,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     int i, ret;
     GChecksum *cs;
diff --git a/crypto/hash-nettle.c b/crypto/hash-nettle.c
index 6a206dcb18..4c13f463fd 100644
--- a/crypto/hash-nettle.c
+++ b/crypto/hash-nettle.c
@@ -108,7 +108,7 @@ int qcrypto_hash_bytesv(QCryptoHashAlgorithm alg,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     int i;
     union qcrypto_hash_ctx ctx;
diff --git a/crypto/hash.c b/crypto/hash.c
index 0f1ceac66a..a2f5c42295 100644
--- a/crypto/hash.c
+++ b/crypto/hash.c
@@ -44,7 +44,7 @@ int qcrypto_hash_bytes(QCryptoHashAlgorithm alg,
                        size_t len,
                        uint8_t **result,
                        size_t *resultlen,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     struct iovec iov = { .iov_base = (char *)buf,
                          .iov_len = len };
@@ -57,7 +57,7 @@ int qcrypto_hash_digestv(QCryptoHashAlgorithm alg,
                          const struct iovec *iov,
                          size_t niov,
                          char **digest,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     uint8_t *result = NULL;
     size_t resultlen = 0;
@@ -81,7 +81,7 @@ int qcrypto_hash_digest(QCryptoHashAlgorithm alg,
                         const char *buf,
                         size_t len,
                         char **digest,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     struct iovec iov = { .iov_base = (char *)buf, .iov_len = len };
 
@@ -92,7 +92,7 @@ int qcrypto_hash_base64v(QCryptoHashAlgorithm alg,
                          const struct iovec *iov,
                          size_t niov,
                          char **base64,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     uint8_t *result = NULL;
     size_t resultlen = 0;
@@ -110,7 +110,7 @@ int qcrypto_hash_base64(QCryptoHashAlgorithm alg,
                         const char *buf,
                         size_t len,
                         char **base64,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     struct iovec iov = { .iov_base = (char *)buf, .iov_len = len };
 
diff --git a/crypto/hmac-gcrypt.c b/crypto/hmac-gcrypt.c
index 21189e694f..d0c7e8dece 100644
--- a/crypto/hmac-gcrypt.c
+++ b/crypto/hmac-gcrypt.c
@@ -44,7 +44,7 @@ bool qcrypto_hmac_supports(QCryptoHashAlgorithm alg)
 
 QCryptoHmac *qcrypto_hmac_new(QCryptoHashAlgorithm alg,
                               const uint8_t *key, size_t nkey,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     QCryptoHmac *hmac;
     QCryptoHmacGcrypt *ctx;
@@ -105,7 +105,7 @@ int qcrypto_hmac_bytesv(QCryptoHmac *hmac,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     QCryptoHmacGcrypt *ctx;
     gcry_error_t err;
diff --git a/crypto/hmac-glib.c b/crypto/hmac-glib.c
index 08a1fdd10a..38f69dfd5b 100644
--- a/crypto/hmac-glib.c
+++ b/crypto/hmac-glib.c
@@ -51,7 +51,7 @@ bool qcrypto_hmac_supports(QCryptoHashAlgorithm alg)
 
 QCryptoHmac *qcrypto_hmac_new(QCryptoHashAlgorithm alg,
                               const uint8_t *key, size_t nkey,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     QCryptoHmac *hmac;
     QCryptoHmacGlib *ctx;
@@ -103,7 +103,7 @@ int qcrypto_hmac_bytesv(QCryptoHmac *hmac,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     QCryptoHmacGlib *ctx;
     int i, ret;
@@ -143,7 +143,7 @@ bool qcrypto_hmac_supports(QCryptoHashAlgorithm alg)
 
 QCryptoHmac *qcrypto_hmac_new(QCryptoHashAlgorithm alg,
                               const uint8_t *key, size_t nkey,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     return NULL;
 }
@@ -158,7 +158,7 @@ int qcrypto_hmac_bytesv(QCryptoHmac *hmac,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     return -1;
 }
diff --git a/crypto/hmac-nettle.c b/crypto/hmac-nettle.c
index 4a9e6b2c7d..ac8b8ca30d 100644
--- a/crypto/hmac-nettle.c
+++ b/crypto/hmac-nettle.c
@@ -99,7 +99,7 @@ bool qcrypto_hmac_supports(QCryptoHashAlgorithm alg)
 
 QCryptoHmac *qcrypto_hmac_new(QCryptoHashAlgorithm alg,
                               const uint8_t *key, size_t nkey,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     QCryptoHmac *hmac;
     QCryptoHmacNettle *ctx;
@@ -141,7 +141,7 @@ int qcrypto_hmac_bytesv(QCryptoHmac *hmac,
                         size_t niov,
                         uint8_t **result,
                         size_t *resultlen,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     QCryptoHmacNettle *ctx;
     int i;
diff --git a/crypto/hmac.c b/crypto/hmac.c
index 5750405cfb..046b8c616c 100644
--- a/crypto/hmac.c
+++ b/crypto/hmac.c
@@ -20,7 +20,7 @@ int qcrypto_hmac_bytes(QCryptoHmac *hmac,
                        size_t len,
                        uint8_t **result,
                        size_t *resultlen,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     struct iovec iov = {
             .iov_base = (char *)buf,
@@ -34,7 +34,7 @@ int qcrypto_hmac_digestv(QCryptoHmac *hmac,
                          const struct iovec *iov,
                          size_t niov,
                          char **digest,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     uint8_t *result = NULL;
     size_t resultlen = 0;
@@ -61,7 +61,7 @@ int qcrypto_hmac_digest(QCryptoHmac *hmac,
                         const char *buf,
                         size_t len,
                         char **digest,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     struct iovec iov = {
             .iov_base = (char *)buf,
diff --git a/crypto/init.c b/crypto/init.c
index f131c42306..574dc29e57 100644
--- a/crypto/init.c
+++ b/crypto/init.c
@@ -119,7 +119,7 @@ static struct gcry_thread_cbs qcrypto_gcrypt_thread_impl = {
 };
 #endif /* QCRYPTO_INIT_GCRYPT */
 
-int qcrypto_init(Error **errp)
+int qcrypto_init(Error *errp[static 1])
 {
 #ifdef QCRYPTO_INIT_GCRYPT_THREADS
     gcry_control(GCRYCTL_SET_THREAD_CBS, &qcrypto_gcrypt_thread_impl);
diff --git a/crypto/ivgen-essiv.c b/crypto/ivgen-essiv.c
index cba20bde6c..08817038b8 100644
--- a/crypto/ivgen-essiv.c
+++ b/crypto/ivgen-essiv.c
@@ -30,7 +30,7 @@ struct QCryptoIVGenESSIV {
 
 static int qcrypto_ivgen_essiv_init(QCryptoIVGen *ivgen,
                                     const uint8_t *key, size_t nkey,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     uint8_t *salt;
     size_t nhash;
@@ -72,7 +72,7 @@ static int qcrypto_ivgen_essiv_init(QCryptoIVGen *ivgen,
 static int qcrypto_ivgen_essiv_calculate(QCryptoIVGen *ivgen,
                                          uint64_t sector,
                                          uint8_t *iv, size_t niv,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QCryptoIVGenESSIV *essiv = ivgen->private;
     size_t ndata = qcrypto_cipher_get_block_len(ivgen->cipher);
diff --git a/crypto/ivgen-plain.c b/crypto/ivgen-plain.c
index 9b9b4ad0bf..786b7897ba 100644
--- a/crypto/ivgen-plain.c
+++ b/crypto/ivgen-plain.c
@@ -25,7 +25,7 @@
 
 static int qcrypto_ivgen_plain_init(QCryptoIVGen *ivgen,
                                     const uint8_t *key, size_t nkey,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     return 0;
 }
@@ -33,7 +33,7 @@ static int qcrypto_ivgen_plain_init(QCryptoIVGen *ivgen,
 static int qcrypto_ivgen_plain_calculate(QCryptoIVGen *ivgen,
                                          uint64_t sector,
                                          uint8_t *iv, size_t niv,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     size_t ivprefix;
     uint32_t shortsector = cpu_to_le32((sector & 0xffffffff));
diff --git a/crypto/ivgen-plain64.c b/crypto/ivgen-plain64.c
index 6c6b1b44c3..73d60c1e86 100644
--- a/crypto/ivgen-plain64.c
+++ b/crypto/ivgen-plain64.c
@@ -25,7 +25,7 @@
 
 static int qcrypto_ivgen_plain_init(QCryptoIVGen *ivgen,
                                     const uint8_t *key, size_t nkey,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     return 0;
 }
@@ -33,7 +33,7 @@ static int qcrypto_ivgen_plain_init(QCryptoIVGen *ivgen,
 static int qcrypto_ivgen_plain_calculate(QCryptoIVGen *ivgen,
                                          uint64_t sector,
                                          uint8_t *iv, size_t niv,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     size_t ivprefix;
     ivprefix = sizeof(sector);
diff --git a/crypto/ivgen.c b/crypto/ivgen.c
index f66435112b..a5c667350e 100644
--- a/crypto/ivgen.c
+++ b/crypto/ivgen.c
@@ -31,7 +31,7 @@ QCryptoIVGen *qcrypto_ivgen_new(QCryptoIVGenAlgorithm alg,
                                 QCryptoCipherAlgorithm cipheralg,
                                 QCryptoHashAlgorithm hash,
                                 const uint8_t *key, size_t nkey,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     QCryptoIVGen *ivgen = g_new0(QCryptoIVGen, 1);
 
@@ -67,7 +67,7 @@ QCryptoIVGen *qcrypto_ivgen_new(QCryptoIVGenAlgorithm alg,
 int qcrypto_ivgen_calculate(QCryptoIVGen *ivgen,
                             uint64_t sector,
                             uint8_t *iv, size_t niv,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     return ivgen->driver->calculate(ivgen, sector, iv, niv, errp);
 }
diff --git a/crypto/pbkdf-gcrypt.c b/crypto/pbkdf-gcrypt.c
index 40289858bf..6bff786350 100644
--- a/crypto/pbkdf-gcrypt.c
+++ b/crypto/pbkdf-gcrypt.c
@@ -44,7 +44,7 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,
                    const uint8_t *salt, size_t nsalt,
                    uint64_t iterations,
                    uint8_t *out, size_t nout,
-                   Error **errp)
+                   Error *errp[static 1])
 {
     static const int hash_map[QCRYPTO_HASH_ALG__MAX] = {
         [QCRYPTO_HASH_ALG_MD5] = GCRY_MD_MD5,
diff --git a/crypto/pbkdf-nettle.c b/crypto/pbkdf-nettle.c
index 6fb2671656..5c52dec87d 100644
--- a/crypto/pbkdf-nettle.c
+++ b/crypto/pbkdf-nettle.c
@@ -45,7 +45,7 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,
                    const uint8_t *salt, size_t nsalt,
                    uint64_t iterations,
                    uint8_t *out, size_t nout,
-                   Error **errp)
+                   Error *errp[static 1])
 {
     union {
         struct hmac_md5_ctx md5;
diff --git a/crypto/pbkdf-stub.c b/crypto/pbkdf-stub.c
index a15044da42..7adbaa3e79 100644
--- a/crypto/pbkdf-stub.c
+++ b/crypto/pbkdf-stub.c
@@ -35,7 +35,7 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash G_GNUC_UNUSED,
                    uint64_t iterations G_GNUC_UNUSED,
                    uint8_t *out G_GNUC_UNUSED,
                    size_t nout G_GNUC_UNUSED,
-                   Error **errp)
+                   Error *errp[static 1])
 {
     error_setg_errno(errp, ENOSYS,
                      "No crypto library supporting PBKDF in this build");
diff --git a/crypto/pbkdf.c b/crypto/pbkdf.c
index f22e71d183..964215eb2c 100644
--- a/crypto/pbkdf.c
+++ b/crypto/pbkdf.c
@@ -27,7 +27,7 @@
 
 
 static int qcrypto_pbkdf2_get_thread_cpu(unsigned long long *val_ms,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
 #ifdef _WIN32
     FILETIME creation_time, exit_time, kernel_time, user_time;
@@ -66,7 +66,7 @@ uint64_t qcrypto_pbkdf2_count_iters(QCryptoHashAlgorithm hash,
                                     const uint8_t *key, size_t nkey,
                                     const uint8_t *salt, size_t nsalt,
                                     size_t nout,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     uint64_t ret = -1;
     uint8_t *out;
diff --git a/crypto/random-gcrypt.c b/crypto/random-gcrypt.c
index 9f1c9ee60e..b1ecceef61 100644
--- a/crypto/random-gcrypt.c
+++ b/crypto/random-gcrypt.c
@@ -26,10 +26,10 @@
 
 int qcrypto_random_bytes(uint8_t *buf,
                          size_t buflen,
-                         Error **errp G_GNUC_UNUSED)
+                         Error *errp[static 1] G_GNUC_UNUSED)
 {
     gcry_randomize(buf, buflen, GCRY_STRONG_RANDOM);
     return 0;
 }
 
-int qcrypto_random_init(Error **errp G_GNUC_UNUSED) { return 0; }
+int qcrypto_random_init(Error *errp[static 1] G_GNUC_UNUSED) { return 0; }
diff --git a/crypto/random-gnutls.c b/crypto/random-gnutls.c
index 5350003a0b..ef740ddaeb 100644
--- a/crypto/random-gnutls.c
+++ b/crypto/random-gnutls.c
@@ -27,7 +27,7 @@
 
 int qcrypto_random_bytes(uint8_t *buf,
                          size_t buflen,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     int ret;
 
@@ -43,4 +43,4 @@ int qcrypto_random_bytes(uint8_t *buf,
 }
 
 
-int qcrypto_random_init(Error **errp G_GNUC_UNUSED) { return 0; }
+int qcrypto_random_init(Error *errp[static 1] G_GNUC_UNUSED) { return 0; }
diff --git a/crypto/random-platform.c b/crypto/random-platform.c
index 92eed0ee78..e53d0dcf89 100644
--- a/crypto/random-platform.c
+++ b/crypto/random-platform.c
@@ -29,7 +29,7 @@ static HCRYPTPROV hCryptProv;
 static int fd; /* a file handle to either /dev/urandom or /dev/random */
 #endif
 
-int qcrypto_random_init(Error **errp)
+int qcrypto_random_init(Error *errp[static 1])
 {
 #ifndef _WIN32
     /* TBD perhaps also add support for BSD getentropy / Linux
@@ -57,7 +57,7 @@ int qcrypto_random_init(Error **errp)
 
 int qcrypto_random_bytes(uint8_t *buf G_GNUC_UNUSED,
                          size_t buflen G_GNUC_UNUSED,
-                         Error **errp)
+                         Error *errp[static 1])
 {
 #ifndef _WIN32
     int ret = -1;
diff --git a/crypto/secret.c b/crypto/secret.c
index e5631b9dd2..3e86b18663 100644
--- a/crypto/secret.c
+++ b/crypto/secret.c
@@ -31,7 +31,7 @@ static void
 qcrypto_secret_load_data(QCryptoSecret *secret,
                          uint8_t **output,
                          size_t *outputlen,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     char *data = NULL;
     size_t length = 0;
@@ -69,7 +69,7 @@ static void qcrypto_secret_decrypt(QCryptoSecret *secret,
                                    size_t inputlen,
                                    uint8_t **output,
                                    size_t *outputlen,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     uint8_t *key = NULL, *ciphertext = NULL, *iv = NULL;
     size_t keylen, ciphertextlen, ivlen;
@@ -170,7 +170,7 @@ static void qcrypto_secret_decode(const uint8_t *input,
                                   size_t inputlen,
                                   uint8_t **output,
                                   size_t *outputlen,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     *output = qbase64_decode((const gchar*)input,
                              inputlen,
@@ -182,7 +182,7 @@ static void qcrypto_secret_decode(const uint8_t *input,
 static void
 qcrypto_secret_prop_set_loaded(Object *obj,
                                bool value,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
 
@@ -234,7 +234,7 @@ qcrypto_secret_prop_set_loaded(Object *obj,
 
 static bool
 qcrypto_secret_prop_get_loaded(Object *obj,
-                               Error **errp G_GNUC_UNUSED)
+                               Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
     return secret->data != NULL;
@@ -244,7 +244,7 @@ qcrypto_secret_prop_get_loaded(Object *obj,
 static void
 qcrypto_secret_prop_set_format(Object *obj,
                                int value,
-                               Error **errp G_GNUC_UNUSED)
+                               Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoSecret *creds = QCRYPTO_SECRET(obj);
 
@@ -254,7 +254,7 @@ qcrypto_secret_prop_set_format(Object *obj,
 
 static int
 qcrypto_secret_prop_get_format(Object *obj,
-                               Error **errp G_GNUC_UNUSED)
+                               Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoSecret *creds = QCRYPTO_SECRET(obj);
 
@@ -265,7 +265,7 @@ qcrypto_secret_prop_get_format(Object *obj,
 static void
 qcrypto_secret_prop_set_data(Object *obj,
                              const char *value,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
 
@@ -276,7 +276,7 @@ qcrypto_secret_prop_set_data(Object *obj,
 
 static char *
 qcrypto_secret_prop_get_data(Object *obj,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
     return g_strdup(secret->data);
@@ -286,7 +286,7 @@ qcrypto_secret_prop_get_data(Object *obj,
 static void
 qcrypto_secret_prop_set_file(Object *obj,
                              const char *value,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
 
@@ -297,7 +297,7 @@ qcrypto_secret_prop_set_file(Object *obj,
 
 static char *
 qcrypto_secret_prop_get_file(Object *obj,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
     return g_strdup(secret->file);
@@ -307,7 +307,7 @@ qcrypto_secret_prop_get_file(Object *obj,
 static void
 qcrypto_secret_prop_set_iv(Object *obj,
                            const char *value,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
 
@@ -318,7 +318,7 @@ qcrypto_secret_prop_set_iv(Object *obj,
 
 static char *
 qcrypto_secret_prop_get_iv(Object *obj,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
     return g_strdup(secret->iv);
@@ -328,7 +328,7 @@ qcrypto_secret_prop_get_iv(Object *obj,
 static void
 qcrypto_secret_prop_set_keyid(Object *obj,
                               const char *value,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
 
@@ -339,7 +339,7 @@ qcrypto_secret_prop_set_keyid(Object *obj,
 
 static char *
 qcrypto_secret_prop_get_keyid(Object *obj,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
     return g_strdup(secret->keyid);
@@ -347,7 +347,7 @@ qcrypto_secret_prop_get_keyid(Object *obj,
 
 
 static void
-qcrypto_secret_complete(UserCreatable *uc, Error **errp)
+qcrypto_secret_complete(UserCreatable *uc, Error *errp[static 1])
 {
     object_property_set_bool(OBJECT(uc), true, "loaded", errp);
 }
@@ -404,7 +404,7 @@ qcrypto_secret_class_init(ObjectClass *oc, void *data)
 int qcrypto_secret_lookup(const char *secretid,
                           uint8_t **data,
                           size_t *datalen,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     Object *obj;
     QCryptoSecret *secret;
@@ -441,7 +441,7 @@ int qcrypto_secret_lookup(const char *secretid,
 
 
 char *qcrypto_secret_lookup_as_utf8(const char *secretid,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     uint8_t *data;
     size_t datalen;
@@ -466,7 +466,7 @@ char *qcrypto_secret_lookup_as_utf8(const char *secretid,
 
 
 char *qcrypto_secret_lookup_as_base64(const char *secretid,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     uint8_t *data;
     size_t datalen;
diff --git a/crypto/tlscreds.c b/crypto/tlscreds.c
index 21bd388769..55ee7af473 100644
--- a/crypto/tlscreds.c
+++ b/crypto/tlscreds.c
@@ -30,7 +30,7 @@ int
 qcrypto_tls_creds_get_dh_params_file(QCryptoTLSCreds *creds,
                                      const char *filename,
                                      gnutls_dh_params_t *dh_params,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     int ret;
 
@@ -96,7 +96,7 @@ qcrypto_tls_creds_get_path(QCryptoTLSCreds *creds,
                            const char *filename,
                            bool required,
                            char **cred,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     struct stat sb;
     int ret = -1;
@@ -139,7 +139,7 @@ qcrypto_tls_creds_get_path(QCryptoTLSCreds *creds,
 static void
 qcrypto_tls_creds_prop_set_verify(Object *obj,
                                   bool value,
-                                  Error **errp G_GNUC_UNUSED)
+                                  Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCreds *creds = QCRYPTO_TLS_CREDS(obj);
 
@@ -149,7 +149,7 @@ qcrypto_tls_creds_prop_set_verify(Object *obj,
 
 static bool
 qcrypto_tls_creds_prop_get_verify(Object *obj,
-                                  Error **errp G_GNUC_UNUSED)
+                                  Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCreds *creds = QCRYPTO_TLS_CREDS(obj);
 
@@ -160,7 +160,7 @@ qcrypto_tls_creds_prop_get_verify(Object *obj,
 static void
 qcrypto_tls_creds_prop_set_dir(Object *obj,
                                const char *value,
-                               Error **errp G_GNUC_UNUSED)
+                               Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCreds *creds = QCRYPTO_TLS_CREDS(obj);
 
@@ -170,7 +170,7 @@ qcrypto_tls_creds_prop_set_dir(Object *obj,
 
 static char *
 qcrypto_tls_creds_prop_get_dir(Object *obj,
-                               Error **errp G_GNUC_UNUSED)
+                               Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCreds *creds = QCRYPTO_TLS_CREDS(obj);
 
@@ -181,7 +181,7 @@ qcrypto_tls_creds_prop_get_dir(Object *obj,
 static void
 qcrypto_tls_creds_prop_set_priority(Object *obj,
                                     const char *value,
-                                    Error **errp G_GNUC_UNUSED)
+                                    Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCreds *creds = QCRYPTO_TLS_CREDS(obj);
 
@@ -191,7 +191,7 @@ qcrypto_tls_creds_prop_set_priority(Object *obj,
 
 static char *
 qcrypto_tls_creds_prop_get_priority(Object *obj,
-                                    Error **errp G_GNUC_UNUSED)
+                                    Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCreds *creds = QCRYPTO_TLS_CREDS(obj);
 
@@ -202,7 +202,7 @@ qcrypto_tls_creds_prop_get_priority(Object *obj,
 static void
 qcrypto_tls_creds_prop_set_endpoint(Object *obj,
                                     int value,
-                                    Error **errp G_GNUC_UNUSED)
+                                    Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCreds *creds = QCRYPTO_TLS_CREDS(obj);
 
@@ -212,7 +212,7 @@ qcrypto_tls_creds_prop_set_endpoint(Object *obj,
 
 static int
 qcrypto_tls_creds_prop_get_endpoint(Object *obj,
-                                    Error **errp G_GNUC_UNUSED)
+                                    Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCreds *creds = QCRYPTO_TLS_CREDS(obj);
 
diff --git a/crypto/tlscredsanon.c b/crypto/tlscredsanon.c
index ad6f331aca..9c33c3d8e5 100644
--- a/crypto/tlscredsanon.c
+++ b/crypto/tlscredsanon.c
@@ -31,7 +31,7 @@
 
 static int
 qcrypto_tls_creds_anon_load(QCryptoTLSCredsAnon *creds,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     char *dhparams = NULL;
     int ret;
@@ -103,7 +103,7 @@ qcrypto_tls_creds_anon_unload(QCryptoTLSCredsAnon *creds)
 
 static void
 qcrypto_tls_creds_anon_load(QCryptoTLSCredsAnon *creds G_GNUC_UNUSED,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     error_setg(errp, "TLS credentials support requires GNUTLS");
 }
@@ -122,7 +122,7 @@ qcrypto_tls_creds_anon_unload(QCryptoTLSCredsAnon *creds G_GNUC_UNUSED)
 static void
 qcrypto_tls_creds_anon_prop_set_loaded(Object *obj,
                                        bool value,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     QCryptoTLSCredsAnon *creds = QCRYPTO_TLS_CREDS_ANON(obj);
 
@@ -139,7 +139,7 @@ qcrypto_tls_creds_anon_prop_set_loaded(Object *obj,
 
 static bool
 qcrypto_tls_creds_anon_prop_get_loaded(Object *obj,
-                                       Error **errp G_GNUC_UNUSED)
+                                       Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCredsAnon *creds = QCRYPTO_TLS_CREDS_ANON(obj);
 
@@ -156,7 +156,7 @@ qcrypto_tls_creds_anon_prop_get_loaded(Object *obj,
 
 static bool
 qcrypto_tls_creds_anon_prop_get_loaded(Object *obj G_GNUC_UNUSED,
-                                       Error **errp G_GNUC_UNUSED)
+                                       Error *errp[static 1] G_GNUC_UNUSED)
 {
     return false;
 }
@@ -166,7 +166,7 @@ qcrypto_tls_creds_anon_prop_get_loaded(Object *obj G_GNUC_UNUSED,
 
 
 static void
-qcrypto_tls_creds_anon_complete(UserCreatable *uc, Error **errp)
+qcrypto_tls_creds_anon_complete(UserCreatable *uc, Error *errp[static 1])
 {
     object_property_set_bool(OBJECT(uc), true, "loaded", errp);
 }
diff --git a/crypto/tlscredsx509.c b/crypto/tlscredsx509.c
index f4dc85cb75..b310660508 100644
--- a/crypto/tlscredsx509.c
+++ b/crypto/tlscredsx509.c
@@ -37,7 +37,7 @@ qcrypto_tls_creds_check_cert_times(gnutls_x509_crt_t cert,
                                    const char *certFile,
                                    bool isServer,
                                    bool isCA,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     time_t now = time(NULL);
 
@@ -86,7 +86,7 @@ qcrypto_tls_creds_check_cert_basic_constraints(QCryptoTLSCredsX509 *creds,
                                                const char *certFile,
                                                bool isServer,
                                                bool isCA,
-                                               Error **errp)
+                                               Error *errp[static 1])
 {
     int status;
 
@@ -138,7 +138,7 @@ qcrypto_tls_creds_check_cert_key_usage(QCryptoTLSCredsX509 *creds,
                                        gnutls_x509_crt_t cert,
                                        const char *certFile,
                                        bool isCA,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     int status;
     unsigned int usage = 0;
@@ -197,7 +197,7 @@ qcrypto_tls_creds_check_cert_key_purpose(QCryptoTLSCredsX509 *creds,
                                          gnutls_x509_crt_t cert,
                                          const char *certFile,
                                          bool isServer,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     int status;
     size_t i;
@@ -291,7 +291,7 @@ qcrypto_tls_creds_check_cert(QCryptoTLSCredsX509 *creds,
                              const char *certFile,
                              bool isServer,
                              bool isCA,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     if (qcrypto_tls_creds_check_cert_times(cert, certFile,
                                            isServer, isCA,
@@ -332,7 +332,7 @@ qcrypto_tls_creds_check_cert_pair(gnutls_x509_crt_t cert,
                                   size_t ncacerts,
                                   const char *cacertFile,
                                   bool isServer,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     unsigned int status;
 
@@ -384,7 +384,7 @@ static gnutls_x509_crt_t
 qcrypto_tls_creds_load_cert(QCryptoTLSCredsX509 *creds,
                             const char *certFile,
                             bool isServer,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     gnutls_datum_t data;
     gnutls_x509_crt_t cert = NULL;
@@ -441,7 +441,7 @@ qcrypto_tls_creds_load_ca_cert_list(QCryptoTLSCredsX509 *creds,
                                     gnutls_x509_crt_t *certs,
                                     unsigned int certMax,
                                     size_t *ncerts,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     gnutls_datum_t data;
     char *buf = NULL;
@@ -485,7 +485,7 @@ qcrypto_tls_creds_x509_sanity_check(QCryptoTLSCredsX509 *creds,
                                     bool isServer,
                                     const char *cacertFile,
                                     const char *certFile,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     gnutls_x509_crt_t cert = NULL;
     gnutls_x509_crt_t cacerts[MAX_CERTS];
@@ -549,7 +549,7 @@ qcrypto_tls_creds_x509_sanity_check(QCryptoTLSCredsX509 *creds,
 
 static int
 qcrypto_tls_creds_x509_load(QCryptoTLSCredsX509 *creds,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     char *cacert = NULL, *cacrl = NULL, *cert = NULL,
         *key = NULL, *dhparams = NULL;
@@ -697,7 +697,7 @@ qcrypto_tls_creds_x509_unload(QCryptoTLSCredsX509 *creds)
 
 static void
 qcrypto_tls_creds_x509_load(QCryptoTLSCredsX509 *creds G_GNUC_UNUSED,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     error_setg(errp, "TLS credentials support requires GNUTLS");
 }
@@ -716,7 +716,7 @@ qcrypto_tls_creds_x509_unload(QCryptoTLSCredsX509 *creds G_GNUC_UNUSED)
 static void
 qcrypto_tls_creds_x509_prop_set_loaded(Object *obj,
                                        bool value,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     QCryptoTLSCredsX509 *creds = QCRYPTO_TLS_CREDS_X509(obj);
 
@@ -733,7 +733,7 @@ qcrypto_tls_creds_x509_prop_set_loaded(Object *obj,
 
 static bool
 qcrypto_tls_creds_x509_prop_get_loaded(Object *obj,
-                                       Error **errp G_GNUC_UNUSED)
+                                       Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCredsX509 *creds = QCRYPTO_TLS_CREDS_X509(obj);
 
@@ -746,7 +746,7 @@ qcrypto_tls_creds_x509_prop_get_loaded(Object *obj,
 
 static bool
 qcrypto_tls_creds_x509_prop_get_loaded(Object *obj G_GNUC_UNUSED,
-                                       Error **errp G_GNUC_UNUSED)
+                                       Error *errp[static 1] G_GNUC_UNUSED)
 {
     return false;
 }
@@ -758,7 +758,7 @@ qcrypto_tls_creds_x509_prop_get_loaded(Object *obj G_GNUC_UNUSED,
 static void
 qcrypto_tls_creds_x509_prop_set_sanity(Object *obj,
                                        bool value,
-                                       Error **errp G_GNUC_UNUSED)
+                                       Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCredsX509 *creds = QCRYPTO_TLS_CREDS_X509(obj);
 
@@ -769,7 +769,7 @@ qcrypto_tls_creds_x509_prop_set_sanity(Object *obj,
 static void
 qcrypto_tls_creds_x509_prop_set_passwordid(Object *obj,
                                            const char *value,
-                                           Error **errp G_GNUC_UNUSED)
+                                           Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCredsX509 *creds = QCRYPTO_TLS_CREDS_X509(obj);
 
@@ -779,7 +779,7 @@ qcrypto_tls_creds_x509_prop_set_passwordid(Object *obj,
 
 static char *
 qcrypto_tls_creds_x509_prop_get_passwordid(Object *obj,
-                                           Error **errp G_GNUC_UNUSED)
+                                           Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCredsX509 *creds = QCRYPTO_TLS_CREDS_X509(obj);
 
@@ -789,7 +789,7 @@ qcrypto_tls_creds_x509_prop_get_passwordid(Object *obj,
 
 static bool
 qcrypto_tls_creds_x509_prop_get_sanity(Object *obj,
-                                       Error **errp G_GNUC_UNUSED)
+                                       Error *errp[static 1] G_GNUC_UNUSED)
 {
     QCryptoTLSCredsX509 *creds = QCRYPTO_TLS_CREDS_X509(obj);
 
@@ -798,7 +798,7 @@ qcrypto_tls_creds_x509_prop_get_sanity(Object *obj,
 
 
 static void
-qcrypto_tls_creds_x509_complete(UserCreatable *uc, Error **errp)
+qcrypto_tls_creds_x509_complete(UserCreatable *uc, Error *errp[static 1])
 {
     object_property_set_bool(OBJECT(uc), true, "loaded", errp);
 }
diff --git a/crypto/tlssession.c b/crypto/tlssession.c
index 96a02deb69..a32d831870 100644
--- a/crypto/tlssession.c
+++ b/crypto/tlssession.c
@@ -94,7 +94,7 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds,
                         const char *hostname,
                         const char *aclname,
                         QCryptoTLSCredsEndpoint endpoint,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     QCryptoTLSSession *session;
     int ret;
@@ -212,7 +212,7 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds,
 
 static int
 qcrypto_tls_session_check_certificate(QCryptoTLSSession *session,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     int ret;
     unsigned int status;
@@ -347,7 +347,7 @@ qcrypto_tls_session_check_certificate(QCryptoTLSSession *session,
 
 int
 qcrypto_tls_session_check_credentials(QCryptoTLSSession *session,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     if (object_dynamic_cast(OBJECT(session->creds),
                             TYPE_QCRYPTO_TLS_CREDS_ANON)) {
@@ -440,7 +440,7 @@ qcrypto_tls_session_read(QCryptoTLSSession *session,
 
 int
 qcrypto_tls_session_handshake(QCryptoTLSSession *session,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     int ret = gnutls_handshake(session->handle);
     if (ret == 0) {
@@ -475,7 +475,7 @@ qcrypto_tls_session_get_handshake_status(QCryptoTLSSession *session)
 
 int
 qcrypto_tls_session_get_key_size(QCryptoTLSSession *session,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     gnutls_cipher_algorithm_t cipher;
     int ssf;
@@ -508,7 +508,7 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds G_GNUC_UNUSED,
                         const char *hostname G_GNUC_UNUSED,
                         const char *aclname G_GNUC_UNUSED,
                         QCryptoTLSCredsEndpoint endpoint G_GNUC_UNUSED,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     error_setg(errp, "TLS requires GNUTLS support");
     return NULL;
@@ -523,7 +523,7 @@ qcrypto_tls_session_free(QCryptoTLSSession *sess G_GNUC_UNUSED)
 
 int
 qcrypto_tls_session_check_credentials(QCryptoTLSSession *sess G_GNUC_UNUSED,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     error_setg(errp, "TLS requires GNUTLS support");
     return -1;
@@ -562,7 +562,7 @@ qcrypto_tls_session_read(QCryptoTLSSession *sess,
 
 int
 qcrypto_tls_session_handshake(QCryptoTLSSession *sess,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     error_setg(errp, "TLS requires GNUTLS support");
     return -1;
@@ -578,7 +578,7 @@ qcrypto_tls_session_get_handshake_status(QCryptoTLSSession *sess)
 
 int
 qcrypto_tls_session_get_key_size(QCryptoTLSSession *sess,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     error_setg(errp, "TLS requires GNUTLS support");
     return -1;
diff --git a/device_tree.c b/device_tree.c
index a24ddff02b..2bfc2957a8 100644
--- a/device_tree.c
+++ b/device_tree.c
@@ -230,7 +230,7 @@ static int findnode_nofail(void *fdt, const char *node_path)
 }
 
 char **qemu_fdt_node_path(void *fdt, const char *name, char *compat,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     int offset, len, ret;
     const char *iter_name;
@@ -336,7 +336,8 @@ int qemu_fdt_setprop_string(void *fdt, const char *node_path,
 }
 
 const void *qemu_fdt_getprop(void *fdt, const char *node_path,
-                             const char *property, int *lenp, Error **errp)
+                             const char *property, int *lenp,
+                             Error *errp[static 1])
 {
     int len;
     const void *r;
@@ -353,7 +354,8 @@ const void *qemu_fdt_getprop(void *fdt, const char *node_path,
 }
 
 uint32_t qemu_fdt_getprop_cell(void *fdt, const char *node_path,
-                               const char *property, int *lenp, Error **errp)
+                               const char *property, int *lenp,
+                               Error *errp[static 1])
 {
     int len;
     const uint32_t *p;
diff --git a/dump.c b/dump.c
index 3fa8ba3571..d4faf071d7 100644
--- a/dump.c
+++ b/dump.c
@@ -102,7 +102,7 @@ static int fd_write_vmcore(const void *buf, size_t size, void *opaque)
     return 0;
 }
 
-static void write_elf64_header(DumpState *s, Error **errp)
+static void write_elf64_header(DumpState *s, Error *errp[static 1])
 {
     Elf64_Ehdr elf_header;
     int ret;
@@ -133,7 +133,7 @@ static void write_elf64_header(DumpState *s, Error **errp)
     }
 }
 
-static void write_elf32_header(DumpState *s, Error **errp)
+static void write_elf32_header(DumpState *s, Error *errp[static 1])
 {
     Elf32_Ehdr elf_header;
     int ret;
@@ -166,7 +166,7 @@ static void write_elf32_header(DumpState *s, Error **errp)
 
 static void write_elf64_load(DumpState *s, MemoryMapping *memory_mapping,
                              int phdr_index, hwaddr offset,
-                             hwaddr filesz, Error **errp)
+                             hwaddr filesz, Error *errp[static 1])
 {
     Elf64_Phdr phdr;
     int ret;
@@ -189,7 +189,7 @@ static void write_elf64_load(DumpState *s, MemoryMapping *memory_mapping,
 
 static void write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
                              int phdr_index, hwaddr offset,
-                             hwaddr filesz, Error **errp)
+                             hwaddr filesz, Error *errp[static 1])
 {
     Elf32_Phdr phdr;
     int ret;
@@ -210,7 +210,7 @@ static void write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
     }
 }
 
-static void write_elf64_note(DumpState *s, Error **errp)
+static void write_elf64_note(DumpState *s, Error *errp[static 1])
 {
     Elf64_Phdr phdr;
     hwaddr begin = s->memory_offset - s->note_size;
@@ -236,7 +236,7 @@ static inline int cpu_index(CPUState *cpu)
 }
 
 static void write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     CPUState *cpu;
     int ret;
@@ -260,7 +260,7 @@ static void write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
     }
 }
 
-static void write_elf32_note(DumpState *s, Error **errp)
+static void write_elf32_note(DumpState *s, Error *errp[static 1])
 {
     hwaddr begin = s->memory_offset - s->note_size;
     Elf32_Phdr phdr;
@@ -281,7 +281,7 @@ static void write_elf32_note(DumpState *s, Error **errp)
 }
 
 static void write_elf32_notes(WriteCoreDumpFunction f, DumpState *s,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     CPUState *cpu;
     int ret;
@@ -331,7 +331,8 @@ static void write_elf_section(DumpState *s, int type, Error **errp)
     }
 }
 
-static void write_data(DumpState *s, void *buf, int length, Error **errp)
+static void write_data(DumpState *s, void *buf, int length,
+                       Error *errp[static 1])
 {
     int ret;
 
@@ -345,7 +346,7 @@ static void write_data(DumpState *s, void *buf, int length, Error **errp)
 
 /* write the memory to vmcore. 1 page per I/O. */
 static void write_memory(DumpState *s, GuestPhysBlock *block, ram_addr_t start,
-                         int64_t size, Error **errp)
+                         int64_t size, Error *errp[static 1])
 {
     int64_t i;
 
@@ -428,7 +429,7 @@ static void get_offset_range(hwaddr phys_addr,
     }
 }
 
-static void write_elf_loads(DumpState *s, Error **errp)
+static void write_elf_loads(DumpState *s, Error *errp[static 1])
 {
     hwaddr offset, filesz;
     MemoryMapping *memory_mapping;
@@ -464,7 +465,7 @@ static void write_elf_loads(DumpState *s, Error **errp)
 }
 
 /* write elf header, PT_NOTE and elf note to vmcore. */
-static void dump_begin(DumpState *s, Error **errp)
+static void dump_begin(DumpState *s, Error *errp[static 1])
 {
     if (s->dump_info.d_class == ELFCLASS64) {
         write_elf64_header(s, errp);
@@ -558,7 +559,7 @@ static int get_next_block(DumpState *s, GuestPhysBlock *block)
 }
 
 /* write all memory to vmcore */
-static void dump_iterate(DumpState *s, Error **errp)
+static void dump_iterate(DumpState *s, Error *errp[static 1])
 {
     GuestPhysBlock *block;
     int64_t size;
@@ -581,7 +582,7 @@ static void dump_iterate(DumpState *s, Error **errp)
     } while (!get_next_block(s, block));
 }
 
-static void create_vmcore(DumpState *s, Error **errp)
+static void create_vmcore(DumpState *s, Error *errp[static 1])
 {
     dump_begin(s, errp);
     if (ERR_IS_SET(errp)) {
@@ -669,7 +670,7 @@ static int buf_write_note(const void *buf, size_t size, void *opaque)
 }
 
 /* write common header, sub header and elf note to vmcore */
-static void create_header32(DumpState *s, Error **errp)
+static void create_header32(DumpState *s, Error *errp[static 1])
 {
     DiskDumpHeader32 *dh = NULL;
     KdumpSubHeader32 *kh = NULL;
@@ -767,7 +768,7 @@ out:
 }
 
 /* write common header, sub header and elf note to vmcore */
-static void create_header64(DumpState *s, Error **errp)
+static void create_header64(DumpState *s, Error *errp[static 1])
 {
     DiskDumpHeader64 *dh = NULL;
     KdumpSubHeader64 *kh = NULL;
@@ -865,7 +866,7 @@ out:
     g_free(s->note_buf);
 }
 
-static void write_dump_header(DumpState *s, Error **errp)
+static void write_dump_header(DumpState *s, Error *errp[static 1])
 {
     if (s->dump_info.d_class == ELFCLASS32) {
         create_header32(s, errp);
@@ -1005,7 +1006,7 @@ static bool get_next_page(GuestPhysBlock **blockptr, uint64_t *pfnptr,
     return true;
 }
 
-static void write_dump_bitmap(DumpState *s, Error **errp)
+static void write_dump_bitmap(DumpState *s, Error *errp[static 1])
 {
     int ret = 0;
     uint64_t last_pfn, pfn;
@@ -1134,7 +1135,7 @@ static inline bool is_zero_page(const uint8_t *buf, size_t page_size)
     return buffer_is_zero(buf, page_size);
 }
 
-static void write_dump_pages(DumpState *s, Error **errp)
+static void write_dump_pages(DumpState *s, Error *errp[static 1])
 {
     int ret = 0;
     DataCache page_desc, page_data;
@@ -1303,7 +1304,7 @@ out:
     g_free(buf_out);
 }
 
-static void create_kdump_vmcore(DumpState *s, Error **errp)
+static void create_kdump_vmcore(DumpState *s, Error *errp[static 1])
 {
     int ret;
 
@@ -1433,7 +1434,7 @@ static int64_t dump_calculate_size(DumpState *s)
 
 static void dump_init(DumpState *s, int fd, bool has_format,
                       DumpGuestMemoryFormat format, bool paging, bool has_filter,
-                      int64_t begin, int64_t length, Error **errp)
+                      int64_t begin, int64_t length, Error *errp[static 1])
 {
     CPUState *cpu;
     int nr_cpus;
@@ -1605,7 +1606,7 @@ cleanup:
 }
 
 /* this operation might be time consuming. */
-static void dump_process(DumpState *s, Error **errp)
+static void dump_process(DumpState *s, Error *errp[static 1])
 {
     Error *local_err = NULL;
     DumpQueryResult *result = NULL;
@@ -1643,7 +1644,7 @@ static void *dump_thread(void *data)
     return NULL;
 }
 
-DumpQueryResult *qmp_query_dump(Error **errp)
+DumpQueryResult *qmp_query_dump(Error *errp[static 1])
 {
     DumpQueryResult *result = g_new(DumpQueryResult, 1);
     DumpState *state = &dump_state_global;
@@ -1659,7 +1660,8 @@ void qmp_dump_guest_memory(bool paging, const char *file,
                            bool has_detach, bool detach,
                            bool has_begin, int64_t begin, bool has_length,
                            int64_t length, bool has_format,
-                           DumpGuestMemoryFormat format, Error **errp)
+                           DumpGuestMemoryFormat format,
+                           Error *errp[static 1])
 {
     const char *p;
     int fd = -1;
@@ -1758,7 +1760,7 @@ void qmp_dump_guest_memory(bool paging, const char *file,
     }
 }
 
-DumpGuestMemoryCapability *qmp_query_dump_guest_memory_capability(Error **errp)
+DumpGuestMemoryCapability *qmp_query_dump_guest_memory_capability(Error *errp[static 1])
 {
     DumpGuestMemoryFormatList *item;
     DumpGuestMemoryCapability *cap =
diff --git a/exec.c b/exec.c
index 35d9588350..9a9169d7ca 100644
--- a/exec.c
+++ b/exec.c
@@ -754,7 +754,7 @@ void cpu_exec_initfn(CPUState *cpu)
 #endif
 }
 
-void cpu_exec_realizefn(CPUState *cpu, Error **errp)
+void cpu_exec_realizefn(CPUState *cpu, Error *errp[static 1])
 {
     CPUClass *cc ATTRIBUTE_UNUSED = CPU_GET_CLASS(cpu);
 
@@ -1485,7 +1485,7 @@ static int64_t get_file_size(int fd)
 static void *file_ram_alloc(RAMBlock *block,
                             ram_addr_t memory,
                             const char *path,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     bool unlink_on_error = false;
     char *filename;
@@ -1777,7 +1777,8 @@ static int memory_try_enable_merging(void *addr, size_t len)
  * resize callback to update device state and/or add assertions to detect
  * misuse, if necessary.
  */
-int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize, Error **errp)
+int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize,
+                    Error *errp[static 1])
 {
     assert(block);
 
@@ -1855,7 +1856,7 @@ static void dirty_memory_extend(ram_addr_t old_ram_size,
     }
 }
 
-static void ram_block_add(RAMBlock *new_block, Error **errp)
+static void ram_block_add(RAMBlock *new_block, Error *errp[static 1])
 {
     RAMBlock *block;
     RAMBlock *last_block = NULL;
@@ -1933,7 +1934,7 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
 #ifdef __linux__
 RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
                                    bool share, const char *mem_path,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     RAMBlock *new_block;
 
@@ -1981,7 +1982,7 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
                                                   uint64_t length,
                                                   void *host),
                                   void *host, bool resizeable,
-                                  MemoryRegion *mr, Error **errp)
+                                  MemoryRegion *mr, Error *errp[static 1])
 {
     RAMBlock *new_block;
 
@@ -2011,12 +2012,13 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
 }
 
 RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
-                                   MemoryRegion *mr, Error **errp)
+                                   MemoryRegion *mr, Error *errp[static 1])
 {
     return qemu_ram_alloc_internal(size, size, NULL, host, false, mr, errp);
 }
 
-RAMBlock *qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp)
+RAMBlock *qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr,
+                         Error *errp[static 1])
 {
     return qemu_ram_alloc_internal(size, size, NULL, NULL, false, mr, errp);
 }
@@ -2025,7 +2027,7 @@ RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t maxsz,
                                      void (*resized)(const char*,
                                                      uint64_t length,
                                                      void *host),
-                                     MemoryRegion *mr, Error **errp)
+                                     MemoryRegion *mr, Error *errp[static 1])
 {
     return qemu_ram_alloc_internal(size, maxsz, resized, NULL, true, mr, errp);
 }
diff --git a/fsdev/qemu-fsdev-throttle.c b/fsdev/qemu-fsdev-throttle.c
index 7ae4e86646..22b6b57a9d 100644
--- a/fsdev/qemu-fsdev-throttle.c
+++ b/fsdev/qemu-fsdev-throttle.c
@@ -29,7 +29,8 @@ static void fsdev_throttle_write_timer_cb(void *opaque)
     qemu_co_enter_next(&fst->throttled_reqs[true]);
 }
 
-void fsdev_throttle_parse_opts(QemuOpts *opts, FsThrottle *fst, Error **errp)
+void fsdev_throttle_parse_opts(QemuOpts *opts, FsThrottle *fst,
+                               Error *errp[static 1])
 {
     throttle_config_init(&fst->cfg);
     fst->cfg.buckets[THROTTLE_BPS_TOTAL].avg =
diff --git a/gdbstub.c b/gdbstub.c
index ec4e4b25be..fe480b47bb 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -1923,7 +1923,7 @@ static void gdb_sigterm_handler(int signal)
 #endif
 
 static void gdb_monitor_open(Chardev *chr, ChardevBackend *backend,
-                             bool *be_opened, Error **errp)
+                             bool *be_opened, Error *errp[static 1])
 {
     *be_opened = false;
 }
diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
index 96d2683348..fff8fa90a2 100644
--- a/hw/9pfs/9p.c
+++ b/hw/9pfs/9p.c
@@ -3482,7 +3482,7 @@ void pdu_submit(V9fsPDU *pdu, P9MsgHeader *hdr)
 }
 
 /* Returns 0 on success, 1 on failure. */
-int v9fs_device_realize_common(V9fsState *s, Error **errp)
+int v9fs_device_realize_common(V9fsState *s, Error *errp[static 1])
 {
     int i, len;
     struct stat stat;
@@ -3578,7 +3578,7 @@ out:
     return rc;
 }
 
-void v9fs_device_unrealize_common(V9fsState *s, Error **errp)
+void v9fs_device_unrealize_common(V9fsState *s, Error *errp[static 1])
 {
     if (s->ops->cleanup) {
         s->ops->cleanup(&s->ctx);
diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c
index 245abd8aae..99dfc3d886 100644
--- a/hw/9pfs/virtio-9p-device.c
+++ b/hw/9pfs/virtio-9p-device.c
@@ -83,7 +83,7 @@ out_free_pdu:
 }
 
 static uint64_t virtio_9p_get_features(VirtIODevice *vdev, uint64_t features,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     virtio_add_feature(&features, VIRTIO_9P_MOUNT_TAG);
     return features;
@@ -105,7 +105,7 @@ static void virtio_9p_get_config(VirtIODevice *vdev, uint8_t *config)
     g_free(cfg);
 }
 
-static void virtio_9p_device_realize(DeviceState *dev, Error **errp)
+static void virtio_9p_device_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     V9fsVirtioState *v = VIRTIO_9P(dev);
@@ -124,7 +124,8 @@ out:
     return;
 }
 
-static void virtio_9p_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_9p_device_unrealize(DeviceState *dev,
+                                       Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     V9fsVirtioState *v = VIRTIO_9P(dev);
diff --git a/hw/acpi/acpi-stub.c b/hw/acpi/acpi-stub.c
index 26bd22f7ec..26d3185f72 100644
--- a/hw/acpi/acpi-stub.c
+++ b/hw/acpi/acpi-stub.c
@@ -23,7 +23,7 @@
 #include "qmp-commands.h"
 #include "hw/acpi/acpi.h"
 
-void acpi_table_add(const QemuOpts *opts, Error **errp)
+void acpi_table_add(const QemuOpts *opts, Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 }
diff --git a/hw/acpi/core.c b/hw/acpi/core.c
index 95fcac95a2..8669a8da6d 100644
--- a/hw/acpi/core.c
+++ b/hw/acpi/core.c
@@ -99,7 +99,7 @@ static int acpi_checksum(const uint8_t *data, int len)
 static void acpi_table_install(const char unsigned *blob, size_t bloblen,
                                bool has_header,
                                const struct AcpiTableOptions *hdrs,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     size_t body_start;
     const char unsigned *hdr_src;
@@ -229,7 +229,7 @@ static void acpi_table_install(const char unsigned *blob, size_t bloblen,
                                       ACPI_TABLE_PFX_SIZE, acpi_payload_size);
 }
 
-void acpi_table_add(const QemuOpts *opts, Error **errp)
+void acpi_table_add(const QemuOpts *opts, Error *errp[static 1])
 {
     AcpiTableOptions *hdrs = NULL;
     Error *err = NULL;
@@ -303,7 +303,7 @@ out:
 
 static bool acpi_table_builtin = false;
 
-void acpi_table_add_builtin(const QemuOpts *opts, Error **errp)
+void acpi_table_add_builtin(const QemuOpts *opts, Error *errp[static 1])
 {
     acpi_table_builtin = true;
     acpi_table_add(opts, errp);
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
index 6dc138db89..f85facdda7 100644
--- a/hw/acpi/cpu.c
+++ b/hw/acpi/cpu.c
@@ -221,7 +221,8 @@ static AcpiCpuStatus *get_cpu_status(CPUHotplugState *cpu_st, DeviceState *dev)
 }
 
 void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev,
-                      CPUHotplugState *cpu_st, DeviceState *dev, Error **errp)
+                      CPUHotplugState *cpu_st, DeviceState *dev,
+                      Error *errp[static 1])
 {
     AcpiCpuStatus *cdev;
 
@@ -239,7 +240,7 @@ void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev,
 
 void acpi_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
                                 CPUHotplugState *cpu_st,
-                                DeviceState *dev, Error **errp)
+                                DeviceState *dev, Error *errp[static 1])
 {
     AcpiCpuStatus *cdev;
 
@@ -253,7 +254,7 @@ void acpi_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
 }
 
 void acpi_cpu_unplug_cb(CPUHotplugState *cpu_st,
-                        DeviceState *dev, Error **errp)
+                        DeviceState *dev, Error *errp[static 1])
 {
     AcpiCpuStatus *cdev;
 
diff --git a/hw/acpi/cpu_hotplug.c b/hw/acpi/cpu_hotplug.c
index c72a748bb3..e1ee4636fe 100644
--- a/hw/acpi/cpu_hotplug.c
+++ b/hw/acpi/cpu_hotplug.c
@@ -57,7 +57,7 @@ static const MemoryRegionOps AcpiCpuHotplug_ops = {
 };
 
 static void acpi_set_cpu_present_bit(AcpiCpuHotplug *g, CPUState *cpu,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     CPUClass *k = CPU_GET_CLASS(cpu);
     int64_t cpu_id;
@@ -73,7 +73,8 @@ static void acpi_set_cpu_present_bit(AcpiCpuHotplug *g, CPUState *cpu,
 }
 
 void legacy_acpi_cpu_plug_cb(HotplugHandler *hotplug_dev,
-                             AcpiCpuHotplug *g, DeviceState *dev, Error **errp)
+                             AcpiCpuHotplug *g, DeviceState *dev,
+                             Error *errp[static 1])
 {
     acpi_set_cpu_present_bit(g, CPU(dev), errp);
     if (ERR_IS_SET(errp)) {
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index 54e422a39f..e4861cf8d6 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -312,7 +312,7 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
 }
 
 static void ich9_pm_get_gpe0_blk(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     ICH9LPCPMRegs *pm = opaque;
     uint32_t value = pm->pm_io_base + ICH9_PMIO_GPE0_STS;
@@ -320,7 +320,8 @@ static void ich9_pm_get_gpe0_blk(Object *obj, Visitor *v, const char *name,
     visit_type_uint32(v, name, &value, errp);
 }
 
-static bool ich9_pm_get_memory_hotplug_support(Object *obj, Error **errp)
+static bool ich9_pm_get_memory_hotplug_support(Object *obj,
+                                               Error *errp[static 1])
 {
     ICH9LPCState *s = ICH9_LPC_DEVICE(obj);
 
@@ -328,14 +329,14 @@ static bool ich9_pm_get_memory_hotplug_support(Object *obj, Error **errp)
 }
 
 static void ich9_pm_set_memory_hotplug_support(Object *obj, bool value,
-                                               Error **errp)
+                                               Error *errp[static 1])
 {
     ICH9LPCState *s = ICH9_LPC_DEVICE(obj);
 
     s->pm.acpi_memory_hotplug.is_enabled = value;
 }
 
-static bool ich9_pm_get_cpu_hotplug_legacy(Object *obj, Error **errp)
+static bool ich9_pm_get_cpu_hotplug_legacy(Object *obj, Error *errp[static 1])
 {
     ICH9LPCState *s = ICH9_LPC_DEVICE(obj);
 
@@ -343,7 +344,7 @@ static bool ich9_pm_get_cpu_hotplug_legacy(Object *obj, Error **errp)
 }
 
 static void ich9_pm_set_cpu_hotplug_legacy(Object *obj, bool value,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     ICH9LPCState *s = ICH9_LPC_DEVICE(obj);
 
@@ -356,7 +357,7 @@ static void ich9_pm_set_cpu_hotplug_legacy(Object *obj, bool value,
 }
 
 static void ich9_pm_get_disable_s3(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     ICH9LPCPMRegs *pm = opaque;
     uint8_t value = pm->disable_s3;
@@ -365,7 +366,7 @@ static void ich9_pm_get_disable_s3(Object *obj, Visitor *v, const char *name,
 }
 
 static void ich9_pm_set_disable_s3(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     ICH9LPCPMRegs *pm = opaque;
     Error *local_err = NULL;
@@ -381,7 +382,7 @@ out:
 }
 
 static void ich9_pm_get_disable_s4(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     ICH9LPCPMRegs *pm = opaque;
     uint8_t value = pm->disable_s4;
@@ -390,7 +391,7 @@ static void ich9_pm_get_disable_s4(Object *obj, Visitor *v, const char *name,
 }
 
 static void ich9_pm_set_disable_s4(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     ICH9LPCPMRegs *pm = opaque;
     Error *local_err = NULL;
@@ -406,7 +407,7 @@ out:
 }
 
 static void ich9_pm_get_s4_val(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     ICH9LPCPMRegs *pm = opaque;
     uint8_t value = pm->s4_val;
@@ -415,7 +416,7 @@ static void ich9_pm_get_s4_val(Object *obj, Visitor *v, const char *name,
 }
 
 static void ich9_pm_set_s4_val(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     ICH9LPCPMRegs *pm = opaque;
     Error *local_err = NULL;
@@ -430,19 +431,21 @@ out:
     error_propagate(errp, local_err);
 }
 
-static bool ich9_pm_get_enable_tco(Object *obj, Error **errp)
+static bool ich9_pm_get_enable_tco(Object *obj, Error *errp[static 1])
 {
     ICH9LPCState *s = ICH9_LPC_DEVICE(obj);
     return s->pm.enable_tco;
 }
 
-static void ich9_pm_set_enable_tco(Object *obj, bool value, Error **errp)
+static void ich9_pm_set_enable_tco(Object *obj, bool value,
+                                   Error *errp[static 1])
 {
     ICH9LPCState *s = ICH9_LPC_DEVICE(obj);
     s->pm.enable_tco = value;
 }
 
-void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
+void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm,
+                            Error *errp[static 1])
 {
     static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN;
     pm->acpi_memory_hotplug.is_enabled = true;
@@ -485,7 +488,7 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp)
 }
 
 void ich9_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(hotplug_dev);
 
@@ -510,7 +513,7 @@ void ich9_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
 }
 
 void ich9_pm_device_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                      DeviceState *dev, Error **errp)
+                                      DeviceState *dev, Error *errp[static 1])
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(hotplug_dev);
 
@@ -530,7 +533,7 @@ void ich9_pm_device_unplug_request_cb(HotplugHandler *hotplug_dev,
 }
 
 void ich9_pm_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(hotplug_dev);
 
diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c
index f4b6a096c0..7444c7c085 100644
--- a/hw/acpi/memory_hotplug.c
+++ b/hw/acpi/memory_hotplug.c
@@ -236,7 +236,7 @@ void acpi_memory_hotplug_init(MemoryRegion *as, Object *owner,
  */
 static MemStatus *
 acpi_memory_slot_status(MemHotplugState *mem_st,
-                        DeviceState *dev, Error **errp)
+                        DeviceState *dev, Error *errp[static 1])
 {
     Error *local_err = NULL;
     int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
@@ -260,7 +260,7 @@ acpi_memory_slot_status(MemHotplugState *mem_st,
 }
 
 void acpi_memory_plug_cb(HotplugHandler *hotplug_dev, MemHotplugState *mem_st,
-                         DeviceState *dev, Error **errp)
+                         DeviceState *dev, Error *errp[static 1])
 {
     MemStatus *mdev;
     DeviceClass *dc = DEVICE_GET_CLASS(dev);
@@ -284,7 +284,7 @@ void acpi_memory_plug_cb(HotplugHandler *hotplug_dev, MemHotplugState *mem_st,
 
 void acpi_memory_unplug_request_cb(HotplugHandler *hotplug_dev,
                                    MemHotplugState *mem_st,
-                                   DeviceState *dev, Error **errp)
+                                   DeviceState *dev, Error *errp[static 1])
 {
     MemStatus *mdev;
 
@@ -298,7 +298,7 @@ void acpi_memory_unplug_request_cb(HotplugHandler *hotplug_dev,
 }
 
 void acpi_memory_unplug_cb(MemHotplugState *mem_st,
-                           DeviceState *dev, Error **errp)
+                           DeviceState *dev, Error *errp[static 1])
 {
     MemStatus *mdev;
 
diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
index 2b0f3e1bfb..42426ceb4a 100644
--- a/hw/acpi/pcihp.c
+++ b/hw/acpi/pcihp.c
@@ -182,7 +182,7 @@ void acpi_pcihp_reset(AcpiPciHpState *s)
 }
 
 void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
-                               DeviceState *dev, Error **errp)
+                               DeviceState *dev, Error *errp[static 1])
 {
     PCIDevice *pdev = PCI_DEVICE(dev);
     int slot = PCI_SLOT(pdev->devfn);
@@ -205,7 +205,7 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
 }
 
 void acpi_pcihp_device_unplug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
-                                 DeviceState *dev, Error **errp)
+                                 DeviceState *dev, Error *errp[static 1])
 {
     PCIDevice *pdev = PCI_DEVICE(dev);
     int slot = PCI_SLOT(pdev->devfn);
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index f3c5f03d35..cac9623a0d 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -372,7 +372,7 @@ static void piix4_pm_powerdown_req(Notifier *n, void *opaque)
 }
 
 static void piix4_device_plug_cb(HotplugHandler *hotplug_dev,
-                                 DeviceState *dev, Error **errp)
+                                 DeviceState *dev, Error *errp[static 1])
 {
     PIIX4PMState *s = PIIX4_PM(hotplug_dev);
 
@@ -402,7 +402,8 @@ static void piix4_device_plug_cb(HotplugHandler *hotplug_dev,
 }
 
 static void piix4_device_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                           DeviceState *dev, Error **errp)
+                                           DeviceState *dev,
+                                           Error *errp[static 1])
 {
     PIIX4PMState *s = PIIX4_PM(hotplug_dev);
 
@@ -425,7 +426,7 @@ static void piix4_device_unplug_request_cb(HotplugHandler *hotplug_dev,
 }
 
 static void piix4_device_unplug_cb(HotplugHandler *hotplug_dev,
-                                   DeviceState *dev, Error **errp)
+                                   DeviceState *dev, Error *errp[static 1])
 {
     PIIX4PMState *s = PIIX4_PM(hotplug_dev);
 
@@ -493,7 +494,7 @@ static void piix4_pm_add_propeties(PIIX4PMState *s)
                                   &s->io_base, IGNORE_ERRORS);
 }
 
-static void piix4_pm_realize(PCIDevice *dev, Error **errp)
+static void piix4_pm_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PIIX4PMState *s = PIIX4_PM(dev);
     uint8_t *pci_conf;
@@ -613,14 +614,15 @@ static const MemoryRegionOps piix4_gpe_ops = {
 };
 
 
-static bool piix4_get_cpu_hotplug_legacy(Object *obj, Error **errp)
+static bool piix4_get_cpu_hotplug_legacy(Object *obj, Error *errp[static 1])
 {
     PIIX4PMState *s = PIIX4_PM(obj);
 
     return s->cpu_hotplug_legacy;
 }
 
-static void piix4_set_cpu_hotplug_legacy(Object *obj, bool value, Error **errp)
+static void piix4_set_cpu_hotplug_legacy(Object *obj, bool value,
+                                         Error *errp[static 1])
 {
     PIIX4PMState *s = PIIX4_PM(obj);
 
diff --git a/hw/acpi/vmgenid.c b/hw/acpi/vmgenid.c
index 5bc495960c..e6380176d5 100644
--- a/hw/acpi/vmgenid.c
+++ b/hw/acpi/vmgenid.c
@@ -163,7 +163,8 @@ static void vmgenid_update_guest(VmGenIdState *vms)
     }
 }
 
-static void vmgenid_set_guid(Object *obj, const char *value, Error **errp)
+static void vmgenid_set_guid(Object *obj, const char *value,
+                             Error *errp[static 1])
 {
     VmGenIdState *vms = VMGENID(obj);
 
@@ -212,7 +213,7 @@ static Property vmgenid_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void vmgenid_realize(DeviceState *dev, Error **errp)
+static void vmgenid_realize(DeviceState *dev, Error *errp[static 1])
 {
     VmGenIdState *vms = VMGENID(dev);
 
@@ -264,7 +265,7 @@ static void vmgenid_register_types(void)
 
 type_init(vmgenid_register_types)
 
-GuidInfo *qmp_query_vm_generation_id(Error **errp)
+GuidInfo *qmp_query_vm_generation_id(Error *errp[static 1])
 {
     GuidInfo *info;
     VmGenIdState *vms;
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 7d9c8691bb..e7d51935c8 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -48,7 +48,7 @@ static void aw_a10_init(Object *obj)
     qdev_set_parent_bus(DEVICE(&s->sata), sysbus_get_default());
 }
 
-static void aw_a10_realize(DeviceState *dev, Error **errp)
+static void aw_a10_realize(DeviceState *dev, Error *errp[static 1])
 {
     AwA10State *s = AW_A10(dev);
     SysBusDevice *sysbusdev;
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index 2fa8bbb249..cf7cdd26b9 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -108,7 +108,7 @@ static void bitband_init(Object *obj)
     sysbus_init_mmio(dev, &s->iomem);
 }
 
-static void bitband_realize(DeviceState *dev, Error **errp)
+static void bitband_realize(DeviceState *dev, Error *errp[static 1])
 {
     BitBandState *s = BITBAND(dev);
 
@@ -157,7 +157,7 @@ static void armv7m_instance_init(Object *obj)
     }
 }
 
-static void armv7m_realize(DeviceState *dev, Error **errp)
+static void armv7m_realize(DeviceState *dev, Error *errp[static 1])
 {
     ARMv7MState *s = ARMV7M(dev);
     SysBusDevice *sbd;
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index e824ea87a9..eaaec43021 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -115,7 +115,7 @@ static const AspeedBoardConfig aspeed_boards[] = {
 #define FIRMWARE_ADDR 0x0
 
 static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
     uint8_t *storage;
@@ -145,7 +145,7 @@ static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
 }
 
 static void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     int i ;
 
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index d546b6af91..585ec239fb 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -187,7 +187,7 @@ static void aspeed_soc_init(Object *obj)
     qdev_set_parent_bus(DEVICE(&s->ftgmac100), sysbus_get_default());
 }
 
-static void aspeed_soc_realize(DeviceState *dev, Error **errp)
+static void aspeed_soc_realize(DeviceState *dev, Error *errp[static 1])
 {
     int i;
     AspeedSoCState *s = ASPEED_SOC(dev);
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 447870b5a7..8280a17a3a 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -123,7 +123,8 @@ static void bcm2835_peripherals_init(Object *obj)
                                    OBJECT(&s->sdhost.sdbus), &error_abort);
 }
 
-static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
+static void bcm2835_peripherals_realize(DeviceState *dev,
+                                        Error *errp[static 1])
 {
     BCM2835PeripheralState *s = BCM2835_PERIPHERALS(dev);
     Object *obj;
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index 2c6a082395..ec0bbdb3a5 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -51,7 +51,7 @@ static void bcm2836_init(Object *obj)
     qdev_set_parent_bus(DEVICE(&s->peripherals), sysbus_get_default());
 }
 
-static void bcm2836_realize(DeviceState *dev, Error **errp)
+static void bcm2836_realize(DeviceState *dev, Error *errp[static 1])
 {
     BCM2836State *s = BCM2836(dev);
     Object *obj;
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index eeaa8729ff..15bf47510f 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -56,7 +56,7 @@ static void digic_init(Object *obj)
     object_property_add_child(obj, "uart", OBJECT(&s->uart), IGNORE_ERRORS);
 }
 
-static void digic_realize(DeviceState *dev, Error **errp)
+static void digic_realize(DeviceState *dev, Error *errp[static 1])
 {
     DigicState *s = DIGIC(dev);
     SysBusDevice *sbd;
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
index c10f96d83c..9c6667adf2 100644
--- a/hw/arm/fsl-imx25.c
+++ b/hw/arm/fsl-imx25.c
@@ -74,7 +74,7 @@ static void fsl_imx25_init(Object *obj)
     }
 }
 
-static void fsl_imx25_realize(DeviceState *dev, Error **errp)
+static void fsl_imx25_realize(DeviceState *dev, Error *errp[static 1])
 {
     FslIMX25State *s = FSL_IMX25(dev);
     uint8_t i;
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
index 0cc80f3aee..181ee404c7 100644
--- a/hw/arm/fsl-imx31.c
+++ b/hw/arm/fsl-imx31.c
@@ -66,7 +66,7 @@ static void fsl_imx31_init(Object *obj)
     }
 }
 
-static void fsl_imx31_realize(DeviceState *dev, Error **errp)
+static void fsl_imx31_realize(DeviceState *dev, Error *errp[static 1])
 {
     FslIMX31State *s = FSL_IMX31(dev);
     uint16_t i;
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 1bdf9dbd70..f7ae56d39b 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -119,7 +119,7 @@ static void fsl_imx6_init(Object *obj)
     object_property_add_child(obj, "eth", OBJECT(&s->eth), IGNORE_ERRORS);
 }
 
-static void fsl_imx6_realize(DeviceState *dev, Error **errp)
+static void fsl_imx6_realize(DeviceState *dev, Error *errp[static 1])
 {
     FslIMX6State *s = FSL_IMX6(dev);
     uint16_t i;
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 5af0d7fe5b..917ab3899b 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -288,7 +288,7 @@ static void integratorcm_init(Object *obj)
     /* ??? Save/restore.  */
 }
 
-static void integratorcm_realize(DeviceState *d, Error **errp)
+static void integratorcm_realize(DeviceState *d, Error *errp[static 1])
 {
     IntegratorCMState *s = INTEGRATOR_CM(d);
 
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 9c710f74b4..aab4449f73 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -396,7 +396,7 @@ static void mv88w8618_eth_init(Object *obj)
     sysbus_init_mmio(sbd, &s->iomem);
 }
 
-static void mv88w8618_eth_realize(DeviceState *dev, Error **errp)
+static void mv88w8618_eth_realize(DeviceState *dev, Error *errp[static 1])
 {
     mv88w8618_eth_state *s = MV88W8618_ETH(dev);
 
@@ -621,7 +621,7 @@ static const GraphicHwOps musicpal_gfx_ops = {
     .gfx_update  = lcd_refresh,
 };
 
-static void musicpal_lcd_realize(DeviceState *dev, Error **errp)
+static void musicpal_lcd_realize(DeviceState *dev, Error *errp[static 1])
 {
     musicpal_lcd_state *s = MUSICPAL_LCD(dev);
     s->con = graphic_console_init(dev, 0, &musicpal_gfx_ops, s);
diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
index 629e6c64e6..0239068342 100644
--- a/hw/arm/pxa2xx.c
+++ b/hw/arm/pxa2xx.c
@@ -1965,7 +1965,7 @@ static void pxa2xx_fir_instance_init(Object *obj)
     sysbus_init_irq(sbd, &s->tx_dma);
 }
 
-static void pxa2xx_fir_realize(DeviceState *dev, Error **errp)
+static void pxa2xx_fir_realize(DeviceState *dev, Error *errp[static 1])
 {
     PXA2xxFIrState *s = PXA2XX_FIR(dev);
 
diff --git a/hw/arm/pxa2xx_gpio.c b/hw/arm/pxa2xx_gpio.c
index 521dbad039..e40c35a942 100644
--- a/hw/arm/pxa2xx_gpio.c
+++ b/hw/arm/pxa2xx_gpio.c
@@ -294,7 +294,7 @@ static void pxa2xx_gpio_initfn(Object *obj)
     sysbus_init_irq(sbd, &s->irqX);
 }
 
-static void pxa2xx_gpio_realize(DeviceState *dev, Error **errp)
+static void pxa2xx_gpio_realize(DeviceState *dev, Error *errp[static 1])
 {
     PXA2xxGPIOInfo *s = PXA2XX_GPIO(dev);
 
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
index 93bde14743..bb52342196 100644
--- a/hw/arm/spitz.c
+++ b/hw/arm/spitz.c
@@ -599,7 +599,7 @@ static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
     return 0;
 }
 
-static void spitz_lcdtg_realize(SSISlave *dev, Error **errp)
+static void spitz_lcdtg_realize(SSISlave *dev, Error *errp[static 1])
 {
     SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, dev);
 
@@ -665,7 +665,7 @@ static void spitz_adc_temp_on(void *opaque, int line, int level)
         max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
 }
 
-static void corgi_ssp_realize(SSISlave *d, Error **errp)
+static void corgi_ssp_realize(SSISlave *d, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(d);
     CorgiSSPState *s = FROM_SSI_SLAVE(CorgiSSPState, d);
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
index 6e1260d2ed..50961aa252 100644
--- a/hw/arm/stm32f205_soc.c
+++ b/hw/arm/stm32f205_soc.c
@@ -82,7 +82,7 @@ static void stm32f205_soc_initfn(Object *obj)
     }
 }
 
-static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
+static void stm32f205_soc_realize(DeviceState *dev_soc, Error *errp[static 1])
 {
     STM32F205State *s = STM32F205_SOC(dev_soc);
     DeviceState *dev, *armv7m;
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index 7683edc9e5..43e0048517 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -1239,7 +1239,7 @@ static void strongarm_uart_init(Object *obj)
     s->tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, strongarm_uart_tx, s);
 }
 
-static void strongarm_uart_realize(DeviceState *dev, Error **errp)
+static void strongarm_uart_realize(DeviceState *dev, Error *errp[static 1])
 {
     StrongARMUARTState *s = STRONGARM_UART(dev);
 
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
index 2421b8150d..3b43fa2e60 100644
--- a/hw/arm/tosa.c
+++ b/hw/arm/tosa.c
@@ -137,7 +137,7 @@ static uint32_t tosa_ssp_tansfer(SSISlave *dev, uint32_t value)
     return 0;
 }
 
-static void tosa_ssp_realize(SSISlave *dev, Error **errp)
+static void tosa_ssp_realize(SSISlave *dev, Error *errp[static 1])
 {
     /* Nothing to do.  */
 }
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index d1e294f969..ec779d9f58 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -718,14 +718,15 @@ static void vexpress_common_init(MachineState *machine)
     arm_load_kernel(ARM_CPU(first_cpu), &daughterboard->bootinfo);
 }
 
-static bool vexpress_get_secure(Object *obj, Error **errp)
+static bool vexpress_get_secure(Object *obj, Error *errp[static 1])
 {
     VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
 
     return vms->secure;
 }
 
-static void vexpress_set_secure(Object *obj, bool value, Error **errp)
+static void vexpress_set_secure(Object *obj, bool value,
+                                Error *errp[static 1])
 {
     VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
 
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 4c187bba59..81a7a4bbf7 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1484,63 +1484,63 @@ static void machvirt_init(MachineState *machine)
     create_platform_bus(vms, pic);
 }
 
-static bool virt_get_secure(Object *obj, Error **errp)
+static bool virt_get_secure(Object *obj, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
     return vms->secure;
 }
 
-static void virt_set_secure(Object *obj, bool value, Error **errp)
+static void virt_set_secure(Object *obj, bool value, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
     vms->secure = value;
 }
 
-static bool virt_get_virt(Object *obj, Error **errp)
+static bool virt_get_virt(Object *obj, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
     return vms->virt;
 }
 
-static void virt_set_virt(Object *obj, bool value, Error **errp)
+static void virt_set_virt(Object *obj, bool value, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
     vms->virt = value;
 }
 
-static bool virt_get_highmem(Object *obj, Error **errp)
+static bool virt_get_highmem(Object *obj, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
     return vms->highmem;
 }
 
-static void virt_set_highmem(Object *obj, bool value, Error **errp)
+static void virt_set_highmem(Object *obj, bool value, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
     vms->highmem = value;
 }
 
-static bool virt_get_its(Object *obj, Error **errp)
+static bool virt_get_its(Object *obj, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
     return vms->its;
 }
 
-static void virt_set_its(Object *obj, bool value, Error **errp)
+static void virt_set_its(Object *obj, bool value, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
     vms->its = value;
 }
 
-static char *virt_get_gic_version(Object *obj, Error **errp)
+static char *virt_get_gic_version(Object *obj, Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
     const char *val = vms->gic_version == 3 ? "3" : "2";
@@ -1548,7 +1548,8 @@ static char *virt_get_gic_version(Object *obj, Error **errp)
     return g_strdup(val);
 }
 
-static void virt_set_gic_version(Object *obj, const char *value, Error **errp)
+static void virt_set_gic_version(Object *obj, const char *value,
+                                 Error *errp[static 1])
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
 
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index ee6c64b409..42f9cf396f 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -94,7 +94,7 @@ static inline int arm_gic_ppi_index(int cpu_nr, int ppi_index)
 }
 
 static void xlnx_zynqmp_create_rpu(XlnxZynqMPState *s, const char *boot_cpu,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     int i;
 
@@ -179,7 +179,7 @@ static void xlnx_zynqmp_init(Object *obj)
     qdev_set_parent_bus(DEVICE(&s->dpdma), sysbus_get_default());
 }
 
-static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
+static void xlnx_zynqmp_realize(DeviceState *dev, Error *errp[static 1])
 {
     XlnxZynqMPState *s = XLNX_ZYNQMP(dev);
     MemoryRegion *system_memory = get_system_memory();
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
index 1607cbdb03..91fa782cc6 100644
--- a/hw/arm/z2.c
+++ b/hw/arm/z2.c
@@ -151,7 +151,7 @@ static void z2_lcd_cs(void *opaque, int line, int level)
     z2_lcd->selected = !level;
 }
 
-static void zipit_lcd_realize(SSISlave *dev, Error **errp)
+static void zipit_lcd_realize(SSISlave *dev, Error *errp[static 1])
 {
     ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
     z->selected = 0;
diff --git a/hw/audio/ac97.c b/hw/audio/ac97.c
index 959c786261..84889fd4fe 100644
--- a/hw/audio/ac97.c
+++ b/hw/audio/ac97.c
@@ -1338,7 +1338,7 @@ static void ac97_on_reset (DeviceState *dev)
     mixer_reset (s);
 }
 
-static void ac97_realize(PCIDevice *dev, Error **errp)
+static void ac97_realize(PCIDevice *dev, Error *errp[static 1])
 {
     AC97LinkState *s = DO_UPCAST (AC97LinkState, dev, dev);
     uint8_t *c = s->dev.config;
diff --git a/hw/audio/adlib.c b/hw/audio/adlib.c
index c6e0f10c16..8870fe706d 100644
--- a/hw/audio/adlib.c
+++ b/hw/audio/adlib.c
@@ -254,7 +254,7 @@ static MemoryRegionPortio adlib_portio_list[] = {
     PORTIO_END_OF_LIST(),
 };
 
-static void adlib_realizefn (DeviceState *dev, Error **errp)
+static void adlib_realizefn (DeviceState *dev, Error *errp[static 1])
 {
     AdlibState *s = ADLIB(dev);
     struct audsettings as;
diff --git a/hw/audio/cs4231a.c b/hw/audio/cs4231a.c
index 096e8e98d7..2a1bc2aa16 100644
--- a/hw/audio/cs4231a.c
+++ b/hw/audio/cs4231a.c
@@ -657,7 +657,7 @@ static void cs4231a_initfn (Object *obj)
                            "cs4231a", 4);
 }
 
-static void cs4231a_realizefn (DeviceState *dev, Error **errp)
+static void cs4231a_realizefn (DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *d = ISA_DEVICE (dev);
     CSState *s = CS4231A (dev);
diff --git a/hw/audio/es1370.c b/hw/audio/es1370.c
index dd7c23d185..bec992255e 100644
--- a/hw/audio/es1370.c
+++ b/hw/audio/es1370.c
@@ -1016,7 +1016,7 @@ static void es1370_on_reset(DeviceState *dev)
     es1370_reset (s);
 }
 
-static void es1370_realize(PCIDevice *dev, Error **errp)
+static void es1370_realize(PCIDevice *dev, Error *errp[static 1])
 {
     ES1370State *s = ES1370(dev);
     uint8_t *c = s->dev.config;
diff --git a/hw/audio/gus.c b/hw/audio/gus.c
index 3e864cd36d..e894365592 100644
--- a/hw/audio/gus.c
+++ b/hw/audio/gus.c
@@ -234,7 +234,7 @@ static const MemoryRegionPortio gus_portio_list2[] = {
     PORTIO_END_OF_LIST (),
 };
 
-static void gus_realizefn (DeviceState *dev, Error **errp)
+static void gus_realizefn (DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *d = ISA_DEVICE(dev);
     GUSState *s = GUS (dev);
diff --git a/hw/audio/intel-hda.c b/hw/audio/intel-hda.c
index 06acc98f7b..b11e55ac5d 100644
--- a/hw/audio/intel-hda.c
+++ b/hw/audio/intel-hda.c
@@ -51,7 +51,7 @@ void hda_codec_bus_init(DeviceState *dev, HDACodecBus *bus, size_t bus_size,
     bus->xfer = xfer;
 }
 
-static void hda_codec_dev_realize(DeviceState *qdev, Error **errp)
+static void hda_codec_dev_realize(DeviceState *qdev, Error *errp[static 1])
 {
     HDACodecBus *bus = HDA_BUS(qdev->parent_bus);
     HDACodecDevice *dev = HDA_CODEC_DEVICE(qdev);
@@ -70,7 +70,7 @@ static void hda_codec_dev_realize(DeviceState *qdev, Error **errp)
     }
 }
 
-static void hda_codec_dev_unrealize(DeviceState *qdev, Error **errp)
+static void hda_codec_dev_unrealize(DeviceState *qdev, Error *errp[static 1])
 {
     HDACodecDevice *dev = HDA_CODEC_DEVICE(qdev);
     HDACodecDeviceClass *cdc = HDA_CODEC_DEVICE_GET_CLASS(dev);
@@ -1128,7 +1128,7 @@ static void intel_hda_reset(DeviceState *dev)
     intel_hda_update_irq(d);
 }
 
-static void intel_hda_realize(PCIDevice *pci, Error **errp)
+static void intel_hda_realize(PCIDevice *pci, Error *errp[static 1])
 {
     IntelHDAState *d = INTEL_HDA(pci);
     uint8_t *conf = d->pci.config;
diff --git a/hw/audio/marvell_88w8618.c b/hw/audio/marvell_88w8618.c
index 4f65f8c199..0c2657bedd 100644
--- a/hw/audio/marvell_88w8618.c
+++ b/hw/audio/marvell_88w8618.c
@@ -253,7 +253,7 @@ static void mv88w8618_audio_init(Object *obj)
     sysbus_init_mmio(dev, &s->iomem);
 }
 
-static void mv88w8618_audio_realize(DeviceState *dev, Error **errp)
+static void mv88w8618_audio_realize(DeviceState *dev, Error *errp[static 1])
 {
     mv88w8618_audio_state *s = MV88W8618_AUDIO(dev);
 
diff --git a/hw/audio/milkymist-ac97.c b/hw/audio/milkymist-ac97.c
index bc8db71ae0..d33072979a 100644
--- a/hw/audio/milkymist-ac97.c
+++ b/hw/audio/milkymist-ac97.c
@@ -299,7 +299,7 @@ static void milkymist_ac97_init(Object *obj)
     sysbus_init_mmio(dev, &s->regs_region);
 }
 
-static void milkymist_ac97_realize(DeviceState *dev, Error **errp)
+static void milkymist_ac97_realize(DeviceState *dev, Error *errp[static 1])
 {
     MilkymistAC97State *s = MILKYMIST_AC97(dev);
     struct audsettings as;
diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c
index f643b122bb..67ca88f5e1 100644
--- a/hw/audio/pcspk.c
+++ b/hw/audio/pcspk.c
@@ -178,7 +178,7 @@ static void pcspk_initfn(Object *obj)
                              0, &error_abort);
 }
 
-static void pcspk_realizefn(DeviceState *dev, Error **errp)
+static void pcspk_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     PCSpkState *s = PC_SPEAKER(dev);
diff --git a/hw/audio/pl041.c b/hw/audio/pl041.c
index c8cc503236..ce03d3b602 100644
--- a/hw/audio/pl041.c
+++ b/hw/audio/pl041.c
@@ -534,7 +534,7 @@ static void pl041_init(Object *obj)
     sysbus_init_irq(dev, &s->irq);
 }
 
-static void pl041_realize(DeviceState *dev, Error **errp)
+static void pl041_realize(DeviceState *dev, Error *errp[static 1])
 {
     PL041State *s = PL041(dev);
 
diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c
index 6ab2f6f89a..bc9e066cf9 100644
--- a/hw/audio/sb16.c
+++ b/hw/audio/sb16.c
@@ -1358,7 +1358,7 @@ static void sb16_initfn (Object *obj)
     s->cmd = -1;
 }
 
-static void sb16_realizefn (DeviceState *dev, Error **errp)
+static void sb16_realizefn (DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE (dev);
     SB16State *s = SB16 (dev);
diff --git a/hw/block/block.c b/hw/block/block.c
index 27878d0087..bf13eb37fd 100644
--- a/hw/block/block.c
+++ b/hw/block/block.c
@@ -52,7 +52,7 @@ void blkconf_blocksizes(BlockConf *conf)
 }
 
 void blkconf_apply_backend_options(BlockConf *conf, bool readonly,
-                                   bool resizable, Error **errp)
+                                   bool resizable, Error *errp[static 1])
 {
     BlockBackend *blk = conf->blk;
     BlockdevOnError rerror, werror;
@@ -103,7 +103,7 @@ void blkconf_apply_backend_options(BlockConf *conf, bool readonly,
 
 void blkconf_geometry(BlockConf *conf, int *ptrans,
                       unsigned cyls_max, unsigned heads_max, unsigned secs_max,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     DriveInfo *dinfo;
 
diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
index 5556f0e64e..7d859e35a9 100644
--- a/hw/block/dataplane/virtio-blk.c
+++ b/hw/block/dataplane/virtio-blk.c
@@ -78,7 +78,7 @@ static void notify_guest_bh(void *opaque)
 /* Context: QEMU global mutex held */
 void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf,
                                   VirtIOBlockDataPlane **dataplane,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     VirtIOBlockDataPlane *s;
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 597ea719a7..d246858787 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -470,7 +470,7 @@ static void fd_revalidate(FDrive *drv)
     }
 }
 
-static void fd_change_cb(void *opaque, bool load, Error **errp)
+static void fd_change_cb(void *opaque, bool load, Error *errp[static 1])
 {
     FDrive *drive = opaque;
 
@@ -2520,7 +2520,7 @@ static void fdctrl_result_timer(void *opaque)
 
 /* Init functions */
 static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     unsigned int i;
     FDrive *drive;
@@ -2630,7 +2630,7 @@ void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
 }
 
 static void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     int i, j;
     static int command_tables_inited = 0;
@@ -2679,7 +2679,7 @@ static const MemoryRegionPortio fdc_portio_list[] = {
     PORTIO_END_OF_LIST(),
 };
 
-static void isabus_fdc_realize(DeviceState *dev, Error **errp)
+static void isabus_fdc_realize(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     FDCtrlISABus *isa = ISA_FDC(dev);
@@ -2742,7 +2742,7 @@ static void sysbus_fdc_common_initfn(Object *obj)
     qdev_init_gpio_in(dev, fdctrl_handle_tc, 1);
 }
 
-static void sysbus_fdc_common_realize(DeviceState *dev, Error **errp)
+static void sysbus_fdc_common_realize(DeviceState *dev, Error *errp[static 1])
 {
     FDCtrlSysBus *sys = SYSBUS_FDC(dev);
     FDCtrl *fdctrl = &sys->state;
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 190573cefa..2182855f66 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -1211,7 +1211,7 @@ static uint32_t m25p80_transfer8(SSISlave *ss, uint32_t tx)
     return r;
 }
 
-static void m25p80_realize(SSISlave *ss, Error **errp)
+static void m25p80_realize(SSISlave *ss, Error *errp[static 1])
 {
     Flash *s = M25P80(ss);
     M25P80Class *mc = M25P80_GET_CLASS(s);
diff --git a/hw/block/nand.c b/hw/block/nand.c
index 0d33ac281f..a2b6437d96 100644
--- a/hw/block/nand.c
+++ b/hw/block/nand.c
@@ -369,7 +369,7 @@ static const VMStateDescription vmstate_nand = {
     }
 };
 
-static void nand_realize(DeviceState *dev, Error **errp)
+static void nand_realize(DeviceState *dev, Error *errp[static 1])
 {
     int pagesize;
     NANDFlashState *s = NAND(dev);
diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
index e634b128ce..caa6650513 100644
--- a/hw/block/pflash_cfi01.c
+++ b/hw/block/pflash_cfi01.c
@@ -699,7 +699,7 @@ static const MemoryRegionOps pflash_cfi01_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
+static void pflash_cfi01_realize(DeviceState *dev, Error *errp[static 1])
 {
     pflash_t *pfl = CFI_PFLASH01(dev);
     uint64_t total_len;
diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
index 2ef8c76b94..391024ce0e 100644
--- a/hw/block/pflash_cfi02.c
+++ b/hw/block/pflash_cfi02.c
@@ -593,7 +593,7 @@ static const MemoryRegionOps pflash_cfi02_ops_le = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
+static void pflash_cfi02_realize(DeviceState *dev, Error *errp[static 1])
 {
     pflash_t *pfl = CFI_PFLASH02(dev);
     uint32_t chip_len;
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index 11455faebc..389cd59421 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -776,7 +776,7 @@ static void virtio_blk_set_config(VirtIODevice *vdev, const uint8_t *config)
 }
 
 static uint64_t virtio_blk_get_features(VirtIODevice *vdev, uint64_t features,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     VirtIOBlock *s = VIRTIO_BLK(vdev);
 
@@ -904,7 +904,7 @@ static const BlockDevOps virtio_block_ops = {
     .resize_cb = virtio_blk_resize,
 };
 
-static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
+static void virtio_blk_device_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOBlock *s = VIRTIO_BLK(dev);
@@ -961,7 +961,8 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
     blk_iostatus_enable(s->blk);
 }
 
-static void virtio_blk_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_blk_device_unrealize(DeviceState *dev,
+                                        Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOBlock *s = VIRTIO_BLK(dev);
diff --git a/hw/bt/hci-csr.c b/hw/bt/hci-csr.c
index d13192b9b5..c9732775e0 100644
--- a/hw/bt/hci-csr.c
+++ b/hw/bt/hci-csr.c
@@ -465,7 +465,7 @@ qemu_irq *csrhci_pins_get(Chardev *chr)
 static void csrhci_open(Chardev *chr,
                         ChardevBackend *backend,
                         bool *be_opened,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     struct csrhci_s *s = HCI_CHARDEV(chr);
 
diff --git a/hw/char/bcm2835_aux.c b/hw/char/bcm2835_aux.c
index 4d46ad60ae..b5d1bfa8f9 100644
--- a/hw/char/bcm2835_aux.c
+++ b/hw/char/bcm2835_aux.c
@@ -274,7 +274,7 @@ static void bcm2835_aux_init(Object *obj)
     sysbus_init_irq(sbd, &s->irq);
 }
 
-static void bcm2835_aux_realize(DeviceState *dev, Error **errp)
+static void bcm2835_aux_realize(DeviceState *dev, Error *errp[static 1])
 {
     BCM2835AuxState *s = BCM2835_AUX(dev);
 
diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
index 4a2c124104..7aa4e091f0 100644
--- a/hw/char/cadence_uart.c
+++ b/hw/char/cadence_uart.c
@@ -477,7 +477,7 @@ static void cadence_uart_reset(DeviceState *dev)
     uart_update_status(s);
 }
 
-static void cadence_uart_realize(DeviceState *dev, Error **errp)
+static void cadence_uart_realize(DeviceState *dev, Error *errp[static 1])
 {
     CadenceUARTState *s = CADENCE_UART(dev);
 
diff --git a/hw/char/debugcon.c b/hw/char/debugcon.c
index 90e437edfb..fd97488501 100644
--- a/hw/char/debugcon.c
+++ b/hw/char/debugcon.c
@@ -85,7 +85,7 @@ static const MemoryRegionOps debugcon_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void debugcon_realize_core(DebugconState *s, Error **errp)
+static void debugcon_realize_core(DebugconState *s, Error *errp[static 1])
 {
     if (!qemu_chr_fe_get_driver(&s->chr)) {
         error_setg(errp, "Can't create debugcon device, empty char device");
@@ -95,7 +95,7 @@ static void debugcon_realize_core(DebugconState *s, Error **errp)
     qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, s, NULL, true);
 }
 
-static void debugcon_isa_realizefn(DeviceState *dev, Error **errp)
+static void debugcon_isa_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *d = ISA_DEVICE(dev);
     ISADebugconState *isa = ISA_DEBUGCON_DEVICE(dev);
diff --git a/hw/char/digic-uart.c b/hw/char/digic-uart.c
index 34306e11ff..ee353d1b90 100644
--- a/hw/char/digic-uart.c
+++ b/hw/char/digic-uart.c
@@ -141,7 +141,7 @@ static void digic_uart_reset(DeviceState *d)
     s->reg_st = ST_TX_RDY;
 }
 
-static void digic_uart_realize(DeviceState *dev, Error **errp)
+static void digic_uart_realize(DeviceState *dev, Error *errp[static 1])
 {
     DigicUartState *s = DIGIC_UART(dev);
 
diff --git a/hw/char/escc.c b/hw/char/escc.c
index 3f787632c7..ffd24cba71 100644
--- a/hw/char/escc.c
+++ b/hw/char/escc.c
@@ -1001,7 +1001,7 @@ static void escc_init1(Object *obj)
     sysbus_init_mmio(dev, &s->mmio);
 }
 
-static void escc_realize(DeviceState *dev, Error **errp)
+static void escc_realize(DeviceState *dev, Error *errp[static 1])
 {
     ESCCState *s = ESCC(dev);
     unsigned int i;
diff --git a/hw/char/etraxfs_ser.c b/hw/char/etraxfs_ser.c
index c1fba9f50f..2574d024c8 100644
--- a/hw/char/etraxfs_ser.c
+++ b/hw/char/etraxfs_ser.c
@@ -227,7 +227,7 @@ static void etraxfs_ser_init(Object *obj)
     sysbus_init_mmio(dev, &s->mmio);
 }
 
-static void etraxfs_ser_realize(DeviceState *dev, Error **errp)
+static void etraxfs_ser_realize(DeviceState *dev, Error *errp[static 1])
 {
     ETRAXSerial *s = ETRAX_SERIAL(dev);
 
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
index b51d44a321..77efa81781 100644
--- a/hw/char/exynos4210_uart.c
+++ b/hw/char/exynos4210_uart.c
@@ -639,7 +639,7 @@ static void exynos4210_uart_init(Object *obj)
     sysbus_init_irq(dev, &s->irq);
 }
 
-static void exynos4210_uart_realize(DeviceState *dev, Error **errp)
+static void exynos4210_uart_realize(DeviceState *dev, Error *errp[static 1])
 {
     Exynos4210UartState *s = EXYNOS4210_UART(dev);
 
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
index af250305be..f410453273 100644
--- a/hw/char/imx_serial.c
+++ b/hw/char/imx_serial.c
@@ -308,7 +308,7 @@ static const struct MemoryRegionOps imx_serial_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void imx_serial_realize(DeviceState *dev, Error **errp)
+static void imx_serial_realize(DeviceState *dev, Error *errp[static 1])
 {
     IMXSerialState *s = IMX_SERIAL(dev);
 
diff --git a/hw/char/ipoctal232.c b/hw/char/ipoctal232.c
index 337a3e566a..ee90bf1cdb 100644
--- a/hw/char/ipoctal232.c
+++ b/hw/char/ipoctal232.c
@@ -532,7 +532,7 @@ static void hostdev_event(void *opaque, int event)
     }
 }
 
-static void ipoctal_realize(DeviceState *dev, Error **errp)
+static void ipoctal_realize(DeviceState *dev, Error *errp[static 1])
 {
     IPOctalState *s = IPOCTAL(dev);
     unsigned i;
diff --git a/hw/char/lm32_juart.c b/hw/char/lm32_juart.c
index 3948dcd332..811e206009 100644
--- a/hw/char/lm32_juart.c
+++ b/hw/char/lm32_juart.c
@@ -114,7 +114,7 @@ static void juart_reset(DeviceState *d)
     s->jrx = 0;
 }
 
-static void lm32_juart_realize(DeviceState *dev, Error **errp)
+static void lm32_juart_realize(DeviceState *dev, Error *errp[static 1])
 {
     LM32JuartState *s = LM32_JUART(dev);
 
diff --git a/hw/char/lm32_uart.c b/hw/char/lm32_uart.c
index cff8c38f90..ffe951fa47 100644
--- a/hw/char/lm32_uart.c
+++ b/hw/char/lm32_uart.c
@@ -261,7 +261,7 @@ static void lm32_uart_init(Object *obj)
     sysbus_init_mmio(dev, &s->iomem);
 }
 
-static void lm32_uart_realize(DeviceState *dev, Error **errp)
+static void lm32_uart_realize(DeviceState *dev, Error *errp[static 1])
 {
     LM32UartState *s = LM32_UART(dev);
 
diff --git a/hw/char/mcf_uart.c b/hw/char/mcf_uart.c
index fe12ad5ccb..a7677bd485 100644
--- a/hw/char/mcf_uart.c
+++ b/hw/char/mcf_uart.c
@@ -300,7 +300,7 @@ static void mcf_uart_instance_init(Object *obj)
     sysbus_init_irq(dev, &s->irq);
 }
 
-static void mcf_uart_realize(DeviceState *dev, Error **errp)
+static void mcf_uart_realize(DeviceState *dev, Error *errp[static 1])
 {
     mcf_uart_state *s = MCF_UART(dev);
 
diff --git a/hw/char/milkymist-uart.c b/hw/char/milkymist-uart.c
index e19d0f6520..e4b7e05ed3 100644
--- a/hw/char/milkymist-uart.c
+++ b/hw/char/milkymist-uart.c
@@ -194,7 +194,7 @@ static void milkymist_uart_reset(DeviceState *d)
     s->regs[R_STAT] = STAT_THRE;
 }
 
-static void milkymist_uart_realize(DeviceState *dev, Error **errp)
+static void milkymist_uart_realize(DeviceState *dev, Error *errp[static 1])
 {
     MilkymistUartState *s = MILKYMIST_UART(dev);
 
diff --git a/hw/char/parallel.c b/hw/char/parallel.c
index 75a1a2f55e..711e12e1fb 100644
--- a/hw/char/parallel.c
+++ b/hw/char/parallel.c
@@ -504,7 +504,7 @@ static const VMStateDescription vmstate_parallel_isa = {
 };
 
 
-static void parallel_isa_realizefn(DeviceState *dev, Error **errp)
+static void parallel_isa_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     static int index;
     ISADevice *isadev = ISA_DEVICE(dev);
diff --git a/hw/char/pl011.c b/hw/char/pl011.c
index 33802f00c8..c4946b3874 100644
--- a/hw/char/pl011.c
+++ b/hw/char/pl011.c
@@ -324,7 +324,7 @@ static void pl011_init(Object *obj)
     s->id = pl011_id_arm;
 }
 
-static void pl011_realize(DeviceState *dev, Error **errp)
+static void pl011_realize(DeviceState *dev, Error *errp[static 1])
 {
     PL011State *s = PL011(dev);
 
diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
index d7c5cc11fe..72525ba146 100644
--- a/hw/char/serial-isa.c
+++ b/hw/char/serial-isa.c
@@ -46,7 +46,7 @@ static const int isa_serial_irq[MAX_SERIAL_PORTS] = {
     4, 3, 4, 3
 };
 
-static void serial_isa_realizefn(DeviceState *dev, Error **errp)
+static void serial_isa_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     static int index;
     ISADevice *isadev = ISA_DEVICE(dev);
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index 60074eb114..9c599bf166 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -51,7 +51,7 @@ typedef struct PCIMultiSerialState {
 
 static void multi_serial_pci_exit(PCIDevice *dev);
 
-static void serial_pci_realize(PCIDevice *dev, Error **errp)
+static void serial_pci_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
     SerialState *s = &pci->state;
@@ -84,7 +84,7 @@ static void multi_serial_irq_mux(void *opaque, int n, int level)
     pci_set_irq(&pci->dev, pending);
 }
 
-static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
+static void multi_serial_pci_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
diff --git a/hw/char/serial.c b/hw/char/serial.c
index e1f12507bf..c0625b3481 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -884,7 +884,7 @@ static void serial_reset(void *opaque)
     s->msr &= ~UART_MSR_ANY_DELTA;
 }
 
-void serial_realize_core(SerialState *s, Error **errp)
+void serial_realize_core(SerialState *s, Error *errp[static 1])
 {
     if (!qemu_chr_fe_get_driver(&s->chr)) {
         error_setg(errp, "Can't create serial device, empty char device");
diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c
index 8f02f3a612..4947d8dcd6 100644
--- a/hw/char/spapr_vty.c
+++ b/hw/char/spapr_vty.c
@@ -74,7 +74,7 @@ void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len)
     qemu_chr_fe_write_all(&dev->chardev, buf, len);
 }
 
-static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error **errp)
+static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error *errp[static 1])
 {
     VIOsPAPRVTYDevice *dev = VIO_SPAPR_VTY_DEVICE(sdev);
 
diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c
index 59872e6d3b..244d173c14 100644
--- a/hw/char/stm32f2xx_usart.c
+++ b/hw/char/stm32f2xx_usart.c
@@ -202,7 +202,7 @@ static void stm32f2xx_usart_init(Object *obj)
     sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
 }
 
-static void stm32f2xx_usart_realize(DeviceState *dev, Error **errp)
+static void stm32f2xx_usart_realize(DeviceState *dev, Error *errp[static 1])
 {
     STM32F2XXUsartState *s = STM32F2XX_USART(dev);
 
diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c
index 7b10a04f18..9d13a57ff2 100644
--- a/hw/char/terminal3270.c
+++ b/hw/char/terminal3270.c
@@ -168,7 +168,7 @@ static void chr_event(void *opaque, int event)
     }
 }
 
-static void terminal_init(EmulatedCcw3270Device *dev, Error **errp)
+static void terminal_init(EmulatedCcw3270Device *dev, Error *errp[static 1])
 {
     Terminal3270 *t = TERMINAL_3270(dev);
     static bool terminal_available;
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
index 0cb1668c8a..5feeea0b4d 100644
--- a/hw/char/virtio-console.c
+++ b/hw/char/virtio-console.c
@@ -163,7 +163,7 @@ static void chr_event(void *opaque, int event)
     }
 }
 
-static void virtconsole_realize(DeviceState *dev, Error **errp)
+static void virtconsole_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
     VirtConsole *vcon = VIRTIO_CONSOLE(dev);
@@ -197,7 +197,7 @@ static void virtconsole_realize(DeviceState *dev, Error **errp)
     }
 }
 
-static void virtconsole_unrealize(DeviceState *dev, Error **errp)
+static void virtconsole_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     VirtConsole *vcon = VIRTIO_CONSOLE(dev);
 
diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c
index 8f0d130d49..a0a85b9332 100644
--- a/hw/char/virtio-serial-bus.c
+++ b/hw/char/virtio-serial-bus.c
@@ -548,7 +548,7 @@ static void handle_input(VirtIODevice *vdev, VirtQueue *vq)
 }
 
 static uint64_t get_features(VirtIODevice *vdev, uint64_t features,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     VirtIOSerial *vser;
 
@@ -919,7 +919,8 @@ static void remove_port(VirtIOSerial *vser, uint32_t port_id)
     send_control_event(vser, port->id, VIRTIO_CONSOLE_PORT_REMOVE, 1);
 }
 
-static void virtser_port_device_realize(DeviceState *dev, Error **errp)
+static void virtser_port_device_realize(DeviceState *dev,
+                                        Error *errp[static 1])
 {
     VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
     VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
@@ -980,7 +981,7 @@ static void virtser_port_device_realize(DeviceState *dev, Error **errp)
 }
 
 static void virtser_port_device_plug(HotplugHandler *hotplug_dev,
-                                     DeviceState *dev, Error **errp)
+                                     DeviceState *dev, Error *errp[static 1])
 {
     VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
 
@@ -994,7 +995,8 @@ static void virtser_port_device_plug(HotplugHandler *hotplug_dev,
     virtio_notify_config(VIRTIO_DEVICE(hotplug_dev));
 }
 
-static void virtser_port_device_unrealize(DeviceState *dev, Error **errp)
+static void virtser_port_device_unrealize(DeviceState *dev,
+                                          Error *errp[static 1])
 {
     VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
     VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(dev);
@@ -1010,7 +1012,8 @@ static void virtser_port_device_unrealize(DeviceState *dev, Error **errp)
     }
 }
 
-static void virtio_serial_device_realize(DeviceState *dev, Error **errp)
+static void virtio_serial_device_realize(DeviceState *dev,
+                                         Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOSerial *vser = VIRTIO_SERIAL(dev);
@@ -1106,7 +1109,8 @@ static const TypeInfo virtio_serial_port_type_info = {
     .class_init = virtio_serial_port_class_init,
 };
 
-static void virtio_serial_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_serial_device_unrealize(DeviceState *dev,
+                                           Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOSerial *vser = VIRTIO_SERIAL(dev);
diff --git a/hw/char/xilinx_uartlite.c b/hw/char/xilinx_uartlite.c
index 71ed2fc1be..e7a6e048b0 100644
--- a/hw/char/xilinx_uartlite.c
+++ b/hw/char/xilinx_uartlite.c
@@ -207,7 +207,7 @@ static void uart_event(void *opaque, int event)
 
 }
 
-static void xilinx_uartlite_realize(DeviceState *dev, Error **errp)
+static void xilinx_uartlite_realize(DeviceState *dev, Error *errp[static 1])
 {
     XilinxUARTLite *s = XILINX_UARTLITE(dev);
 
diff --git a/hw/core/bus.c b/hw/core/bus.c
index ab1925bee9..fc9133049f 100644
--- a/hw/core/bus.c
+++ b/hw/core/bus.c
@@ -23,19 +23,20 @@
 #include "qapi/error.h"
 
 static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
 
     object_property_set_link(OBJECT(bus), OBJECT(handler),
                              QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
 }
 
-void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp)
+void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler,
+                              Error *errp[static 1])
 {
     qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp);
 }
 
-void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp)
+void qbus_set_bus_hotplug_handler(BusState *bus, Error *errp[static 1])
 {
     qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp);
 }
@@ -147,14 +148,14 @@ BusState *qbus_create(const char *typename, DeviceState *parent, const char *nam
     return bus;
 }
 
-static bool bus_get_realized(Object *obj, Error **errp)
+static bool bus_get_realized(Object *obj, Error *errp[static 1])
 {
     BusState *bus = BUS(obj);
 
     return bus->realized;
 }
 
-static void bus_set_realized(Object *obj, bool value, Error **errp)
+static void bus_set_realized(Object *obj, bool value, Error *errp[static 1])
 {
     BusState *bus = BUS(obj);
     BusClass *bc = BUS_GET_CLASS(bus);
diff --git a/hw/core/generic-loader.c b/hw/core/generic-loader.c
index 46012673c3..01f20d5a1f 100644
--- a/hw/core/generic-loader.c
+++ b/hw/core/generic-loader.c
@@ -58,7 +58,7 @@ static void generic_loader_reset(void *opaque)
     }
 }
 
-static void generic_loader_realize(DeviceState *dev, Error **errp)
+static void generic_loader_realize(DeviceState *dev, Error *errp[static 1])
 {
     GenericLoaderState *s = GENERIC_LOADER(dev);
     hwaddr entry;
@@ -170,7 +170,7 @@ static void generic_loader_realize(DeviceState *dev, Error **errp)
     }
 }
 
-static void generic_loader_unrealize(DeviceState *dev, Error **errp)
+static void generic_loader_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     qemu_unregister_reset(generic_loader_reset, dev);
 }
diff --git a/hw/core/hotplug.c b/hw/core/hotplug.c
index 17ac986685..1390611be3 100644
--- a/hw/core/hotplug.c
+++ b/hw/core/hotplug.c
@@ -15,7 +15,7 @@
 
 void hotplug_handler_pre_plug(HotplugHandler *plug_handler,
                               DeviceState *plugged_dev,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
 
@@ -26,7 +26,7 @@ void hotplug_handler_pre_plug(HotplugHandler *plug_handler,
 
 void hotplug_handler_plug(HotplugHandler *plug_handler,
                           DeviceState *plugged_dev,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
 
@@ -37,7 +37,7 @@ void hotplug_handler_plug(HotplugHandler *plug_handler,
 
 void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
                                     DeviceState *plugged_dev,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
 
@@ -48,7 +48,7 @@ void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
 
 void hotplug_handler_unplug(HotplugHandler *plug_handler,
                             DeviceState *plugged_dev,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
 
diff --git a/hw/core/loader.c b/hw/core/loader.c
index f72930ca4a..ac6deb1f63 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -362,7 +362,8 @@ const char *load_elf_strerror(int error)
     }
 }
 
-void load_elf_hdr(const char *filename, void *hdr, bool *is64, Error **errp)
+void load_elf_hdr(const char *filename, void *hdr, bool *is64,
+                  Error *errp[static 1])
 {
     int fd;
     uint8_t e_ident_local[EI_NIDENT];
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 61e921c9ef..4cc3bac899 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -23,14 +23,15 @@
 #include "sysemu/numa.h"
 #include "sysemu/qtest.h"
 
-static char *machine_get_accel(Object *obj, Error **errp)
+static char *machine_get_accel(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return g_strdup(ms->accel);
 }
 
-static void machine_set_accel(Object *obj, const char *value, Error **errp)
+static void machine_set_accel(Object *obj, const char *value,
+                              Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -40,7 +41,7 @@ static void machine_set_accel(Object *obj, const char *value, Error **errp)
 
 static void machine_set_kernel_irqchip(Object *obj, Visitor *v,
                                        const char *name, void *opaque,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     Error *err = NULL;
     MachineState *ms = MACHINE(obj);
@@ -78,7 +79,7 @@ static void machine_set_kernel_irqchip(Object *obj, Visitor *v,
 
 static void machine_get_kvm_shadow_mem(Object *obj, Visitor *v,
                                        const char *name, void *opaque,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
     int64_t value = ms->kvm_shadow_mem;
@@ -88,7 +89,7 @@ static void machine_get_kvm_shadow_mem(Object *obj, Visitor *v,
 
 static void machine_set_kvm_shadow_mem(Object *obj, Visitor *v,
                                        const char *name, void *opaque,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
     int64_t value;
@@ -101,14 +102,15 @@ static void machine_set_kvm_shadow_mem(Object *obj, Visitor *v,
     ms->kvm_shadow_mem = value;
 }
 
-static char *machine_get_kernel(Object *obj, Error **errp)
+static char *machine_get_kernel(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return g_strdup(ms->kernel_filename);
 }
 
-static void machine_set_kernel(Object *obj, const char *value, Error **errp)
+static void machine_set_kernel(Object *obj, const char *value,
+                               Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -116,14 +118,15 @@ static void machine_set_kernel(Object *obj, const char *value, Error **errp)
     ms->kernel_filename = g_strdup(value);
 }
 
-static char *machine_get_initrd(Object *obj, Error **errp)
+static char *machine_get_initrd(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return g_strdup(ms->initrd_filename);
 }
 
-static void machine_set_initrd(Object *obj, const char *value, Error **errp)
+static void machine_set_initrd(Object *obj, const char *value,
+                               Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -131,14 +134,15 @@ static void machine_set_initrd(Object *obj, const char *value, Error **errp)
     ms->initrd_filename = g_strdup(value);
 }
 
-static char *machine_get_append(Object *obj, Error **errp)
+static char *machine_get_append(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return g_strdup(ms->kernel_cmdline);
 }
 
-static void machine_set_append(Object *obj, const char *value, Error **errp)
+static void machine_set_append(Object *obj, const char *value,
+                               Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -146,14 +150,15 @@ static void machine_set_append(Object *obj, const char *value, Error **errp)
     ms->kernel_cmdline = g_strdup(value);
 }
 
-static char *machine_get_dtb(Object *obj, Error **errp)
+static char *machine_get_dtb(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return g_strdup(ms->dtb);
 }
 
-static void machine_set_dtb(Object *obj, const char *value, Error **errp)
+static void machine_set_dtb(Object *obj, const char *value,
+                            Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -161,14 +166,15 @@ static void machine_set_dtb(Object *obj, const char *value, Error **errp)
     ms->dtb = g_strdup(value);
 }
 
-static char *machine_get_dumpdtb(Object *obj, Error **errp)
+static char *machine_get_dumpdtb(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return g_strdup(ms->dumpdtb);
 }
 
-static void machine_set_dumpdtb(Object *obj, const char *value, Error **errp)
+static void machine_set_dumpdtb(Object *obj, const char *value,
+                                Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -178,7 +184,7 @@ static void machine_set_dumpdtb(Object *obj, const char *value, Error **errp)
 
 static void machine_get_phandle_start(Object *obj, Visitor *v,
                                       const char *name, void *opaque,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
     int64_t value = ms->phandle_start;
@@ -188,7 +194,7 @@ static void machine_get_phandle_start(Object *obj, Visitor *v,
 
 static void machine_set_phandle_start(Object *obj, Visitor *v,
                                       const char *name, void *opaque,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
     int64_t value;
@@ -201,14 +207,15 @@ static void machine_set_phandle_start(Object *obj, Visitor *v,
     ms->phandle_start = value;
 }
 
-static char *machine_get_dt_compatible(Object *obj, Error **errp)
+static char *machine_get_dt_compatible(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return g_strdup(ms->dt_compatible);
 }
 
-static void machine_set_dt_compatible(Object *obj, const char *value, Error **errp)
+static void machine_set_dt_compatible(Object *obj, const char *value,
+                                      Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -216,42 +223,44 @@ static void machine_set_dt_compatible(Object *obj, const char *value, Error **er
     ms->dt_compatible = g_strdup(value);
 }
 
-static bool machine_get_dump_guest_core(Object *obj, Error **errp)
+static bool machine_get_dump_guest_core(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return ms->dump_guest_core;
 }
 
-static void machine_set_dump_guest_core(Object *obj, bool value, Error **errp)
+static void machine_set_dump_guest_core(Object *obj, bool value,
+                                        Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     ms->dump_guest_core = value;
 }
 
-static bool machine_get_mem_merge(Object *obj, Error **errp)
+static bool machine_get_mem_merge(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return ms->mem_merge;
 }
 
-static void machine_set_mem_merge(Object *obj, bool value, Error **errp)
+static void machine_set_mem_merge(Object *obj, bool value,
+                                  Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     ms->mem_merge = value;
 }
 
-static bool machine_get_usb(Object *obj, Error **errp)
+static bool machine_get_usb(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return ms->usb;
 }
 
-static void machine_set_usb(Object *obj, bool value, Error **errp)
+static void machine_set_usb(Object *obj, bool value, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -259,42 +268,45 @@ static void machine_set_usb(Object *obj, bool value, Error **errp)
     ms->usb_disabled = !value;
 }
 
-static bool machine_get_graphics(Object *obj, Error **errp)
+static bool machine_get_graphics(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return ms->enable_graphics;
 }
 
-static void machine_set_graphics(Object *obj, bool value, Error **errp)
+static void machine_set_graphics(Object *obj, bool value,
+                                 Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     ms->enable_graphics = value;
 }
 
-static bool machine_get_igd_gfx_passthru(Object *obj, Error **errp)
+static bool machine_get_igd_gfx_passthru(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return ms->igd_gfx_passthru;
 }
 
-static void machine_set_igd_gfx_passthru(Object *obj, bool value, Error **errp)
+static void machine_set_igd_gfx_passthru(Object *obj, bool value,
+                                         Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     ms->igd_gfx_passthru = value;
 }
 
-static char *machine_get_firmware(Object *obj, Error **errp)
+static char *machine_get_firmware(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     return g_strdup(ms->firmware);
 }
 
-static void machine_set_firmware(Object *obj, const char *value, Error **errp)
+static void machine_set_firmware(Object *obj, const char *value,
+                                 Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -302,14 +314,15 @@ static void machine_set_firmware(Object *obj, const char *value, Error **errp)
     ms->firmware = g_strdup(value);
 }
 
-static void machine_set_suppress_vmdesc(Object *obj, bool value, Error **errp)
+static void machine_set_suppress_vmdesc(Object *obj, bool value,
+                                        Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     ms->suppress_vmdesc = value;
 }
 
-static bool machine_get_suppress_vmdesc(Object *obj, Error **errp)
+static bool machine_get_suppress_vmdesc(Object *obj, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -317,14 +330,15 @@ static bool machine_get_suppress_vmdesc(Object *obj, Error **errp)
 }
 
 static void machine_set_enforce_config_section(Object *obj, bool value,
-                                             Error **errp)
+                                             Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
     ms->enforce_config_section = value;
 }
 
-static bool machine_get_enforce_config_section(Object *obj, Error **errp)
+static bool machine_get_enforce_config_section(Object *obj,
+                                               Error *errp[static 1])
 {
     MachineState *ms = MACHINE(obj);
 
@@ -413,7 +427,8 @@ HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine)
  * Empty subset is disallowed and function will return with error in this case.
  */
 void machine_set_cpu_numa_node(MachineState *machine,
-                               const CpuInstanceProperties *props, Error **errp)
+                               const CpuInstanceProperties *props,
+                               Error *errp[static 1])
 {
     MachineClass *mc = MACHINE_GET_CLASS(machine);
     bool match = false;
diff --git a/hw/core/nmi.c b/hw/core/nmi.c
index bfd0896daf..948a9e09cf 100644
--- a/hw/core/nmi.c
+++ b/hw/core/nmi.c
@@ -57,7 +57,7 @@ static void nmi_children(Object *o, struct do_nmi_s *ns)
     object_child_foreach(o, do_nmi, ns);
 }
 
-void nmi_monitor_handle(int cpu_index, Error **errp)
+void nmi_monitor_handle(int cpu_index, Error *errp[static 1])
 {
     struct do_nmi_s ns = {
         .cpu_index = cpu_index,
diff --git a/hw/core/or-irq.c b/hw/core/or-irq.c
index f9d76c4641..cd4f0ddf7a 100644
--- a/hw/core/or-irq.c
+++ b/hw/core/or-irq.c
@@ -50,7 +50,7 @@ static void or_irq_reset(DeviceState *dev)
     }
 }
 
-static void or_irq_realize(DeviceState *dev, Error **errp)
+static void or_irq_realize(DeviceState *dev, Error *errp[static 1])
 {
     qemu_or_irq *s = OR_IRQ(dev);
 
diff --git a/hw/core/platform-bus.c b/hw/core/platform-bus.c
index d3286e6570..c967bc95da 100644
--- a/hw/core/platform-bus.c
+++ b/hw/core/platform-bus.c
@@ -195,7 +195,7 @@ static void platform_bus_init_notify(Notifier *notifier, void *data)
     foreach_dynamic_sysbus_device(link_sysbus_device, pb);
 }
 
-static void platform_bus_realize(DeviceState *dev, Error **errp)
+static void platform_bus_realize(DeviceState *dev, Error *errp[static 1])
 {
     PlatformBusDevice *pbus;
     SysBusDevice *d;
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 68c97c08dc..c6e4d5d46c 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -25,7 +25,7 @@
 
 static void get_pointer(Object *obj, Visitor *v, Property *prop,
                         char *(*print)(void *ptr),
-                        const char *name, Error **errp)
+                        const char *name, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     void **ptr = qdev_get_prop_ptr(dev, prop);
@@ -40,7 +40,7 @@ static void set_pointer(Object *obj, Visitor *v, Property *prop,
                         void (*parse)(DeviceState *dev, const char *str,
                                       void **ptr, const char *propname,
                                       Error **errp),
-                        const char *name, Error **errp)
+                        const char *name, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     void **ptr = qdev_get_prop_ptr(dev, prop);
@@ -67,7 +67,7 @@ static void set_pointer(Object *obj, Visitor *v, Property *prop,
 /* --- drive --- */
 
 static void parse_drive(DeviceState *dev, const char *str, void **ptr,
-                        const char *propname, Error **errp)
+                        const char *propname, Error *errp[static 1])
 {
     BlockBackend *blk;
     bool blk_created = false;
@@ -146,13 +146,13 @@ static char *print_drive(void *ptr)
 }
 
 static void get_drive(Object *obj, Visitor *v, const char *name, void *opaque,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     get_pointer(obj, v, opaque, print_drive, name, errp);
 }
 
 static void set_drive(Object *obj, Visitor *v, const char *name, void *opaque,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     set_pointer(obj, v, opaque, parse_drive, name, errp);
 }
@@ -168,7 +168,7 @@ PropertyInfo qdev_prop_drive = {
 /* --- character device --- */
 
 static void get_chr(Object *obj, Visitor *v, const char *name, void *opaque,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     CharBackend *be = qdev_get_prop_ptr(dev, opaque);
@@ -180,7 +180,7 @@ static void get_chr(Object *obj, Visitor *v, const char *name, void *opaque,
 }
 
 static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -234,7 +234,7 @@ PropertyInfo qdev_prop_chr = {
 
 /* --- netdev device --- */
 static void get_netdev(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -246,7 +246,7 @@ static void get_netdev(Object *obj, Visitor *v, const char *name,
 }
 
 static void set_netdev(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -331,7 +331,7 @@ static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t len)
 }
 
 static void get_vlan(Object *obj, Visitor *v, const char *name, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -349,7 +349,7 @@ static void get_vlan(Object *obj, Visitor *v, const char *name, void *opaque,
 }
 
 static void set_vlan(Object *obj, Visitor *v, const char *name, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -394,7 +394,7 @@ PropertyInfo qdev_prop_vlan = {
 };
 
 void qdev_prop_set_drive(DeviceState *dev, const char *name,
-                         BlockBackend *value, Error **errp)
+                         BlockBackend *value, Error *errp[static 1])
 {
     const char *ref = "";
 
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index f289841484..dc440b69c6 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -12,7 +12,7 @@
 #include "chardev/char.h"
 
 void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     if (dev->id) {
         error_setg(errp, "Attempt to set property '%s' on device '%s' "
@@ -26,7 +26,8 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
 }
 
 void qdev_prop_allow_set_link_before_realize(Object *obj, const char *name,
-                                             Object *val, Error **errp)
+                                             Object *val,
+                                             Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
 
@@ -45,7 +46,7 @@ void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
 }
 
 static void get_enum(Object *obj, Visitor *v, const char *name, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -55,7 +56,7 @@ static void get_enum(Object *obj, Visitor *v, const char *name, void *opaque,
 }
 
 static void set_enum(Object *obj, Visitor *v, const char *name, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -89,7 +90,7 @@ static void bit_prop_set(DeviceState *dev, Property *props, bool val)
 }
 
 static void prop_get_bit(Object *obj, Visitor *v, const char *name,
-                         void *opaque, Error **errp)
+                         void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -100,7 +101,7 @@ static void prop_get_bit(Object *obj, Visitor *v, const char *name,
 }
 
 static void prop_set_bit(Object *obj, Visitor *v, const char *name,
-                         void *opaque, Error **errp)
+                         void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -145,7 +146,7 @@ static void bit64_prop_set(DeviceState *dev, Property *props, bool val)
 }
 
 static void prop_get_bit64(Object *obj, Visitor *v, const char *name,
-                           void *opaque, Error **errp)
+                           void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -156,7 +157,7 @@ static void prop_get_bit64(Object *obj, Visitor *v, const char *name,
 }
 
 static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
-                           void *opaque, Error **errp)
+                           void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -184,7 +185,7 @@ PropertyInfo qdev_prop_bit64 = {
 /* --- bool --- */
 
 static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -194,7 +195,7 @@ static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,
 }
 
 static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -217,7 +218,7 @@ PropertyInfo qdev_prop_bool = {
 /* --- 8bit integer --- */
 
 static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -227,7 +228,7 @@ static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
 }
 
 static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -250,7 +251,7 @@ PropertyInfo qdev_prop_uint8 = {
 /* --- 16bit integer --- */
 
 static void get_uint16(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -260,7 +261,7 @@ static void get_uint16(Object *obj, Visitor *v, const char *name,
 }
 
 static void set_uint16(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -283,7 +284,7 @@ PropertyInfo qdev_prop_uint16 = {
 /* --- 32bit integer --- */
 
 static void get_uint32(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -293,7 +294,7 @@ static void get_uint32(Object *obj, Visitor *v, const char *name,
 }
 
 static void set_uint32(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -308,7 +309,7 @@ static void set_uint32(Object *obj, Visitor *v, const char *name,
 }
 
 static void get_int32(Object *obj, Visitor *v, const char *name, void *opaque,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -318,7 +319,7 @@ static void get_int32(Object *obj, Visitor *v, const char *name, void *opaque,
 }
 
 static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -347,7 +348,7 @@ PropertyInfo qdev_prop_int32 = {
 /* --- 64bit integer --- */
 
 static void get_uint64(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -357,7 +358,7 @@ static void get_uint64(Object *obj, Visitor *v, const char *name,
 }
 
 static void set_uint64(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -386,7 +387,7 @@ static void release_string(Object *obj, const char *name, void *opaque)
 }
 
 static void get_string(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -401,7 +402,7 @@ static void get_string(Object *obj, Visitor *v, const char *name,
 }
 
 static void set_string(Object *obj, Visitor *v, const char *name,
-                       void *opaque, Error **errp)
+                       void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -443,7 +444,7 @@ PropertyInfo qdev_prop_ptr = {
  *   01-02-03-04-05-06
  */
 static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -459,7 +460,7 @@ static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,
 }
 
 static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -574,7 +575,7 @@ PropertyInfo qdev_prop_fdc_drive_type = {
  * bus-local address, i.e. "$slot" or "$slot.$fn"
  */
 static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
-                          void *opaque, Error **errp)
+                          void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -645,7 +646,7 @@ PropertyInfo qdev_prop_pci_devfn = {
 /* --- blocksize --- */
 
 static void set_blocksize(Object *obj, Visitor *v, const char *name,
-                          void *opaque, Error **errp)
+                          void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -690,7 +691,7 @@ PropertyInfo qdev_prop_blocksize = {
 /* --- pci host address --- */
 
 static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -717,7 +718,7 @@ static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
  *   if <domain> is not supplied, it's assumed to be 0.
  */
 static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -829,7 +830,7 @@ static void array_element_release(Object *obj, const char *name, void *opaque)
 }
 
 static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     /* Setter for the property which defines the length of a
      * variable-sized property array. As well as actually setting the
@@ -1115,7 +1116,7 @@ void qdev_prop_set_globals(DeviceState *dev)
 /* --- 64bit unsigned int 'size' type --- */
 
 static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -1125,7 +1126,7 @@ static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
 }
 
 static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index cd95d8ce63..cedb933a0a 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -219,7 +219,7 @@ void device_listener_unregister(DeviceListener *listener)
     QTAILQ_REMOVE(&device_listeners, listener, link);
 }
 
-static void device_realize(DeviceState *dev, Error **errp)
+static void device_realize(DeviceState *dev, Error *errp[static 1])
 {
     DeviceClass *dc = DEVICE_GET_CLASS(dev);
 
@@ -232,7 +232,7 @@ static void device_realize(DeviceState *dev, Error **errp)
     }
 }
 
-static void device_unrealize(DeviceState *dev, Error **errp)
+static void device_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     DeviceClass *dc = DEVICE_GET_CLASS(dev);
 
@@ -309,7 +309,7 @@ void qbus_reset_all_fn(void *opaque)
 
 /* can be used as ->unplug() callback for the simple cases */
 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
-                                  DeviceState *dev, Error **errp)
+                                  DeviceState *dev, Error *errp[static 1])
 {
     /* just zap it */
     object_unparent(OBJECT(dev));
@@ -707,7 +707,7 @@ char *qdev_get_dev_path(DeviceState *dev)
 
 static void qdev_get_legacy_property(Object *obj, Visitor *v,
                                      const char *name, void *opaque,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -736,7 +736,7 @@ static void qdev_get_legacy_property(Object *obj, Visitor *v,
  * will be given names in the "legacy" namespace.
  */
 static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     gchar *name;
 
@@ -766,7 +766,7 @@ static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
  * The type of the QOM property is derived from prop->info.
  */
 void qdev_property_add_static(DeviceState *dev, Property *prop,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     Object *obj = OBJECT(dev);
 
@@ -853,13 +853,13 @@ GSList *qdev_build_hotpluggable_device_list(Object *peripheral)
     return list;
 }
 
-static bool device_get_realized(Object *obj, Error **errp)
+static bool device_get_realized(Object *obj, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     return dev->realized;
 }
 
-static bool check_only_migratable(Object *obj, Error **err)
+static bool check_only_migratable(Object *obj, Error *err[static 1])
 {
     DeviceClass *dc = DEVICE_GET_CLASS(obj);
 
@@ -873,7 +873,8 @@ static bool check_only_migratable(Object *obj, Error **err)
     return true;
 }
 
-static void device_set_realized(Object *obj, bool value, Error **errp)
+static void device_set_realized(Object *obj, bool value,
+                                Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     DeviceClass *dc = DEVICE_GET_CLASS(dev);
@@ -997,7 +998,7 @@ fail:
     }
 }
 
-static bool device_get_hotpluggable(Object *obj, Error **errp)
+static bool device_get_hotpluggable(Object *obj, Error *errp[static 1])
 {
     DeviceClass *dc = DEVICE_GET_CLASS(obj);
     DeviceState *dev = DEVICE(obj);
@@ -1006,7 +1007,7 @@ static bool device_get_hotpluggable(Object *obj, Error **errp)
                                 qbus_is_hotpluggable(dev->parent_bus));
 }
 
-static bool device_get_hotplugged(Object *obj, Error **err)
+static bool device_get_hotplugged(Object *obj, Error *err[static 1])
 {
     DeviceState *dev = DEVICE(obj);
 
diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
index e9f5caee7d..b4eae63b0f 100644
--- a/hw/cpu/a15mpcore.c
+++ b/hw/cpu/a15mpcore.c
@@ -46,7 +46,7 @@ static void a15mp_priv_initfn(Object *obj)
     qdev_prop_set_uint32(gicdev, "revision", 2);
 }
 
-static void a15mp_priv_realize(DeviceState *dev, Error **errp)
+static void a15mp_priv_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     A15MPPrivState *s = A15MPCORE_PRIV(dev);
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index b32fbb7a44..a26228c9c8 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -43,7 +43,7 @@ static void a9mp_priv_initfn(Object *obj)
     qdev_set_parent_bus(DEVICE(&s->wdt), sysbus_get_default());
 }
 
-static void a9mp_priv_realize(DeviceState *dev, Error **errp)
+static void a9mp_priv_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     A9MPPrivState *s = A9MPCORE_PRIV(dev);
diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
index 60336b1c0a..e847fde273 100644
--- a/hw/cpu/arm11mpcore.c
+++ b/hw/cpu/arm11mpcore.c
@@ -64,7 +64,7 @@ static void mpcore_priv_map_setup(ARM11MPCorePriveState *s)
     }
 }
 
-static void mpcore_priv_realize(DeviceState *dev, Error **errp)
+static void mpcore_priv_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     ARM11MPCorePriveState *s = ARM11MPCORE_PRIV(dev);
diff --git a/hw/cpu/core.c b/hw/cpu/core.c
index a10e655d32..2bf05dcdc0 100644
--- a/hw/cpu/core.c
+++ b/hw/cpu/core.c
@@ -12,7 +12,7 @@
 #include "sysemu/cpus.h"
 
 static void core_prop_get_core_id(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     CPUCore *core = CPU_CORE(obj);
     int64_t value = core->core_id;
@@ -21,7 +21,7 @@ static void core_prop_get_core_id(Object *obj, Visitor *v, const char *name,
 }
 
 static void core_prop_set_core_id(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     CPUCore *core = CPU_CORE(obj);
     int64_t value;
@@ -35,7 +35,7 @@ static void core_prop_set_core_id(Object *obj, Visitor *v, const char *name,
 }
 
 static void core_prop_get_nr_threads(Object *obj, Visitor *v, const char *name,
-                                     void *opaque, Error **errp)
+                                     void *opaque, Error *errp[static 1])
 {
     CPUCore *core = CPU_CORE(obj);
     int64_t value = core->nr_threads;
@@ -44,7 +44,7 @@ static void core_prop_get_nr_threads(Object *obj, Visitor *v, const char *name,
 }
 
 static void core_prop_set_nr_threads(Object *obj, Visitor *v, const char *name,
-                                     void *opaque, Error **errp)
+                                     void *opaque, Error *errp[static 1])
 {
     CPUCore *core = CPU_CORE(obj);
     int64_t value;
diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
index be5fad6d74..6a222ae7cf 100644
--- a/hw/cpu/realview_mpcore.c
+++ b/hw/cpu/realview_mpcore.c
@@ -55,7 +55,7 @@ static void mpcore_rirq_set_irq(void *opaque, int irq, int level)
     }
 }
 
-static void realview_mpcore_realize(DeviceState *dev, Error **errp)
+static void realview_mpcore_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     mpcore_rirq_state *s = REALVIEW_MPCORE_RIRQ(dev);
diff --git a/hw/display/ads7846.c b/hw/display/ads7846.c
index 166edade7d..a0b87408b8 100644
--- a/hw/display/ads7846.c
+++ b/hw/display/ads7846.c
@@ -133,7 +133,7 @@ static const VMStateDescription vmstate_ads7846 = {
     }
 };
 
-static void ads7846_realize(SSISlave *d, Error **errp)
+static void ads7846_realize(SSISlave *d, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(d);
     ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, d);
diff --git a/hw/display/bcm2835_fb.c b/hw/display/bcm2835_fb.c
index 7eab927652..33769ef11d 100644
--- a/hw/display/bcm2835_fb.c
+++ b/hw/display/bcm2835_fb.c
@@ -361,7 +361,7 @@ static void bcm2835_fb_reset(DeviceState *dev)
     s->lock = false;
 }
 
-static void bcm2835_fb_realize(DeviceState *dev, Error **errp)
+static void bcm2835_fb_realize(DeviceState *dev, Error *errp[static 1])
 {
     BCM2835FBState *s = BCM2835_FB(dev);
     Error *err = NULL;
diff --git a/hw/display/cg3.c b/hw/display/cg3.c
index 1de15a1d34..487ef7e769 100644
--- a/hw/display/cg3.c
+++ b/hw/display/cg3.c
@@ -293,7 +293,7 @@ static void cg3_initfn(Object *obj)
     sysbus_init_mmio(sbd, &s->reg);
 }
 
-static void cg3_realizefn(DeviceState *dev, Error **errp)
+static void cg3_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     CG3State *s = CG3(dev);
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
index afc290ab91..984b578fa7 100644
--- a/hw/display/cirrus_vga.c
+++ b/hw/display/cirrus_vga.c
@@ -3037,7 +3037,7 @@ static void cirrus_init_common(CirrusVGAState *s, Object *owner,
  *
  ***************************************/
 
-static void isa_cirrus_vga_realizefn(DeviceState *dev, Error **errp)
+static void isa_cirrus_vga_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     ISACirrusVGAState *d = ISA_CIRRUS_VGA(dev);
@@ -3092,7 +3092,7 @@ static const TypeInfo isa_cirrus_vga_info = {
  *
  ***************************************/
 
-static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp)
+static void pci_cirrus_vga_realize(PCIDevice *dev, Error *errp[static 1])
 {
      PCICirrusVGAState *d = PCI_CIRRUS_VGA(dev);
      CirrusVGAState *s = &d->cirrus_vga;
diff --git a/hw/display/exynos4210_fimd.c b/hw/display/exynos4210_fimd.c
index fd0b2bec65..1c887442c8 100644
--- a/hw/display/exynos4210_fimd.c
+++ b/hw/display/exynos4210_fimd.c
@@ -1926,7 +1926,7 @@ static void exynos4210_fimd_init(Object *obj)
     sysbus_init_mmio(dev, &s->iomem);
 }
 
-static void exynos4210_fimd_realize(DeviceState *dev, Error **errp)
+static void exynos4210_fimd_realize(DeviceState *dev, Error *errp[static 1])
 {
     Exynos4210fimdState *s = EXYNOS4210_FIMD(dev);
 
diff --git a/hw/display/jazz_led.c b/hw/display/jazz_led.c
index 3c97d56434..b38296c7eb 100644
--- a/hw/display/jazz_led.c
+++ b/hw/display/jazz_led.c
@@ -276,7 +276,7 @@ static void jazz_led_init(Object *obj)
     sysbus_init_mmio(dev, &s->iomem);
 }
 
-static void jazz_led_realize(DeviceState *dev, Error **errp)
+static void jazz_led_realize(DeviceState *dev, Error *errp[static 1])
 {
     LedState *s = JAZZ_LED(dev);
 
diff --git a/hw/display/milkymist-tmu2.c b/hw/display/milkymist-tmu2.c
index 59120ddb67..f84494a408 100644
--- a/hw/display/milkymist-tmu2.c
+++ b/hw/display/milkymist-tmu2.c
@@ -456,7 +456,7 @@ static void milkymist_tmu2_init(Object *obj)
     sysbus_init_mmio(dev, &s->regs_region);
 }
 
-static void milkymist_tmu2_realize(DeviceState *dev, Error **errp)
+static void milkymist_tmu2_realize(DeviceState *dev, Error *errp[static 1])
 {
     MilkymistTMU2State *s = MILKYMIST_TMU2(dev);
 
diff --git a/hw/display/milkymist-vgafb.c b/hw/display/milkymist-vgafb.c
index 177fdac7d8..ad1d7eba41 100644
--- a/hw/display/milkymist-vgafb.c
+++ b/hw/display/milkymist-vgafb.c
@@ -302,7 +302,7 @@ static void milkymist_vgafb_init(Object *obj)
     sysbus_init_mmio(dev, &s->regs_region);
 }
 
-static void milkymist_vgafb_realize(DeviceState *dev, Error **errp)
+static void milkymist_vgafb_realize(DeviceState *dev, Error *errp[static 1])
 {
     MilkymistVgafbState *s = MILKYMIST_VGAFB(dev);
 
diff --git a/hw/display/pl110.c b/hw/display/pl110.c
index 8c7dcc6f0a..9be0aa24fd 100644
--- a/hw/display/pl110.c
+++ b/hw/display/pl110.c
@@ -466,7 +466,7 @@ static const GraphicHwOps pl110_gfx_ops = {
     .gfx_update  = pl110_update_display,
 };
 
-static void pl110_realize(DeviceState *dev, Error **errp)
+static void pl110_realize(DeviceState *dev, Error *errp[static 1])
 {
     PL110State *s = PL110(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index 0013b29ca5..49546be0eb 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -2048,7 +2048,7 @@ static void qxl_init_ramsize(PCIQXLDevice *qxl)
     qxl->vram_size = pow2ceil(qxl->vram_size);
 }
 
-static void qxl_realize_common(PCIQXLDevice *qxl, Error **errp)
+static void qxl_realize_common(PCIQXLDevice *qxl, Error *errp[static 1])
 {
     uint8_t* config = qxl->pci.config;
     uint32_t pci_device_rev;
@@ -2159,7 +2159,7 @@ static void qxl_realize_common(PCIQXLDevice *qxl, Error **errp)
     qxl->ssd.cursor_bh = qemu_bh_new(qemu_spice_cursor_refresh_bh, &qxl->ssd);
 }
 
-static void qxl_realize_primary(PCIDevice *dev, Error **errp)
+static void qxl_realize_primary(PCIDevice *dev, Error *errp[static 1])
 {
     PCIQXLDevice *qxl = PCI_QXL(dev);
     VGACommonState *vga = &qxl->vga;
@@ -2189,7 +2189,7 @@ static void qxl_realize_primary(PCIDevice *dev, Error **errp)
     register_displaychangelistener(&qxl->ssd.dcl);
 }
 
-static void qxl_realize_secondary(PCIDevice *dev, Error **errp)
+static void qxl_realize_secondary(PCIDevice *dev, Error *errp[static 1])
 {
     static int device_id = 1;
     PCIQXLDevice *qxl = PCI_QXL(dev);
diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index 9d254ef2e1..9874772383 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -1692,7 +1692,7 @@ typedef struct {
     void *chr_state;
 } SM501SysBusState;
 
-static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
+static void sm501_realize_sysbus(DeviceState *dev, Error *errp[static 1])
 {
     SM501SysBusState *s = SYSBUS_SM501(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
@@ -1781,7 +1781,7 @@ typedef struct {
     uint32_t vram_size;
 } SM501PCIState;
 
-static void sm501_realize_pci(PCIDevice *dev, Error **errp)
+static void sm501_realize_pci(PCIDevice *dev, Error *errp[static 1])
 {
     SM501PCIState *s = PCI_SM501(dev);
 
diff --git a/hw/display/ssd0323.c b/hw/display/ssd0323.c
index e182893157..459008f2b7 100644
--- a/hw/display/ssd0323.c
+++ b/hw/display/ssd0323.c
@@ -340,7 +340,7 @@ static const GraphicHwOps ssd0323_ops = {
     .gfx_update  = ssd0323_update_display,
 };
 
-static void ssd0323_realize(SSISlave *d, Error **errp)
+static void ssd0323_realize(SSISlave *d, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(d);
     ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, d);
diff --git a/hw/display/tcx.c b/hw/display/tcx.c
index 6593c1d6af..4c801de5e5 100644
--- a/hw/display/tcx.c
+++ b/hw/display/tcx.c
@@ -803,7 +803,7 @@ static void tcx_initfn(Object *obj)
     sysbus_init_mmio(sbd, &s->alt);
 }
 
-static void tcx_realizefn(DeviceState *dev, Error **errp)
+static void tcx_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     TCXState *s = TCX(dev);
diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c
index 1af95562f2..9ecd584899 100644
--- a/hw/display/vga-isa.c
+++ b/hw/display/vga-isa.c
@@ -51,7 +51,7 @@ static void vga_isa_reset(DeviceState *dev)
     vga_common_reset(s);
 }
 
-static void vga_isa_realizefn(DeviceState *dev, Error **errp)
+static void vga_isa_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     ISAVGAState *d = ISA_VGA(dev);
diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c
index 950fa207b5..f3e0541211 100644
--- a/hw/display/vga-pci.c
+++ b/hw/display/vga-pci.c
@@ -184,14 +184,15 @@ static void pci_vga_qext_write(void *ptr, hwaddr addr,
     }
 }
 
-static bool vga_get_big_endian_fb(Object *obj, Error **errp)
+static bool vga_get_big_endian_fb(Object *obj, Error *errp[static 1])
 {
     PCIVGAState *d = PCI_VGA(PCI_DEVICE(obj));
 
     return d->vga.big_endian_fb;
 }
 
-static void vga_set_big_endian_fb(Object *obj, bool value, Error **errp)
+static void vga_set_big_endian_fb(Object *obj, bool value,
+                                  Error *errp[static 1])
 {
     PCIVGAState *d = PCI_VGA(PCI_DEVICE(obj));
 
@@ -229,7 +230,7 @@ void pci_std_vga_mmio_region_init(VGACommonState *s,
     }
 }
 
-static void pci_std_vga_realize(PCIDevice *dev, Error **errp)
+static void pci_std_vga_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIVGAState *d = PCI_VGA(dev);
     VGACommonState *s = &d->vga;
@@ -272,7 +273,7 @@ static void pci_std_vga_init(Object *obj)
                              IGNORE_ERRORS);
 }
 
-static void pci_secondary_vga_realize(PCIDevice *dev, Error **errp)
+static void pci_secondary_vga_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIVGAState *d = PCI_VGA(dev);
     VGACommonState *s = &d->vga;
diff --git a/hw/display/virtio-gpu-pci.c b/hw/display/virtio-gpu-pci.c
index ef92c4ad6f..83fddfbca4 100644
--- a/hw/display/virtio-gpu-pci.c
+++ b/hw/display/virtio-gpu-pci.c
@@ -22,7 +22,8 @@ static Property virtio_gpu_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_gpu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_gpu_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                   Error *errp[static 1])
 {
     VirtIOGPUPCI *vgpu = VIRTIO_GPU_PCI(vpci_dev);
     VirtIOGPU *g = &vgpu->vdev;
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 9c8ecd2d87..470d2b62e0 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -155,7 +155,7 @@ static void virtio_gpu_set_config(VirtIODevice *vdev, const uint8_t *config)
 }
 
 static uint64_t virtio_gpu_get_features(VirtIODevice *vdev, uint64_t features,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     VirtIOGPU *g = VIRTIO_GPU(vdev);
 
@@ -1099,7 +1099,8 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
     return 0;
 }
 
-static void virtio_gpu_device_realize(DeviceState *qdev, Error **errp)
+static void virtio_gpu_device_realize(DeviceState *qdev,
+                                      Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(qdev);
     VirtIOGPU *g = VIRTIO_GPU(qdev);
@@ -1166,7 +1167,8 @@ static void virtio_gpu_device_realize(DeviceState *qdev, Error **errp)
     }
 }
 
-static void virtio_gpu_device_unrealize(DeviceState *qdev, Error **errp)
+static void virtio_gpu_device_unrealize(DeviceState *qdev,
+                                        Error *errp[static 1])
 {
     VirtIOGPU *g = VIRTIO_GPU(qdev);
     if (g->migration_blocker) {
diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
index f18484e333..b6b5ec64ef 100644
--- a/hw/display/virtio-vga.c
+++ b/hw/display/virtio-vga.c
@@ -96,7 +96,8 @@ static const VMStateDescription vmstate_virtio_vga = {
 };
 
 /* VGA device wrapper around PCI device around virtio GPU */
-static void virtio_vga_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_vga_realize(VirtIOPCIProxy *vpci_dev,
+                               Error *errp[static 1])
 {
     VirtIOVGA *vvga = VIRTIO_VGA(vpci_dev);
     VirtIOGPU *g = &vvga->vdev;
diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
index ec5f27d67e..5d288328c4 100644
--- a/hw/display/vmware_vga.c
+++ b/hw/display/vmware_vga.c
@@ -1294,7 +1294,7 @@ static const MemoryRegionOps vmsvga_io_ops = {
     },
 };
 
-static void pci_vmsvga_realize(PCIDevice *dev, Error **errp)
+static void pci_vmsvga_realize(PCIDevice *dev, Error *errp[static 1])
 {
     struct pci_vmsvga_state_s *s = VMWARE_SVGA(dev);
 
diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c
index f7b7b80c68..96013aef27 100644
--- a/hw/display/xlnx_dp.c
+++ b/hw/display/xlnx_dp.c
@@ -516,7 +516,7 @@ static void xlnx_dp_aux_set_command(XlnxDPState *s, uint32_t value)
 }
 
 static void xlnx_dp_set_dpdma(Object *obj, const char *name, Object *val,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     XlnxDPState *s = XLNX_DP(obj);
     if (s->console) {
@@ -1236,7 +1236,7 @@ static void xlnx_dp_init(Object *obj)
     fifo8_create(&s->tx_fifo, 16);
 }
 
-static void xlnx_dp_realize(DeviceState *dev, Error **errp)
+static void xlnx_dp_realize(DeviceState *dev, Error *errp[static 1])
 {
     XlnxDPState *s = XLNX_DP(dev);
     DisplaySurface *surface;
diff --git a/hw/dma/bcm2835_dma.c b/hw/dma/bcm2835_dma.c
index 5d144a2633..43bf537b5f 100644
--- a/hw/dma/bcm2835_dma.c
+++ b/hw/dma/bcm2835_dma.c
@@ -366,7 +366,7 @@ static void bcm2835_dma_reset(DeviceState *dev)
     }
 }
 
-static void bcm2835_dma_realize(DeviceState *dev, Error **errp)
+static void bcm2835_dma_realize(DeviceState *dev, Error *errp[static 1])
 {
     BCM2835DMAState *s = BCM2835_DMA(dev);
     Error *err = NULL;
diff --git a/hw/dma/i82374.c b/hw/dma/i82374.c
index 6c0f975df0..d00336c84d 100644
--- a/hw/dma/i82374.c
+++ b/hw/dma/i82374.c
@@ -114,7 +114,7 @@ static const MemoryRegionPortio i82374_portio_list[] = {
     PORTIO_END_OF_LIST(),
 };
 
-static void i82374_realize(DeviceState *dev, Error **errp)
+static void i82374_realize(DeviceState *dev, Error *errp[static 1])
 {
     I82374State *s = I82374(dev);
 
diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
index bd23e893bf..2be3a71de3 100644
--- a/hw/dma/i8257.c
+++ b/hw/dma/i8257.c
@@ -542,7 +542,7 @@ static const VMStateDescription vmstate_i8257 = {
     }
 };
 
-static void i8257_realize(DeviceState *dev, Error **errp)
+static void i8257_realize(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isa = ISA_DEVICE(dev);
     I8257State *d = I8257(dev);
diff --git a/hw/dma/pl330.c b/hw/dma/pl330.c
index 32cf8399b8..007621a844 100644
--- a/hw/dma/pl330.c
+++ b/hw/dma/pl330.c
@@ -1537,7 +1537,7 @@ static void pl330_reset(DeviceState *d)
     timer_del(s->timer);
 }
 
-static void pl330_realize(DeviceState *dev, Error **errp)
+static void pl330_realize(DeviceState *dev, Error *errp[static 1])
 {
     int i;
     PL330State *s = PL330(dev);
diff --git a/hw/dma/pxa2xx_dma.c b/hw/dma/pxa2xx_dma.c
index 634a4328f0..80576f89f9 100644
--- a/hw/dma/pxa2xx_dma.c
+++ b/hw/dma/pxa2xx_dma.c
@@ -467,7 +467,7 @@ static void pxa2xx_dma_init(Object *obj)
     sysbus_init_irq(sbd, &s->irq);
 }
 
-static void pxa2xx_dma_realize(DeviceState *dev, Error **errp)
+static void pxa2xx_dma_realize(DeviceState *dev, Error *errp[static 1])
 {
     PXA2xxDMAState *s = PXA2XX_DMA(dev);
     int i;
diff --git a/hw/dma/rc4030.c b/hw/dma/rc4030.c
index edf9432051..356b07fb1f 100644
--- a/hw/dma/rc4030.c
+++ b/hw/dma/rc4030.c
@@ -664,7 +664,7 @@ static void rc4030_initfn(Object *obj)
     sysbus_init_mmio(sysbus, &s->iomem_jazzio);
 }
 
-static void rc4030_realize(DeviceState *dev, Error **errp)
+static void rc4030_realize(DeviceState *dev, Error *errp[static 1])
 {
     rc4030State *s = RC4030(dev);
     Object *o = OBJECT(dev);
@@ -682,7 +682,7 @@ static void rc4030_realize(DeviceState *dev, Error **errp)
     address_space_init(&s->dma_as, &s->dma_mr, "rc4030-dma");
 }
 
-static void rc4030_unrealize(DeviceState *dev, Error **errp)
+static void rc4030_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     rc4030State *s = RC4030(dev);
 
diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index eb491b50ca..86eeb66eb9 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -284,7 +284,7 @@ static void sparc32_dma_init(Object *obj)
     qdev_init_gpio_out(dev, s->gpio, 2);
 }
 
-static void sparc32_dma_realize(DeviceState *dev, Error **errp)
+static void sparc32_dma_realize(DeviceState *dev, Error *errp[static 1])
 {
     DMAState *s = SPARC32_DMA(dev);
     int reg_size;
diff --git a/hw/dma/xilinx_axidma.c b/hw/dma/xilinx_axidma.c
index 3987b5ff96..a6b299c50b 100644
--- a/hw/dma/xilinx_axidma.c
+++ b/hw/dma/xilinx_axidma.c
@@ -514,7 +514,7 @@ static const MemoryRegionOps axidma_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void xilinx_axidma_realize(DeviceState *dev, Error **errp)
+static void xilinx_axidma_realize(DeviceState *dev, Error *errp[static 1])
 {
     XilinxAXIDMA *s = XILINX_AXI_DMA(dev);
     XilinxAXIDMAStreamSlave *ds = XILINX_AXI_DMA_DATA_STREAM(&s->rx_data_dev);
diff --git a/hw/gpio/bcm2835_gpio.c b/hw/gpio/bcm2835_gpio.c
index acc2e3cf9e..7622aa07f5 100644
--- a/hw/gpio/bcm2835_gpio.c
+++ b/hw/gpio/bcm2835_gpio.c
@@ -305,7 +305,7 @@ static void bcm2835_gpio_init(Object *obj)
     qdev_init_gpio_out(dev, s->out, 54);
 }
 
-static void bcm2835_gpio_realize(DeviceState *dev, Error **errp)
+static void bcm2835_gpio_realize(DeviceState *dev, Error *errp[static 1])
 {
     BCM2835GpioState *s = BCM2835_GPIO(dev);
     Object *obj;
diff --git a/hw/gpio/gpio_key.c b/hw/gpio/gpio_key.c
index b34aa49dfb..d7e4186e49 100644
--- a/hw/gpio/gpio_key.c
+++ b/hw/gpio/gpio_key.c
@@ -71,7 +71,7 @@ static void gpio_key_set_irq(void *opaque, int irq, int level)
               qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + GPIO_KEY_LATENCY);
 }
 
-static void gpio_key_realize(DeviceState *dev, Error **errp)
+static void gpio_key_realize(DeviceState *dev, Error *errp[static 1])
 {
     GPIOKEYState *s = GPIOKEY(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/gpio/imx_gpio.c b/hw/gpio/imx_gpio.c
index c36c394fda..ead1ff2ec6 100644
--- a/hw/gpio/imx_gpio.c
+++ b/hw/gpio/imx_gpio.c
@@ -310,7 +310,7 @@ static void imx_gpio_reset(DeviceState *dev)
     imx_gpio_update_int(s);
 }
 
-static void imx_gpio_realize(DeviceState *dev, Error **errp)
+static void imx_gpio_realize(DeviceState *dev, Error *errp[static 1])
 {
     IMXGPIOState *s = IMX_GPIO(dev);
 
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
index 1df394eb12..83181a1153 100644
--- a/hw/gpio/omap_gpio.c
+++ b/hw/gpio/omap_gpio.c
@@ -693,7 +693,7 @@ static void omap_gpio_init(Object *obj)
     sysbus_init_mmio(sbd, &s->iomem);
 }
 
-static void omap_gpio_realize(DeviceState *dev, Error **errp)
+static void omap_gpio_realize(DeviceState *dev, Error *errp[static 1])
 {
     struct omap_gpif_s *s = OMAP1_GPIO(dev);
 
@@ -702,7 +702,7 @@ static void omap_gpio_realize(DeviceState *dev, Error **errp)
     }
 }
 
-static void omap2_gpio_realize(DeviceState *dev, Error **errp)
+static void omap2_gpio_realize(DeviceState *dev, Error *errp[static 1])
 {
     struct omap2_gpif_s *s = OMAP2_GPIO(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
index c762c7366a..4545fed5f0 100644
--- a/hw/i2c/aspeed_i2c.c
+++ b/hw/i2c/aspeed_i2c.c
@@ -422,7 +422,7 @@ static void aspeed_i2c_reset(DeviceState *dev)
  *   0x480 ... 0x4BF: Device 14
  *   0x800 ... 0xFFF: Buffer Pool  (unused in linux driver)
  */
-static void aspeed_i2c_realize(DeviceState *dev, Error **errp)
+static void aspeed_i2c_realize(DeviceState *dev, Error *errp[static 1])
 {
     int i;
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/i2c/imx_i2c.c b/hw/i2c/imx_i2c.c
index 6c81b98ebd..1331260745 100644
--- a/hw/i2c/imx_i2c.c
+++ b/hw/i2c/imx_i2c.c
@@ -302,7 +302,7 @@ static const VMStateDescription imx_i2c_vmstate = {
     }
 };
 
-static void imx_i2c_realize(DeviceState *dev, Error **errp)
+static void imx_i2c_realize(DeviceState *dev, Error *errp[static 1])
 {
     IMXI2CState *s = IMX_I2C(dev);
 
diff --git a/hw/i2c/omap_i2c.c b/hw/i2c/omap_i2c.c
index f6e80bee25..352d7c94d1 100644
--- a/hw/i2c/omap_i2c.c
+++ b/hw/i2c/omap_i2c.c
@@ -459,7 +459,7 @@ static void omap_i2c_init(Object *obj)
     s->bus = i2c_init_bus(dev, NULL);
 }
 
-static void omap_i2c_realize(DeviceState *dev, Error **errp)
+static void omap_i2c_realize(DeviceState *dev, Error *errp[static 1])
 {
     OMAPI2CState *s = OMAP_I2C(dev);
 
diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c
index ea51e09186..e4f0f23d84 100644
--- a/hw/i2c/smbus_ich9.c
+++ b/hw/i2c/smbus_ich9.c
@@ -71,7 +71,7 @@ static void ich9_smbus_write_config(PCIDevice *d, uint32_t address,
     }
 }
 
-static void ich9_smbus_realize(PCIDevice *d, Error **errp)
+static void ich9_smbus_realize(PCIDevice *d, Error *errp[static 1])
 {
     ICH9SMBState *s = ICH9_SMB_DEVICE(d);
 
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
index 7b6d4ea3f3..3aba398d31 100644
--- a/hw/i386/amd_iommu.c
+++ b/hw/i386/amd_iommu.c
@@ -1133,7 +1133,7 @@ static void amdvi_reset(DeviceState *dev)
     amdvi_init(s);
 }
 
-static void amdvi_realize(DeviceState *dev, Error **err)
+static void amdvi_realize(DeviceState *dev, Error *err[static 1])
 {
     int ret = 0;
     AMDVIState *s = AMD_IOMMU_DEVICE(dev);
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index 15610b9de8..c1db89be67 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -3072,7 +3072,7 @@ static AddressSpace *vtd_host_dma_iommu(PCIBus *bus, void *opaque, int devfn)
     return &vtd_as->as;
 }
 
-static bool vtd_decide_config(IntelIOMMUState *s, Error **errp)
+static bool vtd_decide_config(IntelIOMMUState *s, Error *errp[static 1])
 {
     X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s);
 
@@ -3108,7 +3108,7 @@ static bool vtd_decide_config(IntelIOMMUState *s, Error **errp)
     return true;
 }
 
-static void vtd_realize(DeviceState *dev, Error **errp)
+static void vtd_realize(DeviceState *dev, Error *errp[static 1])
 {
     MachineState *ms = MACHINE(qdev_get_machine());
     MachineClass *mc = MACHINE_GET_CLASS(ms);
diff --git a/hw/i386/kvm/apic.c b/hw/i386/kvm/apic.c
index 1df6d26816..ec06d28e9c 100644
--- a/hw/i386/kvm/apic.c
+++ b/hw/i386/kvm/apic.c
@@ -217,7 +217,7 @@ static void kvm_apic_reset(APICCommonState *s)
     run_on_cpu(CPU(s->cpu), kvm_apic_put, RUN_ON_CPU_HOST_PTR(s));
 }
 
-static void kvm_apic_realize(DeviceState *dev, Error **errp)
+static void kvm_apic_realize(DeviceState *dev, Error *errp[static 1])
 {
     APICCommonState *s = APIC_COMMON(dev);
 
@@ -229,7 +229,7 @@ static void kvm_apic_realize(DeviceState *dev, Error **errp)
     }
 }
 
-static void kvm_apic_unrealize(DeviceState *dev, Error **errp)
+static void kvm_apic_unrealize(DeviceState *dev, Error *errp[static 1])
 {
 }
 
diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c
index 363d1b5743..7454163a7e 100644
--- a/hw/i386/kvm/clock.c
+++ b/hw/i386/kvm/clock.c
@@ -208,7 +208,7 @@ static void kvmclock_vm_state_change(void *opaque, int running,
     }
 }
 
-static void kvmclock_realize(DeviceState *dev, Error **errp)
+static void kvmclock_realize(DeviceState *dev, Error *errp[static 1])
 {
     KVMClockState *s = KVM_CLOCK(dev);
 
diff --git a/hw/i386/kvm/i8254.c b/hw/i386/kvm/i8254.c
index 521a58498a..3b458276fb 100644
--- a/hw/i386/kvm/i8254.c
+++ b/hw/i386/kvm/i8254.c
@@ -252,7 +252,7 @@ static void kvm_pit_vm_state_change(void *opaque, int running,
     }
 }
 
-static void kvm_pit_realizefn(DeviceState *dev, Error **errp)
+static void kvm_pit_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     PITCommonState *pit = PIT_COMMON(dev);
     KVMPITClass *kpc = KVM_PIT_GET_CLASS(dev);
diff --git a/hw/i386/kvm/i8259.c b/hw/i386/kvm/i8259.c
index 11d1b726b6..b5ef982283 100644
--- a/hw/i386/kvm/i8259.c
+++ b/hw/i386/kvm/i8259.c
@@ -115,7 +115,7 @@ static void kvm_pic_set_irq(void *opaque, int irq, int level)
     apic_report_irq_delivered(delivered);
 }
 
-static void kvm_pic_realize(DeviceState *dev, Error **errp)
+static void kvm_pic_realize(DeviceState *dev, Error *errp[static 1])
 {
     PICCommonState *s = PIC_COMMON(dev);
     KVMPICClass *kpc = KVM_PIC_GET_CLASS(dev);
diff --git a/hw/i386/kvm/ioapic.c b/hw/i386/kvm/ioapic.c
index 98ca480792..fb9fc2908a 100644
--- a/hw/i386/kvm/ioapic.c
+++ b/hw/i386/kvm/ioapic.c
@@ -138,7 +138,7 @@ static void kvm_ioapic_set_irq(void *opaque, int irq, int level)
     apic_report_irq_delivered(delivered);
 }
 
-static void kvm_ioapic_realize(DeviceState *dev, Error **errp)
+static void kvm_ioapic_realize(DeviceState *dev, Error *errp[static 1])
 {
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
 
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index 194ebb70f3..47ab2aa43a 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -387,7 +387,7 @@ static uint8_t pci_find_cap_offset(PCIDevice *d, uint8_t cap, uint8_t start)
 static void assigned_dev_register_regions(PCIRegion *io_regions,
                                           unsigned long regions_num,
                                           AssignedDevice *pci_dev,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     uint32_t i;
     PCIRegion *cur_region = io_regions;
@@ -490,7 +490,7 @@ static void assigned_dev_register_regions(PCIRegion *io_regions,
 }
 
 static void get_real_id(const char *devpath, const char *idname, uint16_t *val,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     FILE *f;
     char name[128];
@@ -511,18 +511,18 @@ static void get_real_id(const char *devpath, const char *idname, uint16_t *val,
 }
 
 static void get_real_vendor_id(const char *devpath, uint16_t *val,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     get_real_id(devpath, "vendor", val, errp);
 }
 
 static void get_real_device_id(const char *devpath, uint16_t *val,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     get_real_id(devpath, "device", val, errp);
 }
 
-static void get_real_device(AssignedDevice *pci_dev, Error **errp)
+static void get_real_device(AssignedDevice *pci_dev, Error *errp[static 1])
 {
     char dir[128], name[128];
     int fd, r = 0;
@@ -779,7 +779,7 @@ fail:
     return g_strdup("Couldn't find out why.\n");
 }
 
-static void assign_device(AssignedDevice *dev, Error **errp)
+static void assign_device(AssignedDevice *dev, Error *errp[static 1])
 {
     uint32_t flags = KVM_DEV_ASSIGN_ENABLE_IOMMU;
     int r;
@@ -824,7 +824,7 @@ static void assign_device(AssignedDevice *dev, Error **errp)
     }
 }
 
-static void verify_irqchip_in_kernel(Error **errp)
+static void verify_irqchip_in_kernel(Error *errp[static 1])
 {
     if (kvm_irqchip_in_kernel()) {
         return;
@@ -832,7 +832,7 @@ static void verify_irqchip_in_kernel(Error **errp)
     error_setg(errp, "pci-assign requires KVM with in-kernel irqchip enabled");
 }
 
-static int assign_intx(AssignedDevice *dev, Error **errp)
+static int assign_intx(AssignedDevice *dev, Error *errp[static 1])
 {
     AssignedIRQType new_type;
     PCIINTxRoute intx_route;
@@ -1639,7 +1639,8 @@ static void assigned_dev_msix_reset(AssignedDevice *dev)
     }
 }
 
-static void assigned_dev_register_msix_mmio(AssignedDevice *dev, Error **errp)
+static void assigned_dev_register_msix_mmio(AssignedDevice *dev,
+                                            Error *errp[static 1])
 {
     dev->msix_table = mmap(NULL, dev->msix_table_size, PROT_READ | PROT_WRITE,
                            MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
@@ -1730,7 +1731,7 @@ static void reset_assigned_device(DeviceState *dev)
     assigned_dev_pci_write_config(pci_dev, PCI_COMMAND, 0, 1);
 }
 
-static void assigned_realize(struct PCIDevice *pci_dev, Error **errp)
+static void assigned_realize(struct PCIDevice *pci_dev, Error *errp[static 1])
 {
     AssignedDevice *dev = PCI_ASSIGN(pci_dev);
     uint8_t e_intx;
diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c
index 82a49556af..cf02933e3a 100644
--- a/hw/i386/kvmvapic.c
+++ b/hw/i386/kvmvapic.c
@@ -724,7 +724,7 @@ static const MemoryRegionOps vapic_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void vapic_realize(DeviceState *dev, Error **errp)
+static void vapic_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     VAPICROMState *s = VAPIC(dev);
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 7ce0ed96de..96977e1d6d 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -261,7 +261,8 @@ static int boot_device2nibble(char boot_device)
     return 0;
 }
 
-static void set_boot_dev(ISADevice *s, const char *boot_device, Error **errp)
+static void set_boot_dev(ISADevice *s, const char *boot_device,
+                         Error *errp[static 1])
 {
 #define PC_MAX_BOOT_DEVICES 3
     int nbds, bds[3] = { 0, };
@@ -284,7 +285,8 @@ static void set_boot_dev(ISADevice *s, const char *boot_device, Error **errp)
     rtc_set_memory(s, 0x38, (bds[2] << 4) | (fd_bootchk ? 0x0 : 0x1));
 }
 
-static void pc_boot_set(void *opaque, const char *boot_device, Error **errp)
+static void pc_boot_set(void *opaque, const char *boot_device,
+                        Error *errp[static 1])
 {
     set_boot_dev(opaque, boot_device, errp);
 }
@@ -578,7 +580,7 @@ static void port92_initfn(Object *obj)
     qdev_init_gpio_out_named(DEVICE(obj), &s->a20_out, PORT92_A20_LINE, 1);
 }
 
-static void port92_realizefn(DeviceState *dev, Error **errp)
+static void port92_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     Port92State *s = PORT92(dev);
@@ -1092,7 +1094,8 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level)
     }
 }
 
-static void pc_new_cpu(const char *typename, int64_t apic_id, Error **errp)
+static void pc_new_cpu(const char *typename, int64_t apic_id,
+                       Error *errp[static 1])
 {
     Object *cpu = NULL;
     Error *local_err = NULL;
@@ -1106,7 +1109,7 @@ static void pc_new_cpu(const char *typename, int64_t apic_id, Error **errp)
     error_propagate(errp, local_err);
 }
 
-void pc_hot_add_cpu(const int64_t id, Error **errp)
+void pc_hot_add_cpu(const int64_t id, Error *errp[static 1])
 {
     ObjectClass *oc;
     MachineState *ms = MACHINE(qdev_get_machine());
@@ -1681,7 +1684,7 @@ void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name)
 }
 
 static void pc_dimm_plug(HotplugHandler *hotplug_dev,
-                         DeviceState *dev, Error **errp)
+                         DeviceState *dev, Error *errp[static 1])
 {
     HotplugHandlerClass *hhc;
     Error *local_err = NULL;
@@ -1723,7 +1726,7 @@ out:
 }
 
 static void pc_dimm_unplug_request(HotplugHandler *hotplug_dev,
-                                   DeviceState *dev, Error **errp)
+                                   DeviceState *dev, Error *errp[static 1])
 {
     HotplugHandlerClass *hhc;
     Error *local_err = NULL;
@@ -1749,7 +1752,7 @@ out:
 }
 
 static void pc_dimm_unplug(HotplugHandler *hotplug_dev,
-                           DeviceState *dev, Error **errp)
+                           DeviceState *dev, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
     PCDIMMDevice *dimm = PC_DIMM(dev);
@@ -1799,7 +1802,7 @@ static CPUArchId *pc_find_cpu_slot(MachineState *ms, uint32_t id, int *idx)
 }
 
 static void pc_cpu_plug(HotplugHandler *hotplug_dev,
-                        DeviceState *dev, Error **errp)
+                        DeviceState *dev, Error *errp[static 1])
 {
     CPUArchId *found_cpu;
     HotplugHandlerClass *hhc;
@@ -1830,7 +1833,7 @@ out:
     error_propagate(errp, local_err);
 }
 static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                     DeviceState *dev, Error **errp)
+                                     DeviceState *dev, Error *errp[static 1])
 {
     int idx = -1;
     HotplugHandlerClass *hhc;
@@ -1858,7 +1861,7 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
 }
 
 static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev,
-                             DeviceState *dev, Error **errp)
+                             DeviceState *dev, Error *errp[static 1])
 {
     CPUArchId *found_cpu;
     HotplugHandlerClass *hhc;
@@ -1887,7 +1890,7 @@ static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev,
 }
 
 static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
-                            DeviceState *dev, Error **errp)
+                            DeviceState *dev, Error *errp[static 1])
 {
     int idx;
     CPUState *cs;
@@ -1984,7 +1987,8 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
 }
 
 static void pc_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
-                                          DeviceState *dev, Error **errp)
+                                          DeviceState *dev,
+                                          Error *errp[static 1])
 {
     if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
         pc_cpu_pre_plug(hotplug_dev, dev, errp);
@@ -1992,7 +1996,7 @@ static void pc_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
 }
 
 static void pc_machine_device_plug_cb(HotplugHandler *hotplug_dev,
-                                      DeviceState *dev, Error **errp)
+                                      DeviceState *dev, Error *errp[static 1])
 {
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         pc_dimm_plug(hotplug_dev, dev, errp);
@@ -2002,7 +2006,8 @@ static void pc_machine_device_plug_cb(HotplugHandler *hotplug_dev,
 }
 
 static void pc_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                                DeviceState *dev, Error **errp)
+                                                DeviceState *dev,
+                                                Error *errp[static 1])
 {
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         pc_dimm_unplug_request(hotplug_dev, dev, errp);
@@ -2015,7 +2020,8 @@ static void pc_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
 }
 
 static void pc_machine_device_unplug_cb(HotplugHandler *hotplug_dev,
-                                        DeviceState *dev, Error **errp)
+                                        DeviceState *dev,
+                                        Error *errp[static 1])
 {
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         pc_dimm_unplug(hotplug_dev, dev, errp);
@@ -2044,7 +2050,7 @@ static HotplugHandler *pc_get_hotpug_handler(MachineState *machine,
 static void
 pc_machine_get_hotplug_memory_region_size(Object *obj, Visitor *v,
                                           const char *name, void *opaque,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
     int64_t value = memory_region_size(&pcms->hotplug_memory.mr);
@@ -2054,7 +2060,7 @@ pc_machine_get_hotplug_memory_region_size(Object *obj, Visitor *v,
 
 static void pc_machine_get_max_ram_below_4g(Object *obj, Visitor *v,
                                             const char *name, void *opaque,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
     uint64_t value = pcms->max_ram_below_4g;
@@ -2064,7 +2070,7 @@ static void pc_machine_get_max_ram_below_4g(Object *obj, Visitor *v,
 
 static void pc_machine_set_max_ram_below_4g(Object *obj, Visitor *v,
                                             const char *name, void *opaque,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
     Error *error = NULL;
@@ -2093,7 +2099,7 @@ static void pc_machine_set_max_ram_below_4g(Object *obj, Visitor *v,
 }
 
 static void pc_machine_get_vmport(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
     OnOffAuto vmport = pcms->vmport;
@@ -2102,7 +2108,7 @@ static void pc_machine_get_vmport(Object *obj, Visitor *v, const char *name,
 }
 
 static void pc_machine_set_vmport(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
@@ -2135,7 +2141,7 @@ bool pc_machine_is_smm_enabled(PCMachineState *pcms)
 }
 
 static void pc_machine_get_smm(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
     OnOffAuto smm = pcms->smm;
@@ -2144,63 +2150,66 @@ static void pc_machine_get_smm(Object *obj, Visitor *v, const char *name,
 }
 
 static void pc_machine_set_smm(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
     visit_type_OnOffAuto(v, name, &pcms->smm, errp);
 }
 
-static bool pc_machine_get_nvdimm(Object *obj, Error **errp)
+static bool pc_machine_get_nvdimm(Object *obj, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
     return pcms->acpi_nvdimm_state.is_enabled;
 }
 
-static void pc_machine_set_nvdimm(Object *obj, bool value, Error **errp)
+static void pc_machine_set_nvdimm(Object *obj, bool value,
+                                  Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
     pcms->acpi_nvdimm_state.is_enabled = value;
 }
 
-static bool pc_machine_get_smbus(Object *obj, Error **errp)
+static bool pc_machine_get_smbus(Object *obj, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
     return pcms->smbus;
 }
 
-static void pc_machine_set_smbus(Object *obj, bool value, Error **errp)
+static void pc_machine_set_smbus(Object *obj, bool value,
+                                 Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
     pcms->smbus = value;
 }
 
-static bool pc_machine_get_sata(Object *obj, Error **errp)
+static bool pc_machine_get_sata(Object *obj, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
     return pcms->sata;
 }
 
-static void pc_machine_set_sata(Object *obj, bool value, Error **errp)
+static void pc_machine_set_sata(Object *obj, bool value,
+                                Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
     pcms->sata = value;
 }
 
-static bool pc_machine_get_pit(Object *obj, Error **errp)
+static bool pc_machine_get_pit(Object *obj, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
     return pcms->pit;
 }
 
-static void pc_machine_set_pit(Object *obj, bool value, Error **errp)
+static void pc_machine_set_pit(Object *obj, bool value, Error *errp[static 1])
 {
     PCMachineState *pcms = PC_MACHINE(obj);
 
@@ -2294,7 +2303,7 @@ static const CPUArchIdList *pc_possible_cpu_arch_ids(MachineState *ms)
     return ms->possible_cpus;
 }
 
-static void x86_nmi(NMIState *n, int cpu_index, Error **errp)
+static void x86_nmi(NMIState *n, int cpu_index, Error *errp[static 1])
 {
     /* cpu index isn't used */
     CPUState *cs;
diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c
index 293caf83ef..3ca5142e81 100644
--- a/hw/i386/x86-iommu.c
+++ b/hw/i386/x86-iommu.c
@@ -76,7 +76,7 @@ IommuType x86_iommu_get_type(void)
     return x86_iommu_default->type;
 }
 
-static void x86_iommu_realize(DeviceState *dev, Error **errp)
+static void x86_iommu_realize(DeviceState *dev, Error *errp[static 1])
 {
     X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(dev);
     X86IOMMUClass *x86_class = X86_IOMMU_GET_CLASS(dev);
diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
index 1acd4de405..bf281a1967 100644
--- a/hw/i386/xen/xen-hvm.c
+++ b/hw/i386/xen/xen-hvm.c
@@ -239,7 +239,7 @@ static void xen_ram_init(PCMachineState *pcms,
 }
 
 void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,
-                   Error **errp)
+                   Error *errp[static 1])
 {
     unsigned long nr_pfn;
     xen_pfn_t *pfn_list;
@@ -1421,7 +1421,7 @@ void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length)
     }
 }
 
-void qmp_xen_set_global_dirty_log(bool enable, Error **errp)
+void qmp_xen_set_global_dirty_log(bool enable, Error *errp[static 1])
 {
     if (enable) {
         memory_global_dirty_log_start();
diff --git a/hw/i386/xen/xen_apic.c b/hw/i386/xen/xen_apic.c
index 55769eba7e..f99779f6cc 100644
--- a/hw/i386/xen/xen_apic.c
+++ b/hw/i386/xen/xen_apic.c
@@ -37,7 +37,7 @@ static const MemoryRegionOps xen_apic_io_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void xen_apic_realize(DeviceState *dev, Error **errp)
+static void xen_apic_realize(DeviceState *dev, Error *errp[static 1])
 {
     APICCommonState *s = APIC_COMMON(dev);
 
diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c
index 1419fc96d2..bffd503de5 100644
--- a/hw/i386/xen/xen_platform.c
+++ b/hw/i386/xen/xen_platform.c
@@ -423,7 +423,7 @@ static const VMStateDescription vmstate_xen_platform = {
     }
 };
 
-static void xen_platform_realize(PCIDevice *dev, Error **errp)
+static void xen_platform_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIXenPlatformState *d = XEN_PLATFORM(dev);
     uint8_t *pci_conf;
diff --git a/hw/i386/xen/xen_pvdevice.c b/hw/i386/xen/xen_pvdevice.c
index c093b34458..f712a86fce 100644
--- a/hw/i386/xen/xen_pvdevice.c
+++ b/hw/i386/xen/xen_pvdevice.c
@@ -71,7 +71,7 @@ static const MemoryRegionOps xen_pv_mmio_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void xen_pv_realize(PCIDevice *pci_dev, Error **errp)
+static void xen_pv_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     XenPVDevice *d = XEN_PV_DEVICE(pci_dev);
     uint8_t *pci_conf;
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index f60826d6e0..86cba82270 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1700,7 +1700,7 @@ static void sysbus_ahci_init(Object *obj)
     sysbus_init_irq(sbd, &s->ahci.irq);
 }
 
-static void sysbus_ahci_realize(DeviceState *dev, Error **errp)
+static void sysbus_ahci_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysbusAHCIState *s = SYSBUS_AHCI(dev);
 
diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c
index 9ebb8d4fb2..e6c4e30bf4 100644
--- a/hw/ide/cmd646.c
+++ b/hw/ide/cmd646.c
@@ -327,7 +327,7 @@ static void cmd646_pci_config_write(PCIDevice *d, uint32_t addr, uint32_t val,
 }
 
 /* CMD646 PCI IDE controller */
-static void pci_cmd646_ide_realize(PCIDevice *dev, Error **errp)
+static void pci_cmd646_ide_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIIDEState *d = PCI_IDE(dev);
     uint8_t *pci_conf = dev->config;
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 0b48b64d3a..117a2e54c6 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -1120,7 +1120,7 @@ static void ide_cfata_metadata_write(IDEState *s)
 }
 
 /* called when the inserted state of the media has changed */
-static void ide_cd_change_cb(void *opaque, bool load, Error **errp)
+static void ide_cd_change_cb(void *opaque, bool load, Error *errp[static 1])
 {
     IDEState *s = opaque;
     uint64_t nb_sectors;
diff --git a/hw/ide/ich.c b/hw/ide/ich.c
index 519d3d5e16..d04e9d9d06 100644
--- a/hw/ide/ich.c
+++ b/hw/ide/ich.c
@@ -105,7 +105,7 @@ static void pci_ich9_ahci_init(Object *obj)
     ahci_init(&d->ahci, DEVICE(obj));
 }
 
-static void pci_ich9_ahci_realize(PCIDevice *dev, Error **errp)
+static void pci_ich9_ahci_realize(PCIDevice *dev, Error *errp[static 1])
 {
     struct AHCIPCIState *d;
     int sata_cap_offset;
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 40213d662c..bab1588837 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -65,7 +65,7 @@ static const VMStateDescription vmstate_ide_isa = {
     }
 };
 
-static void isa_ide_realizefn(DeviceState *dev, Error **errp)
+static void isa_ide_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     ISAIDEState *s = ISA_IDE(dev);
diff --git a/hw/ide/macio.c b/hw/ide/macio.c
index 9742c005d1..9cdedc31e9 100644
--- a/hw/ide/macio.c
+++ b/hw/ide/macio.c
@@ -422,7 +422,7 @@ static const IDEDMAOps dbdma_ops = {
     .rw_buf         = ide_nop_int,
 };
 
-static void macio_ide_realizefn(DeviceState *dev, Error **errp)
+static void macio_ide_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     MACIOIDEState *s = MACIO_IDE(dev);
 
diff --git a/hw/ide/microdrive.c b/hw/ide/microdrive.c
index e3fd30e457..7d3e009015 100644
--- a/hw/ide/microdrive.c
+++ b/hw/ide/microdrive.c
@@ -589,7 +589,7 @@ static const TypeInfo dscm1xxxx_type_info = {
     .class_init = dscm1xxxx_class_init,
 };
 
-static void microdrive_realize(DeviceState *dev, Error **errp)
+static void microdrive_realize(DeviceState *dev, Error *errp[static 1])
 {
     MicroDriveState *md = MICRODRIVE(dev);
 
diff --git a/hw/ide/mmio.c b/hw/ide/mmio.c
index 6f12f456ed..e266a802f2 100644
--- a/hw/ide/mmio.c
+++ b/hw/ide/mmio.c
@@ -117,7 +117,7 @@ static const VMStateDescription vmstate_ide_mmio = {
     }
 };
 
-static void mmio_ide_realizefn(DeviceState *dev, Error **errp)
+static void mmio_ide_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *d = SYS_BUS_DEVICE(dev);
     MMIOState *s = MMIO_IDE(dev);
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
index 7e2d76705d..bc2fdb9782 100644
--- a/hw/ide/piix.c
+++ b/hw/ide/piix.c
@@ -148,7 +148,7 @@ static void pci_piix_init_ports(PCIIDEState *d) {
     }
 }
 
-static void pci_piix_ide_realize(PCIDevice *dev, Error **errp)
+static void pci_piix_ide_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIIDEState *d = PCI_IDE(dev);
     uint8_t *pci_conf = dev->config;
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index efa34e429a..68233a1a50 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -31,7 +31,7 @@
 /* --------------------------------- */
 
 static char *idebus_get_fw_dev_path(DeviceState *dev);
-static void idebus_unrealize(BusState *qdev, Error **errp);
+static void idebus_unrealize(BusState *qdev, Error *errp[static 1]);
 
 static Property ide_props[] = {
     DEFINE_PROP_UINT32("unit", IDEDevice, unit, -1),
@@ -46,7 +46,7 @@ static void ide_bus_class_init(ObjectClass *klass, void *data)
     k->unrealize = idebus_unrealize;
 }
 
-static void idebus_unrealize(BusState *bus, Error **errp)
+static void idebus_unrealize(BusState *bus, Error *errp[static 1])
 {
     IDEBus *ibus = IDE_BUS(bus);
 
@@ -225,7 +225,7 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
 }
 
 static void ide_dev_get_bootindex(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     IDEDevice *d = IDE_DEVICE(obj);
 
@@ -233,7 +233,7 @@ static void ide_dev_get_bootindex(Object *obj, Visitor *v, const char *name,
 }
 
 static void ide_dev_set_bootindex(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     IDEDevice *d = IDE_DEVICE(obj);
     int32_t boot_index;
diff --git a/hw/ide/via.c b/hw/ide/via.c
index 5b32ecb386..a6bdb639c1 100644
--- a/hw/ide/via.c
+++ b/hw/ide/via.c
@@ -172,7 +172,7 @@ static void vt82c686b_init_ports(PCIIDEState *d) {
 }
 
 /* via ide func */
-static void vt82c686b_ide_realize(PCIDevice *dev, Error **errp)
+static void vt82c686b_ide_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIIDEState *d = PCI_IDE(dev);
     uint8_t *pci_conf = dev->config;
diff --git a/hw/input/adb.c b/hw/input/adb.c
index 43d3205472..48ac0fde4e 100644
--- a/hw/input/adb.c
+++ b/hw/input/adb.c
@@ -138,7 +138,7 @@ static const VMStateDescription vmstate_adb_device = {
     }
 };
 
-static void adb_device_realizefn(DeviceState *dev, Error **errp)
+static void adb_device_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ADBDevice *d = ADB_DEVICE(dev);
     ADBBusState *bus = ADB_BUS(qdev_get_parent_bus(dev));
@@ -489,7 +489,7 @@ static QemuInputHandler adb_keyboard_handler = {
     .event = adb_keyboard_event,
 };
 
-static void adb_kbd_realizefn(DeviceState *dev, Error **errp)
+static void adb_kbd_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ADBKeyboardClass *akc = ADB_KEYBOARD_GET_CLASS(dev);
     akc->parent_realize(dev, errp);
@@ -704,7 +704,7 @@ static const VMStateDescription vmstate_adb_mouse = {
     }
 };
 
-static void adb_mouse_realizefn(DeviceState *dev, Error **errp)
+static void adb_mouse_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     MouseState *s = ADB_MOUSE(dev);
     ADBMouseClass *amc = ADB_MOUSE_GET_CLASS(dev);
diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
index c479f827b6..568741feef 100644
--- a/hw/input/pckbd.c
+++ b/hw/input/pckbd.c
@@ -547,7 +547,7 @@ static void i8042_initfn(Object *obj)
     qdev_init_gpio_out_named(DEVICE(obj), &s->a20_out, I8042_A20_LINE, 1);
 }
 
-static void i8042_realizefn(DeviceState *dev, Error **errp)
+static void i8042_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     ISAKBDState *isa_s = I8042(dev);
diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
index ad1beb3b0b..dbaa71b67d 100644
--- a/hw/input/virtio-input-hid.c
+++ b/hw/input/virtio-input-hid.c
@@ -261,7 +261,7 @@ static void virtio_input_handle_sync(DeviceState *dev)
     virtio_input_send(vinput, &event);
 }
 
-static void virtio_input_hid_realize(DeviceState *dev, Error **errp)
+static void virtio_input_hid_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev);
 
@@ -272,7 +272,8 @@ static void virtio_input_hid_realize(DeviceState *dev, Error **errp)
     }
 }
 
-static void virtio_input_hid_unrealize(DeviceState *dev, Error **errp)
+static void virtio_input_hid_unrealize(DeviceState *dev,
+                                       Error *errp[static 1])
 {
     VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev);
     qemu_input_handler_unregister(vhid->hs);
diff --git a/hw/input/virtio-input-host.c b/hw/input/virtio-input-host.c
index cb79e80024..6e5f9ef2bf 100644
--- a/hw/input/virtio-input-host.c
+++ b/hw/input/virtio-input-host.c
@@ -95,7 +95,7 @@ static void virtio_input_abs_config(VirtIOInputHost *vih, int axis)
     virtio_input_add_config(VIRTIO_INPUT(vih), &config);
 }
 
-static void virtio_input_host_realize(DeviceState *dev, Error **errp)
+static void virtio_input_host_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIOInputHost *vih = VIRTIO_INPUT_HOST(dev);
     VirtIOInput *vinput = VIRTIO_INPUT(dev);
@@ -178,7 +178,8 @@ err_close:
     return;
 }
 
-static void virtio_input_host_unrealize(DeviceState *dev, Error **errp)
+static void virtio_input_host_unrealize(DeviceState *dev,
+                                        Error *errp[static 1])
 {
     VirtIOInputHost *vih = VIRTIO_INPUT_HOST(dev);
 
diff --git a/hw/input/virtio-input.c b/hw/input/virtio-input.c
index beb38528bd..1d259d7df1 100644
--- a/hw/input/virtio-input.c
+++ b/hw/input/virtio-input.c
@@ -183,7 +183,7 @@ static void virtio_input_set_config(VirtIODevice *vdev,
 }
 
 static uint64_t virtio_input_get_features(VirtIODevice *vdev, uint64_t f,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     return f;
 }
@@ -229,7 +229,8 @@ static int virtio_input_post_load(void *opaque, int version_id)
     return 0;
 }
 
-static void virtio_input_device_realize(DeviceState *dev, Error **errp)
+static void virtio_input_device_realize(DeviceState *dev,
+                                        Error *errp[static 1])
 {
     VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(dev);
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
@@ -272,7 +273,8 @@ static void virtio_input_finalize(Object *obj)
 
     g_free(vinput->queue);
 }
-static void virtio_input_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_input_device_unrealize(DeviceState *dev,
+                                          Error *errp[static 1])
 {
     VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(dev);
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
diff --git a/hw/input/vmmouse.c b/hw/input/vmmouse.c
index 4747da9a8d..0d4e0553fb 100644
--- a/hw/input/vmmouse.c
+++ b/hw/input/vmmouse.c
@@ -261,7 +261,7 @@ static void vmmouse_reset(DeviceState *d)
     vmmouse_disable(s);
 }
 
-static void vmmouse_realizefn(DeviceState *dev, Error **errp)
+static void vmmouse_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     VMMouseState *s = VMMOUSE(dev);
 
diff --git a/hw/intc/apic.c b/hw/intc/apic.c
index fe15fb6024..3f3e083838 100644
--- a/hw/intc/apic.c
+++ b/hw/intc/apic.c
@@ -875,7 +875,7 @@ static const MemoryRegionOps apic_io_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void apic_realize(DeviceState *dev, Error **errp)
+static void apic_realize(DeviceState *dev, Error *errp[static 1])
 {
     APICCommonState *s = APIC(dev);
 
@@ -894,7 +894,7 @@ static void apic_realize(DeviceState *dev, Error **errp)
     msi_nonbroken = true;
 }
 
-static void apic_unrealize(DeviceState *dev, Error **errp)
+static void apic_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     APICCommonState *s = APIC(dev);
 
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 536cbad4d0..02b5a81f88 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -307,7 +307,7 @@ static int apic_load_old(QEMUFile *f, void *opaque, int version_id)
 
 static const VMStateDescription vmstate_apic_common;
 
-static void apic_common_realize(DeviceState *dev, Error **errp)
+static void apic_common_realize(DeviceState *dev, Error *errp[static 1])
 {
     APICCommonState *s = APIC_COMMON(dev);
     APICCommonClass *info;
@@ -334,7 +334,7 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
                                    s, -1, 0, IGNORE_ERRORS);
 }
 
-static void apic_common_unrealize(DeviceState *dev, Error **errp)
+static void apic_common_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     APICCommonState *s = APIC_COMMON(dev);
     APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
@@ -447,7 +447,7 @@ static Property apic_properties_common[] = {
 };
 
 static void apic_common_get_id(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     APICCommonState *s = APIC_COMMON(obj);
     int64_t value;
@@ -457,7 +457,7 @@ static void apic_common_get_id(Object *obj, Visitor *v, const char *name,
 }
 
 static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     APICCommonState *s = APIC_COMMON(obj);
     DeviceState *dev = DEVICE(obj);
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
index aa01bac522..5e7ab0784b 100644
--- a/hw/intc/arm_gic.c
+++ b/hw/intc/arm_gic.c
@@ -1397,7 +1397,7 @@ void gic_init_irqs_and_distributor(GICState *s)
     gic_init_irqs_and_mmio(s, gic_set_irq, gic_ops);
 }
 
-static void arm_gic_realize(DeviceState *dev, Error **errp)
+static void arm_gic_realize(DeviceState *dev, Error *errp[static 1])
 {
     /* Device instance realize function for the GIC sysbus device */
     int i;
diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c
index 70f1134823..73560aaf97 100644
--- a/hw/intc/arm_gic_common.c
+++ b/hw/intc/arm_gic_common.c
@@ -127,7 +127,7 @@ void gic_init_irqs_and_mmio(GICState *s, qemu_irq_handler handler,
     sysbus_init_mmio(sbd, &s->cpuiomem[0]);
 }
 
-static void arm_gic_common_realize(DeviceState *dev, Error **errp)
+static void arm_gic_common_realize(DeviceState *dev, Error *errp[static 1])
 {
     GICState *s = ARM_GIC_COMMON(dev);
     int num_irq = s->num_irq;
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
index 00f1b704be..543f1cfdea 100644
--- a/hw/intc/arm_gic_kvm.c
+++ b/hw/intc/arm_gic_kvm.c
@@ -490,7 +490,7 @@ static void kvm_arm_gic_reset(DeviceState *dev)
     }
 }
 
-static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
+static void kvm_arm_gic_realize(DeviceState *dev, Error *errp[static 1])
 {
     int i;
     GICState *s = KVM_ARM_GIC(dev);
diff --git a/hw/intc/arm_gicv2m.c b/hw/intc/arm_gicv2m.c
index 3922fbc1c1..707e4fe34c 100644
--- a/hw/intc/arm_gicv2m.c
+++ b/hw/intc/arm_gicv2m.c
@@ -128,7 +128,7 @@ static const MemoryRegionOps gicv2m_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void gicv2m_realize(DeviceState *dev, Error **errp)
+static void gicv2m_realize(DeviceState *dev, Error *errp[static 1])
 {
     ARMGICv2mState *s = ARM_GICV2M(dev);
     int i;
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
index 1dd941fef3..56ad8e14be 100644
--- a/hw/intc/arm_gicv3.c
+++ b/hw/intc/arm_gicv3.c
@@ -360,7 +360,7 @@ static const MemoryRegionOps gic_ops[] = {
     }
 };
 
-static void arm_gic_realize(DeviceState *dev, Error **errp)
+static void arm_gic_realize(DeviceState *dev, Error *errp[static 1])
 {
     /* Device instance realize function for the GIC sysbus device */
     GICv3State *s = ARM_GICV3(dev);
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
index 3fcd6dfaa9..e5ab078292 100644
--- a/hw/intc/arm_gicv3_common.c
+++ b/hw/intc/arm_gicv3_common.c
@@ -203,7 +203,7 @@ void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
     sysbus_init_mmio(sbd, &s->iomem_redist);
 }
 
-static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
+static void arm_gicv3_common_realize(DeviceState *dev, Error *errp[static 1])
 {
     GICv3State *s = ARM_GICV3_COMMON(dev);
     int i;
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
index edeb4334d1..e0fa1ca972 100644
--- a/hw/intc/arm_gicv3_its_kvm.c
+++ b/hw/intc/arm_gicv3_its_kvm.c
@@ -53,7 +53,7 @@ static int kvm_its_send_msi(GICv3ITSState *s, uint32_t value, uint16_t devid)
     return kvm_vm_ioctl(kvm_state, KVM_SIGNAL_MSI, &msi);
 }
 
-static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
+static void kvm_arm_its_realize(DeviceState *dev, Error *errp[static 1])
 {
     GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
 
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
index 21e86edb17..e5e01b8403 100644
--- a/hw/intc/arm_gicv3_kvm.c
+++ b/hw/intc/arm_gicv3_kvm.c
@@ -680,7 +680,7 @@ static const ARMCPRegInfo gicv3_cpuif_reginfo[] = {
     REGINFO_SENTINEL
 };
 
-static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
+static void kvm_arm_gicv3_realize(DeviceState *dev, Error *errp[static 1])
 {
     GICv3State *s = KVM_ARM_GICV3(dev);
     KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
index 7795c0623f..491a257877 100644
--- a/hw/intc/armv7m_nvic.c
+++ b/hw/intc/armv7m_nvic.c
@@ -999,7 +999,7 @@ static void nvic_systick_trigger(void *opaque, int n, int level)
     }
 }
 
-static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
+static void armv7m_nvic_realize(DeviceState *dev, Error *errp[static 1])
 {
     NVICState *s = NVIC(dev);
     SysBusDevice *systick_sbd;
diff --git a/hw/intc/aspeed_vic.c b/hw/intc/aspeed_vic.c
index 2370e7485f..7fe079e71a 100644
--- a/hw/intc/aspeed_vic.c
+++ b/hw/intc/aspeed_vic.c
@@ -283,7 +283,7 @@ static void aspeed_vic_reset(DeviceState *dev)
 
 #define AVIC_IO_REGION_SIZE 0x20000
 
-static void aspeed_vic_realize(DeviceState *dev, Error **errp)
+static void aspeed_vic_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     AspeedVICState *s = ASPEED_VIC(dev);
diff --git a/hw/intc/exynos4210_gic.c b/hw/intc/exynos4210_gic.c
index 2a55817b76..e411a91456 100644
--- a/hw/intc/exynos4210_gic.c
+++ b/hw/intc/exynos4210_gic.c
@@ -436,7 +436,8 @@ static void exynos4210_irq_gate_init(Object *obj)
     sysbus_init_irq(sbd, &s->out);
 }
 
-static void exynos4210_irq_gate_realize(DeviceState *dev, Error **errp)
+static void exynos4210_irq_gate_realize(DeviceState *dev,
+                                        Error *errp[static 1])
 {
     Exynos4210IRQGateState *s = EXYNOS4210_IRQ_GATE(dev);
 
diff --git a/hw/intc/grlib_irqmp.c b/hw/intc/grlib_irqmp.c
index 94659ee256..0a9498cb1c 100644
--- a/hw/intc/grlib_irqmp.c
+++ b/hw/intc/grlib_irqmp.c
@@ -337,7 +337,7 @@ static void grlib_irqmp_init(Object *obj)
     sysbus_init_mmio(dev, &irqmp->iomem);
 }
 
-static void grlib_irqmp_realize(DeviceState *dev, Error **errp)
+static void grlib_irqmp_realize(DeviceState *dev, Error *errp[static 1])
 {
     IRQMP *irqmp = GRLIB_IRQMP(dev);
 
diff --git a/hw/intc/i8259.c b/hw/intc/i8259.c
index fe9ecd6bd4..7bd6c3d092 100644
--- a/hw/intc/i8259.c
+++ b/hw/intc/i8259.c
@@ -445,7 +445,7 @@ static const MemoryRegionOps pic_elcr_ioport_ops = {
     },
 };
 
-static void pic_realize(DeviceState *dev, Error **errp)
+static void pic_realize(DeviceState *dev, Error *errp[static 1])
 {
     PICCommonState *s = PIC_COMMON(dev);
     PICClass *pc = PIC_GET_CLASS(dev);
diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c
index c2fd563b5b..47f1ec25f9 100644
--- a/hw/intc/i8259_common.c
+++ b/hw/intc/i8259_common.c
@@ -67,7 +67,7 @@ static int pic_dispatch_post_load(void *opaque, int version_id)
     return 0;
 }
 
-static void pic_common_realize(DeviceState *dev, Error **errp)
+static void pic_common_realize(DeviceState *dev, Error *errp[static 1])
 {
     PICCommonState *s = PIC_COMMON(dev);
     ISADevice *isa = ISA_DEVICE(dev);
diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
index 37c4386ae3..7479d89061 100644
--- a/hw/intc/ioapic.c
+++ b/hw/intc/ioapic.c
@@ -410,7 +410,7 @@ static void ioapic_machine_done_notify(Notifier *notifier, void *data)
 
 #define IOAPIC_VER_DEF 0x20
 
-static void ioapic_realize(DeviceState *dev, Error **errp)
+static void ioapic_realize(DeviceState *dev, Error *errp[static 1])
 {
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
 
diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
index 97c4f9c2df..b9f9035860 100644
--- a/hw/intc/ioapic_common.c
+++ b/hw/intc/ioapic_common.c
@@ -123,7 +123,7 @@ static int ioapic_dispatch_post_load(void *opaque, int version_id)
     return 0;
 }
 
-static void ioapic_common_realize(DeviceState *dev, Error **errp)
+static void ioapic_common_realize(DeviceState *dev, Error *errp[static 1])
 {
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
     IOAPICCommonClass *info;
diff --git a/hw/intc/mips_gic.c b/hw/intc/mips_gic.c
index 15e6e40f9f..f821701993 100644
--- a/hw/intc/mips_gic.c
+++ b/hw/intc/mips_gic.c
@@ -401,7 +401,7 @@ static void mips_gic_init(Object *obj)
     qemu_register_reset(gic_reset, s);
 }
 
-static void mips_gic_realize(DeviceState *dev, Error **errp)
+static void mips_gic_realize(DeviceState *dev, Error *errp[static 1])
 {
     MIPSGICState *s = MIPS_GIC(dev);
     CPUState *cs = first_cpu;
diff --git a/hw/intc/nios2_iic.c b/hw/intc/nios2_iic.c
index 016426f964..6ed48f7fc6 100644
--- a/hw/intc/nios2_iic.c
+++ b/hw/intc/nios2_iic.c
@@ -62,7 +62,7 @@ static void altera_iic_init(Object *obj)
     sysbus_init_irq(SYS_BUS_DEVICE(obj), &pv->parent_irq);
 }
 
-static void altera_iic_realize(DeviceState *dev, Error **errp)
+static void altera_iic_realize(DeviceState *dev, Error *errp[static 1])
 {
     struct AlteraIIC *pv = ALTERA_IIC(dev);
     Error *err = NULL;
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
index ccdda89dab..d4824b6a29 100644
--- a/hw/intc/omap_intc.c
+++ b/hw/intc/omap_intc.c
@@ -379,7 +379,7 @@ static void omap_intc_init(Object *obj)
     sysbus_init_mmio(sbd, &s->mmio);
 }
 
-static void omap_intc_realize(DeviceState *dev, Error **errp)
+static void omap_intc_realize(DeviceState *dev, Error *errp[static 1])
 {
     struct omap_intr_handler_s *s = OMAP_INTC(dev);
 
@@ -627,7 +627,7 @@ static void omap2_intc_init(Object *obj)
     sysbus_init_mmio(sbd, &s->mmio);
 }
 
-static void omap2_intc_realize(DeviceState *dev, Error **errp)
+static void omap2_intc_realize(DeviceState *dev, Error *errp[static 1])
 {
     struct omap_intr_handler_s *s = OMAP_INTC(dev);
 
diff --git a/hw/intc/openpic.c b/hw/intc/openpic.c
index f966d0604a..a801248537 100644
--- a/hw/intc/openpic.c
+++ b/hw/intc/openpic.c
@@ -1520,7 +1520,7 @@ static void openpic_init(Object *obj)
     memory_region_init(&opp->mem, obj, "openpic", 0x40000);
 }
 
-static void openpic_realize(DeviceState *dev, Error **errp)
+static void openpic_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *d = SYS_BUS_DEVICE(dev);
     OpenPICState *opp = OPENPIC(dev);
diff --git a/hw/intc/openpic_kvm.c b/hw/intc/openpic_kvm.c
index 0518e017c4..0786ab4a95 100644
--- a/hw/intc/openpic_kvm.c
+++ b/hw/intc/openpic_kvm.c
@@ -197,7 +197,7 @@ static void kvm_openpic_init(Object *obj)
                           "kvm-openpic", 0x40000);
 }
 
-static void kvm_openpic_realize(DeviceState *dev, Error **errp)
+static void kvm_openpic_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *d = SYS_BUS_DEVICE(dev);
     KVMOpenPICState *opp = KVM_OPENPIC(dev);
diff --git a/hw/intc/realview_gic.c b/hw/intc/realview_gic.c
index 1b114e7065..ca3e54edeb 100644
--- a/hw/intc/realview_gic.c
+++ b/hw/intc/realview_gic.c
@@ -18,7 +18,7 @@ static void realview_gic_set_irq(void *opaque, int irq, int level)
     qemu_set_irq(qdev_get_gpio_in(DEVICE(&s->gic), irq), level);
 }
 
-static void realview_gic_realize(DeviceState *dev, Error **errp)
+static void realview_gic_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     RealViewGICState *s = REALVIEW_GIC(dev);
diff --git a/hw/intc/s390_flic.c b/hw/intc/s390_flic.c
index cc14ddc4bd..90be2eb552 100644
--- a/hw/intc/s390_flic.c
+++ b/hw/intc/s390_flic.c
@@ -95,7 +95,7 @@ static Property s390_flic_common_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void s390_flic_common_realize(DeviceState *dev, Error **errp)
+static void s390_flic_common_realize(DeviceState *dev, Error *errp[static 1])
 {
     uint32_t max_batch = S390_FLIC_COMMON(dev)->adapter_routes_max_batch;
 
diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c
index 4ee59628d0..ecd803fb7f 100644
--- a/hw/intc/s390_flic_kvm.c
+++ b/hw/intc/s390_flic_kvm.c
@@ -392,7 +392,7 @@ static const VMStateDescription kvm_s390_flic_vmstate = {
     }
 };
 
-static void kvm_s390_flic_realize(DeviceState *dev, Error **errp)
+static void kvm_s390_flic_realize(DeviceState *dev, Error *errp[static 1])
 {
     KVMS390FLICState *flic_state = KVM_S390_FLIC(dev);
     struct kvm_create_device cd = {0};
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index ea3516794a..74536c0c0b 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -334,7 +334,7 @@ static void icp_reset(void *dev)
     qemu_set_irq(icp->output, 0);
 }
 
-static void icp_realize(DeviceState *dev, Error **errp)
+static void icp_realize(DeviceState *dev, Error *errp[static 1])
 {
     ICPState *icp = ICP(dev);
     ICPStateClass *icpc = ICP_GET_CLASS(dev);
@@ -357,7 +357,7 @@ static void icp_realize(DeviceState *dev, Error **errp)
     qemu_register_reset(icp_reset, dev);
 }
 
-static void icp_unrealize(DeviceState *dev, Error **errp)
+static void icp_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     qemu_unregister_reset(icp_reset, dev);
 }
@@ -601,7 +601,7 @@ static void ics_simple_initfn(Object *obj)
     ics->offset = XICS_IRQ_BASE;
 }
 
-static void ics_simple_realize(DeviceState *dev, Error **errp)
+static void ics_simple_realize(DeviceState *dev, Error *errp[static 1])
 {
     ICSState *ics = ICS_SIMPLE(dev);
 
@@ -642,7 +642,7 @@ static const TypeInfo ics_simple_info = {
     .instance_init = ics_simple_initfn,
 };
 
-static void ics_base_realize(DeviceState *dev, Error **errp)
+static void ics_base_realize(DeviceState *dev, Error *errp[static 1])
 {
     ICSStateClass *icsc = ICS_BASE_GET_CLASS(dev);
     ICSState *ics = ICS_BASE(dev);
diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
index 14b8f6f6e4..49f3e943e3 100644
--- a/hw/intc/xics_kvm.c
+++ b/hw/intc/xics_kvm.c
@@ -159,12 +159,12 @@ static void icp_kvm_cpu_setup(ICPState *icp, PowerPCCPU *cpu)
     QLIST_INSERT_HEAD(&kvm_enabled_icps, enabled_icp, node);
 }
 
-static void icp_kvm_realize(DeviceState *dev, Error **errp)
+static void icp_kvm_realize(DeviceState *dev, Error *errp[static 1])
 {
     qemu_register_reset(icp_kvm_reset, dev);
 }
 
-static void icp_kvm_unrealize(DeviceState *dev, Error **errp)
+static void icp_kvm_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     qemu_unregister_reset(icp_kvm_reset, dev);
 }
@@ -351,7 +351,7 @@ static void ics_kvm_reset(void *dev)
     ics_set_kvm_state(ics, 1);
 }
 
-static void ics_kvm_realize(DeviceState *dev, Error **errp)
+static void ics_kvm_realize(DeviceState *dev, Error *errp[static 1])
 {
     ICSState *ics = ICS_SIMPLE(dev);
 
@@ -394,7 +394,7 @@ static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr,
                  __func__);
 }
 
-int xics_kvm_init(sPAPRMachineState *spapr, Error **errp)
+int xics_kvm_init(sPAPRMachineState *spapr, Error *errp[static 1])
 {
     int rc;
     struct kvm_create_device xics_create_device = {
diff --git a/hw/intc/xics_pnv.c b/hw/intc/xics_pnv.c
index 12ae605f10..a00004bdf3 100644
--- a/hw/intc/xics_pnv.c
+++ b/hw/intc/xics_pnv.c
@@ -159,7 +159,7 @@ static const MemoryRegionOps pnv_icp_ops = {
     },
 };
 
-static void pnv_icp_realize(DeviceState *dev, Error **errp)
+static void pnv_icp_realize(DeviceState *dev, Error *errp[static 1])
 {
     PnvICPState *icp = PNV_ICP(dev);
 
diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c
index d98ea8b130..b88a239dbc 100644
--- a/hw/intc/xics_spapr.c
+++ b/hw/intc/xics_spapr.c
@@ -269,7 +269,8 @@ static int ics_find_free_block(ICSState *ics, int num, int alignnum)
     return -1;
 }
 
-int spapr_ics_alloc(ICSState *ics, int irq_hint, bool lsi, Error **errp)
+int spapr_ics_alloc(ICSState *ics, int irq_hint, bool lsi,
+                    Error *errp[static 1])
 {
     int irq;
 
@@ -302,7 +303,7 @@ int spapr_ics_alloc(ICSState *ics, int irq_hint, bool lsi, Error **errp)
  * the block. If align==true, aligns the first IRQ number to num.
  */
 int spapr_ics_alloc_block(ICSState *ics, int num, bool lsi,
-                          bool align, Error **errp)
+                          bool align, Error *errp[static 1])
 {
     int i, first = -1;
 
diff --git a/hw/ipack/ipack.c b/hw/ipack/ipack.c
index e380f4f369..cf7c5e7bfb 100644
--- a/hw/ipack/ipack.c
+++ b/hw/ipack/ipack.c
@@ -36,7 +36,7 @@ void ipack_bus_new_inplace(IPackBus *bus, size_t bus_size,
     bus->set_irq = handler;
 }
 
-static void ipack_device_realize(DeviceState *dev, Error **errp)
+static void ipack_device_realize(DeviceState *dev, Error *errp[static 1])
 {
     IPackDevice *idev = IPACK_DEVICE(dev);
     IPackBus *bus = IPACK_BUS(qdev_get_parent_bus(dev));
@@ -56,7 +56,7 @@ static void ipack_device_realize(DeviceState *dev, Error **errp)
     k->realize(dev, errp);
 }
 
-static void ipack_device_unrealize(DeviceState *dev, Error **errp)
+static void ipack_device_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     IPackDevice *idev = IPACK_DEVICE(dev);
     IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(dev);
diff --git a/hw/ipack/tpci200.c b/hw/ipack/tpci200.c
index 4dfa6b33f3..d0bc3e573d 100644
--- a/hw/ipack/tpci200.c
+++ b/hw/ipack/tpci200.c
@@ -573,7 +573,7 @@ static const MemoryRegionOps tpci200_las3_ops = {
     }
 };
 
-static void tpci200_realize(PCIDevice *pci_dev, Error **errp)
+static void tpci200_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     TPCI200State *s = TPCI200(pci_dev);
     uint8_t *c = s->dev.config;
diff --git a/hw/ipmi/ipmi.c b/hw/ipmi/ipmi.c
index 5dd057cd39..ef5db1b247 100644
--- a/hw/ipmi/ipmi.c
+++ b/hw/ipmi/ipmi.c
@@ -92,7 +92,7 @@ static TypeInfo ipmi_interface_type_info = {
 };
 
 static void isa_ipmi_bmc_check(Object *obj, const char *name,
-                               Object *val, Error **errp)
+                               Object *val, Error *errp[static 1])
 {
     IPMIBmc *bmc = IPMI_BMC(val);
 
diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c
index 329b03e17f..a98dbd3c77 100644
--- a/hw/ipmi/ipmi_bmc_extern.c
+++ b/hw/ipmi/ipmi_bmc_extern.c
@@ -443,7 +443,7 @@ static void ipmi_bmc_extern_handle_reset(IPMIBmc *b)
     continue_send(ibe);
 }
 
-static void ipmi_bmc_extern_realize(DeviceState *dev, Error **errp)
+static void ipmi_bmc_extern_realize(DeviceState *dev, Error *errp[static 1])
 {
     IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(dev);
 
diff --git a/hw/ipmi/ipmi_bmc_sim.c b/hw/ipmi/ipmi_bmc_sim.c
index 277c28cb40..8dc71db08b 100644
--- a/hw/ipmi/ipmi_bmc_sim.c
+++ b/hw/ipmi/ipmi_bmc_sim.c
@@ -1924,7 +1924,7 @@ out:
     fru->nentries = size / fru->areasize;
 }
 
-static void ipmi_sim_realize(DeviceState *dev, Error **errp)
+static void ipmi_sim_realize(DeviceState *dev, Error *errp[static 1])
 {
     IPMIBmc *b = IPMI_BMC(dev);
     unsigned int i;
diff --git a/hw/ipmi/isa_ipmi_bt.c b/hw/ipmi/isa_ipmi_bt.c
index c7480f5f78..7c1bedf7d9 100644
--- a/hw/ipmi/isa_ipmi_bt.c
+++ b/hw/ipmi/isa_ipmi_bt.c
@@ -370,7 +370,7 @@ static void ipmi_bt_set_irq_enable(IPMIInterface *ii, int val)
     ib->irqs_enabled = val;
 }
 
-static void ipmi_bt_init(IPMIInterface *ii, Error **errp)
+static void ipmi_bt_init(IPMIInterface *ii, Error *errp[static 1])
 {
     IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
@@ -421,7 +421,7 @@ static void ipmi_bt_class_init(IPMIInterfaceClass *iic)
     iic->get_fwinfo = ipmi_bt_get_fwinfo;
 }
 
-static void isa_ipmi_bt_realize(DeviceState *dev, Error **errp)
+static void isa_ipmi_bt_realize(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     ISAIPMIBTDevice *iib = ISA_IPMI_BT(dev);
diff --git a/hw/ipmi/isa_ipmi_kcs.c b/hw/ipmi/isa_ipmi_kcs.c
index 41e3c12b1e..e442f2febf 100644
--- a/hw/ipmi/isa_ipmi_kcs.c
+++ b/hw/ipmi/isa_ipmi_kcs.c
@@ -345,7 +345,7 @@ static void ipmi_kcs_set_irq_enable(IPMIInterface *ii, int val)
     ik->irqs_enabled = val;
 }
 
-static void ipmi_kcs_init(IPMIInterface *ii, Error **errp)
+static void ipmi_kcs_init(IPMIInterface *ii, Error *errp[static 1])
 {
     IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIKCS *ik = iic->get_backend_data(ii);
@@ -393,7 +393,7 @@ static void ipmi_kcs_class_init(IPMIInterfaceClass *iic)
     iic->get_fwinfo = ipmi_kcs_get_fwinfo;
 }
 
-static void ipmi_isa_realize(DeviceState *dev, Error **errp)
+static void ipmi_isa_realize(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     ISAIPMIKCSDevice *iik = ISA_IPMI_KCS(dev);
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index 4d29a9900c..8f7c8144e1 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -59,7 +59,7 @@ static void i82378_request_pic_irq(void *opaque, int irq, int level)
     qemu_set_irq(s->i8259[irq], level);
 }
 
-static void i82378_realize(PCIDevice *pci, Error **errp)
+static void i82378_realize(PCIDevice *pci, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(pci);
     I82378State *s = I82378(dev);
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index 348e0eab9d..ebed529457 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -52,7 +52,7 @@ static const TypeInfo isa_bus_info = {
 };
 
 ISABus *isa_bus_new(DeviceState *dev, MemoryRegion* address_space,
-                    MemoryRegion *address_space_io, Error **errp)
+                    MemoryRegion *address_space_io, Error *errp[static 1])
 {
     if (isabus) {
         error_setg(errp, "Can't create a second ISA bus");
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index ffa8f3ba03..49ecf764d8 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -638,7 +638,7 @@ Object *ich9_lpc_find(void)
 }
 
 static void ich9_lpc_get_sci_int(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(obj);
     uint32_t value = lpc->sci_gsi;
@@ -669,7 +669,7 @@ static void ich9_lpc_initfn(Object *obj)
     ich9_lpc_add_properties(lpc);
 }
 
-static void ich9_lpc_realize(PCIDevice *d, Error **errp)
+static void ich9_lpc_realize(PCIDevice *d, Error *errp[static 1])
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(d);
     DeviceState *dev = DEVICE(d);
diff --git a/hw/isa/pc87312.c b/hw/isa/pc87312.c
index 5ce9f0a062..da69d41155 100644
--- a/hw/isa/pc87312.c
+++ b/hw/isa/pc87312.c
@@ -262,7 +262,7 @@ static void pc87312_reset(DeviceState *d)
     pc87312_soft_reset(s);
 }
 
-static void pc87312_realize(DeviceState *dev, Error **errp)
+static void pc87312_realize(DeviceState *dev, Error *errp[static 1])
 {
     PC87312State *s;
     DeviceState *d;
diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
index f811eba59d..220d4a88dc 100644
--- a/hw/isa/piix4.c
+++ b/hw/isa/piix4.c
@@ -87,7 +87,7 @@ static const VMStateDescription vmstate_piix4 = {
     }
 };
 
-static void piix4_realize(PCIDevice *dev, Error **errp)
+static void piix4_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PIIX4State *d = PIIX4_PCI_DEVICE(dev);
 
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index 50dc83df77..ad09cf9719 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -262,7 +262,7 @@ static const VMStateDescription vmstate_acpi = {
  * just register a PCI device now, functionalities will be implemented later.
  */
 
-static void vt82c686b_ac97_realize(PCIDevice *dev, Error **errp)
+static void vt82c686b_ac97_realize(PCIDevice *dev, Error *errp[static 1])
 {
     VT686AC97State *s = VT82C686B_AC97_DEVICE(dev);
     uint8_t *pci_conf = s->dev.config;
@@ -303,7 +303,7 @@ static const TypeInfo via_ac97_info = {
     .class_init    = via_ac97_class_init,
 };
 
-static void vt82c686b_mc97_realize(PCIDevice *dev, Error **errp)
+static void vt82c686b_mc97_realize(PCIDevice *dev, Error *errp[static 1])
 {
     VT686MC97State *s = VT82C686B_MC97_DEVICE(dev);
     uint8_t *pci_conf = s->dev.config;
@@ -344,7 +344,7 @@ static const TypeInfo via_mc97_info = {
 };
 
 /* vt82c686 pm init */
-static void vt82c686b_pm_realize(PCIDevice *dev, Error **errp)
+static void vt82c686b_pm_realize(PCIDevice *dev, Error *errp[static 1])
 {
     VT686PMState *s = VT82C686B_PM_DEVICE(dev);
     uint8_t *pci_conf;
@@ -432,7 +432,7 @@ static const VMStateDescription vmstate_via = {
 };
 
 /* init the PCI-to-ISA bridge */
-static void vt82c686b_realize(PCIDevice *d, Error **errp)
+static void vt82c686b_realize(PCIDevice *d, Error *errp[static 1])
 {
     VT82C686BState *vt82c = VT82C686B_DEVICE(d);
     uint8_t *pci_conf;
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 3843eb6110..10793b5d7d 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -28,7 +28,7 @@
 #include "hw/mem/nvdimm.h"
 
 static void nvdimm_get_label_size(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     NVDIMMDevice *nvdimm = NVDIMM(obj);
     uint64_t value = nvdimm->label_size;
@@ -37,7 +37,7 @@ static void nvdimm_get_label_size(Object *obj, Visitor *v, const char *name,
 }
 
 static void nvdimm_set_label_size(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     NVDIMMDevice *nvdimm = NVDIMM(obj);
     Error *local_err = NULL;
@@ -78,7 +78,7 @@ static MemoryRegion *nvdimm_get_memory_region(PCDIMMDevice *dimm)
     return &nvdimm->nvdimm_mr;
 }
 
-static void nvdimm_realize(PCDIMMDevice *dimm, Error **errp)
+static void nvdimm_realize(PCDIMMDevice *dimm, Error *errp[static 1])
 {
     MemoryRegion *mr = host_memory_backend_get_memory(dimm->hostmem, errp);
     NVDIMMDevice *nvdimm = NVDIMM(dimm);
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 13f43ab658..ce1cb153be 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -35,7 +35,8 @@ typedef struct pc_dimms_capacity {
 } pc_dimms_capacity;
 
 void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
-                         MemoryRegion *mr, uint64_t align, Error **errp)
+                         MemoryRegion *mr, uint64_t align,
+                         Error *errp[static 1])
 {
     int slot;
     MachineState *machine = MACHINE(qdev_get_machine());
@@ -147,7 +148,7 @@ static int pc_existing_dimms_capacity_internal(Object *obj, void *opaque)
     return 0;
 }
 
-uint64_t pc_existing_dimms_capacity(Error **errp)
+uint64_t pc_existing_dimms_capacity(Error *errp[static 1])
 {
     pc_dimms_capacity cap;
 
@@ -213,7 +214,8 @@ static int pc_dimm_slot2bitmap(Object *obj, void *opaque)
     return 0;
 }
 
-int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp)
+int pc_dimm_get_free_slot(const int *hint, int max_slots,
+                          Error *errp[static 1])
 {
     unsigned long *bitmap = bitmap_new(max_slots);
     int slot = 0;
@@ -275,7 +277,7 @@ static int pc_dimm_built_list(Object *obj, void *opaque)
 uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
                                uint64_t address_space_size,
                                uint64_t *hint, uint64_t align, uint64_t size,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     GSList *list = NULL, *item;
     uint64_t new_addr, ret = 0;
@@ -353,7 +355,7 @@ static Property pc_dimm_properties[] = {
 };
 
 static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     int64_t value;
     MemoryRegion *mr;
@@ -367,7 +369,7 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
 }
 
 static void pc_dimm_check_memdev_is_busy(Object *obj, const char *name,
-                                      Object *val, Error **errp)
+                                      Object *val, Error *errp[static 1])
 {
     Error *local_err = NULL;
 
@@ -395,7 +397,7 @@ static void pc_dimm_init(Object *obj)
                              &error_abort);
 }
 
-static void pc_dimm_realize(DeviceState *dev, Error **errp)
+static void pc_dimm_realize(DeviceState *dev, Error *errp[static 1])
 {
     PCDIMMDevice *dimm = PC_DIMM(dev);
     PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
@@ -419,7 +421,7 @@ static void pc_dimm_realize(DeviceState *dev, Error **errp)
     host_memory_backend_set_mapped(dimm->hostmem, true);
 }
 
-static void pc_dimm_unrealize(DeviceState *dev, Error **errp)
+static void pc_dimm_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     PCDIMMDevice *dimm = PC_DIMM(dev);
 
diff --git a/hw/mips/cps.c b/hw/mips/cps.c
index 4ef337d5c4..2842ddebf5 100644
--- a/hw/mips/cps.c
+++ b/hw/mips/cps.c
@@ -60,7 +60,7 @@ static bool cpu_mips_itu_supported(CPUMIPSState *env)
     return is_mt && !kvm_enabled();
 }
 
-static void mips_cps_realize(DeviceState *dev, Error **errp)
+static void mips_cps_realize(DeviceState *dev, Error *errp[static 1])
 {
     MIPSCPSState *s = MIPS_CPS(dev);
     CPUMIPSState *env;
diff --git a/hw/mips/gt64xxx_pci.c b/hw/mips/gt64xxx_pci.c
index e8b2eef688..93975f766f 100644
--- a/hw/mips/gt64xxx_pci.c
+++ b/hw/mips/gt64xxx_pci.c
@@ -1194,7 +1194,7 @@ static int gt64120_init(SysBusDevice *dev)
     return 0;
 }
 
-static void gt64120_pci_realize(PCIDevice *d, Error **errp)
+static void gt64120_pci_realize(PCIDevice *d, Error *errp[static 1])
 {
     /* FIXME: Malta specific hw assumptions ahead */
     pci_set_word(d->config + PCI_COMMAND, 0);
diff --git a/hw/misc/applesmc.c b/hw/misc/applesmc.c
index 77fab5b9d2..7e4bc090cf 100644
--- a/hw/misc/applesmc.c
+++ b/hw/misc/applesmc.c
@@ -225,7 +225,7 @@ static const MemoryRegionOps applesmc_cmd_io_ops = {
     },
 };
 
-static void applesmc_isa_realize(DeviceState *dev, Error **errp)
+static void applesmc_isa_realize(DeviceState *dev, Error *errp[static 1])
 {
     AppleSMCState *s = APPLE_SMC(dev);
 
diff --git a/hw/misc/arm11scu.c b/hw/misc/arm11scu.c
index 7042ce11e8..9f4a147ee8 100644
--- a/hw/misc/arm11scu.c
+++ b/hw/misc/arm11scu.c
@@ -59,7 +59,7 @@ static const MemoryRegionOps mpcore_scu_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void arm11_scu_realize(DeviceState *dev, Error **errp)
+static void arm11_scu_realize(DeviceState *dev, Error *errp[static 1])
 {
 }
 
diff --git a/hw/misc/arm_sysctl.c b/hw/misc/arm_sysctl.c
index b20b44ea20..d9386aa694 100644
--- a/hw/misc/arm_sysctl.c
+++ b/hw/misc/arm_sysctl.c
@@ -604,7 +604,7 @@ static void arm_sysctl_init(Object *obj)
     qdev_init_gpio_out(dev, &s->pl110_mux_ctrl, 1);
 }
 
-static void arm_sysctl_realize(DeviceState *d, Error **errp)
+static void arm_sysctl_realize(DeviceState *d, Error *errp[static 1])
 {
     arm_sysctl_state *s = ARM_SYSCTL(d);
 
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
index 95022d3607..3e4136d5c4 100644
--- a/hw/misc/aspeed_scu.c
+++ b/hw/misc/aspeed_scu.c
@@ -268,7 +268,7 @@ bool is_supported_silicon_rev(uint32_t silicon_rev)
     return false;
 }
 
-static void aspeed_scu_realize(DeviceState *dev, Error **errp)
+static void aspeed_scu_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     AspeedSCUState *s = ASPEED_SCU(dev);
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 5f3ac0b6f6..9d9b351a1e 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -213,7 +213,7 @@ static void aspeed_sdmc_reset(DeviceState *dev)
     }
 }
 
-static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
+static void aspeed_sdmc_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     AspeedSDMCState *s = ASPEED_SDMC(dev);
diff --git a/hw/misc/bcm2835_mbox.c b/hw/misc/bcm2835_mbox.c
index e97cc814af..4b299ce7db 100644
--- a/hw/misc/bcm2835_mbox.c
+++ b/hw/misc/bcm2835_mbox.c
@@ -293,7 +293,7 @@ static void bcm2835_mbox_reset(DeviceState *dev)
     }
 }
 
-static void bcm2835_mbox_realize(DeviceState *dev, Error **errp)
+static void bcm2835_mbox_realize(DeviceState *dev, Error *errp[static 1])
 {
     BCM2835MboxState *s = BCM2835_MBOX(dev);
     Object *obj;
diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
index 70eaafd325..933deb1302 100644
--- a/hw/misc/bcm2835_property.c
+++ b/hw/misc/bcm2835_property.c
@@ -379,7 +379,7 @@ static void bcm2835_property_reset(DeviceState *dev)
     s->pending = false;
 }
 
-static void bcm2835_property_realize(DeviceState *dev, Error **errp)
+static void bcm2835_property_realize(DeviceState *dev, Error *errp[static 1])
 {
     BCM2835PropertyState *s = BCM2835_PROPERTY(dev);
     Object *obj;
diff --git a/hw/misc/debugexit.c b/hw/misc/debugexit.c
index 84fa1a5b9d..eb00684ab1 100644
--- a/hw/misc/debugexit.c
+++ b/hw/misc/debugexit.c
@@ -36,7 +36,7 @@ static const MemoryRegionOps debug_exit_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void debug_exit_realizefn(DeviceState *d, Error **errp)
+static void debug_exit_realizefn(DeviceState *d, Error *errp[static 1])
 {
     ISADevice *dev = ISA_DEVICE(d);
     ISADebugExitState *isa = ISA_DEBUG_EXIT_DEVICE(d);
diff --git a/hw/misc/eccmemctl.c b/hw/misc/eccmemctl.c
index bb7cc52b5e..6913da0086 100644
--- a/hw/misc/eccmemctl.c
+++ b/hw/misc/eccmemctl.c
@@ -306,7 +306,7 @@ static void ecc_init(Object *obj)
     sysbus_init_mmio(dev, &s->iomem);
 }
 
-static void ecc_realize(DeviceState *dev, Error **errp)
+static void ecc_realize(DeviceState *dev, Error *errp[static 1])
 {
     ECCState *s = ECC_MEMCTL(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/misc/edu.c b/hw/misc/edu.c
index 48735517f4..40fd715816 100644
--- a/hw/misc/edu.c
+++ b/hw/misc/edu.c
@@ -339,7 +339,7 @@ static void *edu_fact_thread(void *opaque)
     return NULL;
 }
 
-static void pci_edu_realize(PCIDevice *pdev, Error **errp)
+static void pci_edu_realize(PCIDevice *pdev, Error *errp[static 1])
 {
     EduState *edu = DO_UPCAST(EduState, pdev, pdev);
     uint8_t *pci_conf = pdev->config;
@@ -379,7 +379,7 @@ static void pci_edu_uninit(PCIDevice *pdev)
 }
 
 static void edu_obj_uint64(Object *obj, Visitor *v, const char *name,
-                           void *opaque, Error **errp)
+                           void *opaque, Error *errp[static 1])
 {
     uint64_t *val = opaque;
 
diff --git a/hw/misc/hyperv_testdev.c b/hw/misc/hyperv_testdev.c
index dbd7cdda07..3eab6c10af 100644
--- a/hw/misc/hyperv_testdev.c
+++ b/hw/misc/hyperv_testdev.c
@@ -133,7 +133,7 @@ static const MemoryRegionOps synic_test_sint_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void hv_test_dev_realizefn(DeviceState *d, Error **errp)
+static void hv_test_dev_realizefn(DeviceState *d, Error *errp[static 1])
 {
     ISADevice *isa = ISA_DEVICE(d);
     HypervTestDev *dev = HYPERV_TEST_DEV(d);
diff --git a/hw/misc/imx6_src.c b/hw/misc/imx6_src.c
index cfb08710fb..44f9e480d4 100644
--- a/hw/misc/imx6_src.c
+++ b/hw/misc/imx6_src.c
@@ -275,7 +275,7 @@ static const struct MemoryRegionOps imx6_src_ops = {
     },
 };
 
-static void imx6_src_realize(DeviceState *dev, Error **errp)
+static void imx6_src_realize(DeviceState *dev, Error *errp[static 1])
 {
     IMX6SRCState *s = IMX6_SRC(dev);
 
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index a68342bd0e..e9dde565b7 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -439,7 +439,7 @@ static void resize_peers(IVShmemState *s, int nb_peers)
 }
 
 static void ivshmem_add_kvm_msi_virq(IVShmemState *s, int vector,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     PCIDevice *pdev = PCI_DEVICE(s);
     int ret;
@@ -457,7 +457,8 @@ static void ivshmem_add_kvm_msi_virq(IVShmemState *s, int vector,
     s->msi_vectors[vector].pdev = pdev;
 }
 
-static void setup_interrupt(IVShmemState *s, int vector, Error **errp)
+static void setup_interrupt(IVShmemState *s, int vector,
+                            Error *errp[static 1])
 {
     EventNotifier *n = &s->peers[s->vm_id].eventfds[vector];
     bool with_irqfd = kvm_msi_via_irqfd_enabled() &&
@@ -487,7 +488,7 @@ static void setup_interrupt(IVShmemState *s, int vector, Error **errp)
     }
 }
 
-static void process_msg_shmem(IVShmemState *s, int fd, Error **errp)
+static void process_msg_shmem(IVShmemState *s, int fd, Error *errp[static 1])
 {
     struct stat buf;
     size_t size;
@@ -533,7 +534,7 @@ static void process_msg_shmem(IVShmemState *s, int fd, Error **errp)
 }
 
 static void process_msg_disconnect(IVShmemState *s, uint16_t posn,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     IVSHMEM_DPRINTF("posn %d has gone away\n", posn);
     if (posn >= s->nb_peers || posn == s->vm_id) {
@@ -544,7 +545,7 @@ static void process_msg_disconnect(IVShmemState *s, uint16_t posn,
 }
 
 static void process_msg_connect(IVShmemState *s, uint16_t posn, int fd,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     Peer *peer = &s->peers[posn];
     int vector;
@@ -575,7 +576,8 @@ static void process_msg_connect(IVShmemState *s, uint16_t posn, int fd,
     }
 }
 
-static void process_msg(IVShmemState *s, int64_t msg, int fd, Error **errp)
+static void process_msg(IVShmemState *s, int64_t msg, int fd,
+                        Error *errp[static 1])
 {
     IVSHMEM_DPRINTF("posn is %" PRId64 ", fd is %d\n", msg, fd);
 
@@ -633,7 +635,8 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
     }
 }
 
-static int64_t ivshmem_recv_msg(IVShmemState *s, int *pfd, Error **errp)
+static int64_t ivshmem_recv_msg(IVShmemState *s, int *pfd,
+                                Error *errp[static 1])
 {
     int64_t msg;
     int n, ret;
@@ -653,7 +656,7 @@ static int64_t ivshmem_recv_msg(IVShmemState *s, int *pfd, Error **errp)
     return msg;
 }
 
-static void ivshmem_recv_setup(IVShmemState *s, Error **errp)
+static void ivshmem_recv_setup(IVShmemState *s, Error *errp[static 1])
 {
     Error *err = NULL;
     int64_t msg;
@@ -747,7 +750,7 @@ static void ivshmem_reset(DeviceState *d)
     }
 }
 
-static int ivshmem_setup_interrupts(IVShmemState *s, Error **errp)
+static int ivshmem_setup_interrupts(IVShmemState *s, Error *errp[static 1])
 {
     /* allocate QEMU callback data for receiving interrupts */
     s->msi_vectors = g_malloc0(s->vectors * sizeof(MSIVector));
@@ -831,7 +834,7 @@ static void ivshmem_write_config(PCIDevice *pdev, uint32_t address,
     }
 }
 
-static void ivshmem_common_realize(PCIDevice *dev, Error **errp)
+static void ivshmem_common_realize(PCIDevice *dev, Error *errp[static 1])
 {
     IVShmemState *s = IVSHMEM_COMMON(dev);
     uint8_t *pci_conf;
@@ -1006,7 +1009,7 @@ static const TypeInfo ivshmem_common_info = {
 };
 
 static void ivshmem_check_memdev_is_busy(Object *obj, const char *name,
-                                         Object *val, Error **errp)
+                                         Object *val, Error *errp[static 1])
 {
     if (host_memory_backend_is_mapped(MEMORY_BACKEND(val))) {
         char *path = object_get_canonical_path_component(val);
@@ -1048,7 +1051,7 @@ static void ivshmem_plain_init(Object *obj)
     s->not_legacy_32bit = 1;
 }
 
-static void ivshmem_plain_realize(PCIDevice *dev, Error **errp)
+static void ivshmem_plain_realize(PCIDevice *dev, Error *errp[static 1])
 {
     IVShmemState *s = IVSHMEM_COMMON(dev);
 
@@ -1120,7 +1123,7 @@ static void ivshmem_doorbell_init(Object *obj)
     s->not_legacy_32bit = 1;
 }
 
-static void ivshmem_doorbell_realize(PCIDevice *dev, Error **errp)
+static void ivshmem_doorbell_realize(PCIDevice *dev, Error *errp[static 1])
 {
     IVShmemState *s = IVSHMEM_COMMON(dev);
 
@@ -1244,7 +1247,7 @@ static void desugar_shm(IVShmemState *s)
     s->hostmem = MEMORY_BACKEND(obj);
 }
 
-static void ivshmem_realize(PCIDevice *dev, Error **errp)
+static void ivshmem_realize(PCIDevice *dev, Error *errp[static 1])
 {
     IVShmemState *s = IVSHMEM_COMMON(dev);
 
diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index 008d8bd4d5..563294f1a5 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -897,7 +897,7 @@ static void cuda_reset(DeviceState *dev)
     s->sr_delay_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_set_sr_int, s);
 }
 
-static void cuda_realizefn(DeviceState *dev, Error **errp)
+static void cuda_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CUDAState *s = CUDA(dev);
     struct tm tm;
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index c5945b81f7..fc84d67098 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -122,7 +122,7 @@ static void macio_bar_setup(MacIOState *macio_state)
     }
 }
 
-static void macio_common_realize(PCIDevice *d, Error **errp)
+static void macio_common_realize(PCIDevice *d, Error *errp[static 1])
 {
     MacIOState *s = MACIO(d);
     SysBusDevice *sysbus_dev;
@@ -145,7 +145,7 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
 
 static void macio_realize_ide(MacIOState *s, MACIOIDEState *ide,
                               qemu_irq irq0, qemu_irq irq1, int dmaid,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     SysBusDevice *sysbus_dev;
 
@@ -156,7 +156,7 @@ static void macio_realize_ide(MacIOState *s, MACIOIDEState *ide,
     object_property_set_bool(OBJECT(ide), true, "realized", errp);
 }
 
-static void macio_oldworld_realize(PCIDevice *d, Error **errp)
+static void macio_oldworld_realize(PCIDevice *d, Error *errp[static 1])
 {
     MacIOState *s = MACIO(d);
     OldWorldMacIOState *os = OLDWORLD_MACIO(d);
@@ -263,7 +263,7 @@ static const MemoryRegionOps timer_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void macio_newworld_realize(PCIDevice *d, Error **errp)
+static void macio_newworld_realize(PCIDevice *d, Error *errp[static 1])
 {
     MacIOState *s = MACIO(d);
     NewWorldMacIOState *ns = NEWWORLD_MACIO(d);
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
index 2a277bdb86..7876f6788a 100644
--- a/hw/misc/max111x.c
+++ b/hw/misc/max111x.c
@@ -147,12 +147,12 @@ static int max111x_init(SSISlave *d, int inputs)
     return 0;
 }
 
-static void max1110_realize(SSISlave *dev, Error **errp)
+static void max1110_realize(SSISlave *dev, Error *errp[static 1])
 {
     max111x_init(dev, 8);
 }
 
-static void max1111_realize(SSISlave *dev, Error **errp)
+static void max1111_realize(SSISlave *dev, Error *errp[static 1])
 {
     max111x_init(dev, 4);
 }
diff --git a/hw/misc/mips_cmgcr.c b/hw/misc/mips_cmgcr.c
index a1edb53f95..20b0e6a991 100644
--- a/hw/misc/mips_cmgcr.c
+++ b/hw/misc/mips_cmgcr.c
@@ -230,7 +230,7 @@ static Property mips_gcr_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void mips_gcr_realize(DeviceState *dev, Error **errp)
+static void mips_gcr_realize(DeviceState *dev, Error *errp[static 1])
 {
     MIPSGCRState *s = MIPS_GCR(dev);
 
diff --git a/hw/misc/mips_cpc.c b/hw/misc/mips_cpc.c
index 6d345745f6..d756277abd 100644
--- a/hw/misc/mips_cpc.c
+++ b/hw/misc/mips_cpc.c
@@ -113,7 +113,7 @@ static void mips_cpc_init(Object *obj)
     sysbus_init_mmio(sbd, &s->mr);
 }
 
-static void mips_cpc_realize(DeviceState *dev, Error **errp)
+static void mips_cpc_realize(DeviceState *dev, Error *errp[static 1])
 {
     MIPSCPCState *s = MIPS_CPC(dev);
 
diff --git a/hw/misc/mips_itu.c b/hw/misc/mips_itu.c
index ef935b51a8..0831aee83b 100644
--- a/hw/misc/mips_itu.c
+++ b/hw/misc/mips_itu.c
@@ -460,7 +460,7 @@ static void mips_itu_init(Object *obj)
                           "mips-itc-tag", ITC_TAG_ADDRSPACE_SZ);
 }
 
-static void mips_itu_realize(DeviceState *dev, Error **errp)
+static void mips_itu_realize(DeviceState *dev, Error *errp[static 1])
 {
     MIPSITUState *s = MIPS_ITU(dev);
 
diff --git a/hw/misc/pc-testdev.c b/hw/misc/pc-testdev.c
index b81d820084..510931eea3 100644
--- a/hw/misc/pc-testdev.c
+++ b/hw/misc/pc-testdev.c
@@ -155,7 +155,7 @@ static const MemoryRegionOps test_iomem_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void testdev_realizefn(DeviceState *d, Error **errp)
+static void testdev_realizefn(DeviceState *d, Error *errp[static 1])
 {
     ISADevice *isa = ISA_DEVICE(d);
     PCTestdev *dev = TESTDEV(d);
diff --git a/hw/misc/pci-testdev.c b/hw/misc/pci-testdev.c
index 7d5990213e..5517800d19 100644
--- a/hw/misc/pci-testdev.c
+++ b/hw/misc/pci-testdev.c
@@ -234,7 +234,7 @@ static const MemoryRegionOps pci_testdev_pio_ops = {
     },
 };
 
-static void pci_testdev_realize(PCIDevice *pci_dev, Error **errp)
+static void pci_testdev_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     PCITestDevState *d = PCI_TEST_DEV(pci_dev);
     uint8_t *pci_conf;
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index 0badd7b0a0..bd07b4e85c 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -85,7 +85,7 @@ static void pvpanic_isa_initfn(Object *obj)
     memory_region_init_io(&s->io, OBJECT(s), &pvpanic_ops, s, "pvpanic", 1);
 }
 
-static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
+static void pvpanic_isa_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *d = ISA_DEVICE(dev);
     PVPanicState *s = ISA_PVPANIC_DEVICE(dev);
diff --git a/hw/misc/sga.c b/hw/misc/sga.c
index 03b006d6f0..191762eff2 100644
--- a/hw/misc/sga.c
+++ b/hw/misc/sga.c
@@ -39,7 +39,7 @@ typedef struct ISASGAState {
     ISADevice parent_obj;
 } ISASGAState;
 
-static void sga_realizefn(DeviceState *dev, Error **errp)
+static void sga_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     rom_add_vga(SGABIOS_FILENAME);
 }
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
index 1b0584d14b..12163425a7 100644
--- a/hw/misc/tmp105.c
+++ b/hw/misc/tmp105.c
@@ -55,7 +55,7 @@ static void tmp105_alarm_update(TMP105State *s)
 }
 
 static void tmp105_get_temperature(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     TMP105State *s = TMP105(obj);
     int64_t value = s->temperature * 1000 / 256;
@@ -67,7 +67,7 @@ static void tmp105_get_temperature(Object *obj, Visitor *v, const char *name,
  * fixed point, so units are 1/256 centigrades.  A simple ratio will do.
  */
 static void tmp105_set_temperature(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     TMP105State *s = TMP105(obj);
     int64_t temp;
diff --git a/hw/misc/unimp.c b/hw/misc/unimp.c
index bcbb585888..3f63d3af54 100644
--- a/hw/misc/unimp.c
+++ b/hw/misc/unimp.c
@@ -59,7 +59,7 @@ static const MemoryRegionOps unimp_ops = {
     .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static void unimp_realize(DeviceState *dev, Error **errp)
+static void unimp_realize(DeviceState *dev, Error *errp[static 1])
 {
     UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(dev);
 
diff --git a/hw/misc/vmport.c b/hw/misc/vmport.c
index 165500223f..4e690ca6b9 100644
--- a/hw/misc/vmport.c
+++ b/hw/misc/vmport.c
@@ -143,7 +143,7 @@ static const MemoryRegionOps vmport_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void vmport_realizefn(DeviceState *dev, Error **errp)
+static void vmport_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     VMPortState *s = VMPORT(dev);
diff --git a/hw/net/allwinner_emac.c b/hw/net/allwinner_emac.c
index 50e8361e52..7dbbe629fa 100644
--- a/hw/net/allwinner_emac.c
+++ b/hw/net/allwinner_emac.c
@@ -442,7 +442,7 @@ static void aw_emac_init(Object *obj)
     sysbus_init_irq(sbd, &s->irq);
 }
 
-static void aw_emac_realize(DeviceState *dev, Error **errp)
+static void aw_emac_realize(DeviceState *dev, Error *errp[static 1])
 {
     AwEmacState *s = AW_EMAC(dev);
 
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 3943187572..5fdc51551e 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -1458,7 +1458,7 @@ static NetClientInfo net_gem_info = {
     .link_status_changed = gem_set_link,
 };
 
-static void gem_realize(DeviceState *dev, Error **errp)
+static void gem_realize(DeviceState *dev, Error *errp[static 1])
 {
     CadenceGEMState *s = CADENCE_GEM(dev);
     int i;
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index 5142003d07..068a040a37 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -869,7 +869,7 @@ static void dp8393x_instance_init(Object *obj)
     sysbus_init_irq(sbd, &s->irq);
 }
 
-static void dp8393x_realize(DeviceState *dev, Error **errp)
+static void dp8393x_realize(DeviceState *dev, Error *errp[static 1])
 {
     dp8393xState *s = DP8393X(dev);
     int i, checksum;
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index 4141e7e108..7320b7beec 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -1585,7 +1585,7 @@ static void e1000_write_config(PCIDevice *pci_dev, uint32_t address,
     }
 }
 
-static void pci_e1000_realize(PCIDevice *pci_dev, Error **errp)
+static void pci_e1000_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(pci_dev);
     E1000State *d = E1000(pci_dev);
diff --git a/hw/net/e1000e.c b/hw/net/e1000e.c
index 34167c0384..4838a68cf8 100644
--- a/hw/net/e1000e.c
+++ b/hw/net/e1000e.c
@@ -405,7 +405,7 @@ static void e1000e_write_config(PCIDevice *pci_dev, uint32_t address,
     }
 }
 
-static void e1000e_pci_realize(PCIDevice *pci_dev, Error **errp)
+static void e1000e_pci_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     static const uint16_t e1000e_pmrb_offset = 0x0C8;
     static const uint16_t e1000e_pcie_offset = 0x0E0;
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
index 663addc758..2d07a2b0a7 100644
--- a/hw/net/eepro100.c
+++ b/hw/net/eepro100.c
@@ -1855,7 +1855,7 @@ static NetClientInfo net_eepro100_info = {
     .receive = nic_receive,
 };
 
-static void e100_nic_realize(PCIDevice *pci_dev, Error **errp)
+static void e100_nic_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
     E100PCIDeviceInfo *info = eepro100_get_class(s);
diff --git a/hw/net/fsl_etsec/etsec.c b/hw/net/fsl_etsec/etsec.c
index 9da1932970..39c2597f7a 100644
--- a/hw/net/fsl_etsec/etsec.c
+++ b/hw/net/fsl_etsec/etsec.c
@@ -376,7 +376,7 @@ static NetClientInfo net_etsec_info = {
     .link_status_changed = etsec_set_link_status,
 };
 
-static void etsec_realize(DeviceState *dev, Error **errp)
+static void etsec_realize(DeviceState *dev, Error *errp[static 1])
 {
     eTSEC        *etsec = ETSEC_COMMON(dev);
 
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
index 3c36ab9cec..f14d76a67a 100644
--- a/hw/net/ftgmac100.c
+++ b/hw/net/ftgmac100.c
@@ -918,7 +918,7 @@ static NetClientInfo net_ftgmac100_info = {
     .link_status_changed = ftgmac100_set_link,
 };
 
-static void ftgmac100_realize(DeviceState *dev, Error **errp)
+static void ftgmac100_realize(DeviceState *dev, Error *errp[static 1])
 {
     FTGMAC100State *s = FTGMAC100(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
index 90e6ee35ba..4589f47533 100644
--- a/hw/net/imx_fec.c
+++ b/hw/net/imx_fec.c
@@ -1158,7 +1158,7 @@ static NetClientInfo imx_eth_net_info = {
 };
 
 
-static void imx_eth_realize(DeviceState *dev, Error **errp)
+static void imx_eth_realize(DeviceState *dev, Error *errp[static 1])
 {
     IMXFECState *s = IMX_FEC(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/net/mcf_fec.c b/hw/net/mcf_fec.c
index bfa6b4bcce..3fea8754a0 100644
--- a/hw/net/mcf_fec.c
+++ b/hw/net/mcf_fec.c
@@ -632,7 +632,7 @@ static NetClientInfo net_mcf_fec_info = {
     .receive = mcf_fec_receive,
 };
 
-static void mcf_fec_realize(DeviceState *dev, Error **errp)
+static void mcf_fec_realize(DeviceState *dev, Error *errp[static 1])
 {
     mcf_fec_state *s = MCF_FEC_NET(dev);
 
diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
index 6065c80f27..7a525d93d9 100644
--- a/hw/net/ne2000-isa.c
+++ b/hw/net/ne2000-isa.c
@@ -59,7 +59,7 @@ static const VMStateDescription vmstate_isa_ne2000 = {
     }
 };
 
-static void isa_ne2000_realizefn(DeviceState *dev, Error **errp)
+static void isa_ne2000_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     ISANE2000State *isa = ISA_NE2000(dev);
@@ -97,7 +97,7 @@ static void isa_ne2000_class_initfn(ObjectClass *klass, void *data)
 
 static void isa_ne2000_get_bootindex(Object *obj, Visitor *v,
                                      const char *name, void *opaque,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     ISANE2000State *isa = ISA_NE2000(obj);
     NE2000State *s = &isa->ne2000;
@@ -107,7 +107,7 @@ static void isa_ne2000_get_bootindex(Object *obj, Visitor *v,
 
 static void isa_ne2000_set_bootindex(Object *obj, Visitor *v,
                                      const char *name, void *opaque,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     ISANE2000State *isa = ISA_NE2000(obj);
     NE2000State *s = &isa->ne2000;
diff --git a/hw/net/ne2000.c b/hw/net/ne2000.c
index 2aec2b80b0..4e3ce23d8c 100644
--- a/hw/net/ne2000.c
+++ b/hw/net/ne2000.c
@@ -718,7 +718,7 @@ static NetClientInfo net_ne2000_info = {
     .receive = ne2000_receive,
 };
 
-static void pci_ne2000_realize(PCIDevice *pci_dev, Error **errp)
+static void pci_ne2000_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     PCINE2000State *d = DO_UPCAST(PCINE2000State, dev, pci_dev);
     NE2000State *s;
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
index 598b60e0eb..8a382b20c8 100644
--- a/hw/net/pcnet-pci.c
+++ b/hw/net/pcnet-pci.c
@@ -279,7 +279,7 @@ static NetClientInfo net_pci_pcnet_info = {
     .link_status_changed = pcnet_set_link_status,
 };
 
-static void pci_pcnet_realize(PCIDevice *pci_dev, Error **errp)
+static void pci_pcnet_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     PCIPCNetState *d = PCI_PCNET(pci_dev);
     PCNetState *s = &d->state;
diff --git a/hw/net/rocker/qmp-norocker.c b/hw/net/rocker/qmp-norocker.c
index 6acbcdb02b..5f27b044e7 100644
--- a/hw/net/rocker/qmp-norocker.c
+++ b/hw/net/rocker/qmp-norocker.c
@@ -20,13 +20,14 @@
 #include "qmp-commands.h"
 #include "qapi/qmp/qerror.h"
 
-RockerSwitch *qmp_query_rocker(const char *name, Error **errp)
+RockerSwitch *qmp_query_rocker(const char *name, Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "rocker");
     return NULL;
 };
 
-RockerPortList *qmp_query_rocker_ports(const char *name, Error **errp)
+RockerPortList *qmp_query_rocker_ports(const char *name,
+                                       Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "rocker");
     return NULL;
@@ -35,7 +36,7 @@ RockerPortList *qmp_query_rocker_ports(const char *name, Error **errp)
 RockerOfDpaFlowList *qmp_query_rocker_of_dpa_flows(const char *name,
                                                    bool has_tbl_id,
                                                    uint32_t tbl_id,
-                                                   Error **errp)
+                                                   Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "rocker");
     return NULL;
@@ -44,7 +45,7 @@ RockerOfDpaFlowList *qmp_query_rocker_of_dpa_flows(const char *name,
 RockerOfDpaGroupList *qmp_query_rocker_of_dpa_groups(const char *name,
                                                      bool has_type,
                                                      uint8_t type,
-                                                     Error **errp)
+                                                     Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "rocker");
     return NULL;
diff --git a/hw/net/rocker/rocker.c b/hw/net/rocker/rocker.c
index 4f0f6d71e5..e3da533cb8 100644
--- a/hw/net/rocker/rocker.c
+++ b/hw/net/rocker/rocker.c
@@ -96,7 +96,7 @@ World *rocker_get_world(Rocker *r, enum rocker_world_type type)
     return NULL;
 }
 
-RockerSwitch *qmp_query_rocker(const char *name, Error **errp)
+RockerSwitch *qmp_query_rocker(const char *name, Error *errp[static 1])
 {
     RockerSwitch *rocker;
     Rocker *r;
@@ -115,7 +115,8 @@ RockerSwitch *qmp_query_rocker(const char *name, Error **errp)
     return rocker;
 }
 
-RockerPortList *qmp_query_rocker_ports(const char *name, Error **errp)
+RockerPortList *qmp_query_rocker_ports(const char *name,
+                                       Error *errp[static 1])
 {
     RockerPortList *list = NULL;
     Rocker *r;
diff --git a/hw/net/rocker/rocker_of_dpa.c b/hw/net/rocker/rocker_of_dpa.c
index 9b1e0d2441..78b2e07485 100644
--- a/hw/net/rocker/rocker_of_dpa.c
+++ b/hw/net/rocker/rocker_of_dpa.c
@@ -2450,7 +2450,7 @@ static void of_dpa_flow_fill(void *cookie, void *value, void *user_data)
 RockerOfDpaFlowList *qmp_query_rocker_of_dpa_flows(const char *name,
                                                    bool has_tbl_id,
                                                    uint32_t tbl_id,
-                                                   Error **errp)
+                                                   Error *errp[static 1])
 {
     struct rocker *r;
     struct world *w;
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
index 04e1044cd6..6c43a7d3d6 100644
--- a/hw/net/rtl8139.c
+++ b/hw/net/rtl8139.c
@@ -3409,7 +3409,7 @@ static NetClientInfo net_rtl8139_info = {
     .link_status_changed = rtl8139_set_link_status,
 };
 
-static void pci_rtl8139_realize(PCIDevice *dev, Error **errp)
+static void pci_rtl8139_realize(PCIDevice *dev, Error *errp[static 1])
 {
     RTL8139State *s = RTL8139(dev);
     DeviceState *d = DEVICE(dev);
diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index 3e2a9896eb..c3745e4d6f 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -317,7 +317,7 @@ static void spapr_vlan_reset(VIOsPAPRDevice *sdev)
     qemu_format_nic_info_str(qemu_get_queue(dev->nic), dev->nicconf.macaddr.a);
 }
 
-static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Error **errp)
+static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Error *errp[static 1])
 {
     VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
 
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index b94c23e7ff..fc5aa32e67 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -560,7 +560,7 @@ static void virtio_net_set_queues(VirtIONet *n)
 static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue);
 
 static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     VirtIONet *n = VIRTIO_NET(vdev);
     NetClientState *nc = qemu_get_queue(n->nic);
@@ -1897,7 +1897,7 @@ void virtio_net_set_netclient_name(VirtIONet *n, const char *name,
     n->netclient_type = g_strdup(type);
 }
 
-static void virtio_net_device_realize(DeviceState *dev, Error **errp)
+static void virtio_net_device_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIONet *n = VIRTIO_NET(dev);
@@ -1996,7 +1996,8 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
     n->qdev = dev;
 }
 
-static void virtio_net_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_net_device_unrealize(DeviceState *dev,
+                                        Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIONet *n = VIRTIO_NET(dev);
diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index 5d8f150e9d..11cb4330bf 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -2288,7 +2288,7 @@ static uint64_t vmxnet3_device_serial_num(VMXNET3State *s)
 #define VMXNET3_USE_64BIT         (true)
 #define VMXNET3_PER_VECTOR_MASK   (false)
 
-static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
+static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(pci_dev);
     VMXNET3State *s = VMXNET3(pci_dev);
@@ -2607,7 +2607,7 @@ static Property vmxnet3_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void vmxnet3_realize(DeviceState *qdev, Error **errp)
+static void vmxnet3_realize(DeviceState *qdev, Error *errp[static 1])
 {
     VMXNET3Class *vc = VMXNET3_DEVICE_GET_CLASS(qdev);
     PCIDevice *pci_dev = PCI_DEVICE(qdev);
diff --git a/hw/net/xilinx_axienet.c b/hw/net/xilinx_axienet.c
index 5ffa739f68..eee37f69f6 100644
--- a/hw/net/xilinx_axienet.c
+++ b/hw/net/xilinx_axienet.c
@@ -940,7 +940,7 @@ static NetClientInfo net_xilinx_enet_info = {
     .receive = eth_rx,
 };
 
-static void xilinx_enet_realize(DeviceState *dev, Error **errp)
+static void xilinx_enet_realize(DeviceState *dev, Error *errp[static 1])
 {
     XilinxAXIEnet *s = XILINX_AXI_ENET(dev);
     XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(&s->rx_data_dev);
diff --git a/hw/net/xilinx_ethlite.c b/hw/net/xilinx_ethlite.c
index 35de353b7c..5b948f3b20 100644
--- a/hw/net/xilinx_ethlite.c
+++ b/hw/net/xilinx_ethlite.c
@@ -227,7 +227,7 @@ static NetClientInfo net_xilinx_ethlite_info = {
     .receive = eth_rx,
 };
 
-static void xilinx_ethlite_realize(DeviceState *dev, Error **errp)
+static void xilinx_ethlite_realize(DeviceState *dev, Error *errp[static 1])
 {
     struct xlx_ethlite *s = XILINX_ETHLITE(dev);
 
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index 43118044f1..109c095a0f 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -1034,7 +1034,7 @@ static const TypeInfo fw_cfg_info = {
     .class_init    = fw_cfg_class_init,
 };
 
-static void fw_cfg_file_slots_allocate(FWCfgState *s, Error **errp)
+static void fw_cfg_file_slots_allocate(FWCfgState *s, Error *errp[static 1])
 {
     uint16_t file_slots_max;
 
@@ -1069,7 +1069,7 @@ static Property fw_cfg_io_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void fw_cfg_io_realize(DeviceState *dev, Error **errp)
+static void fw_cfg_io_realize(DeviceState *dev, Error *errp[static 1])
 {
     FWCfgIoState *s = FW_CFG_IO(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
@@ -1119,7 +1119,7 @@ static Property fw_cfg_mem_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void fw_cfg_mem_realize(DeviceState *dev, Error **errp)
+static void fw_cfg_mem_realize(DeviceState *dev, Error *errp[static 1])
 {
     FWCfgMemState *s = FW_CFG_MEM(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/nvram/mac_nvram.c b/hw/nvram/mac_nvram.c
index aef80e64df..6f93833f07 100644
--- a/hw/nvram/mac_nvram.c
+++ b/hw/nvram/mac_nvram.c
@@ -92,7 +92,7 @@ static void macio_nvram_reset(DeviceState *dev)
 {
 }
 
-static void macio_nvram_realizefn(DeviceState *dev, Error **errp)
+static void macio_nvram_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *d = SYS_BUS_DEVICE(dev);
     MacIONVRAMState *s = MACIO_NVRAM(dev);
@@ -104,7 +104,7 @@ static void macio_nvram_realizefn(DeviceState *dev, Error **errp)
     sysbus_init_mmio(d, &s->mem);
 }
 
-static void macio_nvram_unrealizefn(DeviceState *dev, Error **errp)
+static void macio_nvram_unrealizefn(DeviceState *dev, Error *errp[static 1])
 {
     MacIONVRAMState *s = MACIO_NVRAM(dev);
 
diff --git a/hw/nvram/spapr_nvram.c b/hw/nvram/spapr_nvram.c
index bc355a4348..28c77250bd 100644
--- a/hw/nvram/spapr_nvram.c
+++ b/hw/nvram/spapr_nvram.c
@@ -138,7 +138,7 @@ static void rtas_nvram_store(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 1, (alen < 0) ? 0 : alen);
 }
 
-static void spapr_nvram_realize(VIOsPAPRDevice *dev, Error **errp)
+static void spapr_nvram_realize(VIOsPAPRDevice *dev, Error *errp[static 1])
 {
     sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(dev);
     int ret;
diff --git a/hw/pci-bridge/dec.c b/hw/pci-bridge/dec.c
index cca93620ac..b7471f97b4 100644
--- a/hw/pci-bridge/dec.c
+++ b/hw/pci-bridge/dec.c
@@ -52,7 +52,7 @@ static int dec_map_irq(PCIDevice *pci_dev, int irq_num)
     return irq_num;
 }
 
-static void dec_pci_bridge_realize(PCIDevice *pci_dev, Error **errp)
+static void dec_pci_bridge_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     pci_bridge_initfn(pci_dev, TYPE_PCI_BUS);
 }
@@ -108,7 +108,7 @@ static int pci_dec_21154_device_init(SysBusDevice *dev)
     return 0;
 }
 
-static void dec_21154_pci_host_realize(PCIDevice *d, Error **errp)
+static void dec_21154_pci_host_realize(PCIDevice *d, Error *errp[static 1])
 {
     /* PCI2PCI bridge same values as PearPC - check this */
 }
diff --git a/hw/pci-bridge/gen_pcie_root_port.c b/hw/pci-bridge/gen_pcie_root_port.c
index 8ebffa8bb0..9082452fee 100644
--- a/hw/pci-bridge/gen_pcie_root_port.c
+++ b/hw/pci-bridge/gen_pcie_root_port.c
@@ -25,7 +25,7 @@ static uint8_t gen_rp_aer_vector(const PCIDevice *d)
     return 0;
 }
 
-static int gen_rp_interrupts_init(PCIDevice *d, Error **errp)
+static int gen_rp_interrupts_init(PCIDevice *d, Error *errp[static 1])
 {
     int rc;
 
diff --git a/hw/pci-bridge/ioh3420.c b/hw/pci-bridge/ioh3420.c
index da4e5bdf04..9b50754d6e 100644
--- a/hw/pci-bridge/ioh3420.c
+++ b/hw/pci-bridge/ioh3420.c
@@ -61,7 +61,7 @@ static uint8_t ioh3420_aer_vector(const PCIDevice *d)
     return 0;
 }
 
-static int ioh3420_interrupts_init(PCIDevice *d, Error **errp)
+static int ioh3420_interrupts_init(PCIDevice *d, Error *errp[static 1])
 {
     int rc;
     Error *local_err = NULL;
diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
index 5dbd933cc1..c596d3b51b 100644
--- a/hw/pci-bridge/pci_bridge_dev.c
+++ b/hw/pci-bridge/pci_bridge_dev.c
@@ -184,7 +184,7 @@ static const VMStateDescription pci_bridge_dev_vmstate = {
 };
 
 static void pci_bridge_dev_hotplug_cb(HotplugHandler *hotplug_dev,
-                                      DeviceState *dev, Error **errp)
+                                      DeviceState *dev, Error *errp[static 1])
 {
     PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
 
@@ -198,7 +198,7 @@ static void pci_bridge_dev_hotplug_cb(HotplugHandler *hotplug_dev,
 
 static void pci_bridge_dev_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
                                                  DeviceState *dev,
-                                                 Error **errp)
+                                                 Error *errp[static 1])
 {
     PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
 
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
index 54132c52ad..28e7dd51e5 100644
--- a/hw/pci-bridge/pci_expander_bridge.c
+++ b/hw/pci-bridge/pci_expander_bridge.c
@@ -164,7 +164,8 @@ static const TypeInfo pxb_host_info = {
 /*
  * Registers the PXB bus as a child of pci host root bus.
  */
-static void pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus, Error **errp)
+static void pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus,
+                             Error *errp[static 1])
 {
     PCIBus *bus = dev->bus;
     int pxb_bus_num = pci_bus_num(pxb_bus);
@@ -210,7 +211,8 @@ static gint pxb_compare(gconstpointer a, gconstpointer b)
            0;
 }
 
-static void pxb_dev_realize_common(PCIDevice *dev, bool pcie, Error **errp)
+static void pxb_dev_realize_common(PCIDevice *dev, bool pcie,
+                                   Error *errp[static 1])
 {
     PXBDev *pxb = convert_to_pxb(dev);
     DeviceState *ds, *bds = NULL;
@@ -268,7 +270,7 @@ err_register_bus:
     object_unref(OBJECT(ds));
 }
 
-static void pxb_dev_realize(PCIDevice *dev, Error **errp)
+static void pxb_dev_realize(PCIDevice *dev, Error *errp[static 1])
 {
     if (pci_bus_is_express(dev->bus)) {
         error_setg(errp, "pxb devices cannot reside on a PCIe bus");
@@ -316,7 +318,7 @@ static const TypeInfo pxb_dev_info = {
     .class_init    = pxb_dev_class_init,
 };
 
-static void pxb_pcie_dev_realize(PCIDevice *dev, Error **errp)
+static void pxb_pcie_dev_realize(PCIDevice *dev, Error *errp[static 1])
 {
     if (!pci_bus_is_express(dev->bus)) {
         error_setg(errp, "pxb-pcie devices cannot reside on a PCI bus");
diff --git a/hw/pci-bridge/pcie_root_port.c b/hw/pci-bridge/pcie_root_port.c
index cf3631806f..90158f3942 100644
--- a/hw/pci-bridge/pcie_root_port.c
+++ b/hw/pci-bridge/pcie_root_port.c
@@ -52,7 +52,7 @@ static void rp_reset(DeviceState *qdev)
     pci_bridge_disable_base_limit(d);
 }
 
-static void rp_realize(PCIDevice *d, Error **errp)
+static void rp_realize(PCIDevice *d, Error *errp[static 1])
 {
     PCIEPort *p = PCIE_PORT(d);
     PCIESlot *s = PCIE_SLOT(d);
diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c
index 326f5ef024..d0cf801673 100644
--- a/hw/pci-host/apb.c
+++ b/hw/pci-host/apb.c
@@ -634,7 +634,7 @@ static void pci_apb_set_irq(void *opaque, int irq_num, int level)
     }
 }
 
-static void apb_pci_bridge_realize(PCIDevice *dev, Error **errp)
+static void apb_pci_bridge_realize(PCIDevice *dev, Error *errp[static 1])
 {
     pci_bridge_initfn(dev, TYPE_PCI_BUS);
 
@@ -788,7 +788,7 @@ static int pci_pbm_init_device(SysBusDevice *dev)
     return 0;
 }
 
-static void pbm_pci_host_realize(PCIDevice *d, Error **errp)
+static void pbm_pci_host_realize(PCIDevice *d, Error *errp[static 1])
 {
     pci_set_word(d->config + PCI_COMMAND,
                  PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
index 89133a9dd3..e2790b50b1 100644
--- a/hw/pci-host/bonito.c
+++ b/hw/pci-host/bonito.c
@@ -722,7 +722,7 @@ static int bonito_pcihost_initfn(SysBusDevice *dev)
     return 0;
 }
 
-static void bonito_realize(PCIDevice *dev, Error **errp)
+static void bonito_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIBonitoState *s = PCI_BONITO(dev);
     SysBusDevice *sysbus = SYS_BUS_DEVICE(s->pcihost);
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
index e069ba03da..e1b406eef1 100644
--- a/hw/pci-host/gpex.c
+++ b/hw/pci-host/gpex.c
@@ -44,7 +44,7 @@ static void gpex_set_irq(void *opaque, int irq_num, int level)
     qemu_set_irq(s->irq[irq_num], level);
 }
 
-static void gpex_host_realize(DeviceState *dev, Error **errp)
+static void gpex_host_realize(DeviceState *dev, Error *errp[static 1])
 {
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     GPEXHost *s = GPEX_HOST(dev);
diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
index 2e281f6155..1b5a185c9b 100644
--- a/hw/pci-host/grackle.c
+++ b/hw/pci-host/grackle.c
@@ -115,7 +115,7 @@ static int pci_grackle_init_device(SysBusDevice *dev)
     return 0;
 }
 
-static void grackle_pci_host_realize(PCIDevice *d, Error **errp)
+static void grackle_pci_host_realize(PCIDevice *d, Error *errp[static 1])
 {
     d->config[0x09] = 0x01;
 }
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
index 98f3810cc6..d1ba1fdb5a 100644
--- a/hw/pci-host/piix.c
+++ b/hw/pci-host/piix.c
@@ -212,7 +212,7 @@ static const VMStateDescription vmstate_i440fx = {
 
 static void i440fx_pcihost_get_pci_hole_start(Object *obj, Visitor *v,
                                               const char *name, void *opaque,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     I440FXState *s = I440FX_PCI_HOST_BRIDGE(obj);
     uint64_t val64;
@@ -226,7 +226,7 @@ static void i440fx_pcihost_get_pci_hole_start(Object *obj, Visitor *v,
 
 static void i440fx_pcihost_get_pci_hole_end(Object *obj, Visitor *v,
                                             const char *name, void *opaque,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     I440FXState *s = I440FX_PCI_HOST_BRIDGE(obj);
     uint64_t val64;
@@ -240,7 +240,8 @@ static void i440fx_pcihost_get_pci_hole_end(Object *obj, Visitor *v,
 
 static void i440fx_pcihost_get_pci_hole64_start(Object *obj, Visitor *v,
                                                 const char *name,
-                                                void *opaque, Error **errp)
+                                                void *opaque,
+                                                Error *errp[static 1])
 {
     PCIHostState *h = PCI_HOST_BRIDGE(obj);
     Range w64;
@@ -253,7 +254,7 @@ static void i440fx_pcihost_get_pci_hole64_start(Object *obj, Visitor *v,
 
 static void i440fx_pcihost_get_pci_hole64_end(Object *obj, Visitor *v,
                                               const char *name, void *opaque,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     PCIHostState *h = PCI_HOST_BRIDGE(obj);
     Range w64;
@@ -290,7 +291,7 @@ static void i440fx_pcihost_initfn(Object *obj)
                         NULL, NULL, NULL, IGNORE_ERRORS);
 }
 
-static void i440fx_pcihost_realize(DeviceState *dev, Error **errp)
+static void i440fx_pcihost_realize(DeviceState *dev, Error *errp[static 1])
 {
     PCIHostState *s = PCI_HOST_BRIDGE(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
@@ -302,7 +303,7 @@ static void i440fx_pcihost_realize(DeviceState *dev, Error **errp)
     sysbus_init_ioports(sbd, 0xcfc, 4);
 }
 
-static void i440fx_realize(PCIDevice *dev, Error **errp)
+static void i440fx_realize(PCIDevice *dev, Error *errp[static 1])
 {
     dev->config[I440FX_SMRAM] = 0x02;
 
@@ -652,7 +653,7 @@ static const MemoryRegionOps rcr_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN
 };
 
-static void piix3_realize(PCIDevice *dev, Error **errp)
+static void piix3_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PIIX3State *d = PIIX3_PCI_DEVICE(dev);
 
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
index becc0eeb76..bd9fe872db 100644
--- a/hw/pci-host/ppce500.c
+++ b/hw/pci-host/ppce500.c
@@ -417,7 +417,7 @@ static const VMStateDescription vmstate_ppce500_pci = {
 
 #include "exec/address-spaces.h"
 
-static void e500_pcihost_bridge_realize(PCIDevice *d, Error **errp)
+static void e500_pcihost_bridge_realize(PCIDevice *d, Error *errp[static 1])
 {
     PPCE500PCIBridgeState *b = PPC_E500_PCI_BRIDGE(d);
     PPCE500CCSRState *ccsr = CCSR(container_get(qdev_get_machine(),
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
index f3a8afcd9f..57f4b942a9 100644
--- a/hw/pci-host/prep.c
+++ b/hw/pci-host/prep.c
@@ -213,7 +213,7 @@ static void raven_change_gpio(void *opaque, int n, int level)
     s->contiguous_map = level;
 }
 
-static void raven_pcihost_realizefn(DeviceState *d, Error **errp)
+static void raven_pcihost_realizefn(DeviceState *d, Error *errp[static 1])
 {
     SysBusDevice *dev = SYS_BUS_DEVICE(d);
     PCIHostState *h = PCI_HOST_BRIDGE(dev);
@@ -294,7 +294,7 @@ static void raven_pcihost_initfn(Object *obj)
     qdev_prop_set_bit(pci_dev, "multifunction", false);
 }
 
-static void raven_realize(PCIDevice *d, Error **errp)
+static void raven_realize(PCIDevice *d, Error *errp[static 1])
 {
     RavenPCIState *s = RAVEN_PCI_DEVICE(d);
     char *filename;
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 65eba73939..2e0abf9c22 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -37,7 +37,7 @@
  * Q35 host
  */
 
-static void q35_host_realize(DeviceState *dev, Error **errp)
+static void q35_host_realize(DeviceState *dev, Error *errp[static 1])
 {
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     Q35PCIHost *s = Q35_HOST_DEVICE(dev);
@@ -71,7 +71,7 @@ static const char *q35_host_root_bus_path(PCIHostState *host_bridge,
 
 static void q35_host_get_pci_hole_start(Object *obj, Visitor *v,
                                         const char *name, void *opaque,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     Q35PCIHost *s = Q35_HOST_DEVICE(obj);
     uint64_t val64;
@@ -86,7 +86,7 @@ static void q35_host_get_pci_hole_start(Object *obj, Visitor *v,
 
 static void q35_host_get_pci_hole_end(Object *obj, Visitor *v,
                                       const char *name, void *opaque,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     Q35PCIHost *s = Q35_HOST_DEVICE(obj);
     uint64_t val64;
@@ -101,7 +101,7 @@ static void q35_host_get_pci_hole_end(Object *obj, Visitor *v,
 
 static void q35_host_get_pci_hole64_start(Object *obj, Visitor *v,
                                           const char *name, void *opaque,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     PCIHostState *h = PCI_HOST_BRIDGE(obj);
     Range w64;
@@ -114,7 +114,7 @@ static void q35_host_get_pci_hole64_start(Object *obj, Visitor *v,
 
 static void q35_host_get_pci_hole64_end(Object *obj, Visitor *v,
                                         const char *name, void *opaque,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     PCIHostState *h = PCI_HOST_BRIDGE(obj);
     Range w64;
@@ -126,7 +126,7 @@ static void q35_host_get_pci_hole64_end(Object *obj, Visitor *v,
 }
 
 static void q35_host_get_mmcfg_size(Object *obj, Visitor *v, const char *name,
-                                    void *opaque, Error **errp)
+                                    void *opaque, Error *errp[static 1])
 {
     PCIExpressHost *e = PCIE_HOST_BRIDGE(obj);
     uint32_t value = e->size;
@@ -465,7 +465,7 @@ static void mch_reset(DeviceState *qdev)
     mch_update(mch);
 }
 
-static void mch_realize(PCIDevice *d, Error **errp)
+static void mch_realize(PCIDevice *d, Error *errp[static 1])
 {
     int i;
     MCHPCIState *mch = MCH_PCI_DEVICE(d);
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
index 6cf5e59f86..9a34313c5a 100644
--- a/hw/pci-host/uninorth.c
+++ b/hw/pci-host/uninorth.c
@@ -314,14 +314,14 @@ PCIBus *pci_pmac_u3_init(qemu_irq *pic,
     return h->bus;
 }
 
-static void unin_main_pci_host_realize(PCIDevice *d, Error **errp)
+static void unin_main_pci_host_realize(PCIDevice *d, Error *errp[static 1])
 {
     d->config[0x0C] = 0x08; // cache_line_size
     d->config[0x0D] = 0x10; // latency_timer
     d->config[0x34] = 0x00; // capabilities_pointer
 }
 
-static void unin_agp_pci_host_realize(PCIDevice *d, Error **errp)
+static void unin_agp_pci_host_realize(PCIDevice *d, Error *errp[static 1])
 {
     d->config[0x0C] = 0x08; // cache_line_size
     d->config[0x0D] = 0x10; // latency_timer
@@ -337,7 +337,7 @@ static void unin_agp_pci_host_realize(PCIDevice *d, Error **errp)
     d->config[0x4b] = 0x1;
 }
 
-static void u3_agp_pci_host_realize(PCIDevice *d, Error **errp)
+static void u3_agp_pci_host_realize(PCIDevice *d, Error *errp[static 1])
 {
     /* cache line size */
     d->config[0x0C] = 0x08;
@@ -345,7 +345,8 @@ static void u3_agp_pci_host_realize(PCIDevice *d, Error **errp)
     d->config[0x0D] = 0x10;
 }
 
-static void unin_internal_pci_host_realize(PCIDevice *d, Error **errp)
+static void unin_internal_pci_host_realize(PCIDevice *d,
+                                           Error *errp[static 1])
 {
     d->config[0x0C] = 0x08; // cache_line_size
     d->config[0x0D] = 0x10; // latency_timer
diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
index aa1fdf75fd..a9fe27d962 100644
--- a/hw/pci-host/versatile.c
+++ b/hw/pci-host/versatile.c
@@ -388,7 +388,7 @@ static void pci_vpb_init(Object *obj)
     s->mem_win_size[2] = 0x10000000;
 }
 
-static void pci_vpb_realize(DeviceState *dev, Error **errp)
+static void pci_vpb_realize(DeviceState *dev, Error *errp[static 1])
 {
     PCIVPBState *s = PCI_VPB(dev);
     PCIHostState *h = PCI_HOST_BRIDGE(dev);
@@ -459,7 +459,7 @@ static void pci_vpb_realize(DeviceState *dev, Error **errp)
     object_property_set_bool(OBJECT(&s->pci_dev), true, "realized", errp);
 }
 
-static void versatile_pci_host_realize(PCIDevice *d, Error **errp)
+static void versatile_pci_host_realize(PCIDevice *d, Error *errp[static 1])
 {
     pci_set_word(d->config + PCI_STATUS,
                  PCI_STATUS_66MHZ | PCI_STATUS_DEVSEL_MEDIUM);
diff --git a/hw/pci-host/xilinx-pcie.c b/hw/pci-host/xilinx-pcie.c
index 0cc54f167d..29e0fbabeb 100644
--- a/hw/pci-host/xilinx-pcie.c
+++ b/hw/pci-host/xilinx-pcie.c
@@ -104,7 +104,7 @@ static void xilinx_pcie_set_irq(void *opaque, int irq_num, int level)
        0);
 }
 
-static void xilinx_pcie_host_realize(DeviceState *dev, Error **errp)
+static void xilinx_pcie_host_realize(DeviceState *dev, Error *errp[static 1])
 {
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     XilinxPCIEHost *s = XILINX_PCIE_HOST(dev);
diff --git a/hw/pci/msi.c b/hw/pci/msi.c
index a87b2278a3..4a3fdae4a5 100644
--- a/hw/pci/msi.c
+++ b/hw/pci/msi.c
@@ -184,7 +184,7 @@ bool msi_enabled(const PCIDevice *dev)
  */
 int msi_init(struct PCIDevice *dev, uint8_t offset,
              unsigned int nr_vectors, bool msi64bit,
-             bool msi_per_vector_mask, Error **errp)
+             bool msi_per_vector_mask, Error *errp[static 1])
 {
     unsigned int vectors_order;
     uint16_t flags;
diff --git a/hw/pci/msix.c b/hw/pci/msix.c
index fc5fe511b3..c247402785 100644
--- a/hw/pci/msix.c
+++ b/hw/pci/msix.c
@@ -270,7 +270,7 @@ int msix_init(struct PCIDevice *dev, unsigned short nentries,
               MemoryRegion *table_bar, uint8_t table_bar_nr,
               unsigned table_offset, MemoryRegion *pba_bar,
               uint8_t pba_bar_nr, unsigned pba_offset, uint8_t cap_pos,
-              Error **errp)
+              Error *errp[static 1])
 {
     int cap;
     unsigned table_size, pba_size;
@@ -339,7 +339,7 @@ int msix_init(struct PCIDevice *dev, unsigned short nentries,
 }
 
 int msix_init_exclusive_bar(PCIDevice *dev, unsigned short nentries,
-                            uint8_t bar_nr, Error **errp)
+                            uint8_t bar_nr, Error *errp[static 1])
 {
     int ret;
     char *name;
diff --git a/hw/pci/pci-stub.c b/hw/pci/pci-stub.c
index 36d2c430c5..94c5c62012 100644
--- a/hw/pci/pci-stub.c
+++ b/hw/pci/pci-stub.c
@@ -25,7 +25,7 @@
 #include "hw/pci/pci.h"
 #include "qmp-commands.h"
 
-PciInfoList *qmp_query_pci(Error **errp)
+PciInfoList *qmp_query_pci(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 4e25eee0ad..53852e4af2 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -107,7 +107,7 @@ static void pcibus_machine_done(Notifier *notifier, void *data)
     }
 }
 
-static void pci_bus_realize(BusState *qbus, Error **errp)
+static void pci_bus_realize(BusState *qbus, Error *errp[static 1])
 {
     PCIBus *bus = PCI_BUS(qbus);
 
@@ -117,7 +117,7 @@ static void pci_bus_realize(BusState *qbus, Error **errp)
     vmstate_register(NULL, -1, &vmstate_pcibus, bus);
 }
 
-static void pci_bus_unrealize(BusState *qbus, Error **errp)
+static void pci_bus_unrealize(BusState *qbus, Error *errp[static 1])
 {
     PCIBus *bus = PCI_BUS(qbus);
 
@@ -177,7 +177,8 @@ static const TypeInfo pcie_bus_info = {
 static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
 static void pci_update_mappings(PCIDevice *d);
 static void pci_irq_handler(void *opaque, int irq_num, int level);
-static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom, Error **);
+static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom,
+			       Error *[static 1]);
 static void pci_del_option_rom(PCIDevice *pdev);
 
 static uint16_t pci_default_sub_vendor_id = PCI_SUBVENDOR_ID_REDHAT_QUMRANET;
@@ -798,7 +799,8 @@ static void pci_init_mask_bridge(PCIDevice *d)
                                PCI_PREF_RANGE_TYPE_MASK);
 }
 
-static void pci_init_multifunction(PCIBus *bus, PCIDevice *dev, Error **errp)
+static void pci_init_multifunction(PCIBus *bus, PCIDevice *dev,
+                                   Error *errp[static 1])
 {
     uint8_t slot = PCI_SLOT(dev->devfn);
     uint8_t func;
@@ -955,7 +957,7 @@ uint16_t pci_requester_id(PCIDevice *dev)
 /* -1 for devfn means auto assign */
 static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
                                          const char *name, int devfn,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
     PCIConfigReadFunc *config_read = pc->config_read;
@@ -1070,7 +1072,7 @@ static void pci_unregister_io_regions(PCIDevice *pci_dev)
     pci_unregister_vga(pci_dev);
 }
 
-static void pci_qdev_unrealize(DeviceState *dev, Error **errp)
+static void pci_qdev_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     PCIDevice *pci_dev = PCI_DEVICE(dev);
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
@@ -1769,7 +1771,7 @@ static PciInfo *qmp_query_pci_bus(PCIBus *bus, int bus_num)
     return info;
 }
 
-PciInfoList *qmp_query_pci(Error **errp)
+PciInfoList *qmp_query_pci(Error *errp[static 1])
 {
     PciInfoList *info, *head = NULL, *cur_item = NULL;
     PCIHostState *host_bridge;
@@ -1977,7 +1979,7 @@ PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn)
     return bus->devices[devfn];
 }
 
-static void pci_qdev_realize(DeviceState *qdev, Error **errp)
+static void pci_qdev_realize(DeviceState *qdev, Error *errp[static 1])
 {
     PCIDevice *pci_dev = (PCIDevice *)qdev;
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
@@ -2018,7 +2020,7 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
     }
 }
 
-static void pci_default_realize(PCIDevice *dev, Error **errp)
+static void pci_default_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
 
@@ -2168,7 +2170,7 @@ static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
 
 /* Add an option rom for the device */
 static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     int size;
     char *path;
@@ -2278,7 +2280,7 @@ int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
 
 int pci_add_capability2(PCIDevice *pdev, uint8_t cap_id,
                        uint8_t offset, uint8_t size,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     uint8_t *config;
     int i, overlapping_cap;
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index 15bd92086c..6c89ce10ec 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -300,7 +300,8 @@ static void pcie_cap_slot_event(PCIDevice *dev, PCIExpressHotPlugEvent event)
 
 static void pcie_cap_slot_hotplug_common(PCIDevice *hotplug_dev,
                                          DeviceState *dev,
-                                         uint8_t **exp_cap, Error **errp)
+                                         uint8_t **exp_cap,
+                                         Error *errp[static 1])
 {
     *exp_cap = hotplug_dev->config + hotplug_dev->exp.exp_cap;
     uint16_t sltsta = pci_get_word(*exp_cap + PCI_EXP_SLTSTA);
@@ -315,7 +316,7 @@ static void pcie_cap_slot_hotplug_common(PCIDevice *hotplug_dev,
 }
 
 void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     uint8_t *exp_cap;
     PCIDevice *pci_dev = PCI_DEVICE(dev);
@@ -349,7 +350,8 @@ static void pcie_unplug_device(PCIBus *bus, PCIDevice *dev, void *opaque)
 }
 
 void pcie_cap_slot_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                         DeviceState *dev, Error **errp)
+                                         DeviceState *dev,
+                                         Error *errp[static 1])
 {
     uint8_t *exp_cap;
     PCIDevice *pci_dev = PCI_DEVICE(dev);
diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c
index 828052b0c0..52ec70e5e7 100644
--- a/hw/pci/pcie_aer.c
+++ b/hw/pci/pcie_aer.c
@@ -105,7 +105,7 @@ static void aer_log_clear_all_err(PCIEAERLog *aer_log)
 }
 
 int pcie_aer_init(PCIDevice *dev, uint8_t cap_ver, uint16_t offset,
-                  uint16_t size, Error **errp)
+                  uint16_t size, Error *errp[static 1])
 {
     pcie_add_capability(dev, PCI_EXT_CAP_ID_ERR, cap_ver,
                         offset, size);
diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
index f3ea297a4d..5c2160c634 100644
--- a/hw/pci/shpc.c
+++ b/hw/pci/shpc.c
@@ -491,7 +491,8 @@ static const MemoryRegionOps shpc_mmio_ops = {
     },
 };
 static void shpc_device_hotplug_common(PCIDevice *affected_dev, int *slot,
-                                       SHPCDevice *shpc, Error **errp)
+                                       SHPCDevice *shpc,
+                                       Error *errp[static 1])
 {
     int pci_slot = PCI_SLOT(affected_dev->devfn);
     *slot = SHPC_PCI_TO_IDX(pci_slot);
@@ -506,7 +507,7 @@ static void shpc_device_hotplug_common(PCIDevice *affected_dev, int *slot,
 }
 
 void shpc_device_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
     SHPCDevice *shpc = pci_hotplug_dev->shpc;
@@ -547,7 +548,8 @@ void shpc_device_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
 }
 
 void shpc_device_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
-                                       DeviceState *dev, Error **errp)
+                                       DeviceState *dev,
+                                       Error *errp[static 1])
 {
     PCIDevice *pci_hotplug_dev = PCI_DEVICE(hotplug_dev);
     SHPCDevice *shpc = pci_hotplug_dev->shpc;
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 1b9abbb094..7a875c43f1 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -706,7 +706,8 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500Params *params,
 }
 
 static DeviceState *ppce500_init_mpic_kvm(PPCE500Params *params,
-                                          qemu_irq **irqs, Error **errp)
+                                          qemu_irq **irqs,
+                                          Error *errp[static 1])
 {
     DeviceState *dev;
     CPUState *cs;
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index bae1c0ac99..1d690d0c46 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -114,7 +114,7 @@ static const MemoryRegionOps unin_ops = {
 };
 
 static void fw_cfg_boot_set(void *opaque, const char *boot_device,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
 }
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 97bb8541d7..86480f5176 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -56,7 +56,7 @@
 #define NDRV_VGA_FILENAME "qemu_vga.ndrv"
 
 static void fw_cfg_boot_set(void *opaque, const char *boot_device,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
 }
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 0e5236e577..d721131cca 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -795,7 +795,7 @@ static const TypeInfo pnv_chip_power9_info = {
     .class_init    = pnv_chip_power9_class_init,
 };
 
-static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp)
+static void pnv_chip_core_sanitize(PnvChip *chip, Error *errp[static 1])
 {
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
     int cores_max;
@@ -850,7 +850,7 @@ static void pnv_chip_init(Object *obj)
                                    OBJECT(&chip->psi), &error_abort);
 }
 
-static void pnv_chip_icp_realize(PnvChip *chip, Error **errp)
+static void pnv_chip_icp_realize(PnvChip *chip, Error *errp[static 1])
 {
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
     char *typename = pnv_core_typename(pcc->cpu_model);
@@ -882,7 +882,7 @@ static void pnv_chip_icp_realize(PnvChip *chip, Error **errp)
     g_free(typename);
 }
 
-static void pnv_chip_realize(DeviceState *dev, Error **errp)
+static void pnv_chip_realize(DeviceState *dev, Error *errp[static 1])
 {
     PnvChip *chip = PNV_CHIP(dev);
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
@@ -1067,13 +1067,13 @@ static void pnv_pic_print_info(InterruptStatsProvider *obj,
 }
 
 static void pnv_get_num_chips(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     visit_type_uint32(v, name, &POWERNV_MACHINE(obj)->num_chips, errp);
 }
 
 static void pnv_set_num_chips(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     PnvMachineState *pnv = POWERNV_MACHINE(obj);
     uint32_t num_chips;
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 24d132cc3e..b61f63b7c0 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -44,7 +44,7 @@ static void powernv_cpu_reset(void *opaque)
     env->msr |= MSR_HVB; /* Hypervisor mode */
 }
 
-static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
+static void powernv_cpu_init(PowerPCCPU *cpu, Error *errp[static 1])
 {
     CPUPPCState *env = &cpu->env;
     int core_pir;
@@ -111,7 +111,8 @@ static const MemoryRegionOps pnv_core_xscom_ops = {
     .endianness = DEVICE_BIG_ENDIAN,
 };
 
-static void pnv_core_realize_child(Object *child, XICSFabric *xi, Error **errp)
+static void pnv_core_realize_child(Object *child, XICSFabric *xi,
+                                   Error *errp[static 1])
 {
     CPUState *cs = CPU(child);
     PowerPCCPU *cpu = POWERPC_CPU(cs);
@@ -140,7 +141,7 @@ static void pnv_core_realize_child(Object *child, XICSFabric *xi, Error **errp)
     xics_cpu_setup(xi, cpu, ICP(obj));
 }
 
-static void pnv_core_realize(DeviceState *dev, Error **errp)
+static void pnv_core_realize(DeviceState *dev, Error *errp[static 1])
 {
     PnvCore *pc = PNV_CORE(OBJECT(dev));
     CPUCore *cc = CPU_CORE(OBJECT(dev));
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index f03a80a29b..700dabd9fc 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -418,7 +418,7 @@ static const MemoryRegionOps opb_master_ops = {
     },
 };
 
-static void pnv_lpc_realize(DeviceState *dev, Error **errp)
+static void pnv_lpc_realize(DeviceState *dev, Error *errp[static 1])
 {
     PnvLpcController *lpc = PNV_LPC(dev);
     Object *obj;
diff --git a/hw/ppc/pnv_occ.c b/hw/ppc/pnv_occ.c
index 04880f26d6..6e77014264 100644
--- a/hw/ppc/pnv_occ.c
+++ b/hw/ppc/pnv_occ.c
@@ -92,7 +92,7 @@ static const MemoryRegionOps pnv_occ_xscom_ops = {
 };
 
 
-static void pnv_occ_realize(DeviceState *dev, Error **errp)
+static void pnv_occ_realize(DeviceState *dev, Error *errp[static 1])
 {
     PnvOCC *occ = PNV_OCC(dev);
     Object *obj;
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 5dd697bdb4..370d662c0d 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -459,7 +459,7 @@ static const uint8_t irq_to_xivr[] = {
     PSIHB_XSCOM_XIVR_EXT,
 };
 
-static void pnv_psi_realize(DeviceState *dev, Error **errp)
+static void pnv_psi_realize(DeviceState *dev, Error *errp[static 1])
 {
     PnvPsi *psi = PNV_PSI(dev);
     ICSState *ics = &psi->ics;
diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
index 38bc85f117..4f1b7c4de0 100644
--- a/hw/ppc/pnv_xscom.c
+++ b/hw/ppc/pnv_xscom.c
@@ -174,7 +174,7 @@ const MemoryRegionOps pnv_xscom_ops = {
     .endianness = DEVICE_BIG_ENDIAN,
 };
 
-void pnv_xscom_realize(PnvChip *chip, Error **errp)
+void pnv_xscom_realize(PnvChip *chip, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(chip);
     char *name;
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index bc7b2fd287..05d197dea1 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -324,7 +324,7 @@ static uint32_t PREP_io_800_readb (void *opaque, uint32_t addr)
 #define NVRAM_SIZE        0x2000
 
 static void fw_cfg_boot_set(void *opaque, const char *boot_device,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
 }
diff --git a/hw/ppc/prep_systemio.c b/hw/ppc/prep_systemio.c
index 50893ec529..eccdeb0ed7 100644
--- a/hw/ppc/prep_systemio.c
+++ b/hw/ppc/prep_systemio.c
@@ -239,7 +239,7 @@ static const MemoryRegionOps ppc_parity_error_ops = {
     },
 };
 
-static void prep_systemio_realize(DeviceState *dev, Error **errp)
+static void prep_systemio_realize(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isa = ISA_DEVICE(dev);
     PrepSystemIoState *s = PREP_SYSTEMIO(dev);
diff --git a/hw/ppc/rs6000_mc.c b/hw/ppc/rs6000_mc.c
index b6135650bd..ef6bfd56c8 100644
--- a/hw/ppc/rs6000_mc.c
+++ b/hw/ppc/rs6000_mc.c
@@ -136,7 +136,7 @@ static const MemoryRegionPortio rs6000mc_port_list[] = {
     PORTIO_END_OF_LIST()
 };
 
-static void rs6000mc_realize(DeviceState *dev, Error **errp)
+static void rs6000mc_realize(DeviceState *dev, Error *errp[static 1])
 {
     RS6000MCState *s = RS6000MC_DEVICE(dev);
     int socket = 0;
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index f39fd1e06f..b3da0853de 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -100,7 +100,7 @@
 
 static ICSState *spapr_ics_create(sPAPRMachineState *spapr,
                                   const char *type_ics,
-                                  int nr_irqs, Error **errp)
+                                  int nr_irqs, Error *errp[static 1])
 {
     Error *local_err = NULL;
     Object *obj;
@@ -124,7 +124,8 @@ error:
     return NULL;
 }
 
-static void xics_system_init(MachineState *machine, int nr_irqs, Error **errp)
+static void xics_system_init(MachineState *machine, int nr_irqs,
+                             Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
 
@@ -1230,7 +1231,7 @@ void spapr_free_hpt(sPAPRMachineState *spapr)
 }
 
 static void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     long rc;
 
@@ -1402,7 +1403,7 @@ static void spapr_rtc_create(sPAPRMachineState *spapr)
 }
 
 /* Returns whether we want to use VGA or not */
-static bool spapr_vga_init(PCIBus *pci_bus, Error **errp)
+static bool spapr_vga_init(PCIBus *pci_bus, Error *errp[static 1])
 {
     switch (vga_interface_type) {
     case VGA_NONE:
@@ -1874,7 +1875,7 @@ static SaveVMHandlers savevm_htab_handlers = {
 };
 
 static void spapr_boot_set(void *opaque, const char *boot_device,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     MachineState *machine = MACHINE(qdev_get_machine());
     machine->boot_order = g_strdup(boot_device);
@@ -1921,7 +1922,8 @@ static void spapr_create_lmb_dr_connectors(sPAPRMachineState *spapr)
  * to SPAPR_MEMORY_BLOCK_SIZE(256MB), then refuse to start the guest
  * since we can't support such unaligned sizes with DRCONF_MEMORY.
  */
-static void spapr_validate_node_memory(MachineState *machine, Error **errp)
+static void spapr_validate_node_memory(MachineState *machine,
+                                       Error *errp[static 1])
 {
     int i;
 
@@ -2444,14 +2446,15 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus,
     return NULL;
 }
 
-static char *spapr_get_kvm_type(Object *obj, Error **errp)
+static char *spapr_get_kvm_type(Object *obj, Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
 
     return g_strdup(spapr->kvm_type);
 }
 
-static void spapr_set_kvm_type(Object *obj, const char *value, Error **errp)
+static void spapr_set_kvm_type(Object *obj, const char *value,
+                               Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
 
@@ -2459,7 +2462,8 @@ static void spapr_set_kvm_type(Object *obj, const char *value, Error **errp)
     spapr->kvm_type = g_strdup(value);
 }
 
-static bool spapr_get_modern_hotplug_events(Object *obj, Error **errp)
+static bool spapr_get_modern_hotplug_events(Object *obj,
+                                            Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
 
@@ -2467,7 +2471,7 @@ static bool spapr_get_modern_hotplug_events(Object *obj, Error **errp)
 }
 
 static void spapr_set_modern_hotplug_events(Object *obj, bool value,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
 
@@ -2510,7 +2514,7 @@ void spapr_do_system_reset_on_cpu(CPUState *cs, run_on_cpu_data arg)
     ppc_cpu_do_system_reset(cs);
 }
 
-static void spapr_nmi(NMIState *n, int cpu_index, Error **errp)
+static void spapr_nmi(NMIState *n, int cpu_index, Error *errp[static 1])
 {
     CPUState *cs;
 
@@ -2521,7 +2525,7 @@ static void spapr_nmi(NMIState *n, int cpu_index, Error **errp)
 
 static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
                            uint32_t node, bool dedicated_hp_event_source,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     sPAPRDRConnector *drc;
     sPAPRDRConnectorClass *drck;
@@ -2567,7 +2571,7 @@ static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
 }
 
 static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                              uint32_t node, Error **errp)
+                              uint32_t node, Error *errp[static 1])
 {
     Error *local_err = NULL;
     sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
@@ -2598,7 +2602,7 @@ out:
 }
 
 static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     PCDIMMDevice *dimm = PC_DIMM(dev);
     PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
@@ -2716,7 +2720,7 @@ void spapr_lmb_release(DeviceState *dev)
 }
 
 static void spapr_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
     PCDIMMDevice *dimm = PC_DIMM(dev);
@@ -2728,7 +2732,8 @@ static void spapr_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
 }
 
 static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
-                                        DeviceState *dev, Error **errp)
+                                        DeviceState *dev,
+                                        Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
     Error *local_err = NULL;
@@ -2796,7 +2801,7 @@ void *spapr_populate_hotplug_cpu_dt(CPUState *cs, int *fdt_offset,
 }
 
 static void spapr_core_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     MachineState *ms = MACHINE(qdev_get_machine());
     CPUCore *cc = CPU_CORE(dev);
@@ -2818,7 +2823,7 @@ void spapr_core_release(DeviceState *dev)
 
 static
 void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     int index;
     sPAPRDRConnector *drc;
@@ -2849,7 +2854,7 @@ void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev,
 }
 
 static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
     MachineClass *mc = MACHINE_GET_CLASS(spapr);
@@ -2910,7 +2915,7 @@ static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
 }
 
 static void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     MachineState *machine = MACHINE(OBJECT(hotplug_dev));
     MachineClass *mc = MACHINE_GET_CLASS(hotplug_dev);
@@ -2967,7 +2972,7 @@ out:
 }
 
 static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
-                                      DeviceState *dev, Error **errp)
+                                      DeviceState *dev, Error *errp[static 1])
 {
     sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(qdev_get_machine());
 
@@ -3016,7 +3021,7 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
 }
 
 static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev,
-                                      DeviceState *dev, Error **errp)
+                                      DeviceState *dev, Error *errp[static 1])
 {
     sPAPRMachineState *sms = SPAPR_MACHINE(qdev_get_machine());
     MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
@@ -3037,7 +3042,8 @@ static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev,
 }
 
 static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
-                                                DeviceState *dev, Error **errp)
+                                                DeviceState *dev,
+                                                Error *errp[static 1])
 {
     sPAPRMachineState *sms = SPAPR_MACHINE(qdev_get_machine());
     MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
@@ -3064,7 +3070,8 @@ static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
 }
 
 static void spapr_machine_device_pre_plug(HotplugHandler *hotplug_dev,
-                                          DeviceState *dev, Error **errp)
+                                          DeviceState *dev,
+                                          Error *errp[static 1])
 {
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         spapr_memory_pre_plug(hotplug_dev, dev, errp);
@@ -3137,7 +3144,8 @@ static const CPUArchIdList *spapr_possible_cpu_arch_ids(MachineState *machine)
 static void spapr_phb_placement(sPAPRMachineState *spapr, uint32_t index,
                                 uint64_t *buid, hwaddr *pio,
                                 hwaddr *mmio32, hwaddr *mmio64,
-                                unsigned n_dma, uint32_t *liobns, Error **errp)
+                                unsigned n_dma, uint32_t *liobns,
+                                Error *errp[static 1])
 {
     /*
      * New-style PHB window placement.
@@ -3417,7 +3425,8 @@ DEFINE_SPAPR_MACHINE(2_8, "2.8", false);
 static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index,
                               uint64_t *buid, hwaddr *pio,
                               hwaddr *mmio32, hwaddr *mmio64,
-                              unsigned n_dma, uint32_t *liobns, Error **errp)
+                              unsigned n_dma, uint32_t *liobns,
+                              Error *errp[static 1])
 {
     /* Legacy PHB placement for pseries-2.7 and earlier machine types */
     const uint64_t base_buid = 0x800000020000000ULL;
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index 029a14120e..4b8ef5c2ab 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -60,7 +60,7 @@ static void spapr_cpu_destroy(PowerPCCPU *cpu)
 }
 
 static void spapr_cpu_init(sPAPRMachineState *spapr, PowerPCCPU *cpu,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     CPUPPCState *env = &cpu->env;
 
@@ -111,7 +111,8 @@ char *spapr_get_cpu_core_type(const char *model)
     return core_type;
 }
 
-static void spapr_cpu_core_unrealizefn(DeviceState *dev, Error **errp)
+static void spapr_cpu_core_unrealizefn(DeviceState *dev,
+                                       Error *errp[static 1])
 {
     sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
     sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(dev));
@@ -134,7 +135,7 @@ static void spapr_cpu_core_unrealizefn(DeviceState *dev, Error **errp)
     g_free(sc->threads);
 }
 
-static void spapr_cpu_core_realize_child(Object *child, Error **errp)
+static void spapr_cpu_core_realize_child(Object *child, Error *errp[static 1])
 {
     Error *local_err = NULL;
     sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
@@ -169,7 +170,7 @@ error:
     error_propagate(errp, local_err);
 }
 
-static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
+static void spapr_cpu_core_realize(DeviceState *dev, Error *errp[static 1])
 {
     sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
     sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(dev));
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 867fe9cd84..8968f11654 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -221,14 +221,14 @@ static uint32_t entity_sense(sPAPRDRConnector *drc, sPAPRDREntitySense *state)
 }
 
 static void prop_get_index(Object *obj, Visitor *v, const char *name,
-                           void *opaque, Error **errp)
+                           void *opaque, Error *errp[static 1])
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
     uint32_t value = spapr_drc_index(drc);
     visit_type_uint32(v, name, &value, errp);
 }
 
-static char *prop_get_name(Object *obj, Error **errp)
+static char *prop_get_name(Object *obj, Error *errp[static 1])
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
     sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
@@ -236,7 +236,7 @@ static char *prop_get_name(Object *obj, Error **errp)
 }
 
 static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
-                         void *opaque, Error **errp)
+                         void *opaque, Error *errp[static 1])
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
     int fdt_offset_next, fdt_offset, fdt_depth;
@@ -306,7 +306,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
 }
 
 static void attach(sPAPRDRConnector *drc, DeviceState *d, void *fdt,
-                   int fdt_start_offset, bool coldplug, Error **errp)
+                   int fdt_start_offset, bool coldplug, Error *errp[static 1])
 {
     trace_spapr_drc_attach(spapr_drc_index(drc));
 
@@ -357,7 +357,8 @@ static void attach(sPAPRDRConnector *drc, DeviceState *d, void *fdt,
                              NULL, 0, IGNORE_ERRORS);
 }
 
-static void detach(sPAPRDRConnector *drc, DeviceState *d, Error **errp)
+static void detach(sPAPRDRConnector *drc, DeviceState *d,
+                   Error *errp[static 1])
 {
     trace_spapr_drc_detach(spapr_drc_index(drc));
 
@@ -527,7 +528,7 @@ static const VMStateDescription vmstate_spapr_drc = {
     }
 };
 
-static void realize(DeviceState *d, Error **errp)
+static void realize(DeviceState *d, Error *errp[static 1])
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(d);
     Object *root_container;
@@ -559,7 +560,7 @@ static void realize(DeviceState *d, Error **errp)
     trace_spapr_drc_realize_complete(spapr_drc_index(drc));
 }
 
-static void unrealize(DeviceState *d, Error **errp)
+static void unrealize(DeviceState *d, Error *errp[static 1])
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(d);
     Object *root_container;
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index aa1ffea9e5..b52375a2b9 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1046,7 +1046,7 @@ static target_ulong h_signal_sys_reset(PowerPCCPU *cpu,
 }
 
 static uint32_t cas_check_pvr(PowerPCCPU *cpu, target_ulong *addr,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     bool explicit_match = false; /* Matched the CPU's real PVR */
     uint32_t max_compat = cpu->max_compat;
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index bee492de12..e792c3fbe0 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -371,7 +371,7 @@ void spapr_tce_table_disable(sPAPRTCETable *tcet)
     tcet->nb_table = 0;
 }
 
-static void spapr_tce_table_unrealize(DeviceState *dev, Error **errp)
+static void spapr_tce_table_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     sPAPRTCETable *tcet = SPAPR_TCE_TABLE(dev);
 
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 03eff2f67c..32bf290921 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -1347,7 +1347,7 @@ static int spapr_create_pci_child_dt(sPAPRPHBState *phb, PCIDevice *dev,
 static void spapr_phb_add_pci_device(sPAPRDRConnector *drc,
                                      sPAPRPHBState *phb,
                                      PCIDevice *pdev,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     DeviceState *dev = DEVICE(pdev);
@@ -1389,7 +1389,7 @@ void spapr_phb_remove_pci_device_cb(DeviceState *dev)
 static void spapr_phb_remove_pci_device(sPAPRDRConnector *drc,
                                         sPAPRPHBState *phb,
                                         PCIDevice *pdev,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
@@ -1424,7 +1424,8 @@ static uint32_t spapr_phb_get_pci_drc_index(sPAPRPHBState *phb,
 }
 
 static void spapr_phb_hot_plug_child(HotplugHandler *plug_handler,
-                                     DeviceState *plugged_dev, Error **errp)
+                                     DeviceState *plugged_dev,
+                                     Error *errp[static 1])
 {
     sPAPRPHBState *phb = SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler));
     PCIDevice *pdev = PCI_DEVICE(plugged_dev);
@@ -1489,7 +1490,8 @@ static void spapr_phb_hot_plug_child(HotplugHandler *plug_handler,
 }
 
 static void spapr_phb_hot_unplug_child(HotplugHandler *plug_handler,
-                                       DeviceState *plugged_dev, Error **errp)
+                                       DeviceState *plugged_dev,
+                                       Error *errp[static 1])
 {
     sPAPRPHBState *phb = SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler));
     PCIDevice *pdev = PCI_DEVICE(plugged_dev);
@@ -1553,7 +1555,7 @@ static void spapr_phb_hot_unplug_child(HotplugHandler *plug_handler,
     }
 }
 
-static void spapr_phb_realize(DeviceState *dev, Error **errp)
+static void spapr_phb_realize(DeviceState *dev, Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
     SysBusDevice *s = SYS_BUS_DEVICE(dev);
diff --git a/hw/ppc/spapr_rng.c b/hw/ppc/spapr_rng.c
index 1d0968358e..f3feaf27fb 100644
--- a/hw/ppc/spapr_rng.c
+++ b/hw/ppc/spapr_rng.c
@@ -112,7 +112,7 @@ static void spapr_rng_instance_init(Object *obj)
                                     IGNORE_ERRORS);
 }
 
-static void spapr_rng_realize(DeviceState *dev, Error **errp)
+static void spapr_rng_realize(DeviceState *dev, Error *errp[static 1])
 {
 
     sPAPRRngState *rngstate = SPAPR_RNG(dev);
diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
index 5f4489ac1b..5990c69de3 100644
--- a/hw/ppc/spapr_rtc.c
+++ b/hw/ppc/spapr_rtc.c
@@ -127,12 +127,13 @@ static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static void spapr_rtc_qom_date(Object *obj, struct tm *current_tm, Error **errp)
+static void spapr_rtc_qom_date(Object *obj, struct tm *current_tm,
+                               Error *errp[static 1])
 {
     spapr_rtc_read(SPAPR_RTC(obj), current_tm, NULL);
 }
 
-static void spapr_rtc_realize(DeviceState *dev, Error **errp)
+static void spapr_rtc_realize(DeviceState *dev, Error *errp[static 1])
 {
     sPAPRRTCState *rtc = SPAPR_RTC(dev);
     struct tm tm;
diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index a0ee4fd265..a7ed564c77 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -415,7 +415,7 @@ static void spapr_vio_busdev_reset(DeviceState *qdev)
     }
 }
 
-static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
+static void spapr_vio_busdev_realize(DeviceState *qdev, Error *errp[static 1])
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
     VIOsPAPRDevice *dev = (VIOsPAPRDevice *)qdev;
diff --git a/hw/s390x/3270-ccw.c b/hw/s390x/3270-ccw.c
index 6e6eee4e90..eeb889d62f 100644
--- a/hw/s390x/3270-ccw.c
+++ b/hw/s390x/3270-ccw.c
@@ -91,7 +91,7 @@ static int emulated_ccw_3270_cb(SubchDev *sch, CCW1 ccw)
     return rc;
 }
 
-static void emulated_ccw_3270_realize(DeviceState *ds, Error **errp)
+static void emulated_ccw_3270_realize(DeviceState *ds, Error *errp[static 1])
 {
     uint16_t chpid;
     EmulatedCcw3270Device *dev = EMULATED_CCW_3270(ds);
diff --git a/hw/s390x/ccw-device.c b/hw/s390x/ccw-device.c
index fb8d640a7e..6826d99565 100644
--- a/hw/s390x/ccw-device.c
+++ b/hw/s390x/ccw-device.c
@@ -28,7 +28,7 @@ static void ccw_device_refill_ids(CcwDevice *dev)
     dev->subch_id.valid = true;
 }
 
-static void ccw_device_realize(CcwDevice *dev, Error **errp)
+static void ccw_device_realize(CcwDevice *dev, Error *errp[static 1])
 {
     ccw_device_refill_ids(dev);
 }
diff --git a/hw/s390x/css-bridge.c b/hw/s390x/css-bridge.c
index 49e20a5786..6ae8b20227 100644
--- a/hw/s390x/css-bridge.c
+++ b/hw/s390x/css-bridge.c
@@ -25,7 +25,7 @@
  * device from the virtual css bus.
  */
 static void ccw_device_unplug(HotplugHandler *hotplug_dev,
-                              DeviceState *dev, Error **errp)
+                              DeviceState *dev, Error *errp[static 1])
 {
     CcwDevice *ccw_dev = CCW_DEVICE(dev);
     CCWDeviceClass *k = CCW_DEVICE_GET_CLASS(ccw_dev);
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index cf3a3fa70a..9c020e7357 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -1524,7 +1524,7 @@ static uint32_t css_find_free_subch(uint8_t cssid, uint8_t ssid)
  */
 static bool css_find_free_subch_for_devno(uint8_t cssid, uint8_t ssid,
                                           uint16_t devno, uint16_t *schid,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     uint32_t free_schid;
 
@@ -1558,7 +1558,7 @@ static bool css_find_free_subch_for_devno(uint8_t cssid, uint8_t ssid,
  */
 static bool css_find_free_subch_and_devno(uint8_t cssid, uint8_t *ssid,
                                           uint16_t *devno, uint16_t *schid,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     uint32_t free_schid, free_devno;
 
@@ -1939,7 +1939,7 @@ void css_reset(void)
 }
 
 static void get_css_devid(Object *obj, Visitor *v, const char *name,
-                          void *opaque, Error **errp)
+                          void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -1969,7 +1969,7 @@ static void get_css_devid(Object *obj, Visitor *v, const char *name,
  * parse <cssid>.<ssid>.<devid> and assert valid range for cssid/ssid
  */
 static void set_css_devid(Object *obj, Visitor *v, const char *name,
-                          void *opaque, Error **errp)
+                          void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
@@ -2024,7 +2024,7 @@ PropertyInfo css_devid_ro_propinfo = {
 };
 
 SubchDev *css_create_sch(CssDevId bus_id, bool is_virtual, bool squash_mcss,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     uint16_t schid = 0;
     SubchDev *sch;
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 6eac626212..448418a82e 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -287,7 +287,7 @@ out:
 
 #define TYPE_SCLP_EVENTS_BUS "s390-sclp-events-bus"
 
-static void sclp_events_bus_realize(BusState *bus, Error **errp)
+static void sclp_events_bus_realize(BusState *bus, Error *errp[static 1])
 {
     BusChild *kid;
 
@@ -394,7 +394,7 @@ static const TypeInfo sclp_event_facility_info = {
     .class_size    = sizeof(SCLPEventFacilityClass),
 };
 
-static void event_realize(DeviceState *qdev, Error **errp)
+static void event_realize(DeviceState *qdev, Error *errp[static 1])
 {
     SCLPEvent *event = SCLP_EVENT(qdev);
     SCLPEventClass *child = SCLP_EVENT_GET_CLASS(event);
@@ -408,7 +408,7 @@ static void event_realize(DeviceState *qdev, Error **errp)
     }
 }
 
-static void event_unrealize(DeviceState *qdev, Error **errp)
+static void event_unrealize(DeviceState *qdev, Error *errp[static 1])
 {
     SCLPEvent *event = SCLP_EVENT(qdev);
     SCLPEventClass *child = SCLP_EVENT_GET_CLASS(event);
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 1a9fd04692..f953941071 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -98,7 +98,7 @@ static uint64_t bios_translate_addr(void *opaque, uint64_t srcaddr)
     return srcaddr + dstaddr;
 }
 
-static void s390_ipl_realize(DeviceState *dev, Error **errp)
+static void s390_ipl_realize(DeviceState *dev, Error *errp[static 1])
 {
     S390IPLState *ipl = S390_IPL(dev);
     uint64_t pentry = KERN_IMAGE_START;
@@ -300,7 +300,7 @@ int s390_ipl_set_loadparm(uint8_t *loadparm)
     return -1;
 }
 
-static int load_netboot_image(Error **errp)
+static int load_netboot_image(Error *errp[static 1])
 {
     S390IPLState *ipl = get_ipl_device();
     char *netboot_filename;
diff --git a/hw/s390x/s390-ccw.c b/hw/s390x/s390-ccw.c
index 8614dda6f8..1aee8220dc 100644
--- a/hw/s390x/s390-ccw.c
+++ b/hw/s390x/s390-ccw.c
@@ -31,7 +31,7 @@ int s390_ccw_cmd_request(ORB *orb, SCSW *scsw, void *data)
 
 static void s390_ccw_get_dev_info(S390CCWDevice *cdev,
                                   char *sysfsdev,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     unsigned int cssid, ssid, devid;
     char dev_path[PATH_MAX] = {0}, *tmp;
@@ -62,7 +62,8 @@ static void s390_ccw_get_dev_info(S390CCWDevice *cdev,
     cdev->hostid.valid = true;
 }
 
-static void s390_ccw_realize(S390CCWDevice *cdev, char *sysfsdev, Error **errp)
+static void s390_ccw_realize(S390CCWDevice *cdev, char *sysfsdev,
+                             Error *errp[static 1])
 {
     CcwDevice *ccw_dev = CCW_DEVICE(cdev);
     CCWDeviceClass *ck = CCW_DEVICE_GET_CLASS(ccw_dev);
@@ -112,7 +113,7 @@ out_err_propagate:
     error_propagate(errp, err);
 }
 
-static void s390_ccw_unrealize(S390CCWDevice *cdev, Error **errp)
+static void s390_ccw_unrealize(S390CCWDevice *cdev, Error *errp[static 1])
 {
     CcwDevice *ccw_dev = CCW_DEVICE(cdev);
     SubchDev *sch = ccw_dev->sch;
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index aa4d7f5aa4..644e51b11e 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -665,7 +665,7 @@ static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
 }
 
 static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
-                                  DeviceState *dev, Error **errp)
+                                  DeviceState *dev, Error *errp[static 1])
 {
     PCIDevice *pdev = NULL;
     S390PCIBusDevice *pbdev = NULL;
@@ -765,7 +765,7 @@ static void s390_pcihost_timer_cb(void *opaque)
 }
 
 static void s390_pcihost_hot_unplug(HotplugHandler *hotplug_dev,
-                                    DeviceState *dev, Error **errp)
+                                    DeviceState *dev, Error *errp[static 1])
 {
     PCIDevice *pci_dev = NULL;
     PCIBus *bus;
@@ -910,7 +910,7 @@ static uint16_t s390_pci_generate_uid(S390pciState *s)
     return UID_UNDEFINED;
 }
 
-static uint32_t s390_pci_generate_fid(S390pciState *s, Error **errp)
+static uint32_t s390_pci_generate_fid(S390pciState *s, Error *errp[static 1])
 {
     uint32_t fid = 0;
 
@@ -924,7 +924,7 @@ static uint32_t s390_pci_generate_fid(S390pciState *s, Error **errp)
     return 0;
 }
 
-static void s390_pci_device_realize(DeviceState *dev, Error **errp)
+static void s390_pci_device_realize(DeviceState *dev, Error *errp[static 1])
 {
     S390PCIBusDevice *zpci = S390_PCI_DEVICE(dev);
     S390pciState *s = s390_get_phb();
@@ -993,7 +993,7 @@ static void s390_pci_device_reset(DeviceState *dev)
 }
 
 static void s390_pci_get_fid(Object *obj, Visitor *v, const char *name,
-                         void *opaque, Error **errp)
+                         void *opaque, Error *errp[static 1])
 {
     Property *prop = opaque;
     uint32_t *ptr = qdev_get_prop_ptr(DEVICE(obj), prop);
@@ -1002,7 +1002,7 @@ static void s390_pci_get_fid(Object *obj, Visitor *v, const char *name,
 }
 
 static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,
-                         void *opaque, Error **errp)
+                         void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     S390PCIBusDevice *zpci = S390_PCI_DEVICE(obj);
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index 251882a9dc..ad10b25e6f 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -48,7 +48,7 @@ void s390_skeys_init(void)
 }
 
 static void write_keys(FILE *f, uint8_t *keys, uint64_t startgfn,
-                       uint64_t count, Error **errp)
+                       uint64_t count, Error *errp[static 1])
 {
     uint64_t curpage = startgfn;
     uint64_t maxpage = curpage + count - 1;
@@ -101,7 +101,7 @@ void hmp_dump_skeys(Monitor *mon, const QDict *qdict)
     }
 }
 
-void qmp_dump_skeys(const char *filename, Error **errp)
+void qmp_dump_skeys(const char *filename, Error *errp[static 1])
 {
     S390SKeysState *ss = s390_get_skeys_device();
     S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
@@ -356,7 +356,8 @@ static int s390_storage_keys_load(QEMUFile *f, void *opaque, int version_id)
     return ret;
 }
 
-static inline bool s390_skeys_get_migration_enabled(Object *obj, Error **errp)
+static inline bool s390_skeys_get_migration_enabled(Object *obj,
+                                                    Error *errp[static 1])
 {
     S390SKeysState *ss = S390_SKEYS(obj);
 
@@ -369,7 +370,7 @@ static SaveVMHandlers savevm_s390_storage_keys = {
 };
 
 static inline void s390_skeys_set_migration_enabled(Object *obj, bool value,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     S390SKeysState *ss = S390_SKEYS(obj);
 
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index ae81723914..f82bf20533 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -160,7 +160,7 @@ static void ccw_init(MachineState *machine)
 }
 
 static void s390_cpu_plug(HotplugHandler *hotplug_dev,
-                        DeviceState *dev, Error **errp)
+                        DeviceState *dev, Error *errp[static 1])
 {
     gchar *name;
     S390CPU *cpu = S390_CPU(dev);
@@ -173,7 +173,7 @@ static void s390_cpu_plug(HotplugHandler *hotplug_dev,
 }
 
 static void s390_machine_device_plug(HotplugHandler *hotplug_dev,
-                                     DeviceState *dev, Error **errp)
+                                     DeviceState *dev, Error *errp[static 1])
 {
     if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
         s390_cpu_plug(hotplug_dev, dev, errp);
@@ -189,7 +189,7 @@ static HotplugHandler *s390_get_hotplug_handler(MachineState *machine,
     return NULL;
 }
 
-static void s390_hot_add_cpu(const int64_t id, Error **errp)
+static void s390_hot_add_cpu(const int64_t id, Error *errp[static 1])
 {
     MachineState *machine = MACHINE(qdev_get_machine());
 
@@ -221,7 +221,8 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
     nc->nmi_monitor_handler = s390_nmi;
 }
 
-static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)
+static inline bool machine_get_aes_key_wrap(Object *obj,
+                                            Error *errp[static 1])
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
 
@@ -229,14 +230,15 @@ static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)
 }
 
 static inline void machine_set_aes_key_wrap(Object *obj, bool value,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
 
     ms->aes_key_wrap = value;
 }
 
-static inline bool machine_get_dea_key_wrap(Object *obj, Error **errp)
+static inline bool machine_get_dea_key_wrap(Object *obj,
+                                            Error *errp[static 1])
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
 
@@ -244,7 +246,7 @@ static inline bool machine_get_dea_key_wrap(Object *obj, Error **errp)
 }
 
 static inline void machine_set_dea_key_wrap(Object *obj, bool value,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
 
@@ -283,14 +285,15 @@ bool cpu_model_allowed(void)
     return true;
 }
 
-static char *machine_get_loadparm(Object *obj, Error **errp)
+static char *machine_get_loadparm(Object *obj, Error *errp[static 1])
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
 
     return g_memdup(ms->loadparm, sizeof(ms->loadparm));
 }
 
-static void machine_set_loadparm(Object *obj, const char *val, Error **errp)
+static void machine_set_loadparm(Object *obj, const char *val,
+                                 Error *errp[static 1])
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
     int i;
@@ -312,7 +315,7 @@ static void machine_set_loadparm(Object *obj, const char *val, Error **errp)
         ms->loadparm[i] = ' '; /* pad right with spaces */
     }
 }
-static inline bool machine_get_squash_mcss(Object *obj, Error **errp)
+static inline bool machine_get_squash_mcss(Object *obj, Error *errp[static 1])
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
 
@@ -320,7 +323,7 @@ static inline bool machine_get_squash_mcss(Object *obj, Error **errp)
 }
 
 static inline void machine_set_squash_mcss(Object *obj, bool value,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
 
diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
index 79a1fa3b49..d861321d42 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -183,7 +183,7 @@ int gtod_load(QEMUFile *f, void *opaque, int version_id)
     return 0;
 }
 
-void s390_nmi(NMIState *n, int cpu_index, Error **errp)
+void s390_nmi(NMIState *n, int cpu_index, Error *errp[static 1])
 {
     CPUState *cs = qemu_get_cpu(cpu_index);
 
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index 1bd6b568f4..a4d2952a85 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -483,7 +483,7 @@ void s390_sclp_init(void)
     qdev_init_nofail(DEVICE(new));
 }
 
-static void sclp_realize(DeviceState *dev, Error **errp)
+static void sclp_realize(DeviceState *dev, Error *errp[static 1])
 {
     MachineState *machine = MACHINE(qdev_get_machine());
     SCLPDevice *sclp = SCLP(dev);
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 5cace901e0..772c1b759d 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -675,7 +675,8 @@ static void virtio_sch_disable_cb(SubchDev *sch)
     dev->revision = -1;
 }
 
-static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
+static void virtio_ccw_device_realize(VirtioCcwDevice *dev,
+                                      Error *errp[static 1])
 {
     VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
     CcwDevice *ccw_dev = CCW_DEVICE(dev);
@@ -752,7 +753,8 @@ static int virtio_ccw_exit(VirtioCcwDevice *dev)
     return 0;
 }
 
-static void virtio_ccw_net_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void virtio_ccw_net_realize(VirtioCcwDevice *ccw_dev,
+                                   Error *errp[static 1])
 {
     DeviceState *qdev = DEVICE(ccw_dev);
     VirtIONetCcw *dev = VIRTIO_NET_CCW(ccw_dev);
@@ -774,7 +776,8 @@ static void virtio_ccw_net_instance_init(Object *obj)
                               "bootindex", &error_abort);
 }
 
-static void virtio_ccw_blk_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void virtio_ccw_blk_realize(VirtioCcwDevice *ccw_dev,
+                                   Error *errp[static 1])
 {
     VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -795,7 +798,8 @@ static void virtio_ccw_blk_instance_init(Object *obj)
                               "bootindex", &error_abort);
 }
 
-static void virtio_ccw_serial_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void virtio_ccw_serial_realize(VirtioCcwDevice *ccw_dev,
+                                      Error *errp[static 1])
 {
     VirtioSerialCcw *dev = VIRTIO_SERIAL_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -825,7 +829,8 @@ static void virtio_ccw_serial_instance_init(Object *obj)
                                 TYPE_VIRTIO_SERIAL);
 }
 
-static void virtio_ccw_balloon_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void virtio_ccw_balloon_realize(VirtioCcwDevice *ccw_dev,
+                                       Error *errp[static 1])
 {
     VirtIOBalloonCcw *dev = VIRTIO_BALLOON_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -847,7 +852,8 @@ static void virtio_ccw_balloon_instance_init(Object *obj)
                               "guest-stats-polling-interval", &error_abort);
 }
 
-static void virtio_ccw_scsi_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void virtio_ccw_scsi_realize(VirtioCcwDevice *ccw_dev,
+                                    Error *errp[static 1])
 {
     VirtIOSCSICcw *dev = VIRTIO_SCSI_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -879,7 +885,8 @@ static void virtio_ccw_scsi_instance_init(Object *obj)
 }
 
 #ifdef CONFIG_VHOST_SCSI
-static void vhost_ccw_scsi_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void vhost_ccw_scsi_realize(VirtioCcwDevice *ccw_dev,
+                                   Error *errp[static 1])
 {
     VHostSCSICcw *dev = VHOST_SCSI_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -897,7 +904,8 @@ static void vhost_ccw_scsi_instance_init(Object *obj)
 }
 #endif
 
-static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev,
+                                   Error *errp[static 1])
 {
     VirtIORNGCcw *dev = VIRTIO_RNG_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -913,7 +921,8 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
                              IGNORE_ERRORS);
 }
 
-static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev,
+                                      Error *errp[static 1])
 {
     VirtIOCryptoCcw *dev = VIRTIO_CRYPTO_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -1316,7 +1325,7 @@ static int virtio_ccw_load_config(DeviceState *d, QEMUFile *f)
     return 0;
 }
 
-static void virtio_ccw_pre_plugged(DeviceState *d, Error **errp)
+static void virtio_ccw_pre_plugged(DeviceState *d, Error *errp[static 1])
 {
    VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
    VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
@@ -1327,7 +1336,7 @@ static void virtio_ccw_pre_plugged(DeviceState *d, Error **errp)
 }
 
 /* This is called by virtio-bus just after the device is plugged. */
-static void virtio_ccw_device_plugged(DeviceState *d, Error **errp)
+static void virtio_ccw_device_plugged(DeviceState *d, Error *errp[static 1])
 {
     VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
     VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
@@ -1615,7 +1624,7 @@ static const TypeInfo virtio_ccw_crypto = {
     .class_init    = virtio_ccw_crypto_class_init,
 };
 
-static void virtio_ccw_busdev_realize(DeviceState *dev, Error **errp)
+static void virtio_ccw_busdev_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtioCcwDevice *_dev = (VirtioCcwDevice *)dev;
 
@@ -1632,7 +1641,7 @@ static int virtio_ccw_busdev_exit(DeviceState *dev)
 }
 
 static void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
-                                     DeviceState *dev, Error **errp)
+                                     DeviceState *dev, Error *errp[static 1])
 {
     VirtioCcwDevice *_dev = to_virtio_ccw_dev_fast(dev);
 
@@ -1708,7 +1717,8 @@ static Property virtio_ccw_9p_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_ccw_9p_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void virtio_ccw_9p_realize(VirtioCcwDevice *ccw_dev,
+                                  Error *errp[static 1])
 {
     V9fsCCWState *dev = VIRTIO_9P_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -1754,7 +1764,8 @@ static Property vhost_vsock_ccw_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void vhost_vsock_ccw_realize(VirtioCcwDevice *ccw_dev, Error **errp)
+static void vhost_vsock_ccw_realize(VirtioCcwDevice *ccw_dev,
+                                    Error *errp[static 1])
 {
     VHostVSockCCWState *dev = VHOST_VSOCK_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index 30f866d5a0..39cffa083b 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -344,7 +344,7 @@ static const struct SCSIBusInfo esp_pci_scsi_info = {
     .cancel = esp_request_cancelled,
 };
 
-static void esp_pci_scsi_realize(PCIDevice *dev, Error **errp)
+static void esp_pci_scsi_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIESPState *pci = PCI_ESP(dev);
     DeviceState *d = DEVICE(dev);
@@ -459,7 +459,7 @@ static void dc390_write_config(PCIDevice *dev,
     }
 }
 
-static void dc390_scsi_realize(PCIDevice *dev, Error **errp)
+static void dc390_scsi_realize(PCIDevice *dev, Error *errp[static 1])
 {
     DC390State *pci = DC390(dev);
     uint8_t *contents;
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
index eee831efeb..1929a18abd 100644
--- a/hw/scsi/esp.c
+++ b/hw/scsi/esp.c
@@ -685,7 +685,7 @@ static void sysbus_esp_gpio_demux(void *opaque, int irq, int level)
     }
 }
 
-static void sysbus_esp_realize(DeviceState *dev, Error **errp)
+static void sysbus_esp_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     SysBusESPState *sysbus = ESP(dev);
diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
index 3e56ab267c..0612f4e80b 100644
--- a/hw/scsi/lsi53c895a.c
+++ b/hw/scsi/lsi53c895a.c
@@ -2186,7 +2186,7 @@ static const struct SCSIBusInfo lsi_scsi_info = {
     .cancel = lsi_request_cancelled
 };
 
-static void lsi_scsi_realize(PCIDevice *dev, Error **errp)
+static void lsi_scsi_realize(PCIDevice *dev, Error *errp[static 1])
 {
     LSIState *s = LSI53C895A(dev);
     DeviceState *d = DEVICE(dev);
@@ -2216,7 +2216,7 @@ static void lsi_scsi_realize(PCIDevice *dev, Error **errp)
     scsi_bus_new(&s->bus, sizeof(s->bus), d, &lsi_scsi_info, NULL);
 }
 
-static void lsi_scsi_unrealize(DeviceState *dev, Error **errp)
+static void lsi_scsi_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     LSIState *s = LSI53C895A(dev);
 
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
index e5a3e20a69..ca45d98898 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
@@ -2323,7 +2323,7 @@ static const struct SCSIBusInfo megasas_scsi_info = {
     .cancel = megasas_command_cancelled,
 };
 
-static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
+static void megasas_scsi_realize(PCIDevice *dev, Error *errp[static 1])
 {
     MegasasState *s = MEGASAS(dev);
     MegasasBaseClass *b = MEGASAS_DEVICE_GET_CLASS(s);
diff --git a/hw/scsi/mptsas.c b/hw/scsi/mptsas.c
index 765ab53c34..c7bead1f6e 100644
--- a/hw/scsi/mptsas.c
+++ b/hw/scsi/mptsas.c
@@ -1269,7 +1269,7 @@ static const struct SCSIBusInfo mptsas_scsi_info = {
     .load_request = mptsas_load_request,
 };
 
-static void mptsas_scsi_realize(PCIDevice *dev, Error **errp)
+static void mptsas_scsi_realize(PCIDevice *dev, Error *errp[static 1])
 {
     MPTSASState *s = MPT_SAS(dev);
     Error *err = NULL;
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index bb9f5628db..43deaf6c12 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -46,7 +46,7 @@ static const TypeInfo scsi_bus_info = {
 };
 static int next_scsi_bus;
 
-static void scsi_device_realize(SCSIDevice *s, Error **errp)
+static void scsi_device_realize(SCSIDevice *s, Error *errp[static 1])
 {
     SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
     if (sc->realize) {
@@ -147,7 +147,7 @@ static void scsi_dma_restart_cb(void *opaque, int running, RunState state)
     }
 }
 
-static void scsi_qdev_realize(DeviceState *qdev, Error **errp)
+static void scsi_qdev_realize(DeviceState *qdev, Error *errp[static 1])
 {
     SCSIDevice *dev = SCSI_DEVICE(qdev);
     SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
@@ -207,7 +207,7 @@ static void scsi_qdev_realize(DeviceState *qdev, Error **errp)
                                                      dev);
 }
 
-static void scsi_qdev_unrealize(DeviceState *qdev, Error **errp)
+static void scsi_qdev_unrealize(DeviceState *qdev, Error *errp[static 1])
 {
     SCSIDevice *dev = SCSI_DEVICE(qdev);
 
@@ -222,7 +222,8 @@ static void scsi_qdev_unrealize(DeviceState *qdev, Error **errp)
 /* handle legacy '-drive if=scsi,...' cmd line args */
 SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
                                       int unit, bool removable, int bootindex,
-                                      const char *serial, Error **errp)
+                                      const char *serial,
+                                      Error *errp[static 1])
 {
     const char *driver;
     char *name;
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
index d5c984504b..512f93bad0 100644
--- a/hw/scsi/scsi-disk.c
+++ b/hw/scsi/scsi-disk.c
@@ -2240,7 +2240,8 @@ static void scsi_disk_resize_cb(void *opaque)
     }
 }
 
-static void scsi_cd_change_media_cb(void *opaque, bool load, Error **errp)
+static void scsi_cd_change_media_cb(void *opaque, bool load,
+                                    Error *errp[static 1])
 {
     SCSIDiskState *s = opaque;
 
@@ -2303,7 +2304,7 @@ static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
     }
 }
 
-static void scsi_realize(SCSIDevice *dev, Error **errp)
+static void scsi_realize(SCSIDevice *dev, Error *errp[static 1])
 {
     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
 
@@ -2361,7 +2362,7 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
     blk_iostatus_enable(s->qdev.conf.blk);
 }
 
-static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
+static void scsi_hd_realize(SCSIDevice *dev, Error *errp[static 1])
 {
     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
     /* can happen for devices without drive. The error message for missing
@@ -2378,7 +2379,7 @@ static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
     scsi_realize(&s->qdev, errp);
 }
 
-static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
+static void scsi_cd_realize(SCSIDevice *dev, Error *errp[static 1])
 {
     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
 
@@ -2395,7 +2396,7 @@ static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
     scsi_realize(&s->qdev, errp);
 }
 
-static void scsi_disk_realize(SCSIDevice *dev, Error **errp)
+static void scsi_disk_realize(SCSIDevice *dev, Error *errp[static 1])
 {
     DriveInfo *dinfo;
     Error *local_err = NULL;
@@ -2540,7 +2541,7 @@ static int get_device_type(SCSIDiskState *s)
     return 0;
 }
 
-static void scsi_block_realize(SCSIDevice *dev, Error **errp)
+static void scsi_block_realize(SCSIDevice *dev, Error *errp[static 1])
 {
     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
     int sg_version;
diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
index a55ff87c22..1957f5810c 100644
--- a/hw/scsi/scsi-generic.c
+++ b/hw/scsi/scsi-generic.c
@@ -511,7 +511,7 @@ static void scsi_generic_reset(DeviceState *dev)
     scsi_device_purge_requests(s, SENSE_CODE(RESET));
 }
 
-static void scsi_generic_realize(SCSIDevice *s, Error **errp)
+static void scsi_generic_realize(SCSIDevice *s, Error *errp[static 1])
 {
     int rc;
     int sg_version;
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index 55ee48c4da..a94edb0efc 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -1198,7 +1198,7 @@ static void spapr_vscsi_reset(VIOsPAPRDevice *dev)
     }
 }
 
-static void spapr_vscsi_realize(VIOsPAPRDevice *dev, Error **errp)
+static void spapr_vscsi_realize(VIOsPAPRDevice *dev, Error *errp[static 1])
 {
     VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev);
 
diff --git a/hw/scsi/vhost-scsi-common.c b/hw/scsi/vhost-scsi-common.c
index e41c0314db..ddadc775c2 100644
--- a/hw/scsi/vhost-scsi-common.c
+++ b/hw/scsi/vhost-scsi-common.c
@@ -95,7 +95,7 @@ void vhost_scsi_common_stop(VHostSCSICommon *vsc)
 }
 
 uint64_t vhost_scsi_common_get_features(VirtIODevice *vdev, uint64_t features,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(vdev);
 
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index dea479b7ba..32098da6d4 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -135,7 +135,7 @@ static void vhost_dummy_handle_output(VirtIODevice *vdev, VirtQueue *vq)
 {
 }
 
-static void vhost_scsi_realize(DeviceState *dev, Error **errp)
+static void vhost_scsi_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(dev);
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
@@ -208,7 +208,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
     return;
 }
 
-static void vhost_scsi_unrealize(DeviceState *dev, Error **errp)
+static void vhost_scsi_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c
index 944ea4eb53..7519dae4e9 100644
--- a/hw/scsi/virtio-scsi-dataplane.c
+++ b/hw/scsi/virtio-scsi-dataplane.c
@@ -22,7 +22,7 @@
 #include "hw/virtio/virtio-access.h"
 
 /* Context: QEMU global mutex held */
-void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp)
+void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error *errp[static 1])
 {
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
     VirtIODevice *vdev = VIRTIO_DEVICE(s);
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index a253b5df59..098c660d6d 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -673,7 +673,7 @@ static void virtio_scsi_set_config(VirtIODevice *vdev,
 
 static uint64_t virtio_scsi_get_features(VirtIODevice *vdev,
                                          uint64_t requested_features,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     VirtIOSCSI *s = VIRTIO_SCSI(vdev);
 
@@ -783,7 +783,7 @@ static void virtio_scsi_change(SCSIBus *bus, SCSIDevice *dev, SCSISense sense)
 }
 
 static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
     VirtIOSCSI *s = VIRTIO_SCSI(vdev);
@@ -809,7 +809,7 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
 }
 
 static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
     VirtIOSCSI *s = VIRTIO_SCSI(vdev);
@@ -845,7 +845,7 @@ void virtio_scsi_common_realize(DeviceState *dev,
                                 VirtIOHandleOutput ctrl,
                                 VirtIOHandleOutput evt,
                                 VirtIOHandleOutput cmd,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOSCSICommon *s = VIRTIO_SCSI_COMMON(dev);
@@ -873,7 +873,8 @@ void virtio_scsi_common_realize(DeviceState *dev,
     }
 }
 
-static void virtio_scsi_device_realize(DeviceState *dev, Error **errp)
+static void virtio_scsi_device_realize(DeviceState *dev,
+                                       Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOSCSI *s = VIRTIO_SCSI(dev);
@@ -905,7 +906,7 @@ static void virtio_scsi_instance_init(Object *obj)
                              OBJ_PROP_LINK_UNREF_ON_RELEASE, &error_abort);
 }
 
-void virtio_scsi_common_unrealize(DeviceState *dev, Error **errp)
+void virtio_scsi_common_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(dev);
@@ -914,7 +915,8 @@ void virtio_scsi_common_unrealize(DeviceState *dev, Error **errp)
     virtio_cleanup(vdev);
 }
 
-static void virtio_scsi_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_scsi_device_unrealize(DeviceState *dev,
+                                         Error *errp[static 1])
 {
     VirtIOSCSI *s = VIRTIO_SCSI(dev);
 
diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
index e5133595dc..edb2ea975c 100644
--- a/hw/scsi/vmw_pvscsi.c
+++ b/hw/scsi/vmw_pvscsi.c
@@ -560,7 +560,8 @@ pvscsi_send_msg(PVSCSIState *s, SCSIDevice *dev, uint32_t msg_type)
 }
 
 static void
-pvscsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp)
+pvscsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
+               Error *errp[static 1])
 {
     PVSCSIState *s = PVSCSI(hotplug_dev);
 
@@ -568,7 +569,8 @@ pvscsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp)
 }
 
 static void
-pvscsi_hot_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp)
+pvscsi_hot_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
+                  Error *errp[static 1])
 {
     PVSCSIState *s = PVSCSI(hotplug_dev);
 
@@ -1262,7 +1264,7 @@ static Property pvscsi_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void pvscsi_realize(DeviceState *qdev, Error **errp)
+static void pvscsi_realize(DeviceState *qdev, Error *errp[static 1])
 {
     PVSCSIClass *pvs_c = PVSCSI_DEVICE_GET_CLASS(qdev);
     PCIDevice *pci_dev = PCI_DEVICE(qdev);
diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
index 55c8098ecd..d310360bed 100644
--- a/hw/sd/pl181.c
+++ b/hw/sd/pl181.c
@@ -495,7 +495,7 @@ static void pl181_init(Object *obj)
     qdev_init_gpio_out(dev, s->cardstatus, 2);
 }
 
-static void pl181_realize(DeviceState *dev, Error **errp)
+static void pl181_realize(DeviceState *dev, Error *errp[static 1])
 {
     PL181State *s = PL181(dev);
     DriveInfo *dinfo;
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index ba47bff4db..f9c696d177 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -458,7 +458,7 @@ static bool sd_get_readonly(SDState *sd)
     return sd->wp_switch;
 }
 
-static void sd_cardchange(void *opaque, bool load, Error **errp)
+static void sd_cardchange(void *opaque, bool load, Error *errp[static 1])
 {
     SDState *sd = opaque;
     DeviceState *dev = DEVICE(sd);
@@ -1884,7 +1884,7 @@ static void sd_instance_finalize(Object *obj)
     timer_free(sd->ocr_power_timer);
 }
 
-static void sd_realize(DeviceState *dev, Error **errp)
+static void sd_realize(DeviceState *dev, Error *errp[static 1])
 {
     SDState *sd = SD_CARD(dev);
     int ret;
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 6d6a791ee9..b75fe59795 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1274,7 +1274,7 @@ static Property sdhci_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void sdhci_pci_realize(PCIDevice *dev, Error **errp)
+static void sdhci_pci_realize(PCIDevice *dev, Error *errp[static 1])
 {
     SDHCIState *s = PCI_SDHCI(dev);
     dev->config[PCI_CLASS_PROG] = 0x01; /* Standard Host supported DMA */
@@ -1339,7 +1339,7 @@ static void sdhci_sysbus_finalize(Object *obj)
     sdhci_uninitfn(s);
 }
 
-static void sdhci_sysbus_realize(DeviceState *dev, Error ** errp)
+static void sdhci_sysbus_realize(DeviceState *dev, Error *errp[static 1])
 {
     SDHCIState *s = SYSBUS_SDHCI(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
index 24001dc3e6..3aa128c860 100644
--- a/hw/sd/ssi-sd.c
+++ b/hw/sd/ssi-sd.c
@@ -236,7 +236,7 @@ static const VMStateDescription vmstate_ssi_sd = {
     }
 };
 
-static void ssi_sd_realize(SSISlave *d, Error **errp)
+static void ssi_sd_realize(SSISlave *d, Error *errp[static 1])
 {
     ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
     DriveInfo *dinfo;
diff --git a/hw/sh4/sh_pci.c b/hw/sh4/sh_pci.c
index 38395c082b..5b01fcabbf 100644
--- a/hw/sh4/sh_pci.c
+++ b/hw/sh4/sh_pci.c
@@ -152,7 +152,7 @@ static int sh_pci_device_init(SysBusDevice *dev)
     return 0;
 }
 
-static void sh_pci_host_realize(PCIDevice *d, Error **errp)
+static void sh_pci_host_realize(PCIDevice *d, Error *errp[static 1])
 {
     pci_set_word(d->config + PCI_COMMAND, PCI_COMMAND_WAIT);
     pci_set_word(d->config + PCI_STATUS, PCI_STATUS_CAP_LIST |
diff --git a/hw/smbios/smbios-stub.c b/hw/smbios/smbios-stub.c
index 308739410f..1a88bd5aa0 100644
--- a/hw/smbios/smbios-stub.c
+++ b/hw/smbios/smbios-stub.c
@@ -25,7 +25,7 @@
 #include "qmp-commands.h"
 #include "hw/smbios/smbios.h"
 
-void smbios_entry_add(QemuOpts *opts, Error **errp)
+void smbios_entry_add(QemuOpts *opts, Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 }
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
index 1a5437a07d..8cee645525 100644
--- a/hw/smbios/smbios.c
+++ b/hw/smbios/smbios.c
@@ -882,7 +882,7 @@ static void save_opt(const char **dest, QemuOpts *opts, const char *name)
     }
 }
 
-void smbios_entry_add(QemuOpts *opts, Error **errp)
+void smbios_entry_add(QemuOpts *opts, Error *errp[static 1])
 {
     const char *val;
 
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 0faff4619f..cf433fae03 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -106,7 +106,7 @@ void DMA_init(ISABus *bus, int high_page_enable)
 }
 
 static void fw_cfg_boot_set(void *opaque, const char *boot_device,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
 }
@@ -735,7 +735,7 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static void ram_realize(DeviceState *dev, Error **errp)
+static void ram_realize(DeviceState *dev, Error *errp[static 1])
 {
     RamDevice *d = SUN4M_RAM(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 69f565db25..171fed7dad 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -90,7 +90,7 @@ void DMA_init(ISABus *bus, int high_page_enable)
 }
 
 static void fw_cfg_boot_set(void *opaque, const char *boot_device,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
 }
@@ -237,7 +237,7 @@ pci_ebus_init(PCIBus *bus, int devfn, qemu_irq *irqs)
     return isa_bus;
 }
 
-static void pci_ebus_realize(PCIDevice *pci_dev, Error **errp)
+static void pci_ebus_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     EbusState *s = DO_UPCAST(EbusState, pci_dev, pci_dev);
 
@@ -372,7 +372,7 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static void ram_realize(DeviceState *dev, Error **errp)
+static void ram_realize(DeviceState *dev, Error *errp[static 1])
 {
     RamDevice *d = SUN4U_RAM(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
index cb515730c5..03c7e45d11 100644
--- a/hw/ssi/aspeed_smc.c
+++ b/hw/ssi/aspeed_smc.c
@@ -710,7 +710,7 @@ static const MemoryRegionOps aspeed_smc_ops = {
     .valid.unaligned = true,
 };
 
-static void aspeed_smc_realize(DeviceState *dev, Error **errp)
+static void aspeed_smc_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     AspeedSMCState *s = ASPEED_SMC(dev);
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
index b66505ca49..2f52d36d19 100644
--- a/hw/ssi/imx_spi.c
+++ b/hw/ssi/imx_spi.c
@@ -411,7 +411,7 @@ static const struct MemoryRegionOps imx_spi_ops = {
     },
 };
 
-static void imx_spi_realize(DeviceState *dev, Error **errp)
+static void imx_spi_realize(DeviceState *dev, Error *errp[static 1])
 {
     IMXSPIState *s = IMX_SPI(dev);
     int i;
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
index 7eaaf565fd..58880fe4cf 100644
--- a/hw/ssi/ssi.c
+++ b/hw/ssi/ssi.c
@@ -54,7 +54,7 @@ static uint32_t ssi_transfer_raw_default(SSISlave *dev, uint32_t val)
     return 0;
 }
 
-static void ssi_slave_realize(DeviceState *dev, Error **errp)
+static void ssi_slave_realize(DeviceState *dev, Error *errp[static 1])
 {
     SSISlave *s = SSI_SLAVE(dev);
     SSISlaveClass *ssc = SSI_SLAVE_GET_CLASS(s);
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
index da8adfa443..3a0d23ab09 100644
--- a/hw/ssi/xilinx_spips.c
+++ b/hw/ssi/xilinx_spips.c
@@ -602,7 +602,7 @@ static const MemoryRegionOps lqspi_ops = {
     }
 };
 
-static void xilinx_spips_realize(DeviceState *dev, Error **errp)
+static void xilinx_spips_realize(DeviceState *dev, Error *errp[static 1])
 {
     XilinxSPIPS *s = XILINX_SPIPS(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
@@ -639,7 +639,7 @@ static void xilinx_spips_realize(DeviceState *dev, Error **errp)
     fifo8_create(&s->tx_fifo, xsc->tx_fifo_size);
 }
 
-static void xilinx_qspips_realize(DeviceState *dev, Error **errp)
+static void xilinx_qspips_realize(DeviceState *dev, Error *errp[static 1])
 {
     XilinxSPIPS *s = XILINX_SPIPS(dev);
     XilinxQSPIPS *q = XILINX_QSPIPS(dev);
diff --git a/hw/timer/a9gtimer.c b/hw/timer/a9gtimer.c
index ce1dc63911..e2060deec5 100644
--- a/hw/timer/a9gtimer.c
+++ b/hw/timer/a9gtimer.c
@@ -285,7 +285,7 @@ static void a9_gtimer_reset(DeviceState *dev)
     a9_gtimer_update(s, false);
 }
 
-static void a9_gtimer_realize(DeviceState *dev, Error **errp)
+static void a9_gtimer_realize(DeviceState *dev, Error *errp[static 1])
 {
     A9GTimerState *s = A9_GTIMER(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/timer/altera_timer.c b/hw/timer/altera_timer.c
index c9a0fc5dca..2c6ba35eca 100644
--- a/hw/timer/altera_timer.c
+++ b/hw/timer/altera_timer.c
@@ -171,7 +171,7 @@ static void timer_hit(void *opaque)
     qemu_set_irq(t->irq, timer_irq_state(t));
 }
 
-static void altera_timer_realize(DeviceState *dev, Error **errp)
+static void altera_timer_realize(DeviceState *dev, Error *errp[static 1])
 {
     AlteraTimer *t = ALTERA_TIMER(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
index daf6c48797..ff1a38d992 100644
--- a/hw/timer/arm_mptimer.c
+++ b/hw/timer/arm_mptimer.c
@@ -232,7 +232,7 @@ static void arm_mptimer_init(Object *obj)
     sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
 }
 
-static void arm_mptimer_realize(DeviceState *dev, Error **errp)
+static void arm_mptimer_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     ARMMPTimerState *s = ARM_MPTIMER(dev);
diff --git a/hw/timer/arm_timer.c b/hw/timer/arm_timer.c
index 98fddd7ac1..58420067ab 100644
--- a/hw/timer/arm_timer.c
+++ b/hw/timer/arm_timer.c
@@ -289,7 +289,7 @@ static void sp804_init(Object *obj)
     sysbus_init_mmio(sbd, &s->iomem);
 }
 
-static void sp804_realize(DeviceState *dev, Error **errp)
+static void sp804_realize(DeviceState *dev, Error *errp[static 1])
 {
     SP804State *s = SP804(dev);
 
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
index 9b70ee09b0..e3006dfbf3 100644
--- a/hw/timer/aspeed_timer.c
+++ b/hw/timer/aspeed_timer.c
@@ -423,7 +423,7 @@ static void aspeed_init_one_timer(AspeedTimerCtrlState *s, uint8_t id)
     timer_init_ns(&t->timer, QEMU_CLOCK_VIRTUAL, aspeed_timer_expire, t);
 }
 
-static void aspeed_timer_realize(DeviceState *dev, Error **errp)
+static void aspeed_timer_realize(DeviceState *dev, Error *errp[static 1])
 {
     int i;
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index a2c18b30c3..f8dc4ea3cf 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -709,7 +709,7 @@ static void hpet_init(Object *obj)
     sysbus_init_mmio(sbd, &s->iomem);
 }
 
-static void hpet_realize(DeviceState *dev, Error **errp)
+static void hpet_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     HPETState *s = HPET(dev);
diff --git a/hw/timer/i8254.c b/hw/timer/i8254.c
index 5e61ad50a8..10b8163d08 100644
--- a/hw/timer/i8254.c
+++ b/hw/timer/i8254.c
@@ -329,7 +329,7 @@ static void pit_post_load(PITCommonState *s)
     }
 }
 
-static void pit_realizefn(DeviceState *dev, Error **errp)
+static void pit_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     PITCommonState *pit = PIT_COMMON(dev);
     PITClass *pc = PIT_GET_CLASS(dev);
diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c
index 976d5200f1..8bea8c2809 100644
--- a/hw/timer/i8254_common.c
+++ b/hw/timer/i8254_common.c
@@ -167,7 +167,7 @@ void pit_reset_common(PITCommonState *pit)
     }
 }
 
-static void pit_common_realize(DeviceState *dev, Error **errp)
+static void pit_common_realize(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     PITCommonState *pit = PIT_COMMON(dev);
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
index 8677b753b1..d1a6dc7725 100644
--- a/hw/timer/imx_epit.c
+++ b/hw/timer/imx_epit.c
@@ -301,7 +301,7 @@ static const VMStateDescription vmstate_imx_timer_epit = {
     }
 };
 
-static void imx_epit_realize(DeviceState *dev, Error **errp)
+static void imx_epit_realize(DeviceState *dev, Error *errp[static 1])
 {
     IMXEPITState *s = IMX_EPIT(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/timer/imx_gpt.c b/hw/timer/imx_gpt.c
index 4b9b54bf2e..fa193fbc0a 100644
--- a/hw/timer/imx_gpt.c
+++ b/hw/timer/imx_gpt.c
@@ -466,7 +466,7 @@ static const MemoryRegionOps imx_gpt_ops = {
 };
 
 
-static void imx_gpt_realize(DeviceState *dev, Error **errp)
+static void imx_gpt_realize(DeviceState *dev, Error *errp[static 1])
 {
     IMXGPTState *s = IMX_GPT(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/timer/lm32_timer.c b/hw/timer/lm32_timer.c
index 2a07b59524..d09a91161a 100644
--- a/hw/timer/lm32_timer.c
+++ b/hw/timer/lm32_timer.c
@@ -191,7 +191,7 @@ static void lm32_timer_init(Object *obj)
     sysbus_init_mmio(dev, &s->iomem);
 }
 
-static void lm32_timer_realize(DeviceState *dev, Error **errp)
+static void lm32_timer_realize(DeviceState *dev, Error *errp[static 1])
 {
     LM32TimerState *s = LM32_TIMER(dev);
 
diff --git a/hw/timer/m48t59-isa.c b/hw/timer/m48t59-isa.c
index ea1ba703d7..1c8e737514 100644
--- a/hw/timer/m48t59-isa.c
+++ b/hw/timer/m48t59-isa.c
@@ -110,7 +110,7 @@ static void m48t59_reset_isa(DeviceState *d)
     m48t59_reset_common(NVRAM);
 }
 
-static void m48t59_isa_realize(DeviceState *dev, Error **errp)
+static void m48t59_isa_realize(DeviceState *dev, Error *errp[static 1])
 {
     M48txxISADeviceClass *u = M48TXX_ISA_GET_CLASS(dev);
     ISADevice *isadev = ISA_DEVICE(dev);
diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index 844aad540e..a0bed45551 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -632,7 +632,7 @@ Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base,
     return NULL;
 }
 
-void m48t59_realize_common(M48t59State *s, Error **errp)
+void m48t59_realize_common(M48t59State *s, Error *errp[static 1])
 {
     s->buffer = g_malloc0(s->size);
     if (s->model == 59) {
@@ -658,7 +658,7 @@ static void m48t59_init1(Object *obj)
     memory_region_init_io(&d->io, obj, &m48t59_io_ops, s, "m48t59", 4);
 }
 
-static void m48t59_realize(DeviceState *dev, Error **errp)
+static void m48t59_realize(DeviceState *dev, Error *errp[static 1])
 {
     M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
     M48t59State *s = &d->state;
diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
index b7b9e0f754..023f6e2877 100644
--- a/hw/timer/mc146818rtc.c
+++ b/hw/timer/mc146818rtc.c
@@ -130,7 +130,7 @@ static QLIST_HEAD(, RTCState) rtc_devices =
     QLIST_HEAD_INITIALIZER(rtc_devices);
 
 #ifdef TARGET_I386
-void qmp_rtc_reset_reinjection(Error **errp)
+void qmp_rtc_reset_reinjection(Error *errp[static 1])
 {
     RTCState *s;
 
@@ -925,7 +925,8 @@ static const MemoryRegionOps cmos_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-static void rtc_get_date(Object *obj, struct tm *current_tm, Error **errp)
+static void rtc_get_date(Object *obj, struct tm *current_tm,
+                         Error *errp[static 1])
 {
     RTCState *s = MC146818_RTC(obj);
 
@@ -933,7 +934,7 @@ static void rtc_get_date(Object *obj, struct tm *current_tm, Error **errp)
     rtc_get_time(s, current_tm);
 }
 
-static void rtc_realizefn(DeviceState *dev, Error **errp)
+static void rtc_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     ISADevice *isadev = ISA_DEVICE(dev);
     RTCState *s = MC146818_RTC(dev);
diff --git a/hw/timer/milkymist-sysctl.c b/hw/timer/milkymist-sysctl.c
index 93bc6e1790..09ee22592d 100644
--- a/hw/timer/milkymist-sysctl.c
+++ b/hw/timer/milkymist-sysctl.c
@@ -289,7 +289,7 @@ static void milkymist_sysctl_init(Object *obj)
     sysbus_init_mmio(dev, &s->regs_region);
 }
 
-static void milkymist_sysctl_realize(DeviceState *dev, Error **errp)
+static void milkymist_sysctl_realize(DeviceState *dev, Error *errp[static 1])
 {
     MilkymistSysctlState *s = MILKYMIST_SYSCTL(dev);
 
diff --git a/hw/timer/pxa2xx_timer.c b/hw/timer/pxa2xx_timer.c
index 68ba5a70b3..fbbce15198 100644
--- a/hw/timer/pxa2xx_timer.c
+++ b/hw/timer/pxa2xx_timer.c
@@ -451,7 +451,7 @@ static void pxa2xx_timer_init(Object *obj)
     sysbus_init_mmio(dev, &s->iomem);
 }
 
-static void pxa2xx_timer_realize(DeviceState *dev, Error **errp)
+static void pxa2xx_timer_realize(DeviceState *dev, Error *errp[static 1])
 {
     PXA2xxTimerInfo *s = PXA2XX_TIMER(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/timer/xilinx_timer.c b/hw/timer/xilinx_timer.c
index 59439c05be..696012db96 100644
--- a/hw/timer/xilinx_timer.c
+++ b/hw/timer/xilinx_timer.c
@@ -205,7 +205,7 @@ static void timer_hit(void *opaque)
     timer_update_irq(t);
 }
 
-static void xilinx_timer_realize(DeviceState *dev, Error **errp)
+static void xilinx_timer_realize(DeviceState *dev, Error *errp[static 1])
 {
     struct timerblock *t = XILINX_TIMER(dev);
     unsigned int i;
diff --git a/hw/tpm/tpm_tis.c b/hw/tpm/tpm_tis.c
index a6440fef91..e5d08b942c 100644
--- a/hw/tpm/tpm_tis.c
+++ b/hw/tpm/tpm_tis.c
@@ -1030,7 +1030,7 @@ static Property tpm_tis_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void tpm_tis_realizefn(DeviceState *dev, Error **errp)
+static void tpm_tis_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     TPMState *s = TPM(dev);
     TPMTISEmuState *tis = &s->s.tis;
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 9c747821d2..75806177dd 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -13,7 +13,7 @@ static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);
 
 static char *usb_get_dev_path(DeviceState *dev);
 static char *usb_get_fw_dev_path(DeviceState *qdev);
-static void usb_qdev_unrealize(DeviceState *qdev, Error **errp);
+static void usb_qdev_unrealize(DeviceState *qdev, Error *errp[static 1]);
 
 static Property usb_props[] = {
     DEFINE_PROP_STRING("port", USBDevice, port_path),
@@ -117,7 +117,7 @@ USBBus *usb_bus_find(int busnr)
     return NULL;
 }
 
-static void usb_device_realize(USBDevice *dev, Error **errp)
+static void usb_device_realize(USBDevice *dev, Error *errp[static 1])
 {
     USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 
@@ -135,7 +135,7 @@ USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr)
     return NULL;
 }
 
-static void usb_device_unrealize(USBDevice *dev, Error **errp)
+static void usb_device_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 
@@ -243,7 +243,7 @@ void usb_device_free_streams(USBDevice *dev, USBEndpoint **eps, int nr_eps)
     }
 }
 
-static void usb_qdev_realize(DeviceState *qdev, Error **errp)
+static void usb_qdev_realize(DeviceState *qdev, Error *errp[static 1])
 {
     USBDevice *dev = USB_DEVICE(qdev);
 
@@ -273,7 +273,7 @@ static void usb_qdev_realize(DeviceState *qdev, Error **errp)
     }
 }
 
-static void usb_qdev_unrealize(DeviceState *qdev, Error **errp)
+static void usb_qdev_unrealize(DeviceState *qdev, Error *errp[static 1])
 {
     USBDevice *dev = USB_DEVICE(qdev);
     USBDescString *s, *next;
@@ -324,7 +324,7 @@ USBDevice *usb_create(USBBus *bus, const char *name)
 }
 
 static USBDevice *usb_try_create_simple(USBBus *bus, const char *name,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     USBDevice *dev;
 
@@ -369,7 +369,7 @@ void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
 void usb_register_companion(const char *masterbus, USBPort *ports[],
                             uint32_t portcount, uint32_t firstport,
                             void *opaque, USBPortOps *ops, int speedmask,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     USBBus *bus;
     int i;
@@ -419,7 +419,7 @@ void usb_unregister_port(USBBus *bus, USBPort *port)
     bus->nfree--;
 }
 
-void usb_claim_port(USBDevice *dev, Error **errp)
+void usb_claim_port(USBDevice *dev, Error *errp[static 1])
 {
     USBBus *bus = usb_bus_from_device(dev);
     USBPort *port;
@@ -501,7 +501,7 @@ static void usb_mask_to_str(char *dest, size_t size,
     }
 }
 
-void usb_check_attach(USBDevice *dev, Error **errp)
+void usb_check_attach(USBDevice *dev, Error *errp[static 1])
 {
     USBBus *bus = usb_bus_from_device(dev);
     USBPort *port = dev->port;
@@ -524,7 +524,7 @@ void usb_check_attach(USBDevice *dev, Error **errp)
     }
 }
 
-void usb_device_attach(USBDevice *dev, Error **errp)
+void usb_device_attach(USBDevice *dev, Error *errp[static 1])
 {
     USBPort *port = dev->port;
 
@@ -736,14 +736,14 @@ USBDevice *usbdevice_create(const char *cmdline)
     return dev;
 }
 
-static bool usb_get_attached(Object *obj, Error **errp)
+static bool usb_get_attached(Object *obj, Error *errp[static 1])
 {
     USBDevice *dev = USB_DEVICE(obj);
 
     return dev->attached;
 }
 
-static void usb_set_attached(Object *obj, bool value, Error **errp)
+static void usb_set_attached(Object *obj, bool value, Error *errp[static 1])
 {
     USBDevice *dev = USB_DEVICE(obj);
 
diff --git a/hw/usb/dev-audio.c b/hw/usb/dev-audio.c
index 343345235c..5b104a2781 100644
--- a/hw/usb/dev-audio.c
+++ b/hw/usb/dev-audio.c
@@ -617,7 +617,7 @@ static void usb_audio_handle_data(USBDevice *dev, USBPacket *p)
     }
 }
 
-static void usb_audio_unrealize(USBDevice *dev, Error **errp)
+static void usb_audio_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     USBAudioState *s = USB_AUDIO(dev);
 
@@ -632,7 +632,7 @@ static void usb_audio_unrealize(USBDevice *dev, Error **errp)
     streambuf_fini(&s->out.buf);
 }
 
-static void usb_audio_realize(USBDevice *dev, Error **errp)
+static void usb_audio_realize(USBDevice *dev, Error *errp[static 1])
 {
     USBAudioState *s = USB_AUDIO(dev);
 
diff --git a/hw/usb/dev-bluetooth.c b/hw/usb/dev-bluetooth.c
index 443e3c301d..2591415b7d 100644
--- a/hw/usb/dev-bluetooth.c
+++ b/hw/usb/dev-bluetooth.c
@@ -496,7 +496,7 @@ static void usb_bt_out_hci_packet_acl(void *opaque,
     usb_bt_fifo_enqueue(&s->acl, data, len);
 }
 
-static void usb_bt_unrealize(USBDevice *dev, Error **errp)
+static void usb_bt_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     struct USBBtState *s = (struct USBBtState *) dev->opaque;
 
@@ -505,7 +505,7 @@ static void usb_bt_unrealize(USBDevice *dev, Error **errp)
     s->hci->acl_recv = NULL;
 }
 
-static void usb_bt_realize(USBDevice *dev, Error **errp)
+static void usb_bt_realize(USBDevice *dev, Error *errp[static 1])
 {
     struct USBBtState *s = USB_BT(dev);
 
diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c
index 5b31791392..289b8a7f53 100644
--- a/hw/usb/dev-hid.c
+++ b/hw/usb/dev-hid.c
@@ -690,7 +690,7 @@ static void usb_hid_handle_data(USBDevice *dev, USBPacket *p)
     }
 }
 
-static void usb_hid_unrealize(USBDevice *dev, Error **errp)
+static void usb_hid_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     USBHIDState *us = USB_HID(dev);
 
@@ -699,7 +699,7 @@ static void usb_hid_unrealize(USBDevice *dev, Error **errp)
 
 static void usb_hid_initfn(USBDevice *dev, int kind,
                            const USBDesc *usb1, const USBDesc *usb2,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     USBHIDState *us = USB_HID(dev);
     switch (us->usb_version) {
@@ -730,18 +730,18 @@ static void usb_hid_initfn(USBDevice *dev, int kind,
     }
 }
 
-static void usb_tablet_realize(USBDevice *dev, Error **errp)
+static void usb_tablet_realize(USBDevice *dev, Error *errp[static 1])
 {
 
     usb_hid_initfn(dev, HID_TABLET, &desc_tablet, &desc_tablet2, errp);
 }
 
-static void usb_mouse_realize(USBDevice *dev, Error **errp)
+static void usb_mouse_realize(USBDevice *dev, Error *errp[static 1])
 {
     usb_hid_initfn(dev, HID_MOUSE, &desc_mouse, &desc_mouse2, errp);
 }
 
-static void usb_keyboard_realize(USBDevice *dev, Error **errp)
+static void usb_keyboard_realize(USBDevice *dev, Error *errp[static 1])
 {
     usb_hid_initfn(dev, HID_KEYBOARD, &desc_keyboard, &desc_keyboard2, errp);
 }
diff --git a/hw/usb/dev-hub.c b/hw/usb/dev-hub.c
index e82a6a6c44..820d8a383a 100644
--- a/hw/usb/dev-hub.c
+++ b/hw/usb/dev-hub.c
@@ -511,7 +511,7 @@ static void usb_hub_handle_data(USBDevice *dev, USBPacket *p)
     }
 }
 
-static void usb_hub_unrealize(USBDevice *dev, Error **errp)
+static void usb_hub_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     USBHubState *s = (USBHubState *)dev;
     int i;
@@ -530,7 +530,7 @@ static USBPortOps usb_hub_port_ops = {
     .complete = usb_hub_complete,
 };
 
-static void usb_hub_realize(USBDevice *dev, Error **errp)
+static void usb_hub_realize(USBDevice *dev, Error *errp[static 1])
 {
     USBHubState *s = USB_HUB(dev);
     USBHubPort *port;
diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c
index 94c2e94f10..f0dfa6fb8c 100644
--- a/hw/usb/dev-mtp.c
+++ b/hw/usb/dev-mtp.c
@@ -1529,7 +1529,7 @@ static void usb_mtp_handle_data(USBDevice *dev, USBPacket *p)
     }
 }
 
-static void usb_mtp_realize(USBDevice *dev, Error **errp)
+static void usb_mtp_realize(USBDevice *dev, Error *errp[static 1])
 {
     MTPState *s = USB_MTP(dev);
 
diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c
index 4c2536ed8c..a1b5a04d97 100644
--- a/hw/usb/dev-network.c
+++ b/hw/usb/dev-network.c
@@ -1324,7 +1324,7 @@ static void usbnet_cleanup(NetClientState *nc)
     s->nic = NULL;
 }
 
-static void usb_net_unrealize(USBDevice *dev, Error **errp)
+static void usb_net_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     USBNetState *s = (USBNetState *) dev;
 
@@ -1340,7 +1340,7 @@ static NetClientInfo net_usbnet_info = {
     .cleanup = usbnet_cleanup,
 };
 
-static void usb_net_realize(USBDevice *dev, Error **errrp)
+static void usb_net_realize(USBDevice *dev, Error *errrp[static 1])
 {
     USBNetState *s = USB_NET(dev);
 
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index cc9dd8b533..890817ddba 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -480,7 +480,7 @@ static void usb_serial_event(void *opaque, int event)
     }
 }
 
-static void usb_serial_realize(USBDevice *dev, Error **errp)
+static void usb_serial_realize(USBDevice *dev, Error *errp[static 1])
 {
     USBSerialState *s = USB_SERIAL_DEV(dev);
     Chardev *chr = qemu_chr_fe_get_driver(&s->cs);
diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c
index 49cb1829b5..1ec84c3019 100644
--- a/hw/usb/dev-smartcard-reader.c
+++ b/hw/usb/dev-smartcard-reader.c
@@ -1166,7 +1166,7 @@ static void ccid_handle_data(USBDevice *dev, USBPacket *p)
     }
 }
 
-static void ccid_unrealize(USBDevice *dev, Error **errp)
+static void ccid_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     USBCCIDState *s = USB_CCID_DEV(dev);
 
@@ -1329,7 +1329,7 @@ static int ccid_card_init(DeviceState *qdev)
     return ret;
 }
 
-static void ccid_realize(USBDevice *dev, Error **errp)
+static void ccid_realize(USBDevice *dev, Error *errp[static 1])
 {
     USBCCIDState *s = USB_CCID_DEV(dev);
 
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index b3173553c5..1d28cf05ef 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -589,14 +589,14 @@ static const struct SCSIBusInfo usb_msd_scsi_info_bot = {
     .load_request = usb_msd_load_request,
 };
 
-static void usb_msd_unrealize_storage(USBDevice *dev, Error **errp)
+static void usb_msd_unrealize_storage(USBDevice *dev, Error *errp[static 1])
 {
     MSDState *s = USB_STORAGE_DEV(dev);
 
     object_unref(OBJECT(&s->bus));
 }
 
-static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
+static void usb_msd_realize_storage(USBDevice *dev, Error *errp[static 1])
 {
     MSDState *s = USB_STORAGE_DEV(dev);
     BlockBackend *blk = s->conf.blk;
@@ -646,14 +646,14 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
     s->scsi_dev = scsi_dev;
 }
 
-static void usb_msd_unrealize_bot(USBDevice *dev, Error **errp)
+static void usb_msd_unrealize_bot(USBDevice *dev, Error *errp[static 1])
 {
     MSDState *s = USB_STORAGE_DEV(dev);
 
     object_unref(OBJECT(&s->bus));
 }
 
-static void usb_msd_realize_bot(USBDevice *dev, Error **errp)
+static void usb_msd_realize_bot(USBDevice *dev, Error *errp[static 1])
 {
     MSDState *s = USB_STORAGE_DEV(dev);
     DeviceState *d = DEVICE(dev);
@@ -778,7 +778,7 @@ static void usb_msd_class_initfn_storage(ObjectClass *klass, void *data)
 }
 
 static void usb_msd_get_bootindex(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     USBDevice *dev = USB_DEVICE(obj);
     MSDState *s = USB_STORAGE_DEV(dev);
@@ -787,7 +787,7 @@ static void usb_msd_get_bootindex(Object *obj, Visitor *v, const char *name,
 }
 
 static void usb_msd_set_bootindex(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     USBDevice *dev = USB_DEVICE(obj);
     MSDState *s = USB_STORAGE_DEV(dev);
diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c
index fffc424396..eb777c5953 100644
--- a/hw/usb/dev-uas.c
+++ b/hw/usb/dev-uas.c
@@ -891,7 +891,7 @@ static void usb_uas_handle_data(USBDevice *dev, USBPacket *p)
     }
 }
 
-static void usb_uas_unrealize(USBDevice *dev, Error **errp)
+static void usb_uas_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     UASDevice *uas = USB_UAS(dev);
 
@@ -900,7 +900,7 @@ static void usb_uas_unrealize(USBDevice *dev, Error **errp)
     object_unref(OBJECT(&uas->bus));
 }
 
-static void usb_uas_realize(USBDevice *dev, Error **errp)
+static void usb_uas_realize(USBDevice *dev, Error *errp[static 1])
 {
     UASDevice *uas = USB_UAS(dev);
     DeviceState *d = DEVICE(dev);
diff --git a/hw/usb/dev-wacom.c b/hw/usb/dev-wacom.c
index bf70013059..efd3b155df 100644
--- a/hw/usb/dev-wacom.c
+++ b/hw/usb/dev-wacom.c
@@ -329,7 +329,7 @@ static void usb_wacom_handle_data(USBDevice *dev, USBPacket *p)
     }
 }
 
-static void usb_wacom_unrealize(USBDevice *dev, Error **errp)
+static void usb_wacom_unrealize(USBDevice *dev, Error *errp[static 1])
 {
     USBWacomState *s = (USBWacomState *) dev;
 
@@ -339,7 +339,7 @@ static void usb_wacom_unrealize(USBDevice *dev, Error **errp)
     }
 }
 
-static void usb_wacom_realize(USBDevice *dev, Error **errp)
+static void usb_wacom_realize(USBDevice *dev, Error *errp[static 1])
 {
     USBWacomState *s = USB_WACOM(dev);
     usb_desc_create_serial(dev);
diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
index 6a19b23ebe..bcb6cf4350 100644
--- a/hw/usb/hcd-ehci-pci.c
+++ b/hw/usb/hcd-ehci-pci.c
@@ -28,7 +28,7 @@ typedef struct EHCIPCIInfo {
     bool companion;
 } EHCIPCIInfo;
 
-static void usb_ehci_pci_realize(PCIDevice *dev, Error **errp)
+static void usb_ehci_pci_realize(PCIDevice *dev, Error *errp[static 1])
 {
     EHCIPCIState *i = PCI_EHCI(dev);
     EHCIState *s = &i->ehci;
diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
index 6c20604d07..7267915f1f 100644
--- a/hw/usb/hcd-ehci-sysbus.c
+++ b/hw/usb/hcd-ehci-sysbus.c
@@ -33,7 +33,7 @@ static Property ehci_sysbus_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void usb_ehci_sysbus_realize(DeviceState *dev, Error **errp)
+static void usb_ehci_sysbus_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *d = SYS_BUS_DEVICE(dev);
     EHCISysBusState *i = SYS_BUS_EHCI(dev);
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
index 17c572c55f..689b536651 100644
--- a/hw/usb/hcd-ehci.c
+++ b/hw/usb/hcd-ehci.c
@@ -773,7 +773,7 @@ static void ehci_wakeup(USBPort *port)
 
 static void ehci_register_companion(USBBus *bus, USBPort *ports[],
                                     uint32_t portcount, uint32_t firstport,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     EHCIState *s = container_of(bus, EHCIState, bus);
     uint32_t i;
@@ -2467,7 +2467,7 @@ const VMStateDescription vmstate_ehci = {
     }
 };
 
-void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp)
+void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error *errp[static 1])
 {
     int i;
 
@@ -2492,7 +2492,7 @@ void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp)
     s->vmstate = qemu_add_vm_change_state_handler(usb_ehci_vm_state_change, s);
 }
 
-void usb_ehci_unrealize(EHCIState *s, DeviceState *dev, Error **errp)
+void usb_ehci_unrealize(EHCIState *s, DeviceState *dev, Error *errp[static 1])
 {
     trace_usb_ehci_unrealize();
 
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 2c221d23be..d93087106c 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1848,7 +1848,7 @@ static USBBusOps ohci_bus_ops = {
 static void usb_ohci_init(OHCIState *ohci, DeviceState *dev,
                           int num_ports, dma_addr_t localmem_base,
                           char *masterbus, uint32_t firstport,
-                          AddressSpace *as, Error **errp)
+                          AddressSpace *as, Error *errp[static 1])
 {
     int i;
 
@@ -1940,7 +1940,7 @@ static void ohci_die(OHCIState *ohci)
                  PCI_STATUS_DETECTED_PARITY);
 }
 
-static void usb_ohci_realize_pci(PCIDevice *dev, Error **errp)
+static void usb_ohci_realize_pci(PCIDevice *dev, Error *errp[static 1])
 {
     OHCIPCIState *ohci = PCI_OHCI(dev);
 
@@ -2002,7 +2002,7 @@ typedef struct {
     dma_addr_t dma_offset;
 } OHCISysBusState;
 
-static void ohci_realize_pxa(DeviceState *dev, Error **errp)
+static void ohci_realize_pxa(DeviceState *dev, Error *errp[static 1])
 {
     OHCISysBusState *s = SYSBUS_OHCI(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
index b99a4d6429..82beb7ce6e 100644
--- a/hw/usb/hcd-uhci.c
+++ b/hw/usb/hcd-uhci.c
@@ -1206,7 +1206,7 @@ static USBPortOps uhci_port_ops = {
 static USBBusOps uhci_bus_ops = {
 };
 
-static void usb_uhci_common_realize(PCIDevice *dev, Error **errp)
+static void usb_uhci_common_realize(PCIDevice *dev, Error *errp[static 1])
 {
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     UHCIPCIDeviceClass *u = container_of(pc, UHCIPCIDeviceClass, parent_class);
@@ -1252,7 +1252,7 @@ static void usb_uhci_common_realize(PCIDevice *dev, Error **errp)
     pci_register_bar(&s->dev, 4, PCI_BASE_ADDRESS_SPACE_IO, &s->io_bar);
 }
 
-static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error **errp)
+static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error *errp[static 1])
 {
     UHCIState *s = UHCI(dev);
     uint8_t *pci_conf = s->dev.config;
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index 05364b6955..b52743eca8 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -3330,7 +3330,7 @@ static void usb_xhci_init(XHCIState *xhci)
     }
 }
 
-static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
+static void usb_xhci_realize(struct PCIDevice *dev, Error *errp[static 1])
 {
     int i, ret;
     Error *err = NULL;
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index c32ee8864c..ed6adfc620 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -1004,7 +1004,7 @@ static libusb_device *usb_host_find_ref(int bus, int addr)
     return ret;
 }
 
-static void usb_host_realize(USBDevice *udev, Error **errp)
+static void usb_host_realize(USBDevice *udev, Error *errp[static 1])
 {
     USBHostDevice *s = USB_HOST_DEVICE(udev);
     libusb_device *ldev;
@@ -1068,7 +1068,7 @@ static void usb_host_instance_init(Object *obj)
                                   &udev->qdev, IGNORE_ERRORS);
 }
 
-static void usb_host_unrealize(USBDevice *udev, Error **errp)
+static void usb_host_unrealize(USBDevice *udev, Error *errp[static 1])
 {
     USBHostDevice *s = USB_HOST_DEVICE(udev);
 
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
index d50239e588..285145e170 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -1361,7 +1361,7 @@ static void usbredir_init_endpoints(USBRedirDevice *dev)
     }
 }
 
-static void usbredir_realize(USBDevice *udev, Error **errp)
+static void usbredir_realize(USBDevice *udev, Error *errp[static 1])
 {
     USBRedirDevice *dev = USB_REDIRECT(udev);
     int i;
@@ -1416,7 +1416,7 @@ static void usbredir_cleanup_device_queues(USBRedirDevice *dev)
     }
 }
 
-static void usbredir_unrealize(USBDevice *udev, Error **errp)
+static void usbredir_unrealize(USBDevice *udev, Error *errp[static 1])
 {
     USBRedirDevice *dev = USB_REDIRECT(udev);
 
diff --git a/hw/vfio/amd-xgbe.c b/hw/vfio/amd-xgbe.c
index fab196cebf..7fdfde4f5f 100644
--- a/hw/vfio/amd-xgbe.c
+++ b/hw/vfio/amd-xgbe.c
@@ -14,7 +14,7 @@
 #include "qemu/osdep.h"
 #include "hw/vfio/vfio-amd-xgbe.h"
 
-static void amd_xgbe_realize(DeviceState *dev, Error **errp)
+static void amd_xgbe_realize(DeviceState *dev, Error *errp[static 1])
 {
     VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(dev);
     VFIOAmdXgbeDeviceClass *k = VFIO_AMD_XGBE_DEVICE_GET_CLASS(dev);
diff --git a/hw/vfio/calxeda-xgmac.c b/hw/vfio/calxeda-xgmac.c
index 7bb17af7ad..4f13b7ea26 100644
--- a/hw/vfio/calxeda-xgmac.c
+++ b/hw/vfio/calxeda-xgmac.c
@@ -14,7 +14,7 @@
 #include "qemu/osdep.h"
 #include "hw/vfio/vfio-calxeda-xgmac.h"
 
-static void calxeda_xgmac_realize(DeviceState *dev, Error **errp)
+static void calxeda_xgmac_realize(DeviceState *dev, Error *errp[static 1])
 {
     VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(dev);
     VFIOCalxedaXgmacDeviceClass *k = VFIO_CALXEDA_XGMAC_DEVICE_GET_CLASS(dev);
diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
index d8dfbe321a..bd3929d354 100644
--- a/hw/vfio/ccw.c
+++ b/hw/vfio/ccw.c
@@ -154,7 +154,8 @@ read_err:
     css_inject_io_interrupt(sch);
 }
 
-static void vfio_ccw_register_io_notifier(VFIOCCWDevice *vcdev, Error **errp)
+static void vfio_ccw_register_io_notifier(VFIOCCWDevice *vcdev,
+                                          Error *errp[static 1])
 {
     VFIODevice *vdev = &vcdev->vdev;
     struct vfio_irq_info *irq_info;
@@ -236,7 +237,7 @@ static void vfio_ccw_unregister_io_notifier(VFIOCCWDevice *vcdev)
     g_free(irq_set);
 }
 
-static void vfio_ccw_get_region(VFIOCCWDevice *vcdev, Error **errp)
+static void vfio_ccw_get_region(VFIOCCWDevice *vcdev, Error *errp[static 1])
 {
     VFIODevice *vdev = &vcdev->vdev;
     struct vfio_region_info *info;
@@ -284,7 +285,8 @@ static void vfio_put_device(VFIOCCWDevice *vcdev)
     vfio_put_base_device(&vcdev->vdev);
 }
 
-static VFIOGroup *vfio_ccw_get_group(S390CCWDevice *cdev, Error **errp)
+static VFIOGroup *vfio_ccw_get_group(S390CCWDevice *cdev,
+                                     Error *errp[static 1])
 {
     char *tmp, group_path[PATH_MAX];
     ssize_t len;
@@ -311,7 +313,7 @@ static VFIOGroup *vfio_ccw_get_group(S390CCWDevice *cdev, Error **errp)
     return vfio_get_group(groupid, &address_space_memory, errp);
 }
 
-static void vfio_ccw_realize(DeviceState *dev, Error **errp)
+static void vfio_ccw_realize(DeviceState *dev, Error *errp[static 1])
 {
     VFIODevice *vbasedev;
     VFIOGroup *group;
@@ -376,7 +378,7 @@ out_err_propagate:
     error_propagate(errp, err);
 }
 
-static void vfio_ccw_unrealize(DeviceState *dev, Error **errp)
+static void vfio_ccw_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     CcwDevice *ccw_dev = DO_UPCAST(CcwDevice, parent_obj, dev);
     S390CCWDevice *cdev = DO_UPCAST(S390CCWDevice, parent_obj, ccw_dev);
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
index b9abe77f5a..5b80852786 100644
--- a/hw/vfio/common.c
+++ b/hw/vfio/common.c
@@ -953,7 +953,7 @@ static void vfio_put_address_space(VFIOAddressSpace *space)
 }
 
 static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     VFIOContainer *container;
     int ret, fd;
@@ -1174,7 +1174,8 @@ static void vfio_disconnect_container(VFIOGroup *group)
     }
 }
 
-VFIOGroup *vfio_get_group(int groupid, AddressSpace *as, Error **errp)
+VFIOGroup *vfio_get_group(int groupid, AddressSpace *as,
+                          Error *errp[static 1])
 {
     VFIOGroup *group;
     char path[32];
@@ -1262,7 +1263,7 @@ void vfio_put_group(VFIOGroup *group)
 }
 
 int vfio_get_device(VFIOGroup *group, const char *name,
-                    VFIODevice *vbasedev, Error **errp)
+                    VFIODevice *vbasedev, Error *errp[static 1])
 {
     struct vfio_device_info dev_info = { .argsz = sizeof(dev_info) };
     int ret, fd;
diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c
index 349085ea12..ed17a8f83c 100644
--- a/hw/vfio/pci-quirks.c
+++ b/hw/vfio/pci-quirks.c
@@ -1057,7 +1057,8 @@ typedef struct VFIOIGDQuirk {
  * of the IGD device.
  */
 int vfio_pci_igd_opregion_init(VFIOPCIDevice *vdev,
-                               struct vfio_region_info *info, Error **errp)
+                               struct vfio_region_info *info,
+                               Error *errp[static 1])
 {
     int ret;
 
@@ -1174,7 +1175,8 @@ static int vfio_pci_igd_host_init(VFIOPCIDevice *vdev,
  * to handle if the user has created it for us, which they might want to do
  * to enable multifunction so we don't occupy the whole PCI slot.
  */
-static void vfio_pci_igd_lpc_bridge_realize(PCIDevice *pdev, Error **errp)
+static void vfio_pci_igd_lpc_bridge_realize(PCIDevice *pdev,
+                                            Error *errp[static 1])
 {
     if (pdev->devfn != PCI_DEVFN(0x1f, 0)) {
         error_setg(errp, "VFIO dummy ISA/LPC bridge must have address 1f.0");
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index ae34f35a55..6a38239643 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -100,7 +100,7 @@ static void vfio_intx_eoi(VFIODevice *vbasedev)
     vfio_unmask_single_irqindex(vbasedev, VFIO_PCI_INTX_IRQ_INDEX);
 }
 
-static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error **errp)
+static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error *errp[static 1])
 {
 #ifdef CONFIG_KVM
     struct kvm_irqfd irqfd = {
@@ -254,7 +254,7 @@ static void vfio_intx_update(PCIDevice *pdev)
     vfio_intx_eoi(&vdev->vbasedev);
 }
 
-static int vfio_intx_enable(VFIOPCIDevice *vdev, Error **errp)
+static int vfio_intx_enable(VFIOPCIDevice *vdev, Error *errp[static 1])
 {
     uint8_t pin = vfio_pci_read_config(&vdev->pdev, PCI_INTERRUPT_PIN, 1);
     int ret, argsz;
@@ -1247,7 +1247,7 @@ static void vfio_disable_interrupts(VFIOPCIDevice *vdev)
     }
 }
 
-static int vfio_msi_setup(VFIOPCIDevice *vdev, int pos, Error **errp)
+static int vfio_msi_setup(VFIOPCIDevice *vdev, int pos, Error *errp[static 1])
 {
     uint16_t ctrl;
     bool msi_64bit, msi_maskbit;
@@ -1357,7 +1357,7 @@ static void vfio_pci_fixup_msix_region(VFIOPCIDevice *vdev)
  * need to first look for where the MSI-X table lives.  So we
  * unfortunately split MSI-X setup across two functions.
  */
-static void vfio_msix_early_setup(VFIOPCIDevice *vdev, Error **errp)
+static void vfio_msix_early_setup(VFIOPCIDevice *vdev, Error *errp[static 1])
 {
     uint8_t pos;
     uint16_t ctrl;
@@ -1429,7 +1429,8 @@ static void vfio_msix_early_setup(VFIOPCIDevice *vdev, Error **errp)
     vfio_pci_fixup_msix_region(vdev);
 }
 
-static int vfio_msix_setup(VFIOPCIDevice *vdev, int pos, Error **errp)
+static int vfio_msix_setup(VFIOPCIDevice *vdev, int pos,
+                           Error *errp[static 1])
 {
     int ret;
     Error *err = NULL;
@@ -1781,7 +1782,8 @@ static void vfio_check_af_flr(VFIOPCIDevice *vdev, uint8_t pos)
     }
 }
 
-static int vfio_add_std_cap(VFIOPCIDevice *vdev, uint8_t pos, Error **errp)
+static int vfio_add_std_cap(VFIOPCIDevice *vdev, uint8_t pos,
+                            Error *errp[static 1])
 {
     PCIDevice *pdev = &vdev->pdev;
     uint8_t cap_id, next, size;
@@ -1945,7 +1947,7 @@ static void vfio_add_ext_cap(VFIOPCIDevice *vdev)
     return;
 }
 
-static int vfio_add_capabilities(VFIOPCIDevice *vdev, Error **errp)
+static int vfio_add_capabilities(VFIOPCIDevice *vdev, Error *errp[static 1])
 {
     PCIDevice *pdev = &vdev->pdev;
     int ret;
@@ -2253,7 +2255,7 @@ static VFIODeviceOps vfio_pci_ops = {
     .vfio_eoi = vfio_intx_eoi,
 };
 
-int vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp)
+int vfio_populate_vga(VFIOPCIDevice *vdev, Error *errp[static 1])
 {
     VFIODevice *vbasedev = &vdev->vbasedev;
     struct vfio_region_info *reg_info;
@@ -2321,7 +2323,7 @@ int vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp)
     return 0;
 }
 
-static void vfio_populate_device(VFIOPCIDevice *vdev, Error **errp)
+static void vfio_populate_device(VFIOPCIDevice *vdev, Error *errp[static 1])
 {
     VFIODevice *vbasedev = &vdev->vbasedev;
     struct vfio_region_info *reg_info;
@@ -2609,7 +2611,7 @@ static void vfio_unregister_req_notifier(VFIOPCIDevice *vdev)
     vdev->req_enabled = false;
 }
 
-static void vfio_realize(PCIDevice *pdev, Error **errp)
+static void vfio_realize(PCIDevice *pdev, Error *errp[static 1])
 {
     VFIOPCIDevice *vdev = DO_UPCAST(VFIOPCIDevice, pdev, pdev);
     VFIODevice *vbasedev_iter;
diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c
index a4663c918e..572111d558 100644
--- a/hw/vfio/platform.c
+++ b/hw/vfio/platform.c
@@ -47,7 +47,8 @@ static inline bool vfio_irq_is_automasked(VFIOINTp *intp)
  * @errp: error object
  */
 static VFIOINTp *vfio_init_intp(VFIODevice *vbasedev,
-                                struct vfio_irq_info info, Error **errp)
+                                struct vfio_irq_info info,
+                                Error *errp[static 1])
 {
     int ret;
     VFIOPlatformDevice *vdev =
@@ -462,7 +463,7 @@ static int vfio_platform_hot_reset_multi(VFIODevice *vbasedev)
  * @errp: error object
  *
  */
-static int vfio_populate_device(VFIODevice *vbasedev, Error **errp)
+static int vfio_populate_device(VFIODevice *vbasedev, Error *errp[static 1])
 {
     VFIOINTp *intp, *tmp;
     int i, ret = -1;
@@ -548,7 +549,7 @@ static VFIODeviceOps vfio_platform_ops = {
  * fd retrieval, resource query.
  * Precondition: the device name must be initialized
  */
-static int vfio_base_device_init(VFIODevice *vbasedev, Error **errp)
+static int vfio_base_device_init(VFIODevice *vbasedev, Error *errp[static 1])
 {
     VFIOGroup *group;
     VFIODevice *vbasedev_iter;
@@ -632,7 +633,7 @@ static int vfio_base_device_init(VFIODevice *vbasedev, Error **errp)
  * initialize the device, its memory regions and IRQ structures
  * IRQ are started separately
  */
-static void vfio_platform_realize(DeviceState *dev, Error **errp)
+static void vfio_platform_realize(DeviceState *dev, Error *errp[static 1])
 {
     VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(dev);
     SysBusDevice *sbdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/virtio/vhost-vsock.c b/hw/virtio/vhost-vsock.c
index 49e0022533..71af3b7b28 100644
--- a/hw/virtio/vhost-vsock.c
+++ b/hw/virtio/vhost-vsock.c
@@ -176,7 +176,7 @@ static void vhost_vsock_set_status(VirtIODevice *vdev, uint8_t status)
 
 static uint64_t vhost_vsock_get_features(VirtIODevice *vdev,
                                          uint64_t requested_features,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     /* No feature bits used yet */
     return requested_features;
@@ -294,7 +294,8 @@ static const VMStateDescription vmstate_virtio_vhost_vsock = {
     .post_load = vhost_vsock_post_load,
 };
 
-static void vhost_vsock_device_realize(DeviceState *dev, Error **errp)
+static void vhost_vsock_device_realize(DeviceState *dev,
+                                       Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VHostVSock *vsock = VHOST_VSOCK(dev);
@@ -364,7 +365,8 @@ err_virtio:
     return;
 }
 
-static void vhost_vsock_device_unrealize(DeviceState *dev, Error **errp)
+static void vhost_vsock_device_unrealize(DeviceState *dev,
+                                         Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VHostVSock *vsock = VHOST_VSOCK(dev);
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index 09ac3b7d12..5015b4b083 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -111,7 +111,7 @@ static void balloon_stats_poll_cb(void *opaque)
 }
 
 static void balloon_stats_get_all(Object *obj, Visitor *v, const char *name,
-                                  void *opaque, Error **errp)
+                                  void *opaque, Error *errp[static 1])
 {
     Error *err = NULL;
     VirtIOBalloon *s = opaque;
@@ -151,7 +151,7 @@ out:
 
 static void balloon_stats_get_poll_interval(Object *obj, Visitor *v,
                                             const char *name, void *opaque,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     VirtIOBalloon *s = opaque;
     visit_type_int(v, name, &s->stats_poll_interval, errp);
@@ -159,7 +159,7 @@ static void balloon_stats_get_poll_interval(Object *obj, Visitor *v,
 
 static void balloon_stats_set_poll_interval(Object *obj, Visitor *v,
                                             const char *name, void *opaque,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     VirtIOBalloon *s = opaque;
     int64_t value;
@@ -367,7 +367,7 @@ static void virtio_balloon_set_config(VirtIODevice *vdev,
 }
 
 static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     VirtIOBalloon *dev = VIRTIO_BALLOON(vdev);
     f |= dev->host_features;
@@ -420,7 +420,8 @@ static const VMStateDescription vmstate_virtio_balloon_device = {
     },
 };
 
-static void virtio_balloon_device_realize(DeviceState *dev, Error **errp)
+static void virtio_balloon_device_realize(DeviceState *dev,
+                                          Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOBalloon *s = VIRTIO_BALLOON(dev);
@@ -445,7 +446,8 @@ static void virtio_balloon_device_realize(DeviceState *dev, Error **errp)
     reset_stats(s);
 }
 
-static void virtio_balloon_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_balloon_device_unrealize(DeviceState *dev,
+                                            Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOBalloon *s = VIRTIO_BALLOON(dev);
diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
index 3042232daf..27e15e2734 100644
--- a/hw/virtio/virtio-bus.c
+++ b/hw/virtio/virtio-bus.c
@@ -41,7 +41,7 @@ do { printf("virtio_bus: " fmt , ## __VA_ARGS__); } while (0)
 #endif
 
 /* A VirtIODevice is being plugged */
-void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp)
+void virtio_bus_device_plugged(VirtIODevice *vdev, Error *errp[static 1])
 {
     DeviceState *qdev = DEVICE(vdev);
     BusState *qbus = BUS(qdev_get_parent_bus(qdev));
diff --git a/hw/virtio/virtio-crypto-pci.c b/hw/virtio/virtio-crypto-pci.c
index fe66425540..46c7670afa 100644
--- a/hw/virtio/virtio-crypto-pci.c
+++ b/hw/virtio/virtio-crypto-pci.c
@@ -26,7 +26,8 @@ static Property virtio_crypto_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_crypto_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_crypto_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                      Error *errp[static 1])
 {
     VirtIOCryptoPCI *vcrypto = VIRTIO_CRYPTO_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&vcrypto->vdev);
diff --git a/hw/virtio/virtio-crypto.c b/hw/virtio/virtio-crypto.c
index a4714af54a..6fb6b0e674 100644
--- a/hw/virtio/virtio-crypto.c
+++ b/hw/virtio/virtio-crypto.c
@@ -733,7 +733,7 @@ virtio_crypto_handle_dataq_bh(VirtIODevice *vdev, VirtQueue *vq)
 
 static uint64_t virtio_crypto_get_features(VirtIODevice *vdev,
                                            uint64_t features,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     return features;
 }
@@ -771,7 +771,8 @@ static void virtio_crypto_init_config(VirtIODevice *vdev)
     vcrypto->conf.max_size = vcrypto->conf.cryptodev->conf.max_size;
 }
 
-static void virtio_crypto_device_realize(DeviceState *dev, Error **errp)
+static void virtio_crypto_device_realize(DeviceState *dev,
+                                         Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOCrypto *vcrypto = VIRTIO_CRYPTO(dev);
@@ -813,7 +814,8 @@ static void virtio_crypto_device_realize(DeviceState *dev, Error **errp)
     cryptodev_backend_set_used(vcrypto->cryptodev, true);
 }
 
-static void virtio_crypto_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_crypto_device_unrealize(DeviceState *dev,
+                                           Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOCrypto *vcrypto = VIRTIO_CRYPTO(dev);
@@ -890,7 +892,7 @@ static void virtio_crypto_class_init(ObjectClass *klass, void *data)
 
 static void
 virtio_crypto_check_cryptodev_is_used(Object *obj, const char *name,
-                                      Object *val, Error **errp)
+                                      Object *val, Error *errp[static 1])
 {
     if (cryptodev_backend_is_used(CRYPTODEV_BACKEND(val))) {
         char *path = object_get_canonical_path_component(val);
diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index 5807aa87fe..9595ff5ae6 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -429,7 +429,7 @@ static Property virtio_mmio_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_mmio_realizefn(DeviceState *d, Error **errp)
+static void virtio_mmio_realizefn(DeviceState *d, Error *errp[static 1])
 {
     VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d);
     SysBusDevice *sbd = SYS_BUS_DEVICE(d);
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index d6a8b6be5f..2c707cccc4 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1089,7 +1089,8 @@ static void virtio_pci_vmstate_change(DeviceState *d, bool running)
 }
 
 #ifdef CONFIG_VIRTFS
-static void virtio_9p_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_9p_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                  Error *errp[static 1])
 {
     V9fsPCIState *dev = VIRTIO_9P_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -1563,7 +1564,7 @@ static void virtio_pci_modern_io_region_unmap(VirtIOPCIProxy *proxy,
                                 &region->mr);
 }
 
-static void virtio_pci_pre_plugged(DeviceState *d, Error **errp)
+static void virtio_pci_pre_plugged(DeviceState *d, Error *errp[static 1])
 {
     VirtIOPCIProxy *proxy = VIRTIO_PCI(d);
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
@@ -1576,7 +1577,7 @@ static void virtio_pci_pre_plugged(DeviceState *d, Error **errp)
 }
 
 /* This is called by virtio-bus just after the device is plugged. */
-static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
+static void virtio_pci_device_plugged(DeviceState *d, Error *errp[static 1])
 {
     VirtIOPCIProxy *proxy = VIRTIO_PCI(d);
     VirtioBusState *bus = &proxy->bus;
@@ -1733,7 +1734,7 @@ static void virtio_pci_device_unplugged(DeviceState *d)
     }
 }
 
-static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp)
+static void virtio_pci_realize(PCIDevice *pci_dev, Error *errp[static 1])
 {
     VirtIOPCIProxy *proxy = VIRTIO_PCI(pci_dev);
     VirtioPCIClass *k = VIRTIO_PCI_GET_CLASS(pci_dev);
@@ -1916,7 +1917,7 @@ static Property virtio_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_pci_dc_realize(DeviceState *qdev, Error **errp)
+static void virtio_pci_dc_realize(DeviceState *qdev, Error *errp[static 1])
 {
     VirtioPCIClass *vpciklass = VIRTIO_PCI_GET_CLASS(qdev);
     VirtIOPCIProxy *proxy = VIRTIO_PCI(qdev);
@@ -1966,7 +1967,8 @@ static Property virtio_blk_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_blk_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_blk_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                   Error *errp[static 1])
 {
     VirtIOBlkPCI *dev = VIRTIO_BLK_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -2020,7 +2022,8 @@ static Property virtio_scsi_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_scsi_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_scsi_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                    Error *errp[static 1])
 {
     VirtIOSCSIPCI *dev = VIRTIO_SCSI_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -2088,7 +2091,8 @@ static Property vhost_scsi_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void vhost_scsi_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void vhost_scsi_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                   Error *errp[static 1])
 {
     VHostSCSIPCI *dev = VHOST_SCSI_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -2143,7 +2147,8 @@ static Property vhost_vsock_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void vhost_vsock_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void vhost_vsock_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                    Error *errp[static 1])
 {
     VHostVSockPCI *dev = VHOST_VSOCK_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -2190,7 +2195,8 @@ static Property virtio_balloon_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_balloon_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_balloon_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                       Error *errp[static 1])
 {
     VirtIOBalloonPCI *dev = VIRTIO_BALLOON_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -2241,7 +2247,8 @@ static const TypeInfo virtio_balloon_pci_info = {
 
 /* virtio-serial-pci */
 
-static void virtio_serial_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_serial_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                      Error *errp[static 1])
 {
     VirtIOSerialPCI *dev = VIRTIO_SERIAL_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
@@ -2321,7 +2328,8 @@ static Property virtio_net_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_net_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_net_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                   Error *errp[static 1])
 {
     DeviceState *qdev = DEVICE(vpci_dev);
     VirtIONetPCI *dev = VIRTIO_NET_PCI(vpci_dev);
@@ -2369,7 +2377,8 @@ static const TypeInfo virtio_net_pci_info = {
 
 /* virtio-rng-pci */
 
-static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                   Error *errp[static 1])
 {
     VirtIORngPCI *vrng = VIRTIO_RNG_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&vrng->vdev);
@@ -2425,7 +2434,8 @@ static Property virtio_input_pci_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
-static void virtio_input_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
+static void virtio_input_pci_realize(VirtIOPCIProxy *vpci_dev,
+                                     Error *errp[static 1])
 {
     VirtIOInputPCI *vinput = VIRTIO_INPUT_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&vinput->vdev);
diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c
index 964c775e41..1de59642e9 100644
--- a/hw/virtio/virtio-rng.c
+++ b/hw/virtio/virtio-rng.c
@@ -125,7 +125,8 @@ static void handle_input(VirtIODevice *vdev, VirtQueue *vq)
     virtio_rng_process(vrng);
 }
 
-static uint64_t get_features(VirtIODevice *vdev, uint64_t f, Error **errp)
+static uint64_t get_features(VirtIODevice *vdev, uint64_t f,
+                             Error *errp[static 1])
 {
     return f;
 }
@@ -156,7 +157,7 @@ static void check_rate_limit(void *opaque)
     vrng->activate_timer = true;
 }
 
-static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
+static void virtio_rng_device_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIORNG *vrng = VIRTIO_RNG(dev);
@@ -215,7 +216,8 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
                                                      vrng);
 }
 
-static void virtio_rng_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_rng_device_unrealize(DeviceState *dev,
+                                        Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIORNG *vrng = VIRTIO_RNG(dev);
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 530b5e568e..b007358a19 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -2473,7 +2473,7 @@ static void virtio_memory_listener_commit(MemoryListener *listener)
     }
 }
 
-static void virtio_device_realize(DeviceState *dev, Error **errp)
+static void virtio_device_realize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
@@ -2497,7 +2497,7 @@ static void virtio_device_realize(DeviceState *dev, Error **errp)
     memory_listener_register(&vdev->listener, vdev->dma_as);
 }
 
-static void virtio_device_unrealize(DeviceState *dev, Error **errp)
+static void virtio_device_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
index 8bbe579b6b..caf9dd9bfa 100644
--- a/hw/watchdog/wdt_aspeed.c
+++ b/hw/watchdog/wdt_aspeed.c
@@ -182,7 +182,7 @@ static void aspeed_wdt_timer_expired(void *dev)
 
 #define PCLK_HZ 24000000
 
-static void aspeed_wdt_realize(DeviceState *dev, Error **errp)
+static void aspeed_wdt_realize(DeviceState *dev, Error *errp[static 1])
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     AspeedWDTState *s = ASPEED_WDT(dev);
diff --git a/hw/watchdog/wdt_diag288.c b/hw/watchdog/wdt_diag288.c
index a7b64e2c40..1e0cec8b33 100644
--- a/hw/watchdog/wdt_diag288.c
+++ b/hw/watchdog/wdt_diag288.c
@@ -96,7 +96,7 @@ static int wdt_diag288_handle_timer(DIAG288State *diag288,
     return 0;
 }
 
-static void wdt_diag288_realize(DeviceState *dev, Error **errp)
+static void wdt_diag288_realize(DeviceState *dev, Error *errp[static 1])
 {
     DIAG288State *diag288 = DIAG288(dev);
 
@@ -105,7 +105,7 @@ static void wdt_diag288_realize(DeviceState *dev, Error **errp)
                                   dev);
 }
 
-static void wdt_diag288_unrealize(DeviceState *dev, Error **errp)
+static void wdt_diag288_unrealize(DeviceState *dev, Error *errp[static 1])
 {
     DIAG288State *diag288 = DIAG288(dev);
 
diff --git a/hw/watchdog/wdt_i6300esb.c b/hw/watchdog/wdt_i6300esb.c
index 49b3cd188a..3d966d6db0 100644
--- a/hw/watchdog/wdt_i6300esb.c
+++ b/hw/watchdog/wdt_i6300esb.c
@@ -413,7 +413,7 @@ static const VMStateDescription vmstate_i6300esb = {
     }
 };
 
-static void i6300esb_realize(PCIDevice *dev, Error **errp)
+static void i6300esb_realize(PCIDevice *dev, Error *errp[static 1])
 {
     I6300State *d = WATCHDOG_I6300ESB_DEVICE(dev);
 
diff --git a/hw/watchdog/wdt_ib700.c b/hw/watchdog/wdt_ib700.c
index 532afe89e7..90427e4a3f 100644
--- a/hw/watchdog/wdt_ib700.c
+++ b/hw/watchdog/wdt_ib700.c
@@ -105,7 +105,7 @@ static const MemoryRegionPortio wdt_portio_list[] = {
     PORTIO_END_OF_LIST(),
 };
 
-static void wdt_ib700_realize(DeviceState *dev, Error **errp)
+static void wdt_ib700_realize(DeviceState *dev, Error *errp[static 1])
 {
     IB700State *s = IB700(dev);
 
diff --git a/hw/xen/xen-host-pci-device.c b/hw/xen/xen-host-pci-device.c
index eed8cc88e3..00a07fbf17 100644
--- a/hw/xen/xen-host-pci-device.c
+++ b/hw/xen/xen-host-pci-device.c
@@ -136,7 +136,8 @@ out:
 /* This size should be enough to read a long from a file */
 #define XEN_HOST_PCI_GET_VALUE_BUFFER_SIZE 22
 static void xen_host_pci_get_value(XenHostPCIDevice *d, const char *name,
-                                   unsigned int *pvalue, int base, Error **errp)
+                                   unsigned int *pvalue, int base,
+                                   Error *errp[static 1])
 {
     char path[PATH_MAX];
     char buf[XEN_HOST_PCI_GET_VALUE_BUFFER_SIZE];
@@ -176,7 +177,7 @@ out:
 static inline void xen_host_pci_get_hex_value(XenHostPCIDevice *d,
                                               const char *name,
                                               unsigned int *pvalue,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     xen_host_pci_get_value(d, name, pvalue, 16, errp);
 }
@@ -184,7 +185,7 @@ static inline void xen_host_pci_get_hex_value(XenHostPCIDevice *d,
 static inline void xen_host_pci_get_dec_value(XenHostPCIDevice *d,
                                               const char *name,
                                               unsigned int *pvalue,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     xen_host_pci_get_value(d, name, pvalue, 10, errp);
 }
@@ -199,7 +200,8 @@ static bool xen_host_pci_dev_is_virtfn(XenHostPCIDevice *d)
     return !stat(path, &buf);
 }
 
-static void xen_host_pci_config_open(XenHostPCIDevice *d, Error **errp)
+static void xen_host_pci_config_open(XenHostPCIDevice *d,
+                                     Error *errp[static 1])
 {
     char path[PATH_MAX];
 
@@ -332,7 +334,7 @@ int xen_host_pci_find_ext_cap_offset(XenHostPCIDevice *d, uint32_t cap)
 
 void xen_host_pci_device_get(XenHostPCIDevice *d, uint16_t domain,
                              uint8_t bus, uint8_t dev, uint8_t func,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     unsigned int v;
     Error *err = NULL;
diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c
index b6d71bb52a..33aaf0bfa7 100644
--- a/hw/xen/xen_pt.c
+++ b/hw/xen/xen_pt.c
@@ -762,7 +762,7 @@ static void xen_pt_destroy(PCIDevice *d) {
 }
 /* init */
 
-static void xen_pt_realize(PCIDevice *d, Error **errp)
+static void xen_pt_realize(PCIDevice *d, Error *errp[static 1])
 {
     XenPCIPassthroughState *s = XEN_PT_DEVICE(d);
     int i, rc = 0;
diff --git a/hw/xen/xen_pt_config_init.c b/hw/xen/xen_pt_config_init.c
index 6f18366f67..3d944cc1be 100644
--- a/hw/xen/xen_pt_config_init.c
+++ b/hw/xen/xen_pt_config_init.c
@@ -1891,7 +1891,7 @@ static uint8_t find_cap_offset(XenPCIPassthroughState *s, uint8_t cap)
 
 static void xen_pt_config_reg_init(XenPCIPassthroughState *s,
                                    XenPTRegGroup *reg_grp, XenPTRegInfo *reg,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     XenPTReg *reg_entry;
     uint32_t data = 0;
@@ -1985,7 +1985,7 @@ static void xen_pt_config_reg_init(XenPCIPassthroughState *s,
     QLIST_INSERT_HEAD(&reg_grp->reg_tbl_list, reg_entry, entries);
 }
 
-void xen_pt_config_init(XenPCIPassthroughState *s, Error **errp)
+void xen_pt_config_init(XenPCIPassthroughState *s, Error *errp[static 1])
 {
     int i, rc;
     Error *err = NULL;
diff --git a/hw/xen/xen_pt_graphics.c b/hw/xen/xen_pt_graphics.c
index 0f4c8d77e2..ba878974e3 100644
--- a/hw/xen/xen_pt_graphics.c
+++ b/hw/xen/xen_pt_graphics.c
@@ -164,7 +164,7 @@ struct pci_data {
 } __attribute__((packed));
 
 void xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     unsigned char *bios = NULL;
     struct rom_header *rom;
diff --git a/io/channel-buffer.c b/io/channel-buffer.c
index 43d795976d..fe9710cf99 100644
--- a/io/channel-buffer.c
+++ b/io/channel-buffer.c
@@ -53,7 +53,7 @@ static ssize_t qio_channel_buffer_readv(QIOChannel *ioc,
                                         size_t niov,
                                         int **fds,
                                         size_t *nfds,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     QIOChannelBuffer *bioc = QIO_CHANNEL_BUFFER(ioc);
     ssize_t ret = 0;
@@ -80,7 +80,7 @@ static ssize_t qio_channel_buffer_writev(QIOChannel *ioc,
                                          size_t niov,
                                          int *fds,
                                          size_t nfds,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QIOChannelBuffer *bioc = QIO_CHANNEL_BUFFER(ioc);
     ssize_t ret = 0;
@@ -115,7 +115,7 @@ static ssize_t qio_channel_buffer_writev(QIOChannel *ioc,
 
 static int qio_channel_buffer_set_blocking(QIOChannel *ioc G_GNUC_UNUSED,
                                            bool enabled G_GNUC_UNUSED,
-                                           Error **errp G_GNUC_UNUSED)
+                                           Error *errp[static 1] G_GNUC_UNUSED)
 {
     return 0;
 }
@@ -124,7 +124,7 @@ static int qio_channel_buffer_set_blocking(QIOChannel *ioc G_GNUC_UNUSED,
 static off_t qio_channel_buffer_seek(QIOChannel *ioc,
                                      off_t offset,
                                      int whence,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QIOChannelBuffer *bioc = QIO_CHANNEL_BUFFER(ioc);
 
@@ -135,7 +135,7 @@ static off_t qio_channel_buffer_seek(QIOChannel *ioc,
 
 
 static int qio_channel_buffer_close(QIOChannel *ioc,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     QIOChannelBuffer *bioc = QIO_CHANNEL_BUFFER(ioc);
 
diff --git a/io/channel-command.c b/io/channel-command.c
index 2eea0135b0..fd4c89e5ee 100644
--- a/io/channel-command.c
+++ b/io/channel-command.c
@@ -48,7 +48,7 @@ qio_channel_command_new_pid(int writefd,
 QIOChannelCommand *
 qio_channel_command_new_spawn(const char *const argv[],
                               int flags,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     pid_t pid = -1;
     int stdinfd[2] = { -1, -1 };
@@ -144,7 +144,7 @@ qio_channel_command_new_spawn(const char *const argv[],
 QIOChannelCommand *
 qio_channel_command_new_spawn(const char *const argv[],
                               int flags,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     error_setg_errno(errp, ENOSYS,
                      "Command spawn not supported on this platform");
@@ -154,7 +154,7 @@ qio_channel_command_new_spawn(const char *const argv[],
 
 #ifndef WIN32
 static int qio_channel_command_abort(QIOChannelCommand *ioc,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     pid_t ret;
     int status;
@@ -229,7 +229,7 @@ static ssize_t qio_channel_command_readv(QIOChannel *ioc,
                                          size_t niov,
                                          int **fds,
                                          size_t *nfds,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QIOChannelCommand *cioc = QIO_CHANNEL_COMMAND(ioc);
     ssize_t ret;
@@ -257,7 +257,7 @@ static ssize_t qio_channel_command_writev(QIOChannel *ioc,
                                           size_t niov,
                                           int *fds,
                                           size_t nfds,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     QIOChannelCommand *cioc = QIO_CHANNEL_COMMAND(ioc);
     ssize_t ret;
@@ -280,7 +280,7 @@ static ssize_t qio_channel_command_writev(QIOChannel *ioc,
 
 static int qio_channel_command_set_blocking(QIOChannel *ioc,
                                             bool enabled,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     QIOChannelCommand *cioc = QIO_CHANNEL_COMMAND(ioc);
 
@@ -297,7 +297,7 @@ static int qio_channel_command_set_blocking(QIOChannel *ioc,
 
 
 static int qio_channel_command_close(QIOChannel *ioc,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QIOChannelCommand *cioc = QIO_CHANNEL_COMMAND(ioc);
     int rv = 0;
diff --git a/io/channel-file.c b/io/channel-file.c
index b383273201..e433ba25d7 100644
--- a/io/channel-file.c
+++ b/io/channel-file.c
@@ -44,7 +44,7 @@ QIOChannelFile *
 qio_channel_file_new_path(const char *path,
                           int flags,
                           mode_t mode,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     QIOChannelFile *ioc;
 
@@ -89,7 +89,7 @@ static ssize_t qio_channel_file_readv(QIOChannel *ioc,
                                       size_t niov,
                                       int **fds,
                                       size_t *nfds,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc);
     ssize_t ret;
@@ -117,7 +117,7 @@ static ssize_t qio_channel_file_writev(QIOChannel *ioc,
                                        size_t niov,
                                        int *fds,
                                        size_t nfds,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc);
     ssize_t ret;
@@ -140,7 +140,7 @@ static ssize_t qio_channel_file_writev(QIOChannel *ioc,
 
 static int qio_channel_file_set_blocking(QIOChannel *ioc,
                                          bool enabled,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc);
 
@@ -156,7 +156,7 @@ static int qio_channel_file_set_blocking(QIOChannel *ioc,
 static off_t qio_channel_file_seek(QIOChannel *ioc,
                                    off_t offset,
                                    int whence,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc);
     off_t ret;
@@ -173,7 +173,7 @@ static off_t qio_channel_file_seek(QIOChannel *ioc,
 
 
 static int qio_channel_file_close(QIOChannel *ioc,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc);
 
diff --git a/io/channel-socket.c b/io/channel-socket.c
index 53386b7ba3..9da8cd956d 100644
--- a/io/channel-socket.c
+++ b/io/channel-socket.c
@@ -29,7 +29,7 @@
 
 SocketAddress *
 qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     return socket_sockaddr_to_address(&ioc->localAddr,
                                       ioc->localAddrLen,
@@ -38,7 +38,7 @@ qio_channel_socket_get_local_address(QIOChannelSocket *ioc,
 
 SocketAddress *
 qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     return socket_sockaddr_to_address(&ioc->remoteAddr,
                                       ioc->remoteAddrLen,
@@ -70,7 +70,7 @@ qio_channel_socket_new(void)
 static int
 qio_channel_socket_set_fd(QIOChannelSocket *sioc,
                           int fd,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     if (sioc->fd != -1) {
         error_setg(errp, "Socket is already open");
@@ -117,7 +117,7 @@ qio_channel_socket_set_fd(QIOChannelSocket *sioc,
 
 QIOChannelSocket *
 qio_channel_socket_new_fd(int fd,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     QIOChannelSocket *ioc;
 
@@ -135,7 +135,7 @@ qio_channel_socket_new_fd(int fd,
 
 int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
                                     SocketAddress *addr,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     int fd;
 
@@ -193,7 +193,7 @@ void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
 
 int qio_channel_socket_listen_sync(QIOChannelSocket *ioc,
                                    SocketAddress *addr,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     int fd;
 
@@ -252,7 +252,7 @@ void qio_channel_socket_listen_async(QIOChannelSocket *ioc,
 int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc,
                                   SocketAddress *localAddr,
                                   SocketAddress *remoteAddr,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     int fd;
 
@@ -327,7 +327,7 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
 
 QIOChannelSocket *
 qio_channel_socket_accept(QIOChannelSocket *ioc,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     QIOChannelSocket *cioc;
 
@@ -451,7 +451,7 @@ static ssize_t qio_channel_socket_readv(QIOChannel *ioc,
                                         size_t niov,
                                         int **fds,
                                         size_t *nfds,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
     ssize_t ret;
@@ -499,7 +499,7 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
                                          size_t niov,
                                          int *fds,
                                          size_t nfds,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
     ssize_t ret;
@@ -552,7 +552,7 @@ static ssize_t qio_channel_socket_readv(QIOChannel *ioc,
                                         size_t niov,
                                         int **fds,
                                         size_t *nfds,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
     ssize_t done = 0;
@@ -594,7 +594,7 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
                                          size_t niov,
                                          int *fds,
                                          size_t nfds,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
     ssize_t done = 0;
@@ -635,7 +635,7 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
 static int
 qio_channel_socket_set_blocking(QIOChannel *ioc,
                                 bool enabled,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
 
@@ -674,7 +674,7 @@ qio_channel_socket_set_cork(QIOChannel *ioc,
 
 static int
 qio_channel_socket_close(QIOChannel *ioc,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
 
@@ -696,7 +696,7 @@ qio_channel_socket_close(QIOChannel *ioc,
 static int
 qio_channel_socket_shutdown(QIOChannel *ioc,
                             QIOChannelShutdown how,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
     int sockhow;
diff --git a/io/channel-tls.c b/io/channel-tls.c
index 6350f5b25f..52aeaacae4 100644
--- a/io/channel-tls.c
+++ b/io/channel-tls.c
@@ -65,7 +65,7 @@ QIOChannelTLS *
 qio_channel_tls_new_server(QIOChannel *master,
                            QCryptoTLSCreds *creds,
                            const char *aclname,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QIOChannelTLS *ioc;
 
@@ -102,7 +102,7 @@ QIOChannelTLS *
 qio_channel_tls_new_client(QIOChannel *master,
                            QCryptoTLSCreds *creds,
                            const char *hostname,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     QIOChannelTLS *tioc;
     QIOChannel *ioc;
@@ -235,7 +235,7 @@ static ssize_t qio_channel_tls_readv(QIOChannel *ioc,
                                      size_t niov,
                                      int **fds,
                                      size_t *nfds,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QIOChannelTLS *tioc = QIO_CHANNEL_TLS(ioc);
     size_t i;
@@ -272,7 +272,7 @@ static ssize_t qio_channel_tls_writev(QIOChannel *ioc,
                                       size_t niov,
                                       int *fds,
                                       size_t nfds,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     QIOChannelTLS *tioc = QIO_CHANNEL_TLS(ioc);
     size_t i;
@@ -305,7 +305,7 @@ static ssize_t qio_channel_tls_writev(QIOChannel *ioc,
 
 static int qio_channel_tls_set_blocking(QIOChannel *ioc,
                                         bool enabled,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     QIOChannelTLS *tioc = QIO_CHANNEL_TLS(ioc);
 
@@ -330,7 +330,7 @@ static void qio_channel_tls_set_cork(QIOChannel *ioc,
 
 static int qio_channel_tls_shutdown(QIOChannel *ioc,
                                     QIOChannelShutdown how,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     QIOChannelTLS *tioc = QIO_CHANNEL_TLS(ioc);
 
@@ -338,7 +338,7 @@ static int qio_channel_tls_shutdown(QIOChannel *ioc,
 }
 
 static int qio_channel_tls_close(QIOChannel *ioc,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     QIOChannelTLS *tioc = QIO_CHANNEL_TLS(ioc);
 
diff --git a/io/channel-util.c b/io/channel-util.c
index 0fb4bd0837..cd9a5da1d8 100644
--- a/io/channel-util.c
+++ b/io/channel-util.c
@@ -38,7 +38,7 @@ static bool fd_is_socket(int fd)
 
 
 QIOChannel *qio_channel_new_fd(int fd,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     QIOChannel *ioc;
 
diff --git a/io/channel-websock.c b/io/channel-websock.c
index 5a3badbec2..29bd041e0e 100644
--- a/io/channel-websock.c
+++ b/io/channel-websock.c
@@ -127,7 +127,7 @@ static size_t
 qio_channel_websock_extract_headers(char *buffer,
                                     QIOChannelWebsockHTTPHeader *hdrs,
                                     size_t nhdrsalloc,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     char *nl, *sep, *tmp;
     size_t nhdrs = 0;
@@ -252,7 +252,7 @@ qio_channel_websock_find_header(QIOChannelWebsockHTTPHeader *hdrs,
 
 static int qio_channel_websock_handshake_send_response(QIOChannelWebsock *ioc,
                                                        const char *key,
-                                                       Error **errp)
+                                                       Error *errp[static 1])
 {
     char combined_key[QIO_CHANNEL_WEBSOCK_CLIENT_KEY_LEN +
                       QIO_CHANNEL_WEBSOCK_GUID_LEN + 1];
@@ -287,7 +287,7 @@ static int qio_channel_websock_handshake_send_response(QIOChannelWebsock *ioc,
 
 static int qio_channel_websock_handshake_process(QIOChannelWebsock *ioc,
                                                  char *buffer,
-                                                 Error **errp)
+                                                 Error *errp[static 1])
 {
     QIOChannelWebsockHTTPHeader hdrs[32];
     size_t nhdrs = G_N_ELEMENTS(hdrs);
@@ -373,7 +373,7 @@ static int qio_channel_websock_handshake_process(QIOChannelWebsock *ioc,
 }
 
 static int qio_channel_websock_handshake_read(QIOChannelWebsock *ioc,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     char *handshake_end;
     ssize_t ret;
@@ -520,7 +520,7 @@ static void qio_channel_websock_encode(QIOChannelWebsock *ioc)
 
 
 static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,
-                                                 Error **errp)
+                                                 Error *errp[static 1])
 {
     unsigned char opcode, fin, has_mask;
     size_t header_size;
@@ -594,7 +594,7 @@ static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,
 
 
 static ssize_t qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,
-                                                  Error **errp)
+                                                  Error *errp[static 1])
 {
     size_t i;
     size_t payload_len;
@@ -699,7 +699,7 @@ static void qio_channel_websock_finalize(Object *obj)
 
 
 static ssize_t qio_channel_websock_read_wire(QIOChannelWebsock *ioc,
-                                             Error **errp)
+                                             Error *errp[static 1])
 {
     ssize_t ret;
 
@@ -744,7 +744,7 @@ static ssize_t qio_channel_websock_read_wire(QIOChannelWebsock *ioc,
 
 
 static ssize_t qio_channel_websock_write_wire(QIOChannelWebsock *ioc,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     ssize_t ret;
     ssize_t done = 0;
@@ -848,7 +848,7 @@ static ssize_t qio_channel_websock_readv(QIOChannel *ioc,
                                          size_t niov,
                                          int **fds,
                                          size_t *nfds,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QIOChannelWebsock *wioc = QIO_CHANNEL_WEBSOCK(ioc);
     size_t i;
@@ -894,7 +894,7 @@ static ssize_t qio_channel_websock_writev(QIOChannel *ioc,
                                           size_t niov,
                                           int *fds,
                                           size_t nfds,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     QIOChannelWebsock *wioc = QIO_CHANNEL_WEBSOCK(ioc);
     size_t i;
@@ -947,7 +947,7 @@ static ssize_t qio_channel_websock_writev(QIOChannel *ioc,
 
 static int qio_channel_websock_set_blocking(QIOChannel *ioc,
                                             bool enabled,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     QIOChannelWebsock *wioc = QIO_CHANNEL_WEBSOCK(ioc);
 
@@ -973,7 +973,7 @@ static void qio_channel_websock_set_cork(QIOChannel *ioc,
 
 static int qio_channel_websock_shutdown(QIOChannel *ioc,
                                         QIOChannelShutdown how,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     QIOChannelWebsock *tioc = QIO_CHANNEL_WEBSOCK(ioc);
 
@@ -981,7 +981,7 @@ static int qio_channel_websock_shutdown(QIOChannel *ioc,
 }
 
 static int qio_channel_websock_close(QIOChannel *ioc,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QIOChannelWebsock *wioc = QIO_CHANNEL_WEBSOCK(ioc);
 
diff --git a/io/channel.c b/io/channel.c
index cdf74540c1..78fc21768e 100644
--- a/io/channel.c
+++ b/io/channel.c
@@ -50,7 +50,7 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
                                size_t niov,
                                int **fds,
                                size_t *nfds,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
@@ -70,7 +70,7 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc,
                                 size_t niov,
                                 int *fds,
                                 size_t nfds,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
@@ -88,7 +88,7 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc,
 ssize_t qio_channel_readv(QIOChannel *ioc,
                           const struct iovec *iov,
                           size_t niov,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     return qio_channel_readv_full(ioc, iov, niov, NULL, NULL, errp);
 }
@@ -97,7 +97,7 @@ ssize_t qio_channel_readv(QIOChannel *ioc,
 ssize_t qio_channel_writev(QIOChannel *ioc,
                            const struct iovec *iov,
                            size_t niov,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     return qio_channel_writev_full(ioc, iov, niov, NULL, 0, errp);
 }
@@ -106,7 +106,7 @@ ssize_t qio_channel_writev(QIOChannel *ioc,
 ssize_t qio_channel_read(QIOChannel *ioc,
                          char *buf,
                          size_t buflen,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     struct iovec iov = { .iov_base = buf, .iov_len = buflen };
     return qio_channel_readv_full(ioc, &iov, 1, NULL, NULL, errp);
@@ -116,7 +116,7 @@ ssize_t qio_channel_read(QIOChannel *ioc,
 ssize_t qio_channel_write(QIOChannel *ioc,
                           const char *buf,
                           size_t buflen,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     struct iovec iov = { .iov_base = (char *)buf, .iov_len = buflen };
     return qio_channel_writev_full(ioc, &iov, 1, NULL, 0, errp);
@@ -125,7 +125,7 @@ ssize_t qio_channel_write(QIOChannel *ioc,
 
 int qio_channel_set_blocking(QIOChannel *ioc,
                               bool enabled,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
     return klass->io_set_blocking(ioc, enabled, errp);
@@ -133,7 +133,7 @@ int qio_channel_set_blocking(QIOChannel *ioc,
 
 
 int qio_channel_close(QIOChannel *ioc,
-                      Error **errp)
+                      Error *errp[static 1])
 {
     QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
     return klass->io_close(ioc, errp);
@@ -187,7 +187,7 @@ guint qio_channel_add_watch(QIOChannel *ioc,
 
 int qio_channel_shutdown(QIOChannel *ioc,
                          QIOChannelShutdown how,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
@@ -225,7 +225,7 @@ void qio_channel_set_cork(QIOChannel *ioc,
 off_t qio_channel_io_seek(QIOChannel *ioc,
                           off_t offset,
                           int whence,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
diff --git a/io/dns-resolver.c b/io/dns-resolver.c
index 57a8896cbb..e728a8894d 100644
--- a/io/dns-resolver.c
+++ b/io/dns-resolver.c
@@ -48,7 +48,7 @@ static int qio_dns_resolver_lookup_sync_inet(QIODNSResolver *resolver,
                                              SocketAddress *addr,
                                              size_t *naddrs,
                                              SocketAddress ***addrs,
-                                             Error **errp)
+                                             Error *errp[static 1])
 {
     struct addrinfo ai, *res, *e;
     InetSocketAddress *iaddr = &addr->u.inet;
@@ -131,7 +131,7 @@ static int qio_dns_resolver_lookup_sync_nop(QIODNSResolver *resolver,
                                             SocketAddress *addr,
                                             size_t *naddrs,
                                             SocketAddress ***addrs,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     *naddrs = 1;
     *addrs = g_new0(SocketAddress *, 1);
@@ -145,7 +145,7 @@ int qio_dns_resolver_lookup_sync(QIODNSResolver *resolver,
                                  SocketAddress *addr,
                                  size_t *naddrs,
                                  SocketAddress ***addrs,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     switch (addr->type) {
     case SOCKET_ADDRESS_TYPE_INET:
diff --git a/io/task.c b/io/task.c
index 3ce556017c..8a3dcf1537 100644
--- a/io/task.c
+++ b/io/task.c
@@ -153,7 +153,7 @@ void qio_task_set_error(QIOTask *task,
 
 
 bool qio_task_propagate_error(QIOTask *task,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     if (task->err) {
         error_propagate(errp, task->err);
diff --git a/iothread.c b/iothread.c
index beeb870534..cebd5a6780 100644
--- a/iothread.c
+++ b/iothread.c
@@ -97,7 +97,7 @@ static void iothread_instance_finalize(Object *obj)
     aio_context_unref(iothread->ctx);
 }
 
-static void iothread_complete(UserCreatable *obj, Error **errp)
+static void iothread_complete(UserCreatable *obj, Error *errp[static 1])
 {
     Error *local_error = NULL;
     IOThread *iothread = IOTHREAD(obj);
@@ -161,7 +161,7 @@ static PollParamInfo poll_shrink_info = {
 };
 
 static void iothread_get_poll_param(Object *obj, Visitor *v,
-        const char *name, void *opaque, Error **errp)
+        const char *name, void *opaque, Error *errp[static 1])
 {
     IOThread *iothread = IOTHREAD(obj);
     PollParamInfo *info = opaque;
@@ -171,7 +171,7 @@ static void iothread_get_poll_param(Object *obj, Visitor *v,
 }
 
 static void iothread_set_poll_param(Object *obj, Visitor *v,
-        const char *name, void *opaque, Error **errp)
+        const char *name, void *opaque, Error *errp[static 1])
 {
     IOThread *iothread = IOTHREAD(obj);
     PollParamInfo *info = opaque;
@@ -281,7 +281,7 @@ static int query_one_iothread(Object *object, void *opaque)
     return 0;
 }
 
-IOThreadInfoList *qmp_query_iothreads(Error **errp)
+IOThreadInfoList *qmp_query_iothreads(Error *errp[static 1])
 {
     IOThreadInfoList *head = NULL;
     IOThreadInfoList **prev = &head;
diff --git a/memory.c b/memory.c
index 0ddc4cc28d..d6a2d056c7 100644
--- a/memory.c
+++ b/memory.c
@@ -1005,7 +1005,7 @@ void memory_region_init(MemoryRegion *mr,
 }
 
 static void memory_region_get_addr(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     MemoryRegion *mr = MEMORY_REGION(obj);
     uint64_t value = mr->addr;
@@ -1015,7 +1015,7 @@ static void memory_region_get_addr(Object *obj, Visitor *v, const char *name,
 
 static void memory_region_get_container(Object *obj, Visitor *v,
                                         const char *name, void *opaque,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     MemoryRegion *mr = MEMORY_REGION(obj);
     gchar *path = (gchar *)"";
@@ -1039,7 +1039,7 @@ static Object *memory_region_resolve_container(Object *obj, void *opaque,
 
 static void memory_region_get_priority(Object *obj, Visitor *v,
                                        const char *name, void *opaque,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     MemoryRegion *mr = MEMORY_REGION(obj);
     int32_t value = mr->priority;
@@ -1048,7 +1048,7 @@ static void memory_region_get_priority(Object *obj, Visitor *v,
 }
 
 static void memory_region_get_size(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     MemoryRegion *mr = MEMORY_REGION(obj);
     uint64_t value = memory_region_size(mr);
@@ -1352,7 +1352,7 @@ void memory_region_init_ram(MemoryRegion *mr,
                             Object *owner,
                             const char *name,
                             uint64_t size,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     memory_region_init(mr, owner, name, size);
     mr->ram = true;
@@ -1370,7 +1370,7 @@ void memory_region_init_resizeable_ram(MemoryRegion *mr,
                                        void (*resized)(const char*,
                                                        uint64_t length,
                                                        void *host),
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     memory_region_init(mr, owner, name, size);
     mr->ram = true;
@@ -1388,7 +1388,7 @@ void memory_region_init_ram_from_file(MemoryRegion *mr,
                                       uint64_t size,
                                       bool share,
                                       const char *path,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     memory_region_init(mr, owner, name, size);
     mr->ram = true;
@@ -1444,7 +1444,7 @@ void memory_region_init_rom(MemoryRegion *mr,
                             struct Object *owner,
                             const char *name,
                             uint64_t size,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     memory_region_init(mr, owner, name, size);
     mr->ram = true;
@@ -1461,7 +1461,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
                                    void *opaque,
                                    const char *name,
                                    uint64_t size,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     assert(ops);
     memory_region_init(mr, owner, name, size);
@@ -1879,7 +1879,8 @@ ram_addr_t memory_region_get_ram_addr(MemoryRegion *mr)
     return mr->ram_block ? mr->ram_block->offset : RAM_ADDR_INVALID;
 }
 
-void memory_region_ram_resize(MemoryRegion *mr, ram_addr_t newsize, Error **errp)
+void memory_region_ram_resize(MemoryRegion *mr, ram_addr_t newsize,
+                              Error *errp[static 1])
 {
     assert(mr->ram_block);
 
diff --git a/memory_mapping.c b/memory_mapping.c
index a5d38552a6..a04f2611a4 100644
--- a/memory_mapping.c
+++ b/memory_mapping.c
@@ -286,7 +286,7 @@ static CPUState *find_paging_enabled_cpu(CPUState *start_cpu)
 
 void qemu_get_guest_memory_mapping(MemoryMappingList *list,
                                    const GuestPhysBlockList *guest_phys_blocks,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     CPUState *cpu, *first_paging_enabled_cpu;
     GuestPhysBlock *block;
diff --git a/migration/colo-failover.c b/migration/colo-failover.c
index cc229f5ab1..87114f8d7a 100644
--- a/migration/colo-failover.c
+++ b/migration/colo-failover.c
@@ -39,7 +39,7 @@ static void colo_failover_bh(void *opaque)
     colo_do_failover(NULL);
 }
 
-void failover_request_active(Error **errp)
+void failover_request_active(Error *errp[static 1])
 {
    if (failover_set_state(FAILOVER_STATUS_NONE,
         FAILOVER_STATUS_REQUIRE) != FAILOVER_STATUS_NONE) {
@@ -72,7 +72,7 @@ FailoverStatus failover_get_state(void)
     return atomic_read(&failover_state);
 }
 
-void qmp_x_colo_lost_heartbeat(Error **errp)
+void qmp_x_colo_lost_heartbeat(Error *errp[static 1])
 {
     if (get_colo_mode() == COLO_MODE_UNKNOWN) {
         error_setg(errp, QERR_FEATURE_DISABLED, "colo");
diff --git a/migration/colo.c b/migration/colo.c
index 039b8afa03..581ba6af8f 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -156,7 +156,7 @@ void colo_do_failover(MigrationState *s)
 
 void qmp_xen_set_replication(bool enable, bool primary,
                              bool has_failover, bool failover,
-                             Error **errp)
+                             Error *errp[static 1])
 {
 #ifdef CONFIG_REPLICATION
     ReplicationMode mode = primary ?
@@ -182,7 +182,7 @@ void qmp_xen_set_replication(bool enable, bool primary,
 #endif
 }
 
-ReplicationStatus *qmp_query_xen_replication_status(Error **errp)
+ReplicationStatus *qmp_query_xen_replication_status(Error *errp[static 1])
 {
 #ifdef CONFIG_REPLICATION
     Error *err = NULL;
@@ -204,7 +204,7 @@ ReplicationStatus *qmp_query_xen_replication_status(Error **errp)
 #endif
 }
 
-void qmp_xen_colo_do_checkpoint(Error **errp)
+void qmp_xen_colo_do_checkpoint(Error *errp[static 1])
 {
 #ifdef CONFIG_REPLICATION
     replication_do_checkpoint_all(errp);
@@ -214,7 +214,7 @@ void qmp_xen_colo_do_checkpoint(Error **errp)
 }
 
 static void colo_send_message(QEMUFile *f, COLOMessage msg,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     int ret;
 
@@ -233,7 +233,7 @@ static void colo_send_message(QEMUFile *f, COLOMessage msg,
 }
 
 static void colo_send_message_value(QEMUFile *f, COLOMessage msg,
-                                    uint64_t value, Error **errp)
+                                    uint64_t value, Error *errp[static 1])
 {
     int ret;
 
@@ -251,7 +251,7 @@ static void colo_send_message_value(QEMUFile *f, COLOMessage msg,
     }
 }
 
-static COLOMessage colo_receive_message(QEMUFile *f, Error **errp)
+static COLOMessage colo_receive_message(QEMUFile *f, Error *errp[static 1])
 {
     COLOMessage msg;
     int ret;
@@ -271,7 +271,7 @@ static COLOMessage colo_receive_message(QEMUFile *f, Error **errp)
 }
 
 static void colo_receive_check_message(QEMUFile *f, COLOMessage expect_msg,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     COLOMessage msg;
     Error *local_err = NULL;
@@ -288,7 +288,7 @@ static void colo_receive_check_message(QEMUFile *f, COLOMessage expect_msg,
 }
 
 static uint64_t colo_receive_message_value(QEMUFile *f, uint32_t expect_msg,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     uint64_t value;
     int ret;
@@ -505,7 +505,7 @@ void migrate_start_colo_process(MigrationState *s)
 }
 
 static void colo_wait_handle_message(QEMUFile *f, int *checkpoint_request,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     COLOMessage msg;
     Error *local_err = NULL;
diff --git a/migration/exec.c b/migration/exec.c
index 9077024286..02f2529b54 100644
--- a/migration/exec.c
+++ b/migration/exec.c
@@ -27,7 +27,8 @@
 #include "trace.h"
 
 
-void exec_start_outgoing_migration(MigrationState *s, const char *command, Error **errp)
+void exec_start_outgoing_migration(MigrationState *s, const char *command,
+                                   Error *errp[static 1])
 {
     QIOChannel *ioc;
     const char *argv[] = { "/bin/sh", "-c", command, NULL };
@@ -54,7 +55,7 @@ static gboolean exec_accept_incoming_migration(QIOChannel *ioc,
     return FALSE; /* unregister */
 }
 
-void exec_start_incoming_migration(const char *command, Error **errp)
+void exec_start_incoming_migration(const char *command, Error *errp[static 1])
 {
     QIOChannel *ioc;
     const char *argv[] = { "/bin/sh", "-c", command, NULL };
diff --git a/migration/fd.c b/migration/fd.c
index 0077a505a3..91dc29b4fb 100644
--- a/migration/fd.c
+++ b/migration/fd.c
@@ -25,7 +25,8 @@
 #include "trace.h"
 
 
-void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp)
+void fd_start_outgoing_migration(MigrationState *s, const char *fdname,
+                                 Error *errp[static 1])
 {
     QIOChannel *ioc;
     int fd = monitor_get_fd(cur_mon, fdname, errp);
@@ -54,7 +55,7 @@ static gboolean fd_accept_incoming_migration(QIOChannel *ioc,
     return FALSE; /* unregister */
 }
 
-void fd_start_incoming_migration(const char *infd, Error **errp)
+void fd_start_incoming_migration(const char *infd, Error *errp[static 1])
 {
     QIOChannel *ioc;
     int fd;
diff --git a/migration/migration.c b/migration/migration.c
index 16bdd0a8d6..9f6b65f29c 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -284,7 +284,7 @@ static void migrate_generate_event(int new_state)
  * The migration can be started later after any parameters have been
  * changed.
  */
-static void deferred_incoming_migration(Error **errp)
+static void deferred_incoming_migration(Error *errp[static 1])
 {
     if (deferred_incoming) {
         error_setg(errp, "Incoming migration already deferred");
@@ -321,7 +321,7 @@ void migrate_send_rp_req_pages(MigrationIncomingState *mis, const char *rbname,
     }
 }
 
-void qemu_start_incoming_migration(const char *uri, Error **errp)
+void qemu_start_incoming_migration(const char *uri, Error *errp[static 1])
 {
     const char *p;
 
@@ -505,7 +505,7 @@ void migrate_send_rp_pong(MigrationIncomingState *mis,
     migrate_send_rp_message(mis, MIG_RP_MSG_PONG, sizeof(buf), &buf);
 }
 
-MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
+MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error *errp[static 1])
 {
     MigrationCapabilityStatusList *head = NULL;
     MigrationCapabilityStatusList *caps;
@@ -538,7 +538,7 @@ MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
     return head;
 }
 
-MigrationParameters *qmp_query_migrate_parameters(Error **errp)
+MigrationParameters *qmp_query_migrate_parameters(Error *errp[static 1])
 {
     MigrationParameters *params;
     MigrationState *s = migrate_get_current();
@@ -627,7 +627,7 @@ static void populate_ram_info(MigrationInfo *info, MigrationState *s)
     }
 }
 
-MigrationInfo *qmp_query_migrate(Error **errp)
+MigrationInfo *qmp_query_migrate(Error *errp[static 1])
 {
     MigrationInfo *info = g_malloc0(sizeof(*info));
     MigrationState *s = migrate_get_current();
@@ -716,7 +716,7 @@ MigrationInfo *qmp_query_migrate(Error **errp)
 }
 
 void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     MigrationState *s = migrate_get_current();
     MigrationCapabilityStatusList *cap;
@@ -776,7 +776,8 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
     }
 }
 
-void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
+void qmp_migrate_set_parameters(MigrationParameters *params,
+                                Error *errp[static 1])
 {
     MigrationState *s = migrate_get_current();
 
@@ -882,7 +883,7 @@ void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
 }
 
 
-void qmp_migrate_start_postcopy(Error **errp)
+void qmp_migrate_start_postcopy(Error *errp[static 1])
 {
     MigrationState *s = migrate_get_current();
 
@@ -914,7 +915,7 @@ void migrate_set_state(int *state, int old_state, int new_state)
     }
 }
 
-void migrate_set_block_enabled(bool value, Error **errp)
+void migrate_set_block_enabled(bool value, Error *errp[static 1])
 {
     MigrationCapabilityStatusList *cap;
 
@@ -1124,7 +1125,7 @@ MigrationState *migrate_init(void)
 
 static GSList *migration_blockers;
 
-int migrate_add_blocker(Error *reason, Error **errp)
+int migrate_add_blocker(Error *reason, Error *errp[static 1])
 {
     if (only_migratable) {
         error_propagate(errp, error_copy(reason));
@@ -1149,7 +1150,7 @@ void migrate_del_blocker(Error *reason)
     migration_blockers = g_slist_remove(migration_blockers, reason);
 }
 
-void qmp_migrate_incoming(const char *uri, Error **errp)
+void qmp_migrate_incoming(const char *uri, Error *errp[static 1])
 {
     static bool once = true;
 
@@ -1170,7 +1171,7 @@ void qmp_migrate_incoming(const char *uri, Error **errp)
     once = false;
 }
 
-bool migration_is_blocked(Error **errp)
+bool migration_is_blocked(Error *errp[static 1])
 {
     if (qemu_savevm_state_blocked(errp)) {
         return true;
@@ -1186,7 +1187,7 @@ bool migration_is_blocked(Error **errp)
 
 void qmp_migrate(const char *uri, bool has_blk, bool blk,
                  bool has_inc, bool inc, bool has_detach, bool detach,
-                 Error **errp)
+                 Error *errp[static 1])
 {
     Error *local_err = NULL;
     MigrationState *s = migrate_get_current();
@@ -1254,12 +1255,12 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
     }
 }
 
-void qmp_migrate_cancel(Error **errp)
+void qmp_migrate_cancel(Error *errp[static 1])
 {
     migrate_fd_cancel(migrate_get_current());
 }
 
-void qmp_migrate_set_cache_size(int64_t value, Error **errp)
+void qmp_migrate_set_cache_size(int64_t value, Error *errp[static 1])
 {
     MigrationState *s = migrate_get_current();
     int64_t new_size;
@@ -1288,12 +1289,12 @@ void qmp_migrate_set_cache_size(int64_t value, Error **errp)
     s->xbzrle_cache_size = new_size;
 }
 
-int64_t qmp_query_migrate_cache_size(Error **errp)
+int64_t qmp_query_migrate_cache_size(Error *errp[static 1])
 {
     return migrate_xbzrle_cache_size();
 }
 
-void qmp_migrate_set_speed(int64_t value, Error **errp)
+void qmp_migrate_set_speed(int64_t value, Error *errp[static 1])
 {
     MigrationParameters p = {
         .has_max_bandwidth = true,
@@ -1303,7 +1304,7 @@ void qmp_migrate_set_speed(int64_t value, Error **errp)
     qmp_migrate_set_parameters(&p, errp);
 }
 
-void qmp_migrate_set_downtime(double value, Error **errp)
+void qmp_migrate_set_downtime(double value, Error *errp[static 1])
 {
     if (value < 0 || value > MAX_MIGRATE_DOWNTIME_SECONDS) {
         error_setg(errp, "Parameter 'downtime_limit' expects an integer in "
diff --git a/migration/rdma.c b/migration/rdma.c
index 5cb9572a5c..5e9ed12138 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -811,7 +811,8 @@ static void qemu_rdma_dump_gid(const char *who, struct rdma_cm_id *id)
  *
  * Patches are being reviewed on linux-rdma.
  */
-static int qemu_rdma_broken_ipv6_kernel(struct ibv_context *verbs, Error **errp)
+static int qemu_rdma_broken_ipv6_kernel(struct ibv_context *verbs,
+                                        Error *errp[static 1])
 {
     struct ibv_port_attr port_attr;
 
@@ -906,7 +907,7 @@ static int qemu_rdma_broken_ipv6_kernel(struct ibv_context *verbs, Error **errp)
  * Also create the initial connection manager identifiers for opening
  * the connection.
  */
-static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
+static int qemu_rdma_resolve_host(RDMAContext *rdma, Error *errp[static 1])
 {
     int ret;
     struct rdma_addrinfo *res;
@@ -2279,7 +2280,8 @@ static void qemu_rdma_cleanup(RDMAContext *rdma)
 }
 
 
-static int qemu_rdma_source_init(RDMAContext *rdma, bool pin_all, Error **errp)
+static int qemu_rdma_source_init(RDMAContext *rdma, bool pin_all,
+                                 Error *errp[static 1])
 {
     int ret, idx;
     Error *local_err = NULL;
@@ -2341,7 +2343,7 @@ err_rdma_source_init:
     return -1;
 }
 
-static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
+static int qemu_rdma_connect(RDMAContext *rdma, Error *errp[static 1])
 {
     RDMACapabilities cap = {
                                 .version = RDMA_CONTROL_VERSION_CURRENT,
@@ -2421,7 +2423,7 @@ err_rdma_source_connect:
     return -1;
 }
 
-static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
+static int qemu_rdma_dest_init(RDMAContext *rdma, Error *errp[static 1])
 {
     int ret, idx;
     struct rdma_cm_id *listen_id;
@@ -2499,7 +2501,7 @@ err_dest_init_create_listen_id:
 
 }
 
-static void *qemu_rdma_data_init(const char *host_port, Error **errp)
+static void *qemu_rdma_data_init(const char *host_port, Error *errp[static 1])
 {
     RDMAContext *rdma = NULL;
     InetSocketAddress *addr;
@@ -2535,7 +2537,7 @@ static ssize_t qio_channel_rdma_writev(QIOChannel *ioc,
                                        size_t niov,
                                        int *fds,
                                        size_t nfds,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
     QEMUFile *f = rioc->file;
@@ -2610,7 +2612,7 @@ static ssize_t qio_channel_rdma_readv(QIOChannel *ioc,
                                       size_t niov,
                                       int **fds,
                                       size_t *nfds,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
     RDMAContext *rdma = rioc->rdma;
@@ -2702,7 +2704,7 @@ static int qemu_rdma_drain_cq(QEMUFile *f, RDMAContext *rdma)
 
 static int qio_channel_rdma_set_blocking(QIOChannel *ioc,
                                          bool blocking,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
     /* XXX we should make readv/writev actually honour this :-) */
@@ -2806,7 +2808,7 @@ static GSource *qio_channel_rdma_create_watch(QIOChannel *ioc,
 
 
 static int qio_channel_rdma_close(QIOChannel *ioc,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
     trace_qemu_rdma_close();
@@ -3632,7 +3634,8 @@ static void rdma_accept_incoming_migration(void *opaque)
     migration_fd_process_incoming(f);
 }
 
-void rdma_start_incoming_migration(const char *host_port, Error **errp)
+void rdma_start_incoming_migration(const char *host_port,
+                                   Error *errp[static 1])
 {
     int ret;
     RDMAContext *rdma;
@@ -3671,7 +3674,7 @@ err:
 }
 
 void rdma_start_outgoing_migration(void *opaque,
-                            const char *host_port, Error **errp)
+                            const char *host_port, Error *errp[static 1])
 {
     MigrationState *s = opaque;
     RDMAContext *rdma = qemu_rdma_data_init(host_port, errp);
diff --git a/migration/savevm.c b/migration/savevm.c
index 745caaebef..fa3332ff5f 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -673,7 +673,7 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
                                    const VMStateDescription *vmsd,
                                    void *opaque, int alias_id,
                                    int required_for_version,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     SaveStateEntry *se;
 
@@ -947,7 +947,7 @@ void qemu_savevm_send_postcopy_run(QEMUFile *f)
     qemu_savevm_command_send(f, MIG_CMD_POSTCOPY_RUN, 0, NULL);
 }
 
-bool qemu_savevm_state_blocked(Error **errp)
+bool qemu_savevm_state_blocked(Error *errp[static 1])
 {
     SaveStateEntry *se;
 
@@ -1235,7 +1235,7 @@ void qemu_savevm_state_cleanup(void)
     }
 }
 
-static int qemu_savevm_state(QEMUFile *f, Error **errp)
+static int qemu_savevm_state(QEMUFile *f, Error *errp[static 1])
 {
     int ret;
     MigrationState *ms = migrate_init();
@@ -2055,7 +2055,7 @@ int qemu_loadvm_state(QEMUFile *f)
     return ret;
 }
 
-int save_snapshot(const char *name, Error **errp)
+int save_snapshot(const char *name, Error *errp[static 1])
 {
     BlockDriverState *bs, *bs1;
     QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
@@ -2153,7 +2153,7 @@ int save_snapshot(const char *name, Error **errp)
     return ret;
 }
 
-void qmp_xen_save_devices_state(const char *filename, Error **errp)
+void qmp_xen_save_devices_state(const char *filename, Error *errp[static 1])
 {
     QEMUFile *f;
     QIOChannelFile *ioc;
@@ -2182,7 +2182,7 @@ void qmp_xen_save_devices_state(const char *filename, Error **errp)
     }
 }
 
-void qmp_xen_load_devices_state(const char *filename, Error **errp)
+void qmp_xen_load_devices_state(const char *filename, Error *errp[static 1])
 {
     QEMUFile *f;
     QIOChannelFile *ioc;
@@ -2212,7 +2212,7 @@ void qmp_xen_load_devices_state(const char *filename, Error **errp)
     migration_incoming_state_destroy();
 }
 
-int load_snapshot(const char *name, Error **errp)
+int load_snapshot(const char *name, Error *errp[static 1])
 {
     BlockDriverState *bs, *bs_vm_state;
     QEMUSnapshotInfo sn;
diff --git a/migration/socket.c b/migration/socket.c
index 018e1d1191..a8a2e3efb1 100644
--- a/migration/socket.c
+++ b/migration/socket.c
@@ -27,7 +27,8 @@
 #include "trace.h"
 
 
-static SocketAddress *tcp_build_address(const char *host_port, Error **errp)
+static SocketAddress *tcp_build_address(const char *host_port,
+                                        Error *errp[static 1])
 {
     SocketAddress *saddr;
 
@@ -90,7 +91,7 @@ static void socket_outgoing_migration(QIOTask *task,
 
 static void socket_start_outgoing_migration(MigrationState *s,
                                             SocketAddress *saddr,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     QIOChannelSocket *sioc = qio_channel_socket_new();
     struct SocketConnectData *data = g_new0(struct SocketConnectData, 1);
@@ -111,7 +112,7 @@ static void socket_start_outgoing_migration(MigrationState *s,
 
 void tcp_start_outgoing_migration(MigrationState *s,
                                   const char *host_port,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     Error *err = NULL;
     SocketAddress *saddr = tcp_build_address(host_port, &err);
@@ -123,7 +124,7 @@ void tcp_start_outgoing_migration(MigrationState *s,
 
 void unix_start_outgoing_migration(MigrationState *s,
                                    const char *path,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     SocketAddress *saddr = unix_build_address(path);
     socket_start_outgoing_migration(s, saddr, errp);
@@ -160,7 +161,7 @@ out:
 
 
 static void socket_start_incoming_migration(SocketAddress *saddr,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     QIOChannelSocket *listen_ioc = qio_channel_socket_new();
 
@@ -181,7 +182,8 @@ static void socket_start_incoming_migration(SocketAddress *saddr,
     qapi_free_SocketAddress(saddr);
 }
 
-void tcp_start_incoming_migration(const char *host_port, Error **errp)
+void tcp_start_incoming_migration(const char *host_port,
+                                  Error *errp[static 1])
 {
     Error *err = NULL;
     SocketAddress *saddr = tcp_build_address(host_port, &err);
@@ -191,7 +193,7 @@ void tcp_start_incoming_migration(const char *host_port, Error **errp)
     error_propagate(errp, err);
 }
 
-void unix_start_incoming_migration(const char *path, Error **errp)
+void unix_start_incoming_migration(const char *path, Error *errp[static 1])
 {
     SocketAddress *saddr = unix_build_address(path);
     socket_start_incoming_migration(saddr, errp);
diff --git a/migration/tls.c b/migration/tls.c
index bae9acad6c..42b8235552 100644
--- a/migration/tls.c
+++ b/migration/tls.c
@@ -31,7 +31,7 @@
 static QCryptoTLSCreds *
 migration_tls_get_creds(MigrationState *s,
                         QCryptoTLSCredsEndpoint endpoint,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     Object *creds;
     QCryptoTLSCreds *ret;
@@ -81,7 +81,7 @@ static void migration_tls_incoming_handshake(QIOTask *task,
 
 void migration_tls_channel_process_incoming(MigrationState *s,
                                             QIOChannel *ioc,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     QCryptoTLSCreds *creds;
     QIOChannelTLS *tioc;
@@ -131,7 +131,7 @@ static void migration_tls_outgoing_handshake(QIOTask *task,
 void migration_tls_channel_connect(MigrationState *s,
                                    QIOChannel *ioc,
                                    const char *hostname,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     QCryptoTLSCreds *creds;
     QIOChannelTLS *tioc;
diff --git a/monitor.c b/monitor.c
index 7c4327a175..71e2e80bbd 100644
--- a/monitor.c
+++ b/monitor.c
@@ -429,7 +429,7 @@ static void monitor_qapi_event_handler(void *opaque);
  * applying any rate limiting if required.
  */
 static void
-monitor_qapi_event_queue(QAPIEvent event, QDict *qdict, Error **errp)
+monitor_qapi_event_queue(QAPIEvent event, QDict *qdict, Error *errp[static 1])
 {
     MonitorQAPIEventConf *evconf;
     MonitorQAPIEventState *evstate;
@@ -588,7 +588,7 @@ static void monitor_data_destroy(Monitor *mon)
 }
 
 char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
-                                int64_t cpu_index, Error **errp)
+                                int64_t cpu_index, Error *errp[static 1])
 {
     char *output = NULL;
     Monitor *old_mon, hmp;
@@ -912,7 +912,7 @@ static void query_commands_cb(QmpCommand *cmd, void *opaque)
     *list = info;
 }
 
-CommandInfoList *qmp_query_commands(Error **errp)
+CommandInfoList *qmp_query_commands(Error *errp[static 1])
 {
     CommandInfoList *list = NULL;
 
@@ -921,7 +921,7 @@ CommandInfoList *qmp_query_commands(Error **errp)
     return list;
 }
 
-EventInfoList *qmp_query_events(Error **errp)
+EventInfoList *qmp_query_events(Error *errp[static 1])
 {
     EventInfoList *info, *ev_list = NULL;
     QAPIEvent e;
@@ -950,7 +950,7 @@ EventInfoList *qmp_query_events(Error **errp)
  * qapi-introspect.py's output actually conforms to the schema.
  */
 static void qmp_query_qmp_schema(QDict *qdict, QObject **ret_data,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     *ret_data = qobject_from_json(qmp_schema_json, &error_abort);
 }
@@ -1025,7 +1025,7 @@ void monitor_init_qmp_commands(void)
                          qmp_marshal_qmp_capabilities, QCO_NO_OPTIONS);
 }
 
-void qmp_qmp_capabilities(Error **errp)
+void qmp_qmp_capabilities(Error *errp[static 1])
 {
     if (cur_mon->qmp.commands == &qmp_commands) {
         error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
@@ -1166,7 +1166,7 @@ void qmp_client_migrate_info(const char *protocol, const char *hostname,
                              bool has_port, int64_t port,
                              bool has_tls_port, int64_t tls_port,
                              bool has_cert_subject, const char *cert_subject,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     if (strcmp(protocol, "spice") == 0) {
         if (!qemu_using_spice(errp)) {
@@ -1429,7 +1429,7 @@ static void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
     memory_dump(mon, count, format, size, addr, 1);
 }
 
-static void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, Error **errp)
+static void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, Error *errp[static 1])
 {
     MemoryRegionSection mrs = memory_region_find(get_system_memory(),
                                                  addr, 1);
@@ -1470,7 +1470,7 @@ static void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
 }
 
 #ifdef CONFIG_LINUX
-static uint64_t vtop(void *ptr, Error **errp)
+static uint64_t vtop(void *ptr, Error *errp[static 1])
 {
     uint64_t pinfo;
     uint64_t ret = -1;
@@ -1901,7 +1901,7 @@ static void hmp_acl_remove(Monitor *mon, const QDict *qdict)
     }
 }
 
-void qmp_getfd(const char *fdname, Error **errp)
+void qmp_getfd(const char *fdname, Error *errp[static 1])
 {
     mon_fd_t *monfd;
     int fd;
@@ -1936,7 +1936,7 @@ void qmp_getfd(const char *fdname, Error **errp)
     QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
 }
 
-void qmp_closefd(const char *fdname, Error **errp)
+void qmp_closefd(const char *fdname, Error *errp[static 1])
 {
     mon_fd_t *monfd;
 
@@ -1955,7 +1955,7 @@ void qmp_closefd(const char *fdname, Error **errp)
     error_setg(errp, QERR_FD_NOT_FOUND, fdname);
 }
 
-int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
+int monitor_get_fd(Monitor *mon, const char *fdname, Error *errp[static 1])
 {
     mon_fd_t *monfd;
 
@@ -2013,7 +2013,7 @@ static void monitor_fdsets_cleanup(void)
 }
 
 AddfdInfo *qmp_add_fd(bool has_fdset_id, int64_t fdset_id, bool has_opaque,
-                      const char *opaque, Error **errp)
+                      const char *opaque, Error *errp[static 1])
 {
     int fd;
     Monitor *mon = cur_mon;
@@ -2038,7 +2038,8 @@ error:
     return NULL;
 }
 
-void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
+void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd,
+                   Error *errp[static 1])
 {
     MonFdset *mon_fdset;
     MonFdsetFd *mon_fdset_fd;
@@ -2076,7 +2077,7 @@ error:
     error_setg(errp, QERR_FD_NOT_FOUND, fd_str);
 }
 
-FdsetInfoList *qmp_query_fdsets(Error **errp)
+FdsetInfoList *qmp_query_fdsets(Error *errp[static 1])
 {
     MonFdset *mon_fdset;
     MonFdsetFd *mon_fdset_fd;
@@ -2117,7 +2118,7 @@ FdsetInfoList *qmp_query_fdsets(Error **errp)
 
 AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
                                 bool has_opaque, const char *opaque,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     MonFdset *mon_fdset = NULL;
     MonFdsetFd *mon_fdset_fd;
@@ -2281,7 +2282,7 @@ void monitor_fdset_dup_fd_remove(int dup_fd)
     monitor_fdset_dup_fd_find_remove(dup_fd, true);
 }
 
-int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp)
+int monitor_fd_param(Monitor *mon, const char *fdname, Error *errp[static 1])
 {
     int fd;
     Error *local_err = NULL;
@@ -4207,28 +4208,28 @@ QemuOptsList qemu_mon_opts = {
 };
 
 #ifndef TARGET_I386
-void qmp_rtc_reset_reinjection(Error **errp)
+void qmp_rtc_reset_reinjection(Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "rtc-reset-reinjection");
 }
 #endif
 
 #ifndef TARGET_S390X
-void qmp_dump_skeys(const char *filename, Error **errp)
+void qmp_dump_skeys(const char *filename, Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "dump-skeys");
 }
 #endif
 
 #ifndef TARGET_ARM
-GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
+GICCapabilityList *qmp_query_gic_capabilities(Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "query-gic-capabilities");
     return NULL;
 }
 #endif
 
-HotpluggableCPUList *qmp_query_hotpluggable_cpus(Error **errp)
+HotpluggableCPUList *qmp_query_hotpluggable_cpus(Error *errp[static 1])
 {
     MachineState *ms = MACHINE(qdev_get_machine());
     MachineClass *mc = MACHINE_GET_CLASS(ms);
diff --git a/nbd/client.c b/nbd/client.c
index 8541e109a7..1e5b81f9f8 100644
--- a/nbd/client.c
+++ b/nbd/client.c
@@ -88,7 +88,7 @@ static QTAILQ_HEAD(, NBDExport) exports = QTAILQ_HEAD_INITIALIZER(exports);
 
 /* Discard length bytes from channel.  Return -errno on failure and 0 on
  * success*/
-static int drop_sync(QIOChannel *ioc, size_t size, Error **errp)
+static int drop_sync(QIOChannel *ioc, size_t size, Error *errp[static 1])
 {
     ssize_t ret = 0;
     char small[1024];
@@ -121,7 +121,7 @@ static int drop_sync(QIOChannel *ioc, size_t size, Error **errp)
  * continue. */
 static int nbd_send_option_request(QIOChannel *ioc, uint32_t opt,
                                    uint32_t len, const char *data,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     nbd_option req;
     QEMU_BUILD_BUG_ON(sizeof(req) != 16);
@@ -166,7 +166,8 @@ static void nbd_send_opt_abort(QIOChannel *ioc)
  * payload. Return 0 if successful, -1 with errp set if it is
  * impossible to continue. */
 static int nbd_receive_option_reply(QIOChannel *ioc, uint32_t opt,
-                                    nbd_opt_reply *reply, Error **errp)
+                                    nbd_opt_reply *reply,
+                                    Error *errp[static 1])
 {
     QEMU_BUILD_BUG_ON(sizeof(*reply) != 20);
     if (read_sync(ioc, reply, sizeof(*reply), errp) < 0) {
@@ -203,7 +204,7 @@ static int nbd_receive_option_reply(QIOChannel *ioc, uint32_t opt,
  * errors.
  */
 static int nbd_handle_reply_err(QIOChannel *ioc, nbd_opt_reply *reply,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     char *msg = NULL;
     int result = -1;
@@ -281,7 +282,7 @@ static int nbd_handle_reply_err(QIOChannel *ioc, nbd_opt_reply *reply,
  * is complete, positive if more replies are expected, or negative
  * with @errp set if an unrecoverable error occurred. */
 static int nbd_receive_list(QIOChannel *ioc, const char *want, bool *match,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     nbd_opt_reply reply;
     uint32_t len;
@@ -364,7 +365,7 @@ static int nbd_receive_list(QIOChannel *ioc, const char *want, bool *match,
 /* Return -1 on failure, 0 if wantname is an available export. */
 static int nbd_receive_query_exports(QIOChannel *ioc,
                                      const char *wantname,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     bool foundExport = false;
 
@@ -396,7 +397,8 @@ static int nbd_receive_query_exports(QIOChannel *ioc,
 
 static QIOChannel *nbd_receive_starttls(QIOChannel *ioc,
                                         QCryptoTLSCreds *tlscreds,
-                                        const char *hostname, Error **errp)
+                                        const char *hostname,
+                                        Error *errp[static 1])
 {
     nbd_opt_reply reply;
     QIOChannelTLS *tioc;
@@ -456,7 +458,7 @@ static QIOChannel *nbd_receive_starttls(QIOChannel *ioc,
 int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *flags,
                           QCryptoTLSCreds *tlscreds, const char *hostname,
                           QIOChannel **outioc,
-                          off_t *size, Error **errp)
+                          off_t *size, Error *errp[static 1])
 {
     char buf[256];
     uint64_t magic, s;
@@ -628,7 +630,7 @@ fail:
 
 #ifdef __linux__
 int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size,
-             Error **errp)
+             Error *errp[static 1])
 {
     unsigned long sectors = size / BDRV_SECTOR_SIZE;
     if (size / BDRV_SECTOR_SIZE != sectors) {
@@ -726,7 +728,7 @@ int nbd_disconnect(int fd)
 
 #else
 int nbd_init(int fd, QIOChannelSocket *ioc, uint16_t flags, off_t size,
-	     Error **errp)
+	     Error *errp[static 1])
 {
     error_setg(errp, "nbd_init is only supported on Linux");
     return -ENOTSUP;
@@ -762,7 +764,8 @@ ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *request)
     return write_sync(ioc, buf, sizeof(buf), IGNORE_ERRORS);
 }
 
-ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply, Error **errp)
+ssize_t nbd_receive_reply(QIOChannel *ioc, NBDReply *reply,
+                          Error *errp[static 1])
 {
     uint8_t buf[NBD_REPLY_SIZE];
     uint32_t magic;
diff --git a/nbd/common.c b/nbd/common.c
index bd81637ab9..eaa94072f9 100644
--- a/nbd/common.c
+++ b/nbd/common.c
@@ -29,7 +29,7 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc,
                      size_t niov,
                      size_t length,
                      bool do_read,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     ssize_t done = 0;
     struct iovec *local_iov = g_new(struct iovec, niov);
diff --git a/nbd/server.c b/nbd/server.c
index b617ad5a4b..464e8caa8c 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -869,7 +869,7 @@ static void nbd_eject_notifier(Notifier *n, void *data)
 NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset, off_t size,
                           uint16_t nbdflags, void (*close)(NBDExport *),
                           bool writethrough, BlockBackend *on_eject_blk,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     BlockBackend *blk;
     NBDExport *exp = g_malloc0(sizeof(NBDExport));
diff --git a/net/colo-compare.c b/net/colo-compare.c
index 16e46c3a6c..11d4391404 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -608,14 +608,15 @@ static void *colo_compare_thread(void *opaque)
     return NULL;
 }
 
-static char *compare_get_pri_indev(Object *obj, Error **errp)
+static char *compare_get_pri_indev(Object *obj, Error *errp[static 1])
 {
     CompareState *s = COLO_COMPARE(obj);
 
     return g_strdup(s->pri_indev);
 }
 
-static void compare_set_pri_indev(Object *obj, const char *value, Error **errp)
+static void compare_set_pri_indev(Object *obj, const char *value,
+                                  Error *errp[static 1])
 {
     CompareState *s = COLO_COMPARE(obj);
 
@@ -623,14 +624,15 @@ static void compare_set_pri_indev(Object *obj, const char *value, Error **errp)
     s->pri_indev = g_strdup(value);
 }
 
-static char *compare_get_sec_indev(Object *obj, Error **errp)
+static char *compare_get_sec_indev(Object *obj, Error *errp[static 1])
 {
     CompareState *s = COLO_COMPARE(obj);
 
     return g_strdup(s->sec_indev);
 }
 
-static void compare_set_sec_indev(Object *obj, const char *value, Error **errp)
+static void compare_set_sec_indev(Object *obj, const char *value,
+                                  Error *errp[static 1])
 {
     CompareState *s = COLO_COMPARE(obj);
 
@@ -638,14 +640,15 @@ static void compare_set_sec_indev(Object *obj, const char *value, Error **errp)
     s->sec_indev = g_strdup(value);
 }
 
-static char *compare_get_outdev(Object *obj, Error **errp)
+static char *compare_get_outdev(Object *obj, Error *errp[static 1])
 {
     CompareState *s = COLO_COMPARE(obj);
 
     return g_strdup(s->outdev);
 }
 
-static void compare_set_outdev(Object *obj, const char *value, Error **errp)
+static void compare_set_outdev(Object *obj, const char *value,
+                               Error *errp[static 1])
 {
     CompareState *s = COLO_COMPARE(obj);
 
@@ -685,7 +688,7 @@ static void compare_sec_rs_finalize(SocketReadState *sec_rs)
  */
 static int find_and_check_chardev(Chardev **chr,
                                   char *chr_name,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     *chr = qemu_chr_find(chr_name);
     if (*chr == NULL) {
@@ -707,7 +710,7 @@ static int find_and_check_chardev(Chardev **chr,
  * Called from the main thread on the primary
  * to setup colo-compare.
  */
-static void colo_compare_complete(UserCreatable *uc, Error **errp)
+static void colo_compare_complete(UserCreatable *uc, Error *errp[static 1])
 {
     CompareState *s = COLO_COMPARE(uc);
     Chardev *chr;
diff --git a/net/dump.c b/net/dump.c
index b66d56e06c..02ec91d784 100644
--- a/net/dump.c
+++ b/net/dump.c
@@ -101,7 +101,7 @@ static void dump_cleanup(DumpState *s)
 }
 
 static int net_dump_state_init(DumpState *s, const char *filename,
-                               int len, Error **errp)
+                               int len, Error *errp[static 1])
 {
     struct pcap_file_hdr hdr;
     struct tm tm;
@@ -180,7 +180,7 @@ static NetClientInfo net_dump_info = {
 };
 
 int net_init_dump(const Netdev *netdev, const char *name,
-                  NetClientState *peer, Error **errp)
+                  NetClientState *peer, Error *errp[static 1])
 {
     int len, rc;
     const char *file;
@@ -264,7 +264,7 @@ static void filter_dump_cleanup(NetFilterState *nf)
     dump_cleanup(&nfds->ds);
 }
 
-static void filter_dump_setup(NetFilterState *nf, Error **errp)
+static void filter_dump_setup(NetFilterState *nf, Error *errp[static 1])
 {
     NetFilterDumpState *nfds = FILTER_DUMP(nf);
 
@@ -277,7 +277,7 @@ static void filter_dump_setup(NetFilterState *nf, Error **errp)
 }
 
 static void filter_dump_get_maxlen(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     NetFilterDumpState *nfds = FILTER_DUMP(obj);
     uint32_t value = nfds->maxlen;
@@ -286,7 +286,7 @@ static void filter_dump_get_maxlen(Object *obj, Visitor *v, const char *name,
 }
 
 static void filter_dump_set_maxlen(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     NetFilterDumpState *nfds = FILTER_DUMP(obj);
     Error *local_err = NULL;
@@ -307,14 +307,15 @@ out:
     error_propagate(errp, local_err);
 }
 
-static char *file_dump_get_filename(Object *obj, Error **errp)
+static char *file_dump_get_filename(Object *obj, Error *errp[static 1])
 {
     NetFilterDumpState *nfds = FILTER_DUMP(obj);
 
     return g_strdup(nfds->filename);
 }
 
-static void file_dump_set_filename(Object *obj, const char *value, Error **errp)
+static void file_dump_set_filename(Object *obj, const char *value,
+                                   Error *errp[static 1])
 {
    NetFilterDumpState *nfds = FILTER_DUMP(obj);
 
diff --git a/net/filter-buffer.c b/net/filter-buffer.c
index 0a9c12aa1a..485b263a92 100644
--- a/net/filter-buffer.c
+++ b/net/filter-buffer.c
@@ -114,7 +114,7 @@ static void filter_buffer_setup_timer(NetFilterState *nf)
     }
 }
 
-static void filter_buffer_setup(NetFilterState *nf, Error **errp)
+static void filter_buffer_setup(NetFilterState *nf, Error *errp[static 1])
 {
     FilterBufferState *s = FILTER_BUFFER(nf);
 
@@ -132,7 +132,8 @@ static void filter_buffer_setup(NetFilterState *nf, Error **errp)
     filter_buffer_setup_timer(nf);
 }
 
-static void filter_buffer_status_changed(NetFilterState *nf, Error **errp)
+static void filter_buffer_status_changed(NetFilterState *nf,
+                                         Error *errp[static 1])
 {
     FilterBufferState *s = FILTER_BUFFER(nf);
 
@@ -158,7 +159,7 @@ static void filter_buffer_class_init(ObjectClass *oc, void *data)
 
 static void filter_buffer_get_interval(Object *obj, Visitor *v,
                                        const char *name, void *opaque,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     FilterBufferState *s = FILTER_BUFFER(obj);
     uint32_t value = s->interval;
@@ -168,7 +169,7 @@ static void filter_buffer_get_interval(Object *obj, Visitor *v,
 
 static void filter_buffer_set_interval(Object *obj, Visitor *v,
                                        const char *name, void *opaque,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     FilterBufferState *s = FILTER_BUFFER(obj);
     Error *local_err = NULL;
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
index c86d355c93..c73a50ab65 100644
--- a/net/filter-mirror.c
+++ b/net/filter-mirror.c
@@ -189,7 +189,7 @@ static void filter_redirector_cleanup(NetFilterState *nf)
     qemu_chr_fe_deinit(&s->chr_out, false);
 }
 
-static void filter_mirror_setup(NetFilterState *nf, Error **errp)
+static void filter_mirror_setup(NetFilterState *nf, Error *errp[static 1])
 {
     MirrorState *s = FILTER_MIRROR(nf);
     Chardev *chr;
@@ -212,7 +212,7 @@ static void redirector_rs_finalize(SocketReadState *rs)
     redirector_to_filter(nf, rs->buf, rs->packet_len);
 }
 
-static void filter_redirector_setup(NetFilterState *nf, Error **errp)
+static void filter_redirector_setup(NetFilterState *nf, Error *errp[static 1])
 {
     MirrorState *s = FILTER_REDIRECTOR(nf);
     Chardev *chr;
@@ -279,7 +279,7 @@ static void filter_redirector_class_init(ObjectClass *oc, void *data)
     nfc->receive_iov = filter_redirector_receive_iov;
 }
 
-static char *filter_redirector_get_indev(Object *obj, Error **errp)
+static char *filter_redirector_get_indev(Object *obj, Error *errp[static 1])
 {
     MirrorState *s = FILTER_REDIRECTOR(obj);
 
@@ -288,7 +288,7 @@ static char *filter_redirector_get_indev(Object *obj, Error **errp)
 
 static void filter_redirector_set_indev(Object *obj,
                                         const char *value,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     MirrorState *s = FILTER_REDIRECTOR(obj);
 
@@ -296,7 +296,7 @@ static void filter_redirector_set_indev(Object *obj,
     s->indev = g_strdup(value);
 }
 
-static char *filter_mirror_get_outdev(Object *obj, Error **errp)
+static char *filter_mirror_get_outdev(Object *obj, Error *errp[static 1])
 {
     MirrorState *s = FILTER_MIRROR(obj);
 
@@ -305,7 +305,7 @@ static char *filter_mirror_get_outdev(Object *obj, Error **errp)
 
 static void filter_mirror_set_outdev(Object *obj,
                                      const char *value,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     MirrorState *s = FILTER_MIRROR(obj);
 
@@ -318,7 +318,7 @@ static void filter_mirror_set_outdev(Object *obj,
     }
 }
 
-static char *filter_redirector_get_outdev(Object *obj, Error **errp)
+static char *filter_redirector_get_outdev(Object *obj, Error *errp[static 1])
 {
     MirrorState *s = FILTER_REDIRECTOR(obj);
 
@@ -327,7 +327,7 @@ static char *filter_redirector_get_outdev(Object *obj, Error **errp)
 
 static void filter_redirector_set_outdev(Object *obj,
                                          const char *value,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     MirrorState *s = FILTER_REDIRECTOR(obj);
 
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
index afa06e8919..b0d64140e1 100644
--- a/net/filter-rewriter.c
+++ b/net/filter-rewriter.c
@@ -226,7 +226,7 @@ static void colo_rewriter_cleanup(NetFilterState *nf)
     }
 }
 
-static void colo_rewriter_setup(NetFilterState *nf, Error **errp)
+static void colo_rewriter_setup(NetFilterState *nf, Error *errp[static 1])
 {
     RewriterState *s = FILTER_COLO_REWRITER(nf);
 
diff --git a/net/filter.c b/net/filter.c
index 43af9f3733..9687d1ee28 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -117,40 +117,44 @@ out:
     return iov_size(iov, iovcnt);
 }
 
-static char *netfilter_get_netdev_id(Object *obj, Error **errp)
+static char *netfilter_get_netdev_id(Object *obj, Error *errp[static 1])
 {
     NetFilterState *nf = NETFILTER(obj);
 
     return g_strdup(nf->netdev_id);
 }
 
-static void netfilter_set_netdev_id(Object *obj, const char *str, Error **errp)
+static void netfilter_set_netdev_id(Object *obj, const char *str,
+                                    Error *errp[static 1])
 {
     NetFilterState *nf = NETFILTER(obj);
 
     nf->netdev_id = g_strdup(str);
 }
 
-static int netfilter_get_direction(Object *obj, Error **errp G_GNUC_UNUSED)
+static int netfilter_get_direction(Object *obj,
+                                   Error *errp[static 1] G_GNUC_UNUSED)
 {
     NetFilterState *nf = NETFILTER(obj);
     return nf->direction;
 }
 
-static void netfilter_set_direction(Object *obj, int direction, Error **errp)
+static void netfilter_set_direction(Object *obj, int direction,
+                                    Error *errp[static 1])
 {
     NetFilterState *nf = NETFILTER(obj);
     nf->direction = direction;
 }
 
-static char *netfilter_get_status(Object *obj, Error **errp)
+static char *netfilter_get_status(Object *obj, Error *errp[static 1])
 {
     NetFilterState *nf = NETFILTER(obj);
 
     return nf->on ? g_strdup("on") : g_strdup("off");
 }
 
-static void netfilter_set_status(Object *obj, const char *str, Error **errp)
+static void netfilter_set_status(Object *obj, const char *str,
+                                 Error *errp[static 1])
 {
     NetFilterState *nf = NETFILTER(obj);
     NetFilterClass *nfc = NETFILTER_GET_CLASS(obj);
@@ -187,7 +191,7 @@ static void netfilter_init(Object *obj)
                             IGNORE_ERRORS);
 }
 
-static void netfilter_complete(UserCreatable *uc, Error **errp)
+static void netfilter_complete(UserCreatable *uc, Error *errp[static 1])
 {
     NetFilterState *nf = NETFILTER(uc);
     NetClientState *ncs[MAX_QUEUE_NUM];
diff --git a/net/hub.c b/net/hub.c
index 32d8cf5cd4..a50d7f92bd 100644
--- a/net/hub.c
+++ b/net/hub.c
@@ -282,7 +282,7 @@ int net_hub_id_for_client(NetClientState *nc, int *id)
 }
 
 int net_init_hubport(const Netdev *netdev, const char *name,
-                     NetClientState *peer, Error **errp)
+                     NetClientState *peer, Error *errp[static 1])
 {
     const NetdevHubPortOptions *hubport;
 
diff --git a/net/l2tpv3.c b/net/l2tpv3.c
index 6745b78990..e86ab39f7a 100644
--- a/net/l2tpv3.c
+++ b/net/l2tpv3.c
@@ -526,7 +526,7 @@ static NetClientInfo net_l2tpv3_info = {
 
 int net_init_l2tpv3(const Netdev *netdev,
                     const char *name,
-                    NetClientState *peer, Error **errp)
+                    NetClientState *peer, Error *errp[static 1])
 {
     /* FIXME error_setg(errp, ...) on failure */
     const NetdevL2TPv3Options *l2tpv3;
diff --git a/net/net.c b/net/net.c
index 5c09301692..cf86e6a298 100644
--- a/net/net.c
+++ b/net/net.c
@@ -868,7 +868,7 @@ int qemu_find_nic_model(NICInfo *nd, const char * const *models,
 }
 
 static int net_init_nic(const Netdev *netdev, const char *name,
-                        NetClientState *peer, Error **errp)
+                        NetClientState *peer, Error *errp[static 1])
 {
     int idx;
     NICInfo *nd;
@@ -965,7 +965,8 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
 };
 
 
-static int net_client_init1(const void *object, bool is_netdev, Error **errp)
+static int net_client_init1(const void *object, bool is_netdev,
+                            Error *errp[static 1])
 {
     Netdev legacy = {0};
     const Netdev *netdev;
@@ -1071,7 +1072,7 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
 }
 
 
-int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
+int net_client_init(QemuOpts *opts, bool is_netdev, Error *errp[static 1])
 {
     void *object = NULL;
     Error *err = NULL;
@@ -1205,12 +1206,12 @@ void hmp_host_net_remove(Monitor *mon, const QDict *qdict)
     qemu_opts_del(qemu_opts_find(qemu_find_opts("net"), device));
 }
 
-void netdev_add(QemuOpts *opts, Error **errp)
+void netdev_add(QemuOpts *opts, Error *errp[static 1])
 {
     net_client_init(opts, true, errp);
 }
 
-void qmp_netdev_add(QDict *qdict, QObject **ret, Error **errp)
+void qmp_netdev_add(QDict *qdict, QObject **ret, Error *errp[static 1])
 {
     Error *local_err = NULL;
     QemuOptsList *opts_list;
@@ -1236,7 +1237,7 @@ out:
     error_propagate(errp, local_err);
 }
 
-void qmp_netdev_del(const char *id, Error **errp)
+void qmp_netdev_del(const char *id, Error *errp[static 1])
 {
     NetClientState *nc;
     QemuOpts *opts;
@@ -1303,7 +1304,7 @@ void print_net_client(Monitor *mon, NetClientState *nc)
 }
 
 RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     NetClientState *nc;
     RxFilterInfoList *filter_list = NULL, *last_entry = NULL;
@@ -1386,7 +1387,7 @@ void hmp_info_network(Monitor *mon, const QDict *qdict)
     }
 }
 
-void qmp_set_link(const char *name, bool up, Error **errp)
+void qmp_set_link(const char *name, bool up, Error *errp[static 1])
 {
     NetClientState *ncs[MAX_QUEUE_NUM];
     NetClientState *nc;
@@ -1501,7 +1502,7 @@ void net_check_clients(void)
     }
 }
 
-static int net_init_client(void *dummy, QemuOpts *opts, Error **errp)
+static int net_init_client(void *dummy, QemuOpts *opts, Error *errp[static 1])
 {
     Error *local_err = NULL;
 
@@ -1514,7 +1515,7 @@ static int net_init_client(void *dummy, QemuOpts *opts, Error **errp)
     return 0;
 }
 
-static int net_init_netdev(void *dummy, QemuOpts *opts, Error **errp)
+static int net_init_netdev(void *dummy, QemuOpts *opts, Error *errp[static 1])
 {
     Error *local_err = NULL;
     int ret;
diff --git a/net/netmap.c b/net/netmap.c
index 2d11a8f4be..a1a8b3fb7b 100644
--- a/net/netmap.c
+++ b/net/netmap.c
@@ -82,7 +82,7 @@ pkt_copy(const void *_src, void *_dst, int l)
  * (which is the case for the VALE bridge).
  */
 static struct nm_desc *netmap_open(const NetdevNetmapOptions *nm_opts,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     struct nm_desc *nmd;
     struct nmreq req;
@@ -419,7 +419,8 @@ static NetClientInfo net_netmap_info = {
  * ... -net netmap,ifname="..."
  */
 int net_init_netmap(const Netdev *netdev,
-                    const char *name, NetClientState *peer, Error **errp)
+                    const char *name, NetClientState *peer,
+                    Error *errp[static 1])
 {
     const NetdevNetmapOptions *netmap_opts = &netdev->u.netmap;
     struct nm_desc *nmd;
diff --git a/net/slirp.c b/net/slirp.c
index 6a6d727999..5325cb1e30 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -843,7 +843,7 @@ static const char **slirp_dnssearch(const StringList *dnsname)
 }
 
 int net_init_slirp(const Netdev *netdev, const char *name,
-                   NetClientState *peer, Error **errp)
+                   NetClientState *peer, Error *errp[static 1])
 {
     /* FIXME error_setg(errp, ...) on failure */
     struct slirp_config_str *config;
diff --git a/net/socket.c b/net/socket.c
index dcae1ae2c0..7c041ff5bd 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -666,7 +666,7 @@ static int net_socket_udp_init(NetClientState *peer,
 }
 
 int net_init_socket(const Netdev *netdev, const char *name,
-                    NetClientState *peer, Error **errp)
+                    NetClientState *peer, Error *errp[static 1])
 {
     /* FIXME error_setg(errp, ...) on failure */
     Error *err = NULL;
diff --git a/net/tap-bsd.c b/net/tap-bsd.c
index 6c9692263d..5b6fb50090 100644
--- a/net/tap-bsd.c
+++ b/net/tap-bsd.c
@@ -41,7 +41,7 @@
 
 #ifndef __FreeBSD__
 int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
-             int vnet_hdr_required, int mq_required, Error **errp)
+             int vnet_hdr_required, int mq_required, Error *errp[static 1])
 {
     int fd;
 #ifdef TAPGIFNAME
@@ -115,7 +115,8 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
 
 #define PATH_NET_TAP "/dev/tap"
 
-static int tap_open_clone(char *ifname, int ifname_size, Error **errp)
+static int tap_open_clone(char *ifname, int ifname_size,
+                          Error *errp[static 1])
 {
     int fd, s, ret;
     struct ifreq ifr;
@@ -160,7 +161,7 @@ static int tap_open_clone(char *ifname, int ifname_size, Error **errp)
 }
 
 int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
-             int vnet_hdr_required, int mq_required, Error **errp)
+             int vnet_hdr_required, int mq_required, Error *errp[static 1])
 {
     int fd = -1;
 
@@ -207,7 +208,8 @@ error:
 }
 #endif /* __FreeBSD__ */
 
-void tap_set_sndbuf(int fd, const NetdevTapOptions *tap, Error **errp)
+void tap_set_sndbuf(int fd, const NetdevTapOptions *tap,
+		    Error *errp[static 1])
 {
 }
 
diff --git a/net/tap-linux.c b/net/tap-linux.c
index a503fa9c6e..6032377666 100644
--- a/net/tap-linux.c
+++ b/net/tap-linux.c
@@ -39,7 +39,7 @@
 #define PATH_NET_TUN "/dev/net/tun"
 
 int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
-             int vnet_hdr_required, int mq_required, Error **errp)
+             int vnet_hdr_required, int mq_required, Error *errp[static 1])
 {
     struct ifreq ifr;
     int fd, ret;
@@ -130,7 +130,8 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
  */
 #define TAP_DEFAULT_SNDBUF 0
 
-void tap_set_sndbuf(int fd, const NetdevTapOptions *tap, Error **errp)
+void tap_set_sndbuf(int fd, const NetdevTapOptions *tap,
+                    Error *errp[static 1])
 {
     int sndbuf;
 
diff --git a/net/tap-solaris.c b/net/tap-solaris.c
index a2a92356c1..a44d4ec6c7 100644
--- a/net/tap-solaris.c
+++ b/net/tap-solaris.c
@@ -57,7 +57,7 @@ ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
  * Allocate TAP device, returns opened fd.
  * Stores dev name in the first arg(must be large enough).
  */
-static int tap_alloc(char *dev, size_t dev_size, Error **errp)
+static int tap_alloc(char *dev, size_t dev_size, Error *errp[static 1])
 {
     /* FIXME leaks like a sieve on error paths */
     /* FIXME suspicious: many errors are reported, then ignored */
@@ -177,7 +177,7 @@ static int tap_alloc(char *dev, size_t dev_size, Error **errp)
 }
 
 int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
-             int vnet_hdr_required, int mq_required, Error **errp)
+             int vnet_hdr_required, int mq_required, Error *errp[static 1])
 {
     char  dev[10]="";
     int fd;
@@ -202,7 +202,8 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
     return fd;
 }
 
-void tap_set_sndbuf(int fd, const NetdevTapOptions *tap, Error **errp)
+void tap_set_sndbuf(int fd, const NetdevTapOptions *tap,
+		    Error *errp[static 1])
 {
 }
 
diff --git a/net/tap-stub.c b/net/tap-stub.c
index a9ab8f8293..b3bdfc731f 100644
--- a/net/tap-stub.c
+++ b/net/tap-stub.c
@@ -27,13 +27,14 @@
 #include "tap_int.h"
 
 int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
-             int vnet_hdr_required, int mq_required, Error **errp)
+             int vnet_hdr_required, int mq_required, Error *errp[static 1])
 {
     error_setg(errp, "tap is not supported in this build");
     return -1;
 }
 
-void tap_set_sndbuf(int fd, const NetdevTapOptions *tap, Error **errp)
+void tap_set_sndbuf(int fd, const NetdevTapOptions *tap,
+		    Error *errp[static 1])
 {
 }
 
diff --git a/net/tap-win32.c b/net/tap-win32.c
index 662f9b63e1..4872d0cdb5 100644
--- a/net/tap-win32.c
+++ b/net/tap-win32.c
@@ -789,7 +789,7 @@ static int tap_win32_init(NetClientState *peer, const char *model,
 }
 
 int net_init_tap(const Netdev *netdev, const char *name,
-                 NetClientState *peer, Error **errp)
+                 NetClientState *peer, Error *errp[static 1])
 {
     /* FIXME error_setg(errp, ...) on failure */
     const NetdevTapOptions *tap;
diff --git a/net/tap.c b/net/tap.c
index 70e5dda82a..15a12beb02 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -62,7 +62,7 @@ typedef struct TAPState {
 } TAPState;
 
 static void launch_script(const char *setup_script, const char *ifname,
-                          int fd, Error **errp);
+                          int fd, Error *errp[static 1]);
 
 static void tap_send(void *opaque);
 static void tap_writable(void *opaque);
@@ -397,7 +397,7 @@ static TAPState *net_tap_fd_init(NetClientState *peer,
 }
 
 static void launch_script(const char *setup_script, const char *ifname,
-                          int fd, Error **errp)
+                          int fd, Error *errp[static 1])
 {
     int pid, status;
     char *args[3];
@@ -472,7 +472,7 @@ static int recv_fd(int c)
 }
 
 static int net_bridge_run_helper(const char *helper, const char *bridge,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     sigset_t oldmask, mask;
     int pid, status;
@@ -573,7 +573,7 @@ static int net_bridge_run_helper(const char *helper, const char *bridge,
 }
 
 int net_init_bridge(const Netdev *netdev, const char *name,
-                    NetClientState *peer, Error **errp)
+                    NetClientState *peer, Error *errp[static 1])
 {
     const NetdevBridgeOptions *bridge;
     const char *helper, *br;
@@ -603,7 +603,8 @@ int net_init_bridge(const Netdev *netdev, const char *name,
 
 static int net_tap_init(const NetdevTapOptions *tap, int *vnet_hdr,
                         const char *setup_script, char *ifname,
-                        size_t ifname_sz, int mq_required, Error **errp)
+                        size_t ifname_sz, int mq_required,
+                        Error *errp[static 1])
 {
     int fd, vnet_hdr_required;
 
@@ -640,7 +641,7 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
                              const char *model, const char *name,
                              const char *ifname, const char *script,
                              const char *downscript, const char *vhostfdname,
-                             int vnet_hdr, int fd, Error **errp)
+                             int vnet_hdr, int fd, Error *errp[static 1])
 {
     Error *err = NULL;
     TAPState *s = net_tap_fd_init(peer, model, name, fd, vnet_hdr);
@@ -736,7 +737,7 @@ static int get_fds(char *str, char *fds[], int max)
 }
 
 int net_init_tap(const Netdev *netdev, const char *name,
-                 NetClientState *peer, Error **errp)
+                 NetClientState *peer, Error *errp[static 1])
 {
     const NetdevTapOptions *tap;
     int fd, vnet_hdr = 0, i = 0, queues;
diff --git a/net/vde.c b/net/vde.c
index e50e5d6394..a4aedd25d7 100644
--- a/net/vde.c
+++ b/net/vde.c
@@ -110,7 +110,7 @@ static int net_vde_init(NetClientState *peer, const char *model,
 }
 
 int net_init_vde(const Netdev *netdev, const char *name,
-                 NetClientState *peer, Error **errp)
+                 NetClientState *peer, Error *errp[static 1])
 {
     /* FIXME error_setg(errp, ...) on failure */
     const NetdevVdeOptions *vde;
diff --git a/net/vhost-user.c b/net/vhost-user.c
index a042ec6a34..5774fb4377 100644
--- a/net/vhost-user.c
+++ b/net/vhost-user.c
@@ -314,7 +314,7 @@ static int net_vhost_user_init(NetClientState *peer, const char *device,
 }
 
 static Chardev *net_vhost_claim_chardev(
-    const NetdevVhostUserOptions *opts, Error **errp)
+    const NetdevVhostUserOptions *opts, Error *errp[static 1])
 {
     Chardev *chr = qemu_chr_find(opts->chardev);
 
@@ -337,7 +337,8 @@ static Chardev *net_vhost_claim_chardev(
     return chr;
 }
 
-static int net_vhost_check_net(void *opaque, QemuOpts *opts, Error **errp)
+static int net_vhost_check_net(void *opaque, QemuOpts *opts,
+                               Error *errp[static 1])
 {
     const char *name = opaque;
     const char *driver, *netdev;
@@ -359,7 +360,7 @@ static int net_vhost_check_net(void *opaque, QemuOpts *opts, Error **errp)
 }
 
 int net_init_vhost_user(const Netdev *netdev, const char *name,
-                        NetClientState *peer, Error **errp)
+                        NetClientState *peer, Error *errp[static 1])
 {
     int queues;
     const NetdevVhostUserOptions *vhost_user_opts;
diff --git a/numa.c b/numa.c
index 7886d31e09..49ad92804a 100644
--- a/numa.c
+++ b/numa.c
@@ -120,7 +120,7 @@ static bool numa_addr_belongs_to_node(ram_addr_t addr, uint32_t node)
  * Given an address, return the index of the NUMA node to which the
  * address belongs to.
  */
-uint32_t numa_get_node(ram_addr_t addr, Error **errp)
+uint32_t numa_get_node(ram_addr_t addr, Error *errp[static 1])
 {
     uint32_t i;
 
@@ -143,7 +143,7 @@ uint32_t numa_get_node(ram_addr_t addr, Error **errp)
 }
 
 static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
-                            QemuOpts *opts, Error **errp)
+                            QemuOpts *opts, Error *errp[static 1])
 {
     uint16_t nodenr;
     uint16List *cpus = NULL;
@@ -225,7 +225,7 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
     max_numa_nodeid = MAX(max_numa_nodeid, nodenr + 1);
 }
 
-static void parse_numa_distance(NumaDistOptions *dist, Error **errp)
+static void parse_numa_distance(NumaDistOptions *dist, Error *errp[static 1])
 {
     uint16_t src = dist->src;
     uint16_t dst = dist->dst;
@@ -261,7 +261,7 @@ static void parse_numa_distance(NumaDistOptions *dist, Error **errp)
     have_numa_distance = true;
 }
 
-static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
+static int parse_numa(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     NumaOptions *object = NULL;
     MachineState *ms = opaque;
@@ -509,7 +509,8 @@ void parse_numa_opts(MachineState *ms)
     }
 }
 
-void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev, Error **errp)
+void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev,
+                       Error *errp[static 1])
 {
     int node_id = object_property_get_int(OBJECT(dev), "node-id", &error_abort);
 
@@ -667,7 +668,7 @@ static int query_memdev(Object *obj, void *opaque)
     return 0;
 }
 
-MemdevList *qmp_query_memdev(Error **errp)
+MemdevList *qmp_query_memdev(Error *errp[static 1])
 {
     Object *obj = object_get_objects_root();
     MemdevList *list = NULL;
diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c
index 3e408e4bf0..16b8b04b09 100644
--- a/qapi/opts-visitor.c
+++ b/qapi/opts-visitor.c
@@ -126,7 +126,7 @@ opts_visitor_insert(GHashTable *unprocessed_opts, const QemuOpt *opt)
 
 static void
 opts_start_struct(Visitor *v, const char *name, void **obj,
-                  size_t size, Error **errp)
+                  size_t size, Error *errp[static 1])
 {
     OptsVisitor *ov = to_ov(v);
     const QemuOpt *opt;
@@ -158,7 +158,7 @@ opts_start_struct(Visitor *v, const char *name, void **obj,
 
 
 static void
-opts_check_struct(Visitor *v, Error **errp)
+opts_check_struct(Visitor *v, Error *errp[static 1])
 {
     OptsVisitor *ov = to_ov(v);
     GHashTableIter iter;
@@ -200,7 +200,8 @@ opts_end_struct(Visitor *v, void **obj)
 
 
 static GQueue *
-lookup_distinct(const OptsVisitor *ov, const char *name, Error **errp)
+lookup_distinct(const OptsVisitor *ov, const char *name,
+                Error *errp[static 1])
 {
     GQueue *list;
 
@@ -214,7 +215,7 @@ lookup_distinct(const OptsVisitor *ov, const char *name, Error **errp)
 
 static void
 opts_start_list(Visitor *v, const char *name, GenericList **list, size_t size,
-                Error **errp)
+                Error *errp[static 1])
 {
     OptsVisitor *ov = to_ov(v);
 
@@ -273,7 +274,7 @@ opts_next_list(Visitor *v, GenericList *tail, size_t size)
 
 
 static void
-opts_check_list(Visitor *v, Error **errp)
+opts_check_list(Visitor *v, Error *errp[static 1])
 {
     /*
      * Unvisited list elements will be reported later when checking
@@ -296,7 +297,7 @@ opts_end_list(Visitor *v, void **obj)
 
 
 static const QemuOpt *
-lookup_scalar(const OptsVisitor *ov, const char *name, Error **errp)
+lookup_scalar(const OptsVisitor *ov, const char *name, Error *errp[static 1])
 {
     if (ov->list_mode == LM_NONE) {
         GQueue *list;
@@ -324,7 +325,7 @@ processed(OptsVisitor *ov, const char *name)
 
 
 static void
-opts_type_str(Visitor *v, const char *name, char **obj, Error **errp)
+opts_type_str(Visitor *v, const char *name, char **obj, Error *errp[static 1])
 {
     OptsVisitor *ov = to_ov(v);
     const QemuOpt *opt;
@@ -346,7 +347,7 @@ opts_type_str(Visitor *v, const char *name, char **obj, Error **errp)
 
 /* mimics qemu-option.c::parse_option_bool() */
 static void
-opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
+opts_type_bool(Visitor *v, const char *name, bool *obj, Error *errp[static 1])
 {
     OptsVisitor *ov = to_ov(v);
     const QemuOpt *opt;
@@ -379,7 +380,8 @@ opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
 
 
 static void
-opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
+opts_type_int64(Visitor *v, const char *name, int64_t *obj,
+                Error *errp[static 1])
 {
     OptsVisitor *ov = to_ov(v);
     const QemuOpt *opt;
@@ -435,7 +437,8 @@ opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
 
 
 static void
-opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
+opts_type_uint64(Visitor *v, const char *name, uint64_t *obj,
+                 Error *errp[static 1])
 {
     OptsVisitor *ov = to_ov(v);
     const QemuOpt *opt;
@@ -487,7 +490,8 @@ opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
 
 
 static void
-opts_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp)
+opts_type_size(Visitor *v, const char *name, uint64_t *obj,
+               Error *errp[static 1])
 {
     OptsVisitor *ov = to_ov(v);
     const QemuOpt *opt;
diff --git a/qapi/qapi-clone-visitor.c b/qapi/qapi-clone-visitor.c
index de756bfb33..bfb3ea88e4 100644
--- a/qapi/qapi-clone-visitor.c
+++ b/qapi/qapi-clone-visitor.c
@@ -24,7 +24,7 @@ static QapiCloneVisitor *to_qcv(Visitor *v)
 }
 
 static void qapi_clone_start_struct(Visitor *v, const char *name, void **obj,
-                                    size_t size, Error **errp)
+                                    size_t size, Error *errp[static 1])
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
@@ -52,7 +52,7 @@ static void qapi_clone_end(Visitor *v, void **obj)
 
 static void qapi_clone_start_list(Visitor *v, const char *name,
                                   GenericList **listp, size_t size,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     qapi_clone_start_struct(v, name, (void **)listp, size, errp);
 }
@@ -70,13 +70,14 @@ static GenericList *qapi_clone_next_list(Visitor *v, GenericList *tail,
 
 static void qapi_clone_start_alternate(Visitor *v, const char *name,
                                        GenericAlternate **obj, size_t size,
-                                       bool promote_int, Error **errp)
+                                       bool promote_int,
+                                       Error *errp[static 1])
 {
     qapi_clone_start_struct(v, name, (void **)obj, size, errp);
 }
 
 static void qapi_clone_type_int64(Visitor *v, const char *name, int64_t *obj,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
@@ -85,7 +86,7 @@ static void qapi_clone_type_int64(Visitor *v, const char *name, int64_t *obj,
 }
 
 static void qapi_clone_type_uint64(Visitor *v, const char *name,
-                                    uint64_t *obj, Error **errp)
+                                    uint64_t *obj, Error *errp[static 1])
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
@@ -94,7 +95,7 @@ static void qapi_clone_type_uint64(Visitor *v, const char *name,
 }
 
 static void qapi_clone_type_bool(Visitor *v, const char *name, bool *obj,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
@@ -103,7 +104,7 @@ static void qapi_clone_type_bool(Visitor *v, const char *name, bool *obj,
 }
 
 static void qapi_clone_type_str(Visitor *v, const char *name, char **obj,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
@@ -119,7 +120,7 @@ static void qapi_clone_type_str(Visitor *v, const char *name, char **obj,
 }
 
 static void qapi_clone_type_number(Visitor *v, const char *name, double *obj,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
@@ -127,7 +128,8 @@ static void qapi_clone_type_number(Visitor *v, const char *name, double *obj,
     /* Value was already cloned by g_memdup() */
 }
 
-static void qapi_clone_type_null(Visitor *v, const char *name, Error **errp)
+static void qapi_clone_type_null(Visitor *v, const char *name,
+                                 Error *errp[static 1])
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c
index e39457bc79..29584f999e 100644
--- a/qapi/qapi-dealloc-visitor.c
+++ b/qapi/qapi-dealloc-visitor.c
@@ -25,7 +25,7 @@ struct QapiDeallocVisitor
 };
 
 static void qapi_dealloc_start_struct(Visitor *v, const char *name, void **obj,
-                                      size_t unused, Error **errp)
+                                      size_t unused, Error *errp[static 1])
 {
 }
 
@@ -38,7 +38,8 @@ static void qapi_dealloc_end_struct(Visitor *v, void **obj)
 
 static void qapi_dealloc_start_alternate(Visitor *v, const char *name,
                                          GenericAlternate **obj, size_t size,
-                                         bool promote_int, Error **errp)
+                                         bool promote_int,
+                                         Error *errp[static 1])
 {
 }
 
@@ -51,7 +52,7 @@ static void qapi_dealloc_end_alternate(Visitor *v, void **obj)
 
 static void qapi_dealloc_start_list(Visitor *v, const char *name,
                                     GenericList **list, size_t size,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
 }
 
@@ -68,7 +69,7 @@ static void qapi_dealloc_end_list(Visitor *v, void **obj)
 }
 
 static void qapi_dealloc_type_str(Visitor *v, const char *name, char **obj,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     if (obj) {
         g_free(*obj);
@@ -76,34 +77,35 @@ static void qapi_dealloc_type_str(Visitor *v, const char *name, char **obj,
 }
 
 static void qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t *obj,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
 }
 
 static void qapi_dealloc_type_uint64(Visitor *v, const char *name,
-                                     uint64_t *obj, Error **errp)
+                                     uint64_t *obj, Error *errp[static 1])
 {
 }
 
 static void qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
 }
 
 static void qapi_dealloc_type_number(Visitor *v, const char *name, double *obj,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
 }
 
 static void qapi_dealloc_type_anything(Visitor *v, const char *name,
-                                       QObject **obj, Error **errp)
+                                       QObject **obj, Error *errp[static 1])
 {
     if (obj) {
         qobject_decref(*obj);
     }
 }
 
-static void qapi_dealloc_type_null(Visitor *v, const char *name, Error **errp)
+static void qapi_dealloc_type_null(Visitor *v, const char *name,
+				   Error *errp[static 1])
 {
 }
 
diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
index e28dbd0ac3..65e09c5571 100644
--- a/qapi/qapi-util.c
+++ b/qapi/qapi-util.c
@@ -16,7 +16,7 @@
 #include "qapi/util.h"
 
 int qapi_enum_parse(const char * const lookup[], const char *buf,
-                    int max, int def, Error **errp)
+                    int max, int def, Error *errp[static 1])
 {
     int i;
 
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 5ad36f8a09..4eadb5adb5 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -20,7 +20,8 @@
 #include "qapi-types.h"
 #include "qapi/qmp/qerror.h"
 
-static QDict *qmp_dispatch_check_obj(const QObject *request, Error **errp)
+static QDict *qmp_dispatch_check_obj(const QObject *request,
+                                     Error *errp[static 1])
 {
     const QDictEntry *ent;
     const char *arg_name;
@@ -68,7 +69,7 @@ static QDict *qmp_dispatch_check_obj(const QObject *request, Error **errp)
 }
 
 static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     Error *local_err = NULL;
     const char *command;
diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c
index 7da822b3a2..9724c6ba4f 100644
--- a/qapi/qobject-input-visitor.c
+++ b/qapi/qobject-input-visitor.c
@@ -158,7 +158,7 @@ static QObject *qobject_input_try_get_object(QObjectInputVisitor *qiv,
 
 static QObject *qobject_input_get_object(QObjectInputVisitor *qiv,
                                          const char *name,
-                                         bool consume, Error **errp)
+                                         bool consume, Error *errp[static 1])
 {
     QObject *obj = qobject_input_try_get_object(qiv, name, consume);
 
@@ -170,7 +170,7 @@ static QObject *qobject_input_get_object(QObjectInputVisitor *qiv,
 
 static const char *qobject_input_get_keyval(QObjectInputVisitor *qiv,
                                             const char *name,
-                                            Error **errp)
+                                            Error *errp[static 1])
 {
     QObject *qobj;
     QString *qstr;
@@ -232,7 +232,7 @@ static const QListEntry *qobject_input_push(QObjectInputVisitor *qiv,
 }
 
 
-static void qobject_input_check_struct(Visitor *v, Error **errp)
+static void qobject_input_check_struct(Visitor *v, Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     StackObject *tos = QSLIST_FIRST(&qiv->stack);
@@ -268,7 +268,7 @@ static void qobject_input_pop(Visitor *v, void **obj)
 }
 
 static void qobject_input_start_struct(Visitor *v, const char *name, void **obj,
-                                       size_t size, Error **errp)
+                                       size_t size, Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
@@ -304,7 +304,7 @@ static void qobject_input_end_struct(Visitor *v, void **obj)
 
 static void qobject_input_start_list(Visitor *v, const char *name,
                                      GenericList **list, size_t size,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
@@ -343,7 +343,7 @@ static GenericList *qobject_input_next_list(Visitor *v, GenericList *tail,
     return tail->next;
 }
 
-static void qobject_input_check_list(Visitor *v, Error **errp)
+static void qobject_input_check_list(Visitor *v, Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     StackObject *tos = QSLIST_FIRST(&qiv->stack);
@@ -367,7 +367,8 @@ static void qobject_input_end_list(Visitor *v, void **obj)
 
 static void qobject_input_start_alternate(Visitor *v, const char *name,
                                           GenericAlternate **obj, size_t size,
-                                          bool promote_int, Error **errp)
+                                          bool promote_int,
+                                          Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, false, errp);
@@ -384,7 +385,7 @@ static void qobject_input_start_alternate(Visitor *v, const char *name,
 }
 
 static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
@@ -405,7 +406,8 @@ static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
 
 
 static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
-                                            int64_t *obj, Error **errp)
+                                            int64_t *obj,
+                                            Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
@@ -422,7 +424,7 @@ static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
 }
 
 static void qobject_input_type_uint64(Visitor *v, const char *name,
-                                      uint64_t *obj, Error **errp)
+                                      uint64_t *obj, Error *errp[static 1])
 {
     /* FIXME: qobject_to_qint mishandles values over INT64_MAX */
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -443,7 +445,8 @@ static void qobject_input_type_uint64(Visitor *v, const char *name,
 }
 
 static void qobject_input_type_uint64_keyval(Visitor *v, const char *name,
-                                             uint64_t *obj, Error **errp)
+                                             uint64_t *obj,
+                                             Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
@@ -460,7 +463,7 @@ static void qobject_input_type_uint64_keyval(Visitor *v, const char *name,
 }
 
 static void qobject_input_type_bool(Visitor *v, const char *name, bool *obj,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
@@ -480,7 +483,7 @@ static void qobject_input_type_bool(Visitor *v, const char *name, bool *obj,
 }
 
 static void qobject_input_type_bool_keyval(Visitor *v, const char *name,
-                                           bool *obj, Error **errp)
+                                           bool *obj, Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
@@ -500,7 +503,7 @@ static void qobject_input_type_bool_keyval(Visitor *v, const char *name,
 }
 
 static void qobject_input_type_str(Visitor *v, const char *name, char **obj,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
@@ -521,7 +524,7 @@ static void qobject_input_type_str(Visitor *v, const char *name, char **obj,
 }
 
 static void qobject_input_type_str_keyval(Visitor *v, const char *name,
-                                          char **obj, Error **errp)
+                                          char **obj, Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
@@ -530,7 +533,7 @@ static void qobject_input_type_str_keyval(Visitor *v, const char *name,
 }
 
 static void qobject_input_type_number(Visitor *v, const char *name, double *obj,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
@@ -557,7 +560,8 @@ static void qobject_input_type_number(Visitor *v, const char *name, double *obj,
 }
 
 static void qobject_input_type_number_keyval(Visitor *v, const char *name,
-                                             double *obj, Error **errp)
+                                             double *obj,
+                                             Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
@@ -577,7 +581,7 @@ static void qobject_input_type_number_keyval(Visitor *v, const char *name,
 }
 
 static void qobject_input_type_any(Visitor *v, const char *name, QObject **obj,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
@@ -591,7 +595,8 @@ static void qobject_input_type_any(Visitor *v, const char *name, QObject **obj,
     *obj = qobj;
 }
 
-static void qobject_input_type_null(Visitor *v, const char *name, Error **errp)
+static void qobject_input_type_null(Visitor *v, const char *name,
+                                    Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
@@ -607,7 +612,8 @@ static void qobject_input_type_null(Visitor *v, const char *name, Error **errp)
 }
 
 static void qobject_input_type_size_keyval(Visitor *v, const char *name,
-                                           uint64_t *obj, Error **errp)
+                                           uint64_t *obj,
+                                           Error *errp[static 1])
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
@@ -712,7 +718,7 @@ Visitor *qobject_input_visitor_new_keyval(QObject *obj)
 
 Visitor *qobject_input_visitor_new_str(const char *str,
                                        const char *implied_key,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     bool is_json = str[0] == '{';
     QObject *obj;
diff --git a/qapi/qobject-output-visitor.c b/qapi/qobject-output-visitor.c
index 871127079d..1892698d84 100644
--- a/qapi/qobject-output-visitor.c
+++ b/qapi/qobject-output-visitor.c
@@ -100,7 +100,8 @@ static void qobject_output_add_obj(QObjectOutputVisitor *qov, const char *name,
 }
 
 static void qobject_output_start_struct(Visitor *v, const char *name,
-                                        void **obj, size_t unused, Error **errp)
+                                        void **obj, size_t unused,
+                                        Error *errp[static 1])
 {
     QObjectOutputVisitor *qov = to_qov(v);
     QDict *dict = qdict_new();
@@ -118,7 +119,7 @@ static void qobject_output_end_struct(Visitor *v, void **obj)
 
 static void qobject_output_start_list(Visitor *v, const char *name,
                                       GenericList **listp, size_t size,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     QObjectOutputVisitor *qov = to_qov(v);
     QList *list = qlist_new();
@@ -141,14 +142,14 @@ static void qobject_output_end_list(Visitor *v, void **obj)
 }
 
 static void qobject_output_type_int64(Visitor *v, const char *name,
-                                      int64_t *obj, Error **errp)
+                                      int64_t *obj, Error *errp[static 1])
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add(qov, name, qint_from_int(*obj));
 }
 
 static void qobject_output_type_uint64(Visitor *v, const char *name,
-                                       uint64_t *obj, Error **errp)
+                                       uint64_t *obj, Error *errp[static 1])
 {
     /* FIXME values larger than INT64_MAX become negative */
     QObjectOutputVisitor *qov = to_qov(v);
@@ -156,14 +157,14 @@ static void qobject_output_type_uint64(Visitor *v, const char *name,
 }
 
 static void qobject_output_type_bool(Visitor *v, const char *name, bool *obj,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add(qov, name, qbool_from_bool(*obj));
 }
 
 static void qobject_output_type_str(Visitor *v, const char *name, char **obj,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     QObjectOutputVisitor *qov = to_qov(v);
     if (*obj) {
@@ -174,21 +175,22 @@ static void qobject_output_type_str(Visitor *v, const char *name, char **obj,
 }
 
 static void qobject_output_type_number(Visitor *v, const char *name,
-                                       double *obj, Error **errp)
+                                       double *obj, Error *errp[static 1])
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add(qov, name, qfloat_from_double(*obj));
 }
 
 static void qobject_output_type_any(Visitor *v, const char *name,
-                                    QObject **obj, Error **errp)
+                                    QObject **obj, Error *errp[static 1])
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_incref(*obj);
     qobject_output_add_obj(qov, name, *obj);
 }
 
-static void qobject_output_type_null(Visitor *v, const char *name, Error **errp)
+static void qobject_output_type_null(Visitor *v, const char *name,
+                                     Error *errp[static 1])
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add_obj(qov, name, qnull());
diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
index bb4a21ce0d..f75ca82225 100644
--- a/qapi/string-input-visitor.c
+++ b/qapi/string-input-visitor.c
@@ -43,7 +43,8 @@ static void free_range(void *range, void *dummy)
     g_free(range);
 }
 
-static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
+static int parse_str(StringInputVisitor *siv, const char *name,
+                     Error *errp[static 1])
 {
     char *str = (char *) siv->string;
     long long start, end;
@@ -119,7 +120,7 @@ error:
 
 static void
 start_list(Visitor *v, const char *name, GenericList **list, size_t size,
-           Error **errp)
+           Error *errp[static 1])
 {
     StringInputVisitor *siv = to_siv(v);
 
@@ -174,7 +175,7 @@ static GenericList *next_list(Visitor *v, GenericList *tail, size_t size)
     return tail->next;
 }
 
-static void check_list(Visitor *v, Error **errp)
+static void check_list(Visitor *v, Error *errp[static 1])
 {
     const StringInputVisitor *siv = to_siv(v);
     Range *r;
@@ -211,7 +212,7 @@ static void end_list(Visitor *v, void **obj)
 }
 
 static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     StringInputVisitor *siv = to_siv(v);
 
@@ -249,7 +250,7 @@ error:
 }
 
 static void parse_type_uint64(Visitor *v, const char *name, uint64_t *obj,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     /* FIXME: parse_type_int64 mishandles values over INT64_MAX */
     int64_t i;
@@ -263,7 +264,7 @@ static void parse_type_uint64(Visitor *v, const char *name, uint64_t *obj,
 }
 
 static void parse_type_size(Visitor *v, const char *name, uint64_t *obj,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     StringInputVisitor *siv = to_siv(v);
     uint64_t val;
@@ -277,7 +278,7 @@ static void parse_type_size(Visitor *v, const char *name, uint64_t *obj,
 }
 
 static void parse_type_bool(Visitor *v, const char *name, bool *obj,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     StringInputVisitor *siv = to_siv(v);
 
@@ -299,7 +300,7 @@ static void parse_type_bool(Visitor *v, const char *name, bool *obj,
 }
 
 static void parse_type_str(Visitor *v, const char *name, char **obj,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     StringInputVisitor *siv = to_siv(v);
 
@@ -307,7 +308,7 @@ static void parse_type_str(Visitor *v, const char *name, char **obj,
 }
 
 static void parse_type_number(Visitor *v, const char *name, double *obj,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     StringInputVisitor *siv = to_siv(v);
     char *endp = (char *) siv->string;
diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c
index 53c2175d81..7122717abb 100644
--- a/qapi/string-output-visitor.c
+++ b/qapi/string-output-visitor.c
@@ -124,7 +124,7 @@ static void format_string(StringOutputVisitor *sov, Range *r, bool next,
 }
 
 static void print_type_int64(Visitor *v, const char *name, int64_t *obj,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     StringOutputVisitor *sov = to_sov(v);
     GList *l;
@@ -200,7 +200,7 @@ static void print_type_int64(Visitor *v, const char *name, int64_t *obj,
 }
 
 static void print_type_uint64(Visitor *v, const char *name, uint64_t *obj,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     /* FIXME: print_type_int64 mishandles values over INT64_MAX */
     int64_t i = *obj;
@@ -208,7 +208,7 @@ static void print_type_uint64(Visitor *v, const char *name, uint64_t *obj,
 }
 
 static void print_type_size(Visitor *v, const char *name, uint64_t *obj,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     StringOutputVisitor *sov = to_sov(v);
     uint64_t val;
@@ -229,14 +229,14 @@ static void print_type_size(Visitor *v, const char *name, uint64_t *obj,
 }
 
 static void print_type_bool(Visitor *v, const char *name, bool *obj,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     StringOutputVisitor *sov = to_sov(v);
     string_output_set(sov, g_strdup(*obj ? "true" : "false"));
 }
 
 static void print_type_str(Visitor *v, const char *name, char **obj,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     StringOutputVisitor *sov = to_sov(v);
     char *out;
@@ -250,7 +250,7 @@ static void print_type_str(Visitor *v, const char *name, char **obj,
 }
 
 static void print_type_number(Visitor *v, const char *name, double *obj,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     StringOutputVisitor *sov = to_sov(v);
     string_output_set(sov, g_strdup_printf("%f", *obj));
@@ -258,7 +258,7 @@ static void print_type_number(Visitor *v, const char *name, double *obj,
 
 static void
 start_list(Visitor *v, const char *name, GenericList **list, size_t size,
-           Error **errp)
+           Error *errp[static 1])
 {
     StringOutputVisitor *sov = to_sov(v);
 
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 7a802c6b37..c4f355aa24 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -172,7 +172,7 @@ static void qdev_print_devinfos(bool show_no_user)
 }
 
 static int set_property(void *opaque, const char *name, const char *value,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     Object *obj = opaque;
 
@@ -206,7 +206,8 @@ static const char *find_typename_by_alias(const char *alias)
     return NULL;
 }
 
-static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
+static DeviceClass *qdev_get_device_class(const char **driver,
+                                          Error *errp[static 1])
 {
     ObjectClass *oc;
     DeviceClass *dc;
@@ -321,7 +322,7 @@ static Object *qdev_get_peripheral_anon(void)
     return dev;
 }
 
-static void qbus_list_bus(DeviceState *dev, Error **errp)
+static void qbus_list_bus(DeviceState *dev, Error *errp[static 1])
 {
     BusState *child;
     const char *sep = " ";
@@ -335,7 +336,7 @@ static void qbus_list_bus(DeviceState *dev, Error **errp)
     error_append_hint(errp, "\n");
 }
 
-static void qbus_list_dev(BusState *bus, Error **errp)
+static void qbus_list_dev(BusState *bus, Error *errp[static 1])
 {
     BusChild *kid;
     const char *sep = " ";
@@ -450,7 +451,7 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name,
     return pick;
 }
 
-static BusState *qbus_find(const char *path, Error **errp)
+static BusState *qbus_find(const char *path, Error *errp[static 1])
 {
     DeviceState *dev;
     BusState *bus;
@@ -557,7 +558,7 @@ void qdev_set_id(DeviceState *dev, const char *id)
     }
 }
 
-DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
+DeviceState *qdev_device_add(QemuOpts *opts, Error *errp[static 1])
 {
     DeviceClass *dc;
     const char *driver, *path;
@@ -787,7 +788,7 @@ void hmp_info_qom_tree(Monitor *mon, const QDict *dict)
     print_qom_composition(mon, obj, 0);
 }
 
-void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
+void qmp_device_add(QDict *qdict, QObject **ret_data, Error *errp[static 1])
 {
     Error *local_err = NULL;
     QemuOpts *opts;
@@ -811,7 +812,7 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
     object_unref(OBJECT(dev));
 }
 
-static DeviceState *find_device_state(const char *id, Error **errp)
+static DeviceState *find_device_state(const char *id, Error *errp[static 1])
 {
     Object *obj;
 
@@ -840,7 +841,7 @@ static DeviceState *find_device_state(const char *id, Error **errp)
     return DEVICE(obj);
 }
 
-void qdev_unplug(DeviceState *dev, Error **errp)
+void qdev_unplug(DeviceState *dev, Error *errp[static 1])
 {
     DeviceClass *dc = DEVICE_GET_CLASS(dev);
     HotplugHandler *hotplug_ctrl;
@@ -879,7 +880,7 @@ void qdev_unplug(DeviceState *dev, Error **errp)
     }
 }
 
-void qmp_device_del(const char *id, Error **errp)
+void qmp_device_del(const char *id, Error *errp[static 1])
 {
     DeviceState *dev = find_device_state(id, errp);
     if (dev != NULL) {
@@ -887,7 +888,7 @@ void qmp_device_del(const char *id, Error **errp)
     }
 }
 
-BlockBackend *blk_by_qdev_id(const char *id, Error **errp)
+BlockBackend *blk_by_qdev_id(const char *id, Error *errp[static 1])
 {
     DeviceState *dev;
     BlockBackend *blk;
diff --git a/qemu-img.c b/qemu-img.c
index d0ab3af44b..0e387f5d4b 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -350,7 +350,7 @@ static BlockBackend *img_open_file(const char *filename,
 
 static int img_add_key_secrets(void *opaque,
                                const char *name, const char *value,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     QDict *options = opaque;
 
@@ -884,7 +884,7 @@ static void common_block_job_cb(void *opaque, int ret)
     }
 }
 
-static void run_block_job(BlockJob *job, Error **errp)
+static void run_block_job(BlockJob *job, Error *errp[static 1])
 {
     AioContext *aio_context = blk_get_aio_context(job->blk);
 
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 6ff0b0c070..3361aac577 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -435,7 +435,8 @@ static QemuOptsList qemu_object_opts = {
 
 
 
-static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)
+static QCryptoTLSCreds *nbd_get_tls_creds(const char *id,
+                                          Error *errp[static 1])
 {
     Object *obj;
     QCryptoTLSCreds *creds;
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 6d3476477f..20c576c7b2 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -50,7 +50,7 @@ extern char **environ;
 #endif
 #endif
 
-static void ga_wait_child(pid_t pid, int *status, Error **errp)
+static void ga_wait_child(pid_t pid, int *status, Error *errp[static 1])
 {
     pid_t rpid;
 
@@ -69,7 +69,8 @@ static void ga_wait_child(pid_t pid, int *status, Error **errp)
     g_assert(rpid == pid);
 }
 
-void qmp_guest_shutdown(bool has_mode, const char *mode, Error **errp)
+void qmp_guest_shutdown(bool has_mode, const char *mode,
+                        Error *errp[static 1])
 {
     const char *shutdown_flag;
     pid_t pid;
@@ -122,7 +123,7 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **errp)
     /* succeeded */
 }
 
-int64_t qmp_guest_get_time(Error **errp)
+int64_t qmp_guest_get_time(Error *errp[static 1])
 {
    int ret;
    qemu_timeval tq;
@@ -136,7 +137,7 @@ int64_t qmp_guest_get_time(Error **errp)
    return tq.tv_sec * 1000000000LL + tq.tv_usec * 1000;
 }
 
-void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
+void qmp_guest_set_time(bool has_time, int64_t time_ns, Error *errp[static 1])
 {
     int ret;
     int status;
@@ -224,7 +225,7 @@ static struct {
     .filehandles = QTAILQ_HEAD_INITIALIZER(guest_file_state.filehandles),
 };
 
-static int64_t guest_file_handle_add(FILE *fh, Error **errp)
+static int64_t guest_file_handle_add(FILE *fh, Error *errp[static 1])
 {
     GuestFileHandle *gfh;
     int64_t handle;
@@ -242,7 +243,8 @@ static int64_t guest_file_handle_add(FILE *fh, Error **errp)
     return handle;
 }
 
-static GuestFileHandle *guest_file_handle_find(int64_t id, Error **errp)
+static GuestFileHandle *guest_file_handle_find(int64_t id,
+                                               Error *errp[static 1])
 {
     GuestFileHandle *gfh;
 
@@ -283,7 +285,7 @@ static const struct {
 };
 
 static int
-find_open_flag(const char *mode_str, Error **errp)
+find_open_flag(const char *mode_str, Error *errp[static 1])
 {
     unsigned mode;
 
@@ -311,7 +313,7 @@ find_open_flag(const char *mode_str, Error **errp)
                                S_IROTH | S_IWOTH)
 
 static FILE *
-safe_open_or_create(const char *path, const char *mode, Error **errp)
+safe_open_or_create(const char *path, const char *mode, Error *errp[static 1])
 {
     Error *local_err = NULL;
     int oflag;
@@ -383,7 +385,7 @@ safe_open_or_create(const char *path, const char *mode, Error **errp)
 }
 
 int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     FILE *fh;
     Error *local_err = NULL;
@@ -414,7 +416,7 @@ int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode,
     return handle;
 }
 
-void qmp_guest_file_close(int64_t handle, Error **errp)
+void qmp_guest_file_close(int64_t handle, Error *errp[static 1])
 {
     GuestFileHandle *gfh = guest_file_handle_find(handle, errp);
     int ret;
@@ -435,7 +437,8 @@ void qmp_guest_file_close(int64_t handle, Error **errp)
 }
 
 struct GuestFileRead *qmp_guest_file_read(int64_t handle, bool has_count,
-                                          int64_t count, Error **errp)
+                                          int64_t count,
+                                          Error *errp[static 1])
 {
     GuestFileHandle *gfh = guest_file_handle_find(handle, errp);
     GuestFileRead *read_data = NULL;
@@ -490,7 +493,7 @@ struct GuestFileRead *qmp_guest_file_read(int64_t handle, bool has_count,
 
 GuestFileWrite *qmp_guest_file_write(int64_t handle, const char *buf_b64,
                                      bool has_count, int64_t count,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     GuestFileWrite *write_data = NULL;
     guchar *buf;
@@ -546,7 +549,7 @@ GuestFileWrite *qmp_guest_file_write(int64_t handle, const char *buf_b64,
 
 struct GuestFileSeek *qmp_guest_file_seek(int64_t handle, int64_t offset,
                                           GuestFileWhence *whence_code,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     GuestFileHandle *gfh = guest_file_handle_find(handle, errp);
     GuestFileSeek *seek_data = NULL;
@@ -585,7 +588,7 @@ struct GuestFileSeek *qmp_guest_file_seek(int64_t handle, int64_t offset,
     return seek_data;
 }
 
-void qmp_guest_file_flush(int64_t handle, Error **errp)
+void qmp_guest_file_flush(int64_t handle, Error *errp[static 1])
 {
     GuestFileHandle *gfh = guest_file_handle_find(handle, errp);
     FILE *fh;
@@ -660,7 +663,8 @@ static int dev_major_minor(const char *devpath,
 /*
  * Walk the mount table and build a list of local file systems
  */
-static void build_fs_mount_list_from_mtab(FsMountList *mounts, Error **errp)
+static void build_fs_mount_list_from_mtab(FsMountList *mounts,
+                                          Error *errp[static 1])
 {
     struct mntent *ment;
     FsMount *mount;
@@ -725,7 +729,7 @@ static void decode_mntname(char *name, int len)
     }
 }
 
-static void build_fs_mount_list(FsMountList *mounts, Error **errp)
+static void build_fs_mount_list(FsMountList *mounts, Error *errp[static 1])
 {
     FsMount *mount;
     char const *mountinfo = "/proc/self/mountinfo";
@@ -786,7 +790,8 @@ static void build_fs_mount_list(FsMountList *mounts, Error **errp)
 
 #if defined(CONFIG_FSFREEZE)
 
-static char *get_pci_driver(char const *syspath, int pathlen, Error **errp)
+static char *get_pci_driver(char const *syspath, int pathlen,
+                            Error *errp[static 1])
 {
     char *path;
     char *dpath;
@@ -816,7 +821,8 @@ static int compare_uint(const void *_a, const void *_b)
 
 /* Walk the specified sysfs and build a sorted list of host or ata numbers */
 static int build_hosts(char const *syspath, char const *host, bool ata,
-                       unsigned int *hosts, int hosts_max, Error **errp)
+                       unsigned int *hosts, int hosts_max,
+                       Error *errp[static 1])
 {
     char *path;
     DIR *dir;
@@ -853,7 +859,7 @@ static int build_hosts(char const *syspath, char const *host, bool ata,
 /* Store disk device info specified by @sysfs into @fs */
 static void build_guest_fsinfo_for_real_device(char const *syspath,
                                                GuestFilesystemInfo *fs,
-                                               Error **errp)
+                                               Error *errp[static 1])
 {
     unsigned int pci[4], host, hosts[8], tgt[3];
     int i, nhosts = 0, pcilen;
@@ -981,13 +987,13 @@ cleanup:
 
 static void build_guest_fsinfo_for_device(char const *devpath,
                                           GuestFilesystemInfo *fs,
-                                          Error **errp);
+                                          Error *errp[static 1]);
 
 /* Store a list of slave devices of virtual volume specified by @syspath into
  * @fs */
 static void build_guest_fsinfo_for_virtual_device(char const *syspath,
                                                   GuestFilesystemInfo *fs,
-                                                  Error **errp)
+                                                  Error *errp[static 1])
 {
     DIR *dir;
     char *dirpath;
@@ -1034,7 +1040,7 @@ static void build_guest_fsinfo_for_virtual_device(char const *syspath,
 /* Dispatch to functions for virtual/real device */
 static void build_guest_fsinfo_for_device(char const *devpath,
                                           GuestFilesystemInfo *fs,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     char *syspath = realpath(devpath, NULL);
 
@@ -1060,7 +1066,7 @@ static void build_guest_fsinfo_for_device(char const *devpath,
 
 /* Return a list of the disk device(s)' info which @mount lies on */
 static GuestFilesystemInfo *build_guest_fsinfo(struct FsMount *mount,
-                                               Error **errp)
+                                               Error *errp[static 1])
 {
     GuestFilesystemInfo *fs = g_malloc0(sizeof(*fs));
     char *devpath = g_strdup_printf("/sys/dev/block/%u:%u",
@@ -1074,7 +1080,7 @@ static GuestFilesystemInfo *build_guest_fsinfo(struct FsMount *mount,
     return fs;
 }
 
-GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
+GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error *errp[static 1])
 {
     FsMountList mounts;
     struct FsMount *mount;
@@ -1171,7 +1177,7 @@ static void execute_fsfreeze_hook(FsfreezeHookArg arg, Error **errp)
 /*
  * Return status of freeze/thaw
  */
-GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
+GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error *errp[static 1])
 {
     if (ga_is_frozen(ga_state)) {
         return GUEST_FSFREEZE_STATUS_FROZEN;
@@ -1180,7 +1186,7 @@ GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
     return GUEST_FSFREEZE_STATUS_THAWED;
 }
 
-int64_t qmp_guest_fsfreeze_freeze(Error **errp)
+int64_t qmp_guest_fsfreeze_freeze(Error *errp[static 1])
 {
     return qmp_guest_fsfreeze_freeze_list(false, NULL, errp);
 }
@@ -1191,7 +1197,7 @@ int64_t qmp_guest_fsfreeze_freeze(Error **errp)
  */
 int64_t qmp_guest_fsfreeze_freeze_list(bool has_mountpoints,
                                        strList *mountpoints,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     int ret = 0, i = 0;
     strList *list;
@@ -1273,7 +1279,7 @@ error:
 /*
  * Walk list of frozen file systems in the guest, and thaw them.
  */
-int64_t qmp_guest_fsfreeze_thaw(Error **errp)
+int64_t qmp_guest_fsfreeze_thaw(Error *errp[static 1])
 {
     int ret;
     FsMountList mounts;
@@ -1346,7 +1352,7 @@ static void guest_fsfreeze_cleanup(void)
  * Walk list of mounted file systems in the guest, and trim them.
  */
 GuestFilesystemTrimResponse *
-qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
+qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error *errp[static 1])
 {
     GuestFilesystemTrimResponse *response;
     GuestFilesystemTrimResultList *list;
@@ -1424,7 +1430,7 @@ qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
 #define SUSPEND_NOT_SUPPORTED 1
 
 static void bios_supports_mode(const char *pmutils_bin, const char *pmutils_arg,
-                               const char *sysfile_str, Error **errp)
+                               const char *sysfile_str, Error *errp[static 1])
 {
     char *pmutils_path;
     pid_t pid;
@@ -1506,7 +1512,7 @@ out:
 }
 
 static void guest_suspend(const char *pmutils_bin, const char *sysfile_str,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     char *pmutils_path;
     pid_t pid;
@@ -1571,7 +1577,7 @@ out:
     g_free(pmutils_path);
 }
 
-void qmp_guest_suspend_disk(Error **errp)
+void qmp_guest_suspend_disk(Error *errp[static 1])
 {
     bios_supports_mode("pm-is-supported", "--hibernate", "disk", errp);
     if (ERR_IS_SET(errp)) {
@@ -1581,7 +1587,7 @@ void qmp_guest_suspend_disk(Error **errp)
     guest_suspend("pm-hibernate", "disk", errp);
 }
 
-void qmp_guest_suspend_ram(Error **errp)
+void qmp_guest_suspend_ram(Error *errp[static 1])
 {
     bios_supports_mode("pm-is-supported", "--suspend", "mem", errp);
     if (ERR_IS_SET(errp)) {
@@ -1591,7 +1597,7 @@ void qmp_guest_suspend_ram(Error **errp)
     guest_suspend("pm-suspend", "mem", errp);
 }
 
-void qmp_guest_suspend_hybrid(Error **errp)
+void qmp_guest_suspend_hybrid(Error *errp[static 1])
 {
     bios_supports_mode("pm-is-supported", "--suspend-hybrid", NULL,
                        errp);
@@ -1618,7 +1624,7 @@ guest_find_interface(GuestNetworkInterfaceList *head,
 /*
  * Build information about guest interfaces
  */
-GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
+GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error *errp[static 1])
 {
     GuestNetworkInterfaceList *head = NULL, *cur_item = NULL;
     struct ifaddrs *ifap, *ifa;
@@ -1764,7 +1770,8 @@ error:
 
 #define SYSCONF_EXACT(name, errp) sysconf_exact((name), #name, (errp))
 
-static long sysconf_exact(int name, const char *name_str, Error **errp)
+static long sysconf_exact(int name, const char *name_str,
+                          Error *errp[static 1])
 {
     long ret;
 
@@ -1796,7 +1803,7 @@ static long sysconf_exact(int name, const char *name_str, Error **errp)
  * Written members remain unmodified on error.
  */
 static void transfer_vcpu(GuestLogicalProcessor *vcpu, bool sys2vcpu,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     char *dirpath;
     int dirfd;
@@ -1853,7 +1860,7 @@ static void transfer_vcpu(GuestLogicalProcessor *vcpu, bool sys2vcpu,
     g_free(dirpath);
 }
 
-GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
+GuestLogicalProcessorList *qmp_guest_get_vcpus(Error *errp[static 1])
 {
     int64_t current;
     GuestLogicalProcessorList *head, **link;
@@ -1892,7 +1899,8 @@ GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
     return NULL;
 }
 
-int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
+int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus,
+                            Error *errp[static 1])
 {
     int64_t processed;
     Error *local_err = NULL;
@@ -1921,7 +1929,7 @@ int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
 void qmp_guest_set_user_password(const char *username,
                                  const char *password,
                                  bool crypted,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     char *passwd_path = NULL;
     pid_t pid;
@@ -2022,7 +2030,7 @@ out:
 }
 
 static void ga_read_sysfs_file(int dirfd, const char *pathname, char *buf,
-                               int size, Error **errp)
+                               int size, Error *errp[static 1])
 {
     int fd;
     int res;
@@ -2044,7 +2052,8 @@ static void ga_read_sysfs_file(int dirfd, const char *pathname, char *buf,
 }
 
 static void ga_write_sysfs_file(int dirfd, const char *pathname,
-                                const char *buf, int size, Error **errp)
+                                const char *buf, int size,
+                                Error *errp[static 1])
 {
     int fd;
 
@@ -2079,7 +2088,7 @@ static void ga_write_sysfs_file(int dirfd, const char *pathname,
  */
 static void transfer_memory_block(GuestMemoryBlock *mem_blk, bool sys2memblk,
                                   GuestMemoryBlockResponse *result,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     char *dirpath;
     int dirfd;
@@ -2200,7 +2209,7 @@ out1:
     }
 }
 
-GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
+GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error *errp[static 1])
 {
     GuestMemoryBlockList *head, **link;
     Error *local_err = NULL;
@@ -2265,7 +2274,8 @@ GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
 }
 
 GuestMemoryBlockResponseList *
-qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
+qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks,
+                            Error *errp[static 1])
 {
     GuestMemoryBlockResponseList *head, **link;
     Error *local_err = NULL;
@@ -2299,7 +2309,7 @@ err:
     return NULL;
 }
 
-GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
+GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error *errp[static 1])
 {
     char *dirpath;
     int dirfd;
@@ -2333,34 +2343,35 @@ GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
 
 #else /* defined(__linux__) */
 
-void qmp_guest_suspend_disk(Error **errp)
+void qmp_guest_suspend_disk(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 }
 
-void qmp_guest_suspend_ram(Error **errp)
+void qmp_guest_suspend_ram(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 }
 
-void qmp_guest_suspend_hybrid(Error **errp)
+void qmp_guest_suspend_hybrid(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 }
 
-GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
+GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
 }
 
-GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
+GuestLogicalProcessorList *qmp_guest_get_vcpus(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
 }
 
-int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
+int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus,
+                            Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return -1;
@@ -2369,25 +2380,26 @@ int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
 void qmp_guest_set_user_password(const char *username,
                                  const char *password,
                                  bool crypted,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 }
 
-GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
+GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
 }
 
 GuestMemoryBlockResponseList *
-qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
+qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks,
+                            Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
 }
 
-GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
+GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
@@ -2397,20 +2409,20 @@ GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
 
 #if !defined(CONFIG_FSFREEZE)
 
-GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
+GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
 }
 
-GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
+GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 
     return 0;
 }
 
-int64_t qmp_guest_fsfreeze_freeze(Error **errp)
+int64_t qmp_guest_fsfreeze_freeze(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 
@@ -2419,14 +2431,14 @@ int64_t qmp_guest_fsfreeze_freeze(Error **errp)
 
 int64_t qmp_guest_fsfreeze_freeze_list(bool has_mountpoints,
                                        strList *mountpoints,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 
     return 0;
 }
 
-int64_t qmp_guest_fsfreeze_thaw(Error **errp)
+int64_t qmp_guest_fsfreeze_thaw(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 
@@ -2436,7 +2448,7 @@ int64_t qmp_guest_fsfreeze_thaw(Error **errp)
 
 #if !defined(CONFIG_FSTRIM)
 GuestFilesystemTrimResponse *
-qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
+qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
@@ -2501,7 +2513,7 @@ static double ga_get_login_time(struct utmpx *user_info)
     return seconds + useconds;
 }
 
-GuestUserList *qmp_guest_get_users(Error **err)
+GuestUserList *qmp_guest_get_users(Error *err[static 1])
 {
     GHashTable *cache = NULL;
     GuestUserList *head = NULL, *cur_item = NULL;
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 9f7936eeeb..34eeafb096 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -103,7 +103,7 @@ static OpenFlags *find_open_flag(const char *mode_str)
     return NULL;
 }
 
-static int64_t guest_file_handle_add(HANDLE fh, Error **errp)
+static int64_t guest_file_handle_add(HANDLE fh, Error *errp[static 1])
 {
     GuestFileHandle *gfh;
     int64_t handle;
@@ -120,7 +120,8 @@ static int64_t guest_file_handle_add(HANDLE fh, Error **errp)
     return handle;
 }
 
-static GuestFileHandle *guest_file_handle_find(int64_t id, Error **errp)
+static GuestFileHandle *guest_file_handle_find(int64_t id,
+                                               Error *errp[static 1])
 {
     GuestFileHandle *gfh;
     QTAILQ_FOREACH(gfh, &guest_file_state.filehandles, next) {
@@ -155,7 +156,7 @@ static void handle_set_nonblocking(HANDLE fh)
 }
 
 int64_t qmp_guest_file_open(const char *path, bool has_mode,
-                            const char *mode, Error **errp)
+                            const char *mode, Error *errp[static 1])
 {
     int64_t fd;
     HANDLE fh;
@@ -200,7 +201,7 @@ int64_t qmp_guest_file_open(const char *path, bool has_mode,
     return fd;
 }
 
-void qmp_guest_file_close(int64_t handle, Error **errp)
+void qmp_guest_file_close(int64_t handle, Error *errp[static 1])
 {
     bool ret;
     GuestFileHandle *gfh = guest_file_handle_find(handle, errp);
@@ -218,7 +219,7 @@ void qmp_guest_file_close(int64_t handle, Error **errp)
     g_free(gfh);
 }
 
-static void acquire_privilege(const char *name, Error **errp)
+static void acquire_privilege(const char *name, Error *errp[static 1])
 {
     HANDLE token = NULL;
     TOKEN_PRIVILEGES priv;
@@ -255,7 +256,7 @@ out:
 }
 
 static void execute_async(DWORD WINAPI (*func)(LPVOID), LPVOID opaque,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     Error *local_err = NULL;
 
@@ -267,7 +268,8 @@ static void execute_async(DWORD WINAPI (*func)(LPVOID), LPVOID opaque,
     }
 }
 
-void qmp_guest_shutdown(bool has_mode, const char *mode, Error **errp)
+void qmp_guest_shutdown(bool has_mode, const char *mode,
+                        Error *errp[static 1])
 {
     UINT shutdown_flag = EWX_FORCE;
 
@@ -299,7 +301,7 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **errp)
 }
 
 GuestFileRead *qmp_guest_file_read(int64_t handle, bool has_count,
-                                   int64_t count, Error **errp)
+                                   int64_t count, Error *errp[static 1])
 {
     GuestFileRead *read_data = NULL;
     guchar *buf;
@@ -342,7 +344,7 @@ GuestFileRead *qmp_guest_file_read(int64_t handle, bool has_count,
 
 GuestFileWrite *qmp_guest_file_write(int64_t handle, const char *buf_b64,
                                      bool has_count, int64_t count,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     GuestFileWrite *write_data = NULL;
     guchar *buf;
@@ -385,7 +387,7 @@ done:
 
 GuestFileSeek *qmp_guest_file_seek(int64_t handle, int64_t offset,
                                    GuestFileWhence *whence_code,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     GuestFileHandle *gfh;
     GuestFileSeek *seek_data;
@@ -419,7 +421,7 @@ GuestFileSeek *qmp_guest_file_seek(int64_t handle, int64_t offset,
     return seek_data;
 }
 
-void qmp_guest_file_flush(int64_t handle, Error **errp)
+void qmp_guest_file_flush(int64_t handle, Error *errp[static 1])
 {
     HANDLE fh;
     GuestFileHandle *gfh = guest_file_handle_find(handle, errp);
@@ -470,7 +472,7 @@ DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,
         0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2,
         0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
 
-static GuestPCIAddress *get_pci_info(char *guid, Error **errp)
+static GuestPCIAddress *get_pci_info(char *guid, Error *errp[static 1])
 {
     HDEVINFO dev_info;
     SP_DEVINFO_DATA dev_info_data;
@@ -564,7 +566,7 @@ out:
     return pci;
 }
 
-static int get_disk_bus_type(HANDLE vol_h, Error **errp)
+static int get_disk_bus_type(HANDLE vol_h, Error *errp[static 1])
 {
     STORAGE_PROPERTY_QUERY query;
     STORAGE_DEVICE_DESCRIPTOR *dev_desc, buf;
@@ -588,7 +590,8 @@ static int get_disk_bus_type(HANDLE vol_h, Error **errp)
 /* VSS provider works with volumes, thus there is no difference if
  * the volume consist of spanned disks. Info about the first disk in the
  * volume is returned for the spanned disk group (LVM) */
-static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
+static GuestDiskAddressList *build_guest_disk_info(char *guid,
+                                                   Error *errp[static 1])
 {
     GuestDiskAddressList *list = NULL;
     GuestDiskAddress *disk;
@@ -648,14 +651,16 @@ out_free:
 
 #else
 
-static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
+static GuestDiskAddressList *build_guest_disk_info(char *guid,
+                                                   Error *errp[static 1])
 {
     return NULL;
 }
 
 #endif /* CONFIG_QGA_NTDDSCSI */
 
-static GuestFilesystemInfo *build_guest_fsinfo(char *guid, Error **errp)
+static GuestFilesystemInfo *build_guest_fsinfo(char *guid,
+                                               Error *errp[static 1])
 {
     DWORD info_size;
     char mnt, *mnt_point;
@@ -703,7 +708,7 @@ free:
     return fs;
 }
 
-GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
+GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error *errp[static 1])
 {
     HANDLE vol_h;
     GuestFilesystemInfoList *new, *ret = NULL;
@@ -737,7 +742,7 @@ GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
 /*
  * Return status of freeze/thaw
  */
-GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
+GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error *errp[static 1])
 {
     if (!vss_initialized()) {
         error_setg(errp, QERR_UNSUPPORTED);
@@ -755,7 +760,7 @@ GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
  * Freeze local file systems using Volume Shadow-copy Service.
  * The frozen state is limited for up to 10 seconds by VSS.
  */
-int64_t qmp_guest_fsfreeze_freeze(Error **errp)
+int64_t qmp_guest_fsfreeze_freeze(Error *errp[static 1])
 {
     int i;
 
@@ -788,7 +793,7 @@ error:
 
 int64_t qmp_guest_fsfreeze_freeze_list(bool has_mountpoints,
                                        strList *mountpoints,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 
@@ -798,7 +803,7 @@ int64_t qmp_guest_fsfreeze_freeze_list(bool has_mountpoints,
 /*
  * Thaw local file systems using Volume Shadow-copy Service.
  */
-int64_t qmp_guest_fsfreeze_thaw(Error **errp)
+int64_t qmp_guest_fsfreeze_thaw(Error *errp[static 1])
 {
     int i;
 
@@ -838,7 +843,7 @@ static void guest_fsfreeze_cleanup(void)
  * areas.
  */
 GuestFilesystemTrimResponse *
-qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
+qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error *errp[static 1])
 {
     GuestFilesystemTrimResponse *resp;
     HANDLE handle;
@@ -940,7 +945,7 @@ typedef enum {
     GUEST_SUSPEND_MODE_RAM
 } GuestSuspendMode;
 
-static void check_suspend_mode(GuestSuspendMode mode, Error **errp)
+static void check_suspend_mode(GuestSuspendMode mode, Error *errp[static 1])
 {
     SYSTEM_POWER_CAPABILITIES sys_pwr_caps;
     Error *local_err = NULL;
@@ -987,7 +992,7 @@ static DWORD WINAPI do_suspend(LPVOID opaque)
     return ret;
 }
 
-void qmp_guest_suspend_disk(Error **errp)
+void qmp_guest_suspend_disk(Error *errp[static 1])
 {
     Error *local_err = NULL;
     GuestSuspendMode *mode = g_new(GuestSuspendMode, 1);
@@ -1003,7 +1008,7 @@ void qmp_guest_suspend_disk(Error **errp)
     }
 }
 
-void qmp_guest_suspend_ram(Error **errp)
+void qmp_guest_suspend_ram(Error *errp[static 1])
 {
     Error *local_err = NULL;
     GuestSuspendMode *mode = g_new(GuestSuspendMode, 1);
@@ -1019,12 +1024,12 @@ void qmp_guest_suspend_ram(Error **errp)
     }
 }
 
-void qmp_guest_suspend_hybrid(Error **errp)
+void qmp_guest_suspend_hybrid(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
 }
 
-static IP_ADAPTER_ADDRESSES *guest_get_adapters_addresses(Error **errp)
+static IP_ADAPTER_ADDRESSES *guest_get_adapters_addresses(Error *errp[static 1])
 {
     IP_ADAPTER_ADDRESSES *adptr_addrs = NULL;
     ULONG adptr_addrs_len = 0;
@@ -1058,7 +1063,7 @@ static char *guest_wctomb_dup(WCHAR *wstr)
 }
 
 static char *guest_addr_to_str(IP_ADAPTER_UNICAST_ADDRESS *ip_addr,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     char addr_str[INET6_ADDRSTRLEN + INET_ADDRSTRLEN];
     DWORD len;
@@ -1145,7 +1150,7 @@ out:
 }
 #endif
 
-GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
+GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error *errp[static 1])
 {
     IP_ADAPTER_ADDRESSES *adptr_addrs, *addr;
     IP_ADAPTER_UNICAST_ADDRESS *ip_addr = NULL;
@@ -1238,7 +1243,7 @@ out:
     return head;
 }
 
-int64_t qmp_guest_get_time(Error **errp)
+int64_t qmp_guest_get_time(Error *errp[static 1])
 {
     SYSTEMTIME ts = {0};
     FILETIME tf;
@@ -1258,7 +1263,7 @@ int64_t qmp_guest_get_time(Error **errp)
                 - W32_FT_OFFSET) * 100;
 }
 
-void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
+void qmp_guest_set_time(bool has_time, int64_t time_ns, Error *errp[static 1])
 {
     SYSTEMTIME ts;
     FILETIME tf;
@@ -1302,7 +1307,7 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
     }
 }
 
-GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
+GuestLogicalProcessorList *qmp_guest_get_vcpus(Error *errp[static 1])
 {
     PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pslpi, ptr;
     DWORD length;
@@ -1372,7 +1377,8 @@ GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
     return NULL;
 }
 
-int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
+int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus,
+                            Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return -1;
@@ -1425,7 +1431,7 @@ get_net_error_message(gint error)
 void qmp_guest_set_user_password(const char *username,
                                  const char *password,
                                  bool crypted,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     NET_API_STATUS nas;
     char *rawpasswddata = NULL;
@@ -1477,20 +1483,21 @@ done:
     g_free(rawpasswddata);
 }
 
-GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
+GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
 }
 
 GuestMemoryBlockResponseList *
-qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
+qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks,
+                            Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
 }
 
-GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
+GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
@@ -1556,7 +1563,7 @@ typedef struct _GA_WTSINFOA {
 
 } GA_WTSINFOA;
 
-GuestUserList *qmp_guest_get_users(Error **err)
+GuestUserList *qmp_guest_get_users(Error *err[static 1])
 {
 #if (_WIN32_WINNT >= 0x0600)
 #define QGA_NANOSECONDS 10000000
diff --git a/qga/commands.c b/qga/commands.c
index 3333ed50b2..6a1e5c9176 100644
--- a/qga/commands.c
+++ b/qga/commands.c
@@ -37,18 +37,18 @@ void slog(const gchar *fmt, ...)
     va_end(ap);
 }
 
-int64_t qmp_guest_sync_delimited(int64_t id, Error **errp)
+int64_t qmp_guest_sync_delimited(int64_t id, Error *errp[static 1])
 {
     ga_set_response_delimited(ga_state);
     return id;
 }
 
-int64_t qmp_guest_sync(int64_t id, Error **errp)
+int64_t qmp_guest_sync(int64_t id, Error *errp[static 1])
 {
     return id;
 }
 
-void qmp_guest_ping(Error **errp)
+void qmp_guest_ping(Error *errp[static 1])
 {
     slog("guest-ping called");
 }
@@ -70,7 +70,7 @@ static void qmp_command_info(QmpCommand *cmd, void *opaque)
     info->supported_commands = cmd_info_list;
 }
 
-struct GuestAgentInfo *qmp_guest_info(Error **errp)
+struct GuestAgentInfo *qmp_guest_info(Error *errp[static 1])
 {
     GuestAgentInfo *info = g_new0(GuestAgentInfo, 1);
 
@@ -142,7 +142,7 @@ static GuestExecInfo *guest_exec_info_find(int64_t pid_numeric)
     return NULL;
 }
 
-GuestExecStatus *qmp_guest_exec_status(int64_t pid, Error **err)
+GuestExecStatus *qmp_guest_exec_status(int64_t pid, Error *err[static 1])
 {
     GuestExecInfo *gei;
     GuestExecStatus *ges;
@@ -481,7 +481,7 @@ done:
 
 /* Convert GuestFileWhence (either a raw integer or an enum value) into
  * the guest's SEEK_ constants.  */
-int ga_parse_whence(GuestFileWhence *whence, Error **errp)
+int ga_parse_whence(GuestFileWhence *whence, Error *errp[static 1])
 {
     /* Exploit the fact that we picked values to match QGA_SEEK_*. */
     if (whence->type == QTYPE_QSTRING) {
@@ -500,7 +500,7 @@ int ga_parse_whence(GuestFileWhence *whence, Error **errp)
     return -1;
 }
 
-GuestHostName *qmp_guest_get_host_name(Error **err)
+GuestHostName *qmp_guest_get_host_name(Error *err[static 1])
 {
     GuestHostName *result = NULL;
     gchar const *hostname = g_get_host_name();
@@ -511,7 +511,7 @@ GuestHostName *qmp_guest_get_host_name(Error **err)
     return result;
 }
 
-GuestTimezone *qmp_guest_get_timezone(Error **errp)
+GuestTimezone *qmp_guest_get_timezone(Error *errp[static 1])
 {
 #if GLIB_CHECK_VERSION(2, 28, 0)
     GuestTimezone *info = NULL;
diff --git a/qga/main.c b/qga/main.c
index 00b064d1e0..8fff47fc1a 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -896,7 +896,7 @@ out:
     return ret;
 }
 
-int64_t ga_get_fd_handle(GAState *s, Error **errp)
+int64_t ga_get_fd_handle(GAState *s, Error *errp[static 1])
 {
     int64_t handle;
 
diff --git a/qga/vss-win32.c b/qga/vss-win32.c
index a80933c98b..2300b71adf 100644
--- a/qga/vss-win32.c
+++ b/qga/vss-win32.c
@@ -145,7 +145,7 @@ void ga_uninstall_vss_provider(void)
 }
 
 /* Call VSS requester and freeze/thaw filesystems and applications */
-void qga_vss_fsfreeze(int *nr_volume, bool freeze, Error **errp)
+void qga_vss_fsfreeze(int *nr_volume, bool freeze, Error *errp[static 1])
 {
     const char *func_name = freeze ? "requester_freeze" : "requester_thaw";
     QGAVSSRequesterFunc func;
diff --git a/qmp.c b/qmp.c
index 9821343ad4..454c77f721 100644
--- a/qmp.c
+++ b/qmp.c
@@ -38,7 +38,7 @@
 #include "hw/mem/pc-dimm.h"
 #include "hw/acpi/acpi_dev_interface.h"
 
-NameInfo *qmp_query_name(Error **errp)
+NameInfo *qmp_query_name(Error *errp[static 1])
 {
     NameInfo *info = g_malloc0(sizeof(*info));
 
@@ -50,7 +50,7 @@ NameInfo *qmp_query_name(Error **errp)
     return info;
 }
 
-VersionInfo *qmp_query_version(Error **errp)
+VersionInfo *qmp_query_version(Error *errp[static 1])
 {
     VersionInfo *info = g_new0(VersionInfo, 1);
 
@@ -63,7 +63,7 @@ VersionInfo *qmp_query_version(Error **errp)
     return info;
 }
 
-KvmInfo *qmp_query_kvm(Error **errp)
+KvmInfo *qmp_query_kvm(Error *errp[static 1])
 {
     KvmInfo *info = g_malloc0(sizeof(*info));
 
@@ -73,7 +73,7 @@ KvmInfo *qmp_query_kvm(Error **errp)
     return info;
 }
 
-UuidInfo *qmp_query_uuid(Error **errp)
+UuidInfo *qmp_query_uuid(Error *errp[static 1])
 {
     UuidInfo *info = g_malloc0(sizeof(*info));
 
@@ -81,13 +81,13 @@ UuidInfo *qmp_query_uuid(Error **errp)
     return info;
 }
 
-void qmp_quit(Error **errp)
+void qmp_quit(Error *errp[static 1])
 {
     no_shutdown = 0;
     qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_QMP);
 }
 
-void qmp_stop(Error **errp)
+void qmp_stop(Error *errp[static 1])
 {
     /* if there is a dump in background, we should wait until the dump
      * finished */
@@ -103,22 +103,22 @@ void qmp_stop(Error **errp)
     }
 }
 
-void qmp_system_reset(Error **errp)
+void qmp_system_reset(Error *errp[static 1])
 {
     qemu_system_reset_request(SHUTDOWN_CAUSE_HOST_QMP);
 }
 
-void qmp_system_powerdown(Error **erp)
+void qmp_system_powerdown(Error *erp[static 1])
 {
     qemu_system_powerdown_request();
 }
 
-void qmp_cpu(int64_t index, Error **errp)
+void qmp_cpu(int64_t index, Error *errp[static 1])
 {
     /* Just do nothing */
 }
 
-void qmp_cpu_add(int64_t id, Error **errp)
+void qmp_cpu_add(int64_t id, Error *errp[static 1])
 {
     MachineClass *mc;
 
@@ -133,13 +133,13 @@ void qmp_cpu_add(int64_t id, Error **errp)
 #ifndef CONFIG_VNC
 /* If VNC support is enabled, the "true" query-vnc command is
    defined in the VNC subsystem */
-VncInfo *qmp_query_vnc(Error **errp)
+VncInfo *qmp_query_vnc(Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "vnc");
     return NULL;
 };
 
-VncInfo2List *qmp_query_vnc_servers(Error **errp)
+VncInfo2List *qmp_query_vnc_servers(Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "vnc");
     return NULL;
@@ -156,13 +156,13 @@ VncInfo2List *qmp_query_vnc_servers(Error **errp)
  * one, or else linking fails.  FIXME Educate the QAPI schema on
  * CONFIG_SPICE.
  */
-SpiceInfo *qmp_query_spice(Error **errp)
+SpiceInfo *qmp_query_spice(Error *errp[static 1])
 {
     abort();
 };
 #endif
 
-void qmp_cont(Error **errp)
+void qmp_cont(Error *errp[static 1])
 {
     BlockBackend *blk;
     BlockDriverState *bs;
@@ -211,12 +211,12 @@ void qmp_cont(Error **errp)
     }
 }
 
-void qmp_system_wakeup(Error **errp)
+void qmp_system_wakeup(Error *errp[static 1])
 {
     qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
 }
 
-ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
+ObjectPropertyInfoList *qmp_qom_list(const char *path, Error *errp[static 1])
 {
     Object *obj;
     bool ambiguous = false;
@@ -251,7 +251,7 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
 }
 
 void qmp_qom_set(const char *path, const char *property, QObject *value,
-                 Error **errp)
+                 Error *errp[static 1])
 {
     Object *obj;
 
@@ -265,7 +265,8 @@ void qmp_qom_set(const char *path, const char *property, QObject *value,
     object_property_set_qobject(obj, value, property, errp);
 }
 
-QObject *qmp_qom_get(const char *path, const char *property, Error **errp)
+QObject *qmp_qom_get(const char *path, const char *property,
+                     Error *errp[static 1])
 {
     Object *obj;
 
@@ -280,7 +281,8 @@ QObject *qmp_qom_get(const char *path, const char *property, Error **errp)
 }
 
 void qmp_set_password(const char *protocol, const char *password,
-                      bool has_connected, const char *connected, Error **errp)
+                      bool has_connected, const char *connected,
+                      Error *errp[static 1])
 {
     int disconnect_if_connected = 0;
     int fail_if_connected = 0;
@@ -330,7 +332,7 @@ void qmp_set_password(const char *protocol, const char *password,
 }
 
 void qmp_expire_password(const char *protocol, const char *whenstr,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     time_t when;
     int rc;
@@ -368,14 +370,14 @@ void qmp_expire_password(const char *protocol, const char *whenstr,
 }
 
 #ifdef CONFIG_VNC
-void qmp_change_vnc_password(const char *password, Error **errp)
+void qmp_change_vnc_password(const char *password, Error *errp[static 1])
 {
     if (vnc_display_password(NULL, password) < 0) {
         error_setg(errp, QERR_SET_PASSWD_FAILED);
     }
 }
 
-static void qmp_change_vnc_listen(const char *target, Error **errp)
+static void qmp_change_vnc_listen(const char *target, Error *errp[static 1])
 {
     QemuOptsList *olist = qemu_find_opts("vnc");
     QemuOpts *opts;
@@ -398,7 +400,7 @@ static void qmp_change_vnc_listen(const char *target, Error **errp)
 }
 
 static void qmp_change_vnc(const char *target, bool has_arg, const char *arg,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     if (strcmp(target, "passwd") == 0 || strcmp(target, "password") == 0) {
         if (!has_arg) {
@@ -411,19 +413,19 @@ static void qmp_change_vnc(const char *target, bool has_arg, const char *arg,
     }
 }
 #else
-void qmp_change_vnc_password(const char *password, Error **errp)
+void qmp_change_vnc_password(const char *password, Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "vnc");
 }
 static void qmp_change_vnc(const char *target, bool has_arg, const char *arg,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     error_setg(errp, QERR_FEATURE_DISABLED, "vnc");
 }
 #endif /* !CONFIG_VNC */
 
 void qmp_change(const char *device, const char *target,
-                bool has_arg, const char *arg, Error **errp)
+                bool has_arg, const char *arg, Error *errp[static 1])
 {
     if (strcmp(device, "vnc") == 0) {
         qmp_change_vnc(target, has_arg, arg, errp);
@@ -451,7 +453,7 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
                                        const char *implements,
                                        bool has_abstract,
                                        bool abstract,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     ObjectTypeInfoList *ret = NULL;
 
@@ -512,7 +514,7 @@ static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
 }
 
 DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
-                                                   Error **errp)
+                                                   Error *errp[static 1])
 {
     ObjectClass *klass;
     Object *obj;
@@ -579,35 +581,35 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
     return prop_list;
 }
 
-CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
+CpuDefinitionInfoList *qmp_query_cpu_definitions(Error *errp[static 1])
 {
     return arch_query_cpu_definitions(errp);
 }
 
 CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
                                                      CpuModelInfo *model,
-                                                     Error **errp)
+                                                     Error *errp[static 1])
 {
     return arch_query_cpu_model_expansion(type, model, errp);
 }
 
 CpuModelCompareInfo *qmp_query_cpu_model_comparison(CpuModelInfo *modela,
                                                     CpuModelInfo *modelb,
-                                                    Error **errp)
+                                                    Error *errp[static 1])
 {
     return arch_query_cpu_model_comparison(modela, modelb, errp);
 }
 
 CpuModelBaselineInfo *qmp_query_cpu_model_baseline(CpuModelInfo *modela,
                                                    CpuModelInfo *modelb,
-                                                   Error **errp)
+                                                   Error *errp[static 1])
 {
     return arch_query_cpu_model_baseline(modela, modelb, errp);
 }
 
 void qmp_add_client(const char *protocol, const char *fdname,
                     bool has_skipauth, bool skipauth, bool has_tls, bool tls,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     Chardev *s;
     int fd;
@@ -650,7 +652,7 @@ void qmp_add_client(const char *protocol, const char *fdname,
 
 
 void qmp_object_add(const char *type, const char *id,
-                    bool has_props, QObject *props, Error **errp)
+                    bool has_props, QObject *props, Error *errp[static 1])
 {
     QDict *pdict;
     Visitor *v;
@@ -676,12 +678,12 @@ void qmp_object_add(const char *type, const char *id,
     QDECREF(pdict);
 }
 
-void qmp_object_del(const char *id, Error **errp)
+void qmp_object_del(const char *id, Error *errp[static 1])
 {
     user_creatable_del(id, errp);
 }
 
-MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp)
+MemoryDeviceInfoList *qmp_query_memory_devices(Error *errp[static 1])
 {
     MemoryDeviceInfoList *head = NULL;
     MemoryDeviceInfoList **prev = &head;
@@ -691,7 +693,7 @@ MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp)
     return head;
 }
 
-ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
+ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error *errp[static 1])
 {
     bool ambig;
     ACPIOSTInfoList *head = NULL;
diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index 506514100c..24a63ef61c 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -556,7 +556,8 @@ QObject *json_parser_parse(GQueue *tokens, va_list *ap)
     return json_parser_parse_err(tokens, ap, IGNORE_ERRORS);
 }
 
-QObject *json_parser_parse_err(GQueue *tokens, va_list *ap, Error **errp)
+QObject *json_parser_parse_err(GQueue *tokens, va_list *ap,
+                               Error *errp[static 1])
 {
     JSONParserContext *ctxt = parser_context_new(tokens);
     QObject *result;
diff --git a/qobject/qdict.c b/qobject/qdict.c
index 88e2ecd658..5a9ea24ffc 100644
--- a/qobject/qdict.c
+++ b/qobject/qdict.c
@@ -732,7 +732,7 @@ static void qdict_split_flat_key(const char *key, char **prefix,
  *
  * Returns: 1 if a valid list, 0 if a dict, -1 on error
  */
-static int qdict_is_list(QDict *maybe_list, Error **errp)
+static int qdict_is_list(QDict *maybe_list, Error *errp[static 1])
 {
     const QDictEntry *ent;
     ssize_t len = 0;
@@ -825,7 +825,7 @@ static int qdict_is_list(QDict *maybe_list, Error **errp)
  * Returns: either a QDict or QList for the nested data structure, or NULL
  * on error
  */
-QObject *qdict_crumple(const QDict *src, Error **errp)
+QObject *qdict_crumple(const QDict *src, Error *errp[static 1])
 {
     const QDictEntry *ent;
     QDict *two_level, *multi_level = NULL;
diff --git a/qobject/qjson.c b/qobject/qjson.c
index b2f3bfec53..fb9b5e8ebc 100644
--- a/qobject/qjson.c
+++ b/qobject/qjson.c
@@ -35,7 +35,8 @@ static void parse_json(JSONMessageParser *parser, GQueue *tokens)
     s->result = json_parser_parse_err(tokens, s->ap, &s->err);
 }
 
-QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
+QObject *qobject_from_jsonv(const char *string, va_list *ap,
+                            Error *errp[static 1])
 {
     JSONParsingState state = {};
 
@@ -50,7 +51,7 @@ QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
     return state.result;
 }
 
-QObject *qobject_from_json(const char *string, Error **errp)
+QObject *qobject_from_json(const char *string, Error *errp[static 1])
 {
     return qobject_from_jsonv(string, NULL, errp);
 }
diff --git a/qom/cpu.c b/qom/cpu.c
index 50698767dd..b724df7416 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -99,7 +99,7 @@ static bool cpu_common_get_paging_enabled(const CPUState *cpu)
 }
 
 void cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     CPUClass *cc = CPU_GET_CLASS(cpu);
 
@@ -108,7 +108,7 @@ void cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list,
 
 static void cpu_common_get_memory_mapping(CPUState *cpu,
                                           MemoryMappingList *list,
-                                          Error **errp)
+                                          Error *errp[static 1])
 {
     error_setg(errp, "Obtaining memory mappings is unsupported on this CPU.");
 }
@@ -320,7 +320,7 @@ static ObjectClass *cpu_common_class_by_name(const char *cpu_model)
 }
 
 static void cpu_common_parse_features(const char *typename, char *features,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     char *featurestr; /* Single "key=value" string being parsed */
     char *val;
@@ -359,7 +359,7 @@ static void cpu_common_parse_features(const char *typename, char *features,
     }
 }
 
-static void cpu_common_realizefn(DeviceState *dev, Error **errp)
+static void cpu_common_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cpu = CPU(dev);
 
@@ -372,7 +372,7 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp)
     trace_init_vcpu(cpu);
 }
 
-static void cpu_common_unrealizefn(DeviceState *dev, Error **errp)
+static void cpu_common_unrealizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cpu = CPU(dev);
     /* NOTE: latest generic point before the cpu is fully unrealized */
diff --git a/qom/object.c b/qom/object.c
index 2a0084ea96..8d9e1e8dc5 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -414,7 +414,8 @@ static void object_property_del_all(Object *obj)
     g_hash_table_unref(obj->properties);
 }
 
-static void object_property_del_child(Object *obj, Object *child, Error **errp)
+static void object_property_del_child(Object *obj, Object *child,
+                                      Error *errp[static 1])
 {
     ObjectProperty *prop;
     GHashTableIter iter;
@@ -498,7 +499,7 @@ Object *object_new(const char *typename)
 Object *object_new_with_props(const char *typename,
                               Object *parent,
                               const char *id,
-                              Error **errp,
+                              Error *errp[static 1],
                               ...)
 {
     va_list vargs;
@@ -562,7 +563,7 @@ Object *object_new_with_propv(const char *typename,
 
 
 int object_set_props(Object *obj,
-                     Error **errp,
+                     Error *errp[static 1],
                      ...)
 {
     va_list vargs;
@@ -909,7 +910,7 @@ object_property_add(Object *obj, const char *name, const char *type,
                     ObjectPropertyAccessor *get,
                     ObjectPropertyAccessor *set,
                     ObjectPropertyRelease *release,
-                    void *opaque, Error **errp)
+                    void *opaque, Error *errp[static 1])
 {
     ObjectProperty *prop;
     size_t name_len = strlen(name);
@@ -963,7 +964,7 @@ object_class_property_add(ObjectClass *klass,
                           ObjectPropertyAccessor *set,
                           ObjectPropertyRelease *release,
                           void *opaque,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     ObjectProperty *prop;
 
@@ -990,7 +991,7 @@ object_class_property_add(ObjectClass *klass,
 }
 
 ObjectProperty *object_property_find(Object *obj, const char *name,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     ObjectProperty *prop;
     ObjectClass *klass = object_get_class(obj);
@@ -1030,7 +1031,7 @@ ObjectProperty *object_property_iter_next(ObjectPropertyIterator *iter)
 }
 
 ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     ObjectProperty *prop;
     ObjectClass *parent_klass;
@@ -1050,7 +1051,7 @@ ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
     return prop;
 }
 
-void object_property_del(Object *obj, const char *name, Error **errp)
+void object_property_del(Object *obj, const char *name, Error *errp[static 1])
 {
     ObjectProperty *prop = g_hash_table_lookup(obj->properties, name);
 
@@ -1066,7 +1067,7 @@ void object_property_del(Object *obj, const char *name, Error **errp)
 }
 
 void object_property_get(Object *obj, Visitor *v, const char *name,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     ObjectProperty *prop = object_property_find(obj, name, errp);
     if (prop == NULL) {
@@ -1081,7 +1082,7 @@ void object_property_get(Object *obj, Visitor *v, const char *name,
 }
 
 void object_property_set(Object *obj, Visitor *v, const char *name,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     ObjectProperty *prop = object_property_find(obj, name, errp);
     if (prop == NULL) {
@@ -1096,7 +1097,7 @@ void object_property_set(Object *obj, Visitor *v, const char *name,
 }
 
 void object_property_set_str(Object *obj, const char *value,
-                             const char *name, Error **errp)
+                             const char *name, Error *errp[static 1])
 {
     QString *qstr = qstring_from_str(value);
     object_property_set_qobject(obj, QOBJECT(qstr), name, errp);
@@ -1105,7 +1106,7 @@ void object_property_set_str(Object *obj, const char *value,
 }
 
 char *object_property_get_str(Object *obj, const char *name,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     QObject *ret = object_property_get_qobject(obj, name, errp);
     QString *qstring;
@@ -1127,7 +1128,7 @@ char *object_property_get_str(Object *obj, const char *name,
 }
 
 void object_property_set_link(Object *obj, Object *value,
-                              const char *name, Error **errp)
+                              const char *name, Error *errp[static 1])
 {
     if (value) {
         gchar *path = object_get_canonical_path(value);
@@ -1139,7 +1140,7 @@ void object_property_set_link(Object *obj, Object *value,
 }
 
 Object *object_property_get_link(Object *obj, const char *name,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     char *str = object_property_get_str(obj, name, errp);
     Object *target = NULL;
@@ -1157,7 +1158,7 @@ Object *object_property_get_link(Object *obj, const char *name,
 }
 
 void object_property_set_bool(Object *obj, bool value,
-                              const char *name, Error **errp)
+                              const char *name, Error *errp[static 1])
 {
     QBool *qbool = qbool_from_bool(value);
     object_property_set_qobject(obj, QOBJECT(qbool), name, errp);
@@ -1166,7 +1167,7 @@ void object_property_set_bool(Object *obj, bool value,
 }
 
 bool object_property_get_bool(Object *obj, const char *name,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     QObject *ret = object_property_get_qobject(obj, name, errp);
     QBool *qbool;
@@ -1188,7 +1189,7 @@ bool object_property_get_bool(Object *obj, const char *name,
 }
 
 void object_property_set_int(Object *obj, int64_t value,
-                             const char *name, Error **errp)
+                             const char *name, Error *errp[static 1])
 {
     QInt *qint = qint_from_int(value);
     object_property_set_qobject(obj, QOBJECT(qint), name, errp);
@@ -1197,7 +1198,7 @@ void object_property_set_int(Object *obj, int64_t value,
 }
 
 int64_t object_property_get_int(Object *obj, const char *name,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     QObject *ret = object_property_get_qobject(obj, name, errp);
     QInt *qint;
@@ -1225,7 +1226,7 @@ typedef struct EnumProperty {
 } EnumProperty;
 
 int object_property_get_enum(Object *obj, const char *name,
-                             const char *typename, Error **errp)
+                             const char *typename, Error *errp[static 1])
 {
     Visitor *v;
     char *str;
@@ -1264,7 +1265,7 @@ int object_property_get_enum(Object *obj, const char *name,
 }
 
 void object_property_get_uint16List(Object *obj, const char *name,
-                                    uint16List **list, Error **errp)
+                                    uint16List **list, Error *errp[static 1])
 {
     Visitor *v;
     char *str;
@@ -1285,7 +1286,7 @@ out:
 }
 
 void object_property_parse(Object *obj, const char *string,
-                           const char *name, Error **errp)
+                           const char *name, Error *errp[static 1])
 {
     Visitor *v = string_input_visitor_new(string);
     object_property_set(obj, v, name, errp);
@@ -1293,7 +1294,7 @@ void object_property_parse(Object *obj, const char *string,
 }
 
 char *object_property_print(Object *obj, const char *name, bool human,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     Visitor *v;
     char *string = NULL;
@@ -1311,7 +1312,8 @@ out:
     return string;
 }
 
-const char *object_property_get_type(Object *obj, const char *name, Error **errp)
+const char *object_property_get_type(Object *obj, const char *name,
+                                     Error *errp[static 1])
 {
     ObjectProperty *prop = object_property_find(obj, name, errp);
     if (prop == NULL) {
@@ -1339,7 +1341,7 @@ Object *object_get_objects_root(void)
 
 static void object_get_child_property(Object *obj, Visitor *v,
                                       const char *name, void *opaque,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     Object *child = opaque;
     gchar *path;
@@ -1367,7 +1369,7 @@ static void object_finalize_child_property(Object *obj, const char *name,
 }
 
 void object_property_add_child(Object *obj, const char *name,
-                               Object *child, Error **errp)
+                               Object *child, Error *errp[static 1])
 {
     Error *local_err = NULL;
     gchar *type;
@@ -1396,7 +1398,7 @@ out:
 }
 
 void object_property_allow_set_link(Object *obj, const char *name,
-                                    Object *val, Error **errp)
+                                    Object *val, Error *errp[static 1])
 {
     /* Allow the link to be set, always */
 }
@@ -1409,7 +1411,7 @@ typedef struct {
 
 static void object_get_link_property(Object *obj, Visitor *v,
                                      const char *name, void *opaque,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     LinkProperty *lprop = opaque;
     Object **child = lprop->child;
@@ -1435,7 +1437,7 @@ static void object_get_link_property(Object *obj, Visitor *v,
  * Returns: The matched object or NULL on path lookup failures.
  */
 static Object *object_resolve_link(Object *obj, const char *name,
-                                   const char *path, Error **errp)
+                                   const char *path, Error *errp[static 1])
 {
     const char *type;
     gchar *target_type;
@@ -1467,7 +1469,7 @@ static Object *object_resolve_link(Object *obj, const char *name,
 
 static void object_set_link_property(Object *obj, Visitor *v,
                                      const char *name, void *opaque,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     Error *local_err = NULL;
     LinkProperty *prop = opaque;
@@ -1522,7 +1524,7 @@ void object_property_add_link(Object *obj, const char *name,
                               void (*check)(Object *, const char *,
                                             Object *, Error **),
                               ObjectPropertyLinkFlags flags,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     Error *local_err = NULL;
     LinkProperty *prop = g_malloc(sizeof(*prop));
@@ -1554,7 +1556,7 @@ out:
 }
 
 void object_property_add_const_link(Object *obj, const char *name,
-                                    Object *target, Error **errp)
+                                    Object *target, Error *errp[static 1])
 {
     char *link_type;
     ObjectProperty *op;
@@ -1731,7 +1733,7 @@ typedef struct StringProperty
 } StringProperty;
 
 static void property_get_str(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     StringProperty *prop = opaque;
     char *value;
@@ -1748,7 +1750,7 @@ static void property_get_str(Object *obj, Visitor *v, const char *name,
 }
 
 static void property_set_str(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     StringProperty *prop = opaque;
     char *value;
@@ -1772,7 +1774,7 @@ static void property_release_str(Object *obj, const char *name,
 void object_property_add_str(Object *obj, const char *name,
                            char *(*get)(Object *, Error **),
                            void (*set)(Object *, const char *, Error **),
-                           Error **errp)
+                           Error *errp[static 1])
 {
     StringProperty *prop = g_malloc0(sizeof(*prop));
 
@@ -1793,7 +1795,7 @@ void object_class_property_add_str(ObjectClass *klass, const char *name,
                                    char *(*get)(Object *, Error **),
                                    void (*set)(Object *, const char *,
                                                Error **),
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     StringProperty *prop = g_malloc0(sizeof(*prop));
 
@@ -1817,7 +1819,7 @@ typedef struct BoolProperty
 } BoolProperty;
 
 static void property_get_bool(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     BoolProperty *prop = opaque;
     bool value;
@@ -1833,7 +1835,7 @@ static void property_get_bool(Object *obj, Visitor *v, const char *name,
 }
 
 static void property_set_bool(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     BoolProperty *prop = opaque;
     bool value;
@@ -1856,7 +1858,7 @@ static void property_release_bool(Object *obj, const char *name,
 void object_property_add_bool(Object *obj, const char *name,
                               bool (*get)(Object *, Error **),
                               void (*set)(Object *, bool, Error **),
-                              Error **errp)
+                              Error *errp[static 1])
 {
     BoolProperty *prop = g_malloc0(sizeof(*prop));
 
@@ -1876,7 +1878,7 @@ void object_property_add_bool(Object *obj, const char *name,
 void object_class_property_add_bool(ObjectClass *klass, const char *name,
                                     bool (*get)(Object *, Error **),
                                     void (*set)(Object *, bool, Error **),
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     BoolProperty *prop = g_malloc0(sizeof(*prop));
 
@@ -1894,7 +1896,7 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
 }
 
 static void property_get_enum(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     EnumProperty *prop = opaque;
     int value;
@@ -1910,7 +1912,7 @@ static void property_get_enum(Object *obj, Visitor *v, const char *name,
 }
 
 static void property_set_enum(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     EnumProperty *prop = opaque;
     int value;
@@ -1934,7 +1936,7 @@ void object_property_add_enum(Object *obj, const char *name,
                               const char * const *strings,
                               int (*get)(Object *, Error **),
                               void (*set)(Object *, int, Error **),
-                              Error **errp)
+                              Error *errp[static 1])
 {
     EnumProperty *prop = g_malloc(sizeof(*prop));
 
@@ -1957,7 +1959,7 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
                                     const char * const *strings,
                                     int (*get)(Object *, Error **),
                                     void (*set)(Object *, int, Error **),
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     EnumProperty *prop = g_malloc(sizeof(*prop));
 
@@ -1980,7 +1982,7 @@ typedef struct TMProperty {
 } TMProperty;
 
 static void property_get_tm(Object *obj, Visitor *v, const char *name,
-                            void *opaque, Error **errp)
+                            void *opaque, Error *errp[static 1])
 {
     TMProperty *prop = opaque;
     Error *err = NULL;
@@ -2036,7 +2038,7 @@ static void property_release_tm(Object *obj, const char *name,
 
 void object_property_add_tm(Object *obj, const char *name,
                             void (*get)(Object *, struct tm *, Error **),
-                            Error **errp)
+                            Error *errp[static 1])
 {
     TMProperty *prop = g_malloc0(sizeof(*prop));
 
@@ -2053,7 +2055,7 @@ void object_property_add_tm(Object *obj, const char *name,
 
 void object_class_property_add_tm(ObjectClass *klass, const char *name,
                                   void (*get)(Object *, struct tm *, Error **),
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     TMProperty *prop = g_malloc0(sizeof(*prop));
 
@@ -2068,90 +2070,94 @@ void object_class_property_add_tm(ObjectClass *klass, const char *name,
     }
 }
 
-static char *qdev_get_type(Object *obj, Error **errp)
+static char *qdev_get_type(Object *obj, Error *errp[static 1])
 {
     return g_strdup(object_get_typename(obj));
 }
 
 static void property_get_uint8_ptr(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     uint8_t value = *(uint8_t *)opaque;
     visit_type_uint8(v, name, &value, errp);
 }
 
 static void property_get_uint16_ptr(Object *obj, Visitor *v, const char *name,
-                                    void *opaque, Error **errp)
+                                    void *opaque, Error *errp[static 1])
 {
     uint16_t value = *(uint16_t *)opaque;
     visit_type_uint16(v, name, &value, errp);
 }
 
 static void property_get_uint32_ptr(Object *obj, Visitor *v, const char *name,
-                                    void *opaque, Error **errp)
+                                    void *opaque, Error *errp[static 1])
 {
     uint32_t value = *(uint32_t *)opaque;
     visit_type_uint32(v, name, &value, errp);
 }
 
 static void property_get_uint64_ptr(Object *obj, Visitor *v, const char *name,
-                                    void *opaque, Error **errp)
+                                    void *opaque, Error *errp[static 1])
 {
     uint64_t value = *(uint64_t *)opaque;
     visit_type_uint64(v, name, &value, errp);
 }
 
 void object_property_add_uint8_ptr(Object *obj, const char *name,
-                                   const uint8_t *v, Error **errp)
+                                   const uint8_t *v, Error *errp[static 1])
 {
     object_property_add(obj, name, "uint8", property_get_uint8_ptr,
                         NULL, NULL, (void *)v, errp);
 }
 
 void object_class_property_add_uint8_ptr(ObjectClass *klass, const char *name,
-                                         const uint8_t *v, Error **errp)
+                                         const uint8_t *v,
+                                         Error *errp[static 1])
 {
     object_class_property_add(klass, name, "uint8", property_get_uint8_ptr,
                               NULL, NULL, (void *)v, errp);
 }
 
 void object_property_add_uint16_ptr(Object *obj, const char *name,
-                                    const uint16_t *v, Error **errp)
+                                    const uint16_t *v, Error *errp[static 1])
 {
     object_property_add(obj, name, "uint16", property_get_uint16_ptr,
                         NULL, NULL, (void *)v, errp);
 }
 
 void object_class_property_add_uint16_ptr(ObjectClass *klass, const char *name,
-                                          const uint16_t *v, Error **errp)
+                                          const uint16_t *v,
+                                          Error *errp[static 1])
 {
     object_class_property_add(klass, name, "uint16", property_get_uint16_ptr,
                               NULL, NULL, (void *)v, errp);
 }
 
 void object_property_add_uint32_ptr(Object *obj, const char *name,
-                                    const uint32_t *v, Error **errp)
+                                    const uint32_t *v, Error *errp[static 1])
 {
     object_property_add(obj, name, "uint32", property_get_uint32_ptr,
                         NULL, NULL, (void *)v, errp);
 }
 
 void object_class_property_add_uint32_ptr(ObjectClass *klass, const char *name,
-                                          const uint32_t *v, Error **errp)
+                                          const uint32_t *v,
+                                          Error *errp[static 1])
 {
     object_class_property_add(klass, name, "uint32", property_get_uint32_ptr,
                               NULL, NULL, (void *)v, errp);
 }
 
 void object_property_add_uint64_ptr(Object *obj, const char *name,
-                                    const uint64_t *v, Error **errp)
+                                    const uint64_t *v, Error *errp[static 1])
 {
     object_property_add(obj, name, "uint64", property_get_uint64_ptr,
                         NULL, NULL, (void *)v, errp);
 }
 
 void object_class_property_add_uint64_ptr(ObjectClass *klass, const char *name,
-                                          const uint64_t *v, Error **errp)
+                                          const uint64_t *v,
+                                          Error *errp[static 1])
 {
     object_class_property_add(klass, name, "uint64", property_get_uint64_ptr,
                               NULL, NULL, (void *)v, errp);
@@ -2163,7 +2169,7 @@ typedef struct {
 } AliasProperty;
 
 static void property_get_alias(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     AliasProperty *prop = opaque;
 
@@ -2171,7 +2177,7 @@ static void property_get_alias(Object *obj, Visitor *v, const char *name,
 }
 
 static void property_set_alias(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     AliasProperty *prop = opaque;
 
@@ -2196,7 +2202,7 @@ static void property_release_alias(Object *obj, const char *name, void *opaque)
 
 void object_property_add_alias(Object *obj, const char *name,
                                Object *target_obj, const char *target_name,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     AliasProperty *prop;
     ObjectProperty *op;
@@ -2241,7 +2247,8 @@ out:
 }
 
 void object_property_set_description(Object *obj, const char *name,
-                                     const char *description, Error **errp)
+                                     const char *description,
+                                     Error *errp[static 1])
 {
     ObjectProperty *op;
 
@@ -2257,7 +2264,7 @@ void object_property_set_description(Object *obj, const char *name,
 void object_class_property_set_description(ObjectClass *klass,
                                            const char *name,
                                            const char *description,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     ObjectProperty *op;
 
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index e8f0fa9b8d..08e09951fc 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -6,7 +6,7 @@
 #include "qapi/opts-visitor.h"
 #include "qemu/config-file.h"
 
-void user_creatable_complete(Object *obj, Error **errp)
+void user_creatable_complete(Object *obj, Error *errp[static 1])
 {
 
     UserCreatableClass *ucc;
@@ -23,7 +23,7 @@ void user_creatable_complete(Object *obj, Error **errp)
     }
 }
 
-bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp)
+bool user_creatable_can_be_deleted(UserCreatable *uc, Error *errp[static 1])
 {
 
     UserCreatableClass *ucc = USER_CREATABLE_GET_CLASS(uc);
@@ -37,7 +37,7 @@ bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp)
 
 Object *user_creatable_add_type(const char *type, const char *id,
                                 const QDict *qdict,
-                                Visitor *v, Error **errp)
+                                Visitor *v, Error *errp[static 1])
 {
     Object *obj;
     ObjectClass *klass;
@@ -109,7 +109,7 @@ out:
 }
 
 
-Object *user_creatable_add_opts(QemuOpts *opts, Error **errp)
+Object *user_creatable_add_opts(QemuOpts *opts, Error *errp[static 1])
 {
     Visitor *v;
     QDict *pdict;
@@ -143,7 +143,8 @@ Object *user_creatable_add_opts(QemuOpts *opts, Error **errp)
 }
 
 
-int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
+int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts,
+                                    Error *errp[static 1])
 {
     bool (*type_predicate)(const char *) = opaque;
     Object *obj = NULL;
@@ -166,7 +167,7 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
 }
 
 
-void user_creatable_del(const char *id, Error **errp)
+void user_creatable_del(const char *id, Error *errp[static 1])
 {
     Object *container;
     Object *obj;
diff --git a/qom/qom-qobject.c b/qom/qom-qobject.c
index 4aec20d73c..cd7d143f18 100644
--- a/qom/qom-qobject.c
+++ b/qom/qom-qobject.c
@@ -19,7 +19,7 @@
 #include "qapi/qobject-output-visitor.h"
 
 void object_property_set_qobject(Object *obj, QObject *value,
-                                 const char *name, Error **errp)
+                                 const char *name, Error *errp[static 1])
 {
     Visitor *v;
 
@@ -29,7 +29,7 @@ void object_property_set_qobject(Object *obj, QObject *value,
 }
 
 QObject *object_property_get_qobject(Object *obj, const char *name,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     QObject *ret = NULL;
     Error *local_err = NULL;
diff --git a/qtest.c b/qtest.c
index 9a5d1dc50d..7c79a4a5c0 100644
--- a/qtest.c
+++ b/qtest.c
@@ -669,7 +669,8 @@ static int qtest_init_accel(MachineState *ms)
     return 0;
 }
 
-void qtest_init(const char *qtest_chrdev, const char *qtest_log, Error **errp)
+void qtest_init(const char *qtest_chrdev, const char *qtest_log,
+                Error *errp[static 1])
 {
     Chardev *chr;
 
diff --git a/replication.c b/replication.c
index d8f00e75b2..174b2c7008 100644
--- a/replication.c
+++ b/replication.c
@@ -42,7 +42,7 @@ void replication_remove(ReplicationState *rs)
 /*
  * The caller of the function MUST make sure vm stopped
  */
-void replication_start_all(ReplicationMode mode, Error **errp)
+void replication_start_all(ReplicationMode mode, Error *errp[static 1])
 {
     ReplicationState *rs, *next;
 
@@ -56,7 +56,7 @@ void replication_start_all(ReplicationMode mode, Error **errp)
     }
 }
 
-void replication_do_checkpoint_all(Error **errp)
+void replication_do_checkpoint_all(Error *errp[static 1])
 {
     ReplicationState *rs, *next;
 
@@ -70,7 +70,7 @@ void replication_do_checkpoint_all(Error **errp)
     }
 }
 
-void replication_get_error_all(Error **errp)
+void replication_get_error_all(Error *errp[static 1])
 {
     ReplicationState *rs, *next;
 
@@ -84,7 +84,7 @@ void replication_get_error_all(Error **errp)
     }
 }
 
-void replication_stop_all(bool failover, Error **errp)
+void replication_stop_all(bool failover, Error *errp[static 1])
 {
     ReplicationState *rs, *next;
 
diff --git a/stubs/arch-query-cpu-def.c b/stubs/arch-query-cpu-def.c
index cefe4beb82..051811a10a 100644
--- a/stubs/arch-query-cpu-def.c
+++ b/stubs/arch-query-cpu-def.c
@@ -3,7 +3,7 @@
 #include "sysemu/arch_init.h"
 #include "qapi/qmp/qerror.h"
 
-CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
+CpuDefinitionInfoList *arch_query_cpu_definitions(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
diff --git a/stubs/arch-query-cpu-model-baseline.c b/stubs/arch-query-cpu-model-baseline.c
index 094ec13c2c..aca479b75b 100644
--- a/stubs/arch-query-cpu-model-baseline.c
+++ b/stubs/arch-query-cpu-model-baseline.c
@@ -5,7 +5,7 @@
 
 CpuModelBaselineInfo *arch_query_cpu_model_baseline(CpuModelInfo *modela,
                                                     CpuModelInfo *modelb,
-                                                    Error **errp)
+                                                    Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
diff --git a/stubs/arch-query-cpu-model-comparison.c b/stubs/arch-query-cpu-model-comparison.c
index d5486ae980..2e384ce2da 100644
--- a/stubs/arch-query-cpu-model-comparison.c
+++ b/stubs/arch-query-cpu-model-comparison.c
@@ -5,7 +5,7 @@
 
 CpuModelCompareInfo *arch_query_cpu_model_comparison(CpuModelInfo *modela,
                                                      CpuModelInfo *modelb,
-                                                     Error **errp)
+                                                     Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
diff --git a/stubs/arch-query-cpu-model-expansion.c b/stubs/arch-query-cpu-model-expansion.c
index ae7cf554d1..39167206a8 100644
--- a/stubs/arch-query-cpu-model-expansion.c
+++ b/stubs/arch-query-cpu-model-expansion.c
@@ -5,7 +5,7 @@
 
 CpuModelExpansionInfo *arch_query_cpu_model_expansion(CpuModelExpansionType type,
                                                       CpuModelInfo *mode,
-                                                      Error **errp)
+                                                      Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
diff --git a/stubs/migr-blocker.c b/stubs/migr-blocker.c
index 2b64ac9560..c1545510bb 100644
--- a/stubs/migr-blocker.c
+++ b/stubs/migr-blocker.c
@@ -2,7 +2,7 @@
 #include "qemu-common.h"
 #include "migration/blocker.h"
 
-int migrate_add_blocker(Error *reason, Error **errp)
+int migrate_add_blocker(Error *reason, Error *errp[static 1])
 {
     return 0;
 }
diff --git a/stubs/monitor.c b/stubs/monitor.c
index e018c8f594..2d6092441b 100644
--- a/stubs/monitor.c
+++ b/stubs/monitor.c
@@ -5,7 +5,7 @@
 
 Monitor *cur_mon = NULL;
 
-int monitor_get_fd(Monitor *mon, const char *name, Error **errp)
+int monitor_get_fd(Monitor *mon, const char *name, Error *errp[static 1])
 {
     error_setg(errp, "only QEMU supports file descriptor passing");
     return -1;
diff --git a/stubs/uuid.c b/stubs/uuid.c
index a880de8d61..49cbda99a4 100644
--- a/stubs/uuid.c
+++ b/stubs/uuid.c
@@ -3,7 +3,7 @@
 #include "qemu/uuid.h"
 #include "qmp-commands.h"
 
-UuidInfo *qmp_query_uuid(Error **errp)
+UuidInfo *qmp_query_uuid(Error *errp[static 1])
 {
     UuidInfo *info = g_malloc0(sizeof(*info));
 
diff --git a/stubs/vmgenid.c b/stubs/vmgenid.c
index c64eb7a16e..b42a5e5a47 100644
--- a/stubs/vmgenid.c
+++ b/stubs/vmgenid.c
@@ -2,7 +2,7 @@
 #include "qmp-commands.h"
 #include "qapi/qmp/qerror.h"
 
-GuidInfo *qmp_query_vm_generation_id(Error **errp)
+GuidInfo *qmp_query_vm_generation_id(Error *errp[static 1])
 {
     error_setg(errp, QERR_UNSUPPORTED);
     return NULL;
diff --git a/stubs/vmstate.c b/stubs/vmstate.c
index 6399474e49..a5356ccc0e 100644
--- a/stubs/vmstate.c
+++ b/stubs/vmstate.c
@@ -9,7 +9,7 @@ int vmstate_register_with_alias_id(DeviceState *dev,
                                    const VMStateDescription *vmsd,
                                    void *base, int alias_id,
                                    int required_for_version,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     return 0;
 }
diff --git a/stubs/xen-hvm.c b/stubs/xen-hvm.c
index 3ca6c51b21..9a8e3ae9ba 100644
--- a/stubs/xen-hvm.c
+++ b/stubs/xen-hvm.c
@@ -37,7 +37,7 @@ int xen_is_pirq_msi(uint32_t msi_data)
 }
 
 void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,
-                   Error **errp)
+                   Error *errp[static 1])
 {
 }
 
@@ -58,6 +58,6 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory)
 {
 }
 
-void qmp_xen_set_global_dirty_log(bool enable, Error **errp)
+void qmp_xen_set_global_dirty_log(bool enable, Error *errp[static 1])
 {
 }
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index b0a391f54b..c48e270428 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -54,7 +54,7 @@ static void alpha_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
     info->print_insn = print_insn_alpha;
 }
 
-static void alpha_cpu_realizefn(DeviceState *dev, Error **errp)
+static void alpha_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     AlphaCPUClass *acc = ALPHA_CPU_GET_CLASS(dev);
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 00b17ca6af..d990141c2c 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -621,7 +621,7 @@ static void arm_cpu_finalizefn(Object *obj)
     g_hash_table_destroy(cpu->cp_regs);
 }
 
-static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
+static void arm_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     ARMCPU *cpu = ARM_CPU(dev);
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 7d6055bb63..86cbb2caa0 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -246,14 +246,15 @@ static const ARMCPUInfo aarch64_cpus[] = {
     { .name = NULL }
 };
 
-static bool aarch64_cpu_get_aarch64(Object *obj, Error **errp)
+static bool aarch64_cpu_get_aarch64(Object *obj, Error *errp[static 1])
 {
     ARMCPU *cpu = ARM_CPU(obj);
 
     return arm_feature(&cpu->env, ARM_FEATURE_AARCH64);
 }
 
-static void aarch64_cpu_set_aarch64(Object *obj, bool value, Error **errp)
+static void aarch64_cpu_set_aarch64(Object *obj, bool value,
+                                    Error *errp[static 1])
 {
     ARMCPU *cpu = ARM_CPU(obj);
 
diff --git a/target/arm/helper.c b/target/arm/helper.c
index 2594faa9b8..a24d666546 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -5336,7 +5336,7 @@ static void arm_cpu_add_definition(gpointer data, gpointer user_data)
     *cpu_list = entry;
 }
 
-CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
+CpuDefinitionInfoList *arch_query_cpu_definitions(Error *errp[static 1])
 {
     CpuDefinitionInfoList *cpu_list = NULL;
     GSList *list;
diff --git a/target/arm/monitor.c b/target/arm/monitor.c
index 299cb80ae7..eba32bc41f 100644
--- a/target/arm/monitor.c
+++ b/target/arm/monitor.c
@@ -66,7 +66,7 @@ static inline void gic_cap_kvm_probe(GICCapability *v2, GICCapability *v3)
 #endif
 }
 
-GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
+GICCapabilityList *qmp_query_gic_capabilities(Error *errp[static 1])
 {
     GICCapabilityList *head = NULL;
     GICCapability *v2 = gic_cap_new(2), *v3 = gic_cap_new(3);
diff --git a/target/cris/cpu.c b/target/cris/cpu.c
index 32815e3fa3..cf015e97cf 100644
--- a/target/cris/cpu.c
+++ b/target/cris/cpu.c
@@ -137,7 +137,7 @@ void cris_cpu_list(FILE *f, fprintf_function cpu_fprintf)
     g_slist_free(list);
 }
 
-static void cris_cpu_realizefn(DeviceState *dev, Error **errp)
+static void cris_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     CRISCPUClass *ccc = CRIS_CPU_GET_CLASS(dev);
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
index 500414752e..d36fe2be8d 100644
--- a/target/hppa/cpu.c
+++ b/target/hppa/cpu.c
@@ -48,7 +48,7 @@ static void hppa_cpu_disas_set_info(CPUState *cs, disassemble_info *info)
     info->print_insn = print_insn_hppa;
 }
 
-static void hppa_cpu_realizefn(DeviceState *dev, Error **errp)
+static void hppa_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     HPPACPUClass *acc = HPPA_CPU_GET_CLASS(dev);
diff --git a/target/i386/arch_memory_mapping.c b/target/i386/arch_memory_mapping.c
index 647cff2829..014e7c816a 100644
--- a/target/i386/arch_memory_mapping.c
+++ b/target/i386/arch_memory_mapping.c
@@ -268,7 +268,7 @@ static void walk_pml5e(MemoryMappingList *list, AddressSpace *as,
 #endif
 
 void x86_cpu_get_memory_mapping(CPUState *cs, MemoryMappingList *list,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(cs);
     CPUX86State *env = &cpu->env;
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index e0a5862568..4c0582a70b 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -1575,7 +1575,8 @@ static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
     dc->props = max_x86_cpu_properties;
 }
 
-static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp);
+static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def,
+			     Error *errp[static 1]);
 
 static void max_x86_cpu_initfn(Object *obj)
 {
@@ -1678,7 +1679,7 @@ static void report_unavailable_features(FeatureWord w, uint32_t mask)
 
 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
                                          const char *name, void *opaque,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1693,7 +1694,7 @@ static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
 
 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
                                          const char *name, void *opaque,
-                                         Error **errp)
+                                         Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1721,7 +1722,7 @@ static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
 
 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
                                         const char *name, void *opaque,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1734,7 +1735,7 @@ static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
 
 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
                                         const char *name, void *opaque,
-                                        Error **errp)
+                                        Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1758,7 +1759,7 @@ static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
 
 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
                                            const char *name, void *opaque,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1770,7 +1771,7 @@ static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
 
 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
                                            const char *name, void *opaque,
-                                           Error **errp)
+                                           Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1792,7 +1793,7 @@ static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
     env->cpuid_version |= value & 0xf;
 }
 
-static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
+static char *x86_cpuid_get_vendor(Object *obj, Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1805,7 +1806,7 @@ static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
 }
 
 static void x86_cpuid_set_vendor(Object *obj, const char *value,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1826,7 +1827,7 @@ static void x86_cpuid_set_vendor(Object *obj, const char *value,
     }
 }
 
-static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
+static char *x86_cpuid_get_model_id(Object *obj, Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1842,7 +1843,7 @@ static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
 }
 
 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     CPUX86State *env = &cpu->env;
@@ -1864,7 +1865,7 @@ static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
 }
 
 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     int64_t value;
@@ -1874,7 +1875,7 @@ static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
 }
 
 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
-                                   void *opaque, Error **errp)
+                                   void *opaque, Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     const int64_t min = 0;
@@ -1897,7 +1898,7 @@ static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
 /* Generic getter for "feature-words" and "filtered-features" properties */
 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
                                       const char *name, void *opaque,
-                                      Error **errp)
+                                      Error *errp[static 1])
 {
     uint32_t *array = (uint32_t *)opaque;
     FeatureWord w;
@@ -1924,7 +1925,7 @@ static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
 }
 
 static void x86_get_hv_spinlocks(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     int64_t value = cpu->hyperv_spinlock_attempts;
@@ -1933,7 +1934,7 @@ static void x86_get_hv_spinlocks(Object *obj, Visitor *v, const char *name,
 }
 
 static void x86_set_hv_spinlocks(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     const int64_t min = 0xFFF;
     const int64_t max = UINT_MAX;
@@ -2007,7 +2008,7 @@ static gint compare_string(gconstpointer a, gconstpointer b)
 /* Parse "+feature,-feature,feature=foo" CPU feature string
  */
 static void x86_cpu_parse_featurestr(const char *typename, char *features,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     char *featurestr; /* Single 'key=value" string being parsed */
     static bool cpu_globals_initialized;
@@ -2095,7 +2096,7 @@ static void x86_cpu_parse_featurestr(const char *typename, char *features,
     }
 }
 
-static void x86_cpu_expand_features(X86CPU *cpu, Error **errp);
+static void x86_cpu_expand_features(X86CPU *cpu, Error *errp[static 1]);
 static int x86_cpu_filter_features(X86CPU *cpu);
 
 /* Check for missing features that may prevent the CPU class from
@@ -2252,7 +2253,7 @@ static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
     *cpu_list = entry;
 }
 
-CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
+CpuDefinitionInfoList *arch_query_cpu_definitions(Error *errp[static 1])
 {
     CpuDefinitionInfoList *cpu_list = NULL;
     GSList *list = get_sorted_cpu_model_list();
@@ -2305,7 +2306,8 @@ static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
 
 /* Load data from X86CPUDefinition into a X86CPU object
  */
-static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
+static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def,
+                             Error *errp[static 1])
 {
     CPUX86State *env = &cpu->env;
     const char *vendor;
@@ -2456,7 +2458,8 @@ static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props)
     }
 }
 
-static void object_apply_props(Object *obj, QDict *props, Error **errp)
+static void object_apply_props(Object *obj, QDict *props,
+                               Error *errp[static 1])
 {
     const QDictEntry *prop;
     Error *err = NULL;
@@ -2473,7 +2476,8 @@ static void object_apply_props(Object *obj, QDict *props, Error **errp)
 }
 
 /* Create X86CPU object according to model+props specification */
-static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
+static X86CPU *x86_cpu_from_model(const char *model, QDict *props,
+                                  Error *errp[static 1])
 {
     X86CPU *xc = NULL;
     X86CPUClass *xcc;
@@ -3178,7 +3182,7 @@ APICCommonClass *apic_get_class(void)
     return APIC_COMMON_CLASS(object_class_by_name(apic_type));
 }
 
-static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
+static void x86_cpu_apic_create(X86CPU *cpu, Error *errp[static 1])
 {
     APICCommonState *apic;
     ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
@@ -3196,7 +3200,7 @@ static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
     apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
 }
 
-static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
+static void x86_cpu_apic_realize(X86CPU *cpu, Error *errp[static 1])
 {
     APICCommonState *apic;
     static bool apic_mmio_map_once;
@@ -3234,7 +3238,7 @@ static void x86_cpu_machine_done(Notifier *n, void *unused)
     }
 }
 #else
-static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
+static void x86_cpu_apic_realize(X86CPU *cpu, Error *errp[static 1])
 {
 }
 #endif
@@ -3360,7 +3364,7 @@ static void x86_cpu_enable_xsave_components(X86CPU *cpu)
 /* Expand CPU configuration data, based on configured features
  * and host/accelerator capabilities when appropriate.
  */
-static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
+static void x86_cpu_expand_features(X86CPU *cpu, Error *errp[static 1])
 {
     CPUX86State *env = &cpu->env;
     FeatureWord w;
@@ -3473,7 +3477,7 @@ static int x86_cpu_filter_features(X86CPU *cpu)
 #define IS_AMD_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && \
                          (env)->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && \
                          (env)->cpuid_vendor3 == CPUID_VENDOR_AMD_3)
-static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
+static void x86_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     X86CPU *cpu = X86_CPU(dev);
@@ -3670,7 +3674,7 @@ out:
     }
 }
 
-static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
+static void x86_cpu_unrealizefn(DeviceState *dev, Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(dev);
     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
@@ -3697,7 +3701,7 @@ typedef struct BitProperty {
 } BitProperty;
 
 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     X86CPU *cpu = X86_CPU(obj);
     BitProperty *fp = opaque;
@@ -3707,7 +3711,7 @@ static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
 }
 
 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
-                                 void *opaque, Error **errp)
+                                 void *opaque, Error *errp[static 1])
 {
     DeviceState *dev = DEVICE(obj);
     X86CPU *cpu = X86_CPU(obj);
@@ -3815,7 +3819,7 @@ static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs)
 }
 static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
                                        const char *name, void *opaque,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     CPUState *cs = CPU(obj);
     GuestPanicInformation *panic_info;
diff --git a/target/lm32/cpu.c b/target/lm32/cpu.c
index 8bd90c09dc..5dc57cbae0 100644
--- a/target/lm32/cpu.c
+++ b/target/lm32/cpu.c
@@ -139,7 +139,7 @@ static void lm32_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
     info->print_insn = print_insn_lm32;
 }
 
-static void lm32_cpu_realizefn(DeviceState *dev, Error **errp)
+static void lm32_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     LM32CPUClass *lcc = LM32_CPU_GET_CLASS(dev);
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
index ae7fa0e1b0..311ae39417 100644
--- a/target/m68k/cpu.c
+++ b/target/m68k/cpu.c
@@ -216,7 +216,7 @@ static const M68kCPUInfo m68k_cpus[] = {
     { .name = "any",   .instance_init = any_cpu_initfn },
 };
 
-static void m68k_cpu_realizefn(DeviceState *dev, Error **errp)
+static void m68k_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     M68kCPU *cpu = M68K_CPU(dev);
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
index 026b5b3e3f..8ba789d711 100644
--- a/target/microblaze/cpu.c
+++ b/target/microblaze/cpu.c
@@ -129,7 +129,7 @@ static void mb_disas_set_info(CPUState *cpu, disassemble_info *info)
     info->print_insn = print_insn_microblaze;
 }
 
-static void mb_cpu_realizefn(DeviceState *dev, Error **errp)
+static void mb_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     MicroBlazeCPUClass *mcc = MICROBLAZE_CPU_GET_CLASS(dev);
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
index 07c82ebb9d..73edc58e93 100644
--- a/target/mips/cpu.c
+++ b/target/mips/cpu.c
@@ -119,7 +119,7 @@ static void mips_cpu_disas_set_info(CPUState *s, disassemble_info *info) {
 #endif
 }
 
-static void mips_cpu_realizefn(DeviceState *dev, Error **errp)
+static void mips_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(dev);
diff --git a/target/moxie/cpu.c b/target/moxie/cpu.c
index ad7435ecbd..9887f98e34 100644
--- a/target/moxie/cpu.c
+++ b/target/moxie/cpu.c
@@ -55,7 +55,7 @@ static void moxie_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
     info->print_insn = print_insn_moxie;
 }
 
-static void moxie_cpu_realizefn(DeviceState *dev, Error **errp)
+static void moxie_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     MoxieCPUClass *mcc = MOXIE_CPU_GET_CLASS(dev);
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
index 227c5352a7..f2dce11e80 100644
--- a/target/nios2/cpu.c
+++ b/target/nios2/cpu.c
@@ -92,7 +92,7 @@ Nios2CPU *cpu_nios2_init(const char *cpu_model)
     return cpu;
 }
 
-static void nios2_cpu_realizefn(DeviceState *dev, Error **errp)
+static void nios2_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     Nios2CPUClass *ncc = NIOS2_CPU_GET_CLASS(dev);
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
index 8cd0a46bf1..a5ec210b53 100644
--- a/target/openrisc/cpu.c
+++ b/target/openrisc/cpu.c
@@ -65,7 +65,7 @@ static void openrisc_cpu_reset(CPUState *s)
 #endif
 }
 
-static void openrisc_cpu_realizefn(DeviceState *dev, Error **errp)
+static void openrisc_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     OpenRISCCPUClass *occ = OPENRISC_CPU_GET_CLASS(dev);
diff --git a/target/ppc/compat.c b/target/ppc/compat.c
index e8ec1e19e7..c93f80ef50 100644
--- a/target/ppc/compat.c
+++ b/target/ppc/compat.c
@@ -111,7 +111,8 @@ bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr,
     return true;
 }
 
-void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp)
+void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr,
+                    Error *errp[static 1])
 {
     const CompatInfo *compat = compat_by_pvr(compat_pvr);
     CPUPPCState *env = &cpu->env;
@@ -158,7 +159,7 @@ static void do_set_compat(CPUState *cs, run_on_cpu_data arg)
     ppc_set_compat(cpu, s->compat_pvr, &s->err);
 }
 
-void ppc_set_compat_all(uint32_t compat_pvr, Error **errp)
+void ppc_set_compat_all(uint32_t compat_pvr, Error *errp[static 1])
 {
     CPUState *cs;
 
diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
index 0597df737e..cb0bcf2bd9 100644
--- a/target/ppc/translate_init.c
+++ b/target/ppc/translate_init.c
@@ -8414,7 +8414,7 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
 }
 
 static void powerpc_get_compat(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     char *value = (char *)"";
     Property *prop = opaque;
@@ -8442,7 +8442,7 @@ static void powerpc_get_compat(Object *obj, Visitor *v, const char *name,
 }
 
 static void powerpc_set_compat(Object *obj, Visitor *v, const char *name,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     char *value = NULL;
     Property *prop = opaque;
@@ -9503,7 +9503,7 @@ static void fix_opcode_tables(opc_handler_t **ppc_opcodes)
 }
 
 /*****************************************************************************/
-static void create_ppc_opcodes(PowerPCCPU *cpu, Error **errp)
+static void create_ppc_opcodes(PowerPCCPU *cpu, Error *errp[static 1])
 {
     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
@@ -9818,7 +9818,7 @@ static inline bool ppc_cpu_is_valid(PowerPCCPUClass *pcc)
 #endif
 }
 
-static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
+static void ppc_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     PowerPCCPU *cpu = POWERPC_CPU(dev);
@@ -10064,7 +10064,7 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
 #endif
 }
 
-static void ppc_cpu_unrealizefn(DeviceState *dev, Error **errp)
+static void ppc_cpu_unrealizefn(DeviceState *dev, Error *errp[static 1])
 {
     PowerPCCPU *cpu = POWERPC_CPU(dev);
     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
@@ -10403,7 +10403,7 @@ static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
     *first = entry;
 }
 
-CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
+CpuDefinitionInfoList *arch_query_cpu_definitions(Error *errp[static 1])
 {
     CpuDefinitionInfoList *cpu_list = NULL;
     GSList *list;
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 7d9e104151..313634b6d6 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -171,7 +171,7 @@ static void s390_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
     info->print_insn = print_insn_s390;
 }
 
-static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
+static void s390_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     S390CPUClass *scc = S390_CPU_GET_CLASS(dev);
@@ -235,7 +235,7 @@ out:
 }
 
 static void s390x_cpu_get_id(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     S390CPU *cpu = S390_CPU(obj);
     int64_t value = cpu->id;
@@ -244,7 +244,7 @@ static void s390x_cpu_get_id(Object *obj, Visitor *v, const char *name,
 }
 
 static void s390x_cpu_set_id(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
+                             void *opaque, Error *errp[static 1])
 {
     S390CPU *cpu = S390_CPU(obj);
     DeviceState *dev = DEVICE(obj);
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 4fde8f41fd..4e60f9f340 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -299,7 +299,7 @@ static void create_cpu_model_list(ObjectClass *klass, void *opaque)
     *cpu_list = entry;
 }
 
-CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
+CpuDefinitionInfoList *arch_query_cpu_definitions(Error *errp[static 1])
 {
     CpuDefinitionInfoList *list = NULL;
 
@@ -309,7 +309,7 @@ CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
 }
 
 static void cpu_model_from_info(S390CPUModel *model, const CpuModelInfo *info,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     const QDict *qdict = NULL;
     const QDictEntry *e;
@@ -465,7 +465,7 @@ static void list_add_feat(const char *name, void *opaque)
 
 CpuModelCompareInfo *arch_query_cpu_model_comparison(CpuModelInfo *infoa,
                                                      CpuModelInfo *infob,
-                                                     Error **errp)
+                                                     Error *errp[static 1])
 {
     CpuModelCompareResult feat_result, gen_result;
     CpuModelCompareInfo *compare_info;
@@ -538,7 +538,7 @@ CpuModelCompareInfo *arch_query_cpu_model_comparison(CpuModelInfo *infoa,
 
 CpuModelBaselineInfo *arch_query_cpu_model_baseline(CpuModelInfo *infoa,
                                                     CpuModelInfo *infob,
-                                                    Error **errp)
+                                                    Error *errp[static 1])
 {
     CpuModelBaselineInfo *baseline_info;
     S390CPUModel modela, modelb, model;
@@ -629,7 +629,8 @@ static void error_prepend_missing_feat(const char *name, void *opaque)
 }
 
 static void check_compatibility(const S390CPUModel *max_model,
-                                const S390CPUModel *model, Error **errp)
+                                const S390CPUModel *model,
+                                Error *errp[static 1])
 {
     S390FeatBitmap missing;
 
@@ -684,7 +685,7 @@ static void add_qemu_cpu_model_features(S390FeatBitmap fbm)
     }
 }
 
-static S390CPUModel *get_max_cpu_model(Error **errp)
+static S390CPUModel *get_max_cpu_model(Error *errp[static 1])
 {
     static S390CPUModel max_model;
     static bool cached;
@@ -709,7 +710,8 @@ static S390CPUModel *get_max_cpu_model(Error **errp)
     return NULL;
 }
 
-static inline void apply_cpu_model(const S390CPUModel *model, Error **errp)
+static inline void apply_cpu_model(const S390CPUModel *model,
+                                   Error *errp[static 1])
 {
 #ifndef CONFIG_USER_ONLY
     static S390CPUModel applied_model;
@@ -741,7 +743,7 @@ static inline void apply_cpu_model(const S390CPUModel *model, Error **errp)
 #endif
 }
 
-void s390_realize_cpu_model(CPUState *cs, Error **errp)
+void s390_realize_cpu_model(CPUState *cs, Error *errp[static 1])
 {
     S390CPUClass *xcc = S390_CPU_GET_CLASS(cs);
     S390CPU *cpu = S390_CPU(cs);
@@ -779,7 +781,7 @@ void s390_realize_cpu_model(CPUState *cs, Error **errp)
 }
 
 static void get_feature(Object *obj, Visitor *v, const char *name,
-                        void *opaque, Error **errp)
+                        void *opaque, Error *errp[static 1])
 {
     S390Feat feat = (S390Feat) opaque;
     S390CPU *cpu = S390_CPU(obj);
@@ -796,7 +798,7 @@ static void get_feature(Object *obj, Visitor *v, const char *name,
 }
 
 static void set_feature(Object *obj, Visitor *v, const char *name,
-                        void *opaque, Error **errp)
+                        void *opaque, Error *errp[static 1])
 {
     S390Feat feat = (S390Feat) opaque;
     DeviceState *dev = DEVICE(obj);
@@ -831,7 +833,7 @@ static void set_feature(Object *obj, Visitor *v, const char *name,
 }
 
 static void get_feature_group(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     S390FeatGroup group = (S390FeatGroup) opaque;
     const S390FeatGroupDef *def = s390_feat_group_def(group);
@@ -852,7 +854,7 @@ static void get_feature_group(Object *obj, Visitor *v, const char *name,
 }
 
 static void set_feature_group(Object *obj, Visitor *v, const char *name,
-                              void *opaque, Error **errp)
+                              void *opaque, Error *errp[static 1])
 {
     S390FeatGroup group = (S390FeatGroup) opaque;
     const S390FeatGroupDef *def = s390_feat_group_def(group);
@@ -975,17 +977,17 @@ static void s390_cpu_model_finalize(Object *obj)
     cpu->model = NULL;
 }
 
-static bool get_is_migration_safe(Object *obj, Error **errp)
+static bool get_is_migration_safe(Object *obj, Error *errp[static 1])
 {
     return S390_CPU_GET_CLASS(obj)->is_migration_safe;
 }
 
-static bool get_is_static(Object *obj, Error **errp)
+static bool get_is_static(Object *obj, Error *errp[static 1])
 {
     return S390_CPU_GET_CLASS(obj)->is_static;
 }
 
-static char *get_description(Object *obj, Error **errp)
+static char *get_description(Object *obj, Error *errp[static 1])
 {
     return g_strdup(S390_CPU_GET_CLASS(obj)->desc);
 }
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index 1408ce2b4a..1a5c83b812 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -68,7 +68,7 @@ void s390x_cpu_timer(void *opaque)
 }
 #endif
 
-S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp)
+S390CPU *cpu_s390x_create(const char *cpu_model, Error *errp[static 1])
 {
     static bool features_parsed;
     char *name, *features;
@@ -104,7 +104,8 @@ S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp)
     return S390_CPU(CPU(object_new(typename)));
 }
 
-S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp)
+S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id,
+                       Error *errp[static 1])
 {
     S390CPU *cpu;
     Error *err = NULL;
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 0979c1fc27..4d023c24b4 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -2550,7 +2550,7 @@ bool kvm_s390_cpu_models_supported(void)
                              KVM_S390_VM_CPU_MACHINE_SUBFUNC);
 }
 
-void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
+void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error *errp[static 1])
 {
     struct kvm_s390_vm_cpu_machine prop = {};
     struct kvm_device_attr attr = {
@@ -2627,7 +2627,8 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
                S390_FEAT_MAX);
 }
 
-void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
+void kvm_s390_apply_cpu_model(const S390CPUModel *model,
+                              Error *errp[static 1])
 {
     struct kvm_s390_vm_cpu_processor prop  = {
         .fac_list = { 0 },
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
index dc2cbce478..54cc3b0433 100644
--- a/target/sh4/cpu.c
+++ b/target/sh4/cpu.c
@@ -239,7 +239,7 @@ static const TypeInfo sh7785_type_info = {
     .instance_init = sh7785_cpu_initfn,
 };
 
-static void superh_cpu_realizefn(DeviceState *dev, Error **errp)
+static void superh_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     SuperHCPUClass *scc = SUPERH_CPU_GET_CLASS(dev);
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index 51a6f129a1..7f8e991033 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -105,7 +105,7 @@ static void cpu_sparc_disas_set_info(CPUState *cpu, disassemble_info *info)
 }
 
 static void sparc_cpu_parse_features(CPUState *cs, char *features,
-                                     Error **errp);
+                                     Error *errp[static 1]);
 
 static int cpu_sparc_register(SPARCCPU *cpu, const char *cpu_model)
 {
@@ -571,7 +571,7 @@ static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *name)
 }
 
 static void sparc_cpu_parse_features(CPUState *cs, char *features,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     SPARCCPU *cpu = SPARC_CPU(cs);
     sparc_def_t *cpu_def = cpu->env.def;
@@ -796,7 +796,7 @@ static bool sparc_cpu_has_work(CPUState *cs)
            cpu_interrupts_enabled(env);
 }
 
-static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
+static void sparc_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(dev);
diff --git a/target/tilegx/cpu.c b/target/tilegx/cpu.c
index f8448c4c9e..c65e13f7f5 100644
--- a/target/tilegx/cpu.c
+++ b/target/tilegx/cpu.c
@@ -86,7 +86,7 @@ static void tilegx_cpu_reset(CPUState *s)
     memset(env, 0, offsetof(CPUTLGState, end_reset_fields));
 }
 
-static void tilegx_cpu_realizefn(DeviceState *dev, Error **errp)
+static void tilegx_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     TileGXCPUClass *tcc = TILEGX_CPU_GET_CLASS(dev);
diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c
index efeb6553d0..1f66439825 100644
--- a/target/tricore/cpu.c
+++ b/target/tricore/cpu.c
@@ -61,7 +61,7 @@ static bool tricore_cpu_has_work(CPUState *cs)
     return true;
 }
 
-static void tricore_cpu_realizefn(DeviceState *dev, Error **errp)
+static void tricore_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     TriCoreCPU *cpu = TRICORE_CPU(dev);
diff --git a/target/unicore32/cpu.c b/target/unicore32/cpu.c
index 3b14cfa37d..b52a9d513b 100644
--- a/target/unicore32/cpu.c
+++ b/target/unicore32/cpu.c
@@ -99,7 +99,7 @@ static const UniCore32CPUInfo uc32_cpus[] = {
     { .name = "any",        .instance_init = uc32_any_cpu_initfn },
 };
 
-static void uc32_cpu_realizefn(DeviceState *dev, Error **errp)
+static void uc32_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     UniCore32CPUClass *ucc = UNICORE32_CPU_GET_CLASS(dev);
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
index 69bf002489..8045e9b33c 100644
--- a/target/xtensa/cpu.c
+++ b/target/xtensa/cpu.c
@@ -97,7 +97,7 @@ static ObjectClass *xtensa_cpu_class_by_name(const char *cpu_model)
     return oc;
 }
 
-static void xtensa_cpu_realizefn(DeviceState *dev, Error **errp)
+static void xtensa_cpu_realizefn(DeviceState *dev, Error *errp[static 1])
 {
     CPUState *cs = CPU(dev);
     XtensaCPUClass *xcc = XTENSA_CPU_GET_CLASS(dev);
diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
index 6145fcbab6..33cb4cc693 100644
--- a/tests/check-qom-proplist.c
+++ b/tests/check-qom-proplist.c
@@ -68,7 +68,7 @@ struct DummyObjectClass {
 
 static void dummy_set_bv(Object *obj,
                          bool value,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     DummyObject *dobj = DUMMY_OBJECT(obj);
 
@@ -76,7 +76,7 @@ static void dummy_set_bv(Object *obj,
 }
 
 static bool dummy_get_bv(Object *obj,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     DummyObject *dobj = DUMMY_OBJECT(obj);
 
@@ -86,7 +86,7 @@ static bool dummy_get_bv(Object *obj,
 
 static void dummy_set_av(Object *obj,
                          int value,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     DummyObject *dobj = DUMMY_OBJECT(obj);
 
@@ -94,7 +94,7 @@ static void dummy_set_av(Object *obj,
 }
 
 static int dummy_get_av(Object *obj,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     DummyObject *dobj = DUMMY_OBJECT(obj);
 
@@ -104,7 +104,7 @@ static int dummy_get_av(Object *obj,
 
 static void dummy_set_sv(Object *obj,
                          const char *value,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     DummyObject *dobj = DUMMY_OBJECT(obj);
 
@@ -113,7 +113,7 @@ static void dummy_set_sv(Object *obj,
 }
 
 static char *dummy_get_sv(Object *obj,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     DummyObject *dobj = DUMMY_OBJECT(obj);
 
diff --git a/tests/test-crypto-block.c b/tests/test-crypto-block.c
index 95c4bd5da3..e4e2d0b837 100644
--- a/tests/test-crypto-block.c
+++ b/tests/test-crypto-block.c
@@ -191,7 +191,7 @@ static ssize_t test_block_read_func(QCryptoBlock *block,
                                     uint8_t *buf,
                                     size_t buflen,
                                     void *opaque,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     Buffer *header = opaque;
 
@@ -206,7 +206,7 @@ static ssize_t test_block_read_func(QCryptoBlock *block,
 static ssize_t test_block_init_func(QCryptoBlock *block,
                                     size_t headerlen,
                                     void *opaque,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     Buffer *header = opaque;
 
@@ -223,7 +223,7 @@ static ssize_t test_block_write_func(QCryptoBlock *block,
                                      const uint8_t *buf,
                                      size_t buflen,
                                      void *opaque,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     Buffer *header = opaque;
 
diff --git a/tests/test-crypto-tlscredsx509.c b/tests/test-crypto-tlscredsx509.c
index a14b4b1cad..71103db19c 100644
--- a/tests/test-crypto-tlscredsx509.c
+++ b/tests/test-crypto-tlscredsx509.c
@@ -39,7 +39,7 @@ struct QCryptoTLSCredsTestData {
 
 static QCryptoTLSCreds *test_tls_creds_create(QCryptoTLSCredsEndpoint endpoint,
                                               const char *certdir,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     Object *parent = object_get_objects_root();
     Object *creds = object_new_with_props(
diff --git a/tests/test-crypto-tlssession.c b/tests/test-crypto-tlssession.c
index 1a4a066d76..6f9be98eb0 100644
--- a/tests/test-crypto-tlssession.c
+++ b/tests/test-crypto-tlssession.c
@@ -61,7 +61,7 @@ static ssize_t testRead(char *buf, size_t len, void *opaque)
 
 static QCryptoTLSCreds *test_tls_creds_create(QCryptoTLSCredsEndpoint endpoint,
                                               const char *certdir,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     Error *err = NULL;
     Object *parent = object_get_objects_root();
diff --git a/tests/test-io-channel-tls.c b/tests/test-io-channel-tls.c
index 6509ab1045..b298674d28 100644
--- a/tests/test-io-channel-tls.c
+++ b/tests/test-io-channel-tls.c
@@ -66,7 +66,7 @@ static void test_tls_handshake_done(QIOTask *task,
 
 static QCryptoTLSCreds *test_tls_creds_create(QCryptoTLSCredsEndpoint endpoint,
                                               const char *certdir,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     Object *parent = object_get_objects_root();
     Object *creds = object_new_with_props(
diff --git a/tests/test-logging.c b/tests/test-logging.c
index a12585f70a..2f85342208 100644
--- a/tests/test-logging.c
+++ b/tests/test-logging.c
@@ -87,7 +87,8 @@ static void test_parse_range(void)
     error_free_or_abort(&err);
 }
 
-static void set_log_path_tmp(char const *dir, char const *tpl, Error **errp)
+static void set_log_path_tmp(char const *dir, char const *tpl,
+                             Error *errp[static 1])
 {
     gchar *file_path = g_build_filename(dir, tpl, NULL);
 
diff --git a/tests/test-qapi-util.c b/tests/test-qapi-util.c
index 0305b9201b..d377e23bc2 100644
--- a/tests/test-qapi-util.c
+++ b/tests/test-qapi-util.c
@@ -75,12 +75,12 @@ static void test_parse_qapi_name(void)
     g_assert(ret == -1);
 }
 
-static void successfn(Error **errp)
+static void successfn(Error *errp[static 1])
 {
     g_assert(!ERR_IS_SET(errp));
 }
 
-static void fail1(Error **errp)
+static void fail1(Error *errp[static 1])
 {
     g_assert(!ERR_IS_SET(errp));
 
@@ -89,7 +89,7 @@ static void fail1(Error **errp)
     g_assert(ERR_IS_SET(errp));
 }
 
-static void fail2(Error **errp)
+static void fail2(Error *errp[static 1])
 {
     g_assert(!ERR_IS_SET(errp));
 
@@ -98,7 +98,7 @@ static void fail2(Error **errp)
     g_assert(ERR_IS_SET(errp));
 }
 
-static void multifn(Error **errp)
+static void multifn(Error *errp[static 1])
 {
     Error *err1 = NULL, *err2 = NULL;
     successfn(&err1);
@@ -119,7 +119,7 @@ static void multifn(Error **errp)
     error_propagate(errp, err1);
 }
 
-static void test_propagate(void (*fn)(Error **), Error **errp)
+static void test_propagate(void (*fn)(Error **), Error *errp[static 1])
 {
     bool failed;
     Error *local_err = NULL;
diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c
index 91ea932869..802c5cfb6a 100644
--- a/tests/test-qdev-global-props.c
+++ b/tests/test-qdev-global-props.c
@@ -117,7 +117,7 @@ static void test_static_globalprop(void)
 #define TYPE_UNUSED_NOHOTPLUG "nohotplug-type"
 
 static void prop1_accessor(Object *obj, Visitor *v, const char *name,
-                           void *opaque, Error **errp)
+                           void *opaque, Error *errp[static 1])
 {
     MyType *mt = DYNAMIC_TYPE(obj);
 
@@ -125,7 +125,7 @@ static void prop1_accessor(Object *obj, Visitor *v, const char *name,
 }
 
 static void prop2_accessor(Object *obj, Visitor *v, const char *name,
-                           void *opaque, Error **errp)
+                           void *opaque, Error *errp[static 1])
 {
     MyType *mt = DYNAMIC_TYPE(obj);
 
diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c
index 5a596a6e7b..a3119078c4 100644
--- a/tests/test-qemu-opts.c
+++ b/tests/test-qemu-opts.c
@@ -435,7 +435,7 @@ static void test_qemu_opts_set(void)
 }
 
 static int opts_count_iter(void *opaque, const char *name, const char *value,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     (*(size_t *)opaque)++;
     return 0;
diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
index acdded4d67..78caddfe4c 100644
--- a/tests/test-qmp-commands.c
+++ b/tests/test-qmp-commands.c
@@ -10,22 +10,22 @@
 
 static QmpCommandList qmp_commands;
 
-void qmp_user_def_cmd(Error **errp)
+void qmp_user_def_cmd(Error *errp[static 1])
 {
 }
 
-Empty2 *qmp_user_def_cmd0(Error **errp)
+Empty2 *qmp_user_def_cmd0(Error *errp[static 1])
 {
     return g_new0(Empty2, 1);
 }
 
-void qmp_user_def_cmd1(UserDefOne * ud1, Error **errp)
+void qmp_user_def_cmd1(UserDefOne * ud1, Error *errp[static 1])
 {
 }
 
 UserDefTwo *qmp_user_def_cmd2(UserDefOne *ud1a,
                               bool has_udb1, UserDefOne *ud1b,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     UserDefTwo *ret;
     UserDefOne *ud1c = g_malloc0(sizeof(UserDefOne));
@@ -51,7 +51,8 @@ UserDefTwo *qmp_user_def_cmd2(UserDefOne *ud1a,
     return ret;
 }
 
-int64_t qmp_guest_get_time(int64_t a, bool has_b, int64_t b, Error **errp)
+int64_t qmp_guest_get_time(int64_t a, bool has_b, int64_t b,
+                           Error *errp[static 1])
 {
     return a + (has_b ? b : 0);
 }
@@ -61,11 +62,11 @@ QObject *qmp_guest_sync(QObject *arg, Error **errp)
     return arg;
 }
 
-void qmp_boxed_struct(UserDefZero *arg, Error **errp)
+void qmp_boxed_struct(UserDefZero *arg, Error *errp[static 1])
 {
 }
 
-void qmp_boxed_union(UserDefNativeListUnion *arg, Error **errp)
+void qmp_boxed_union(UserDefNativeListUnion *arg, Error *errp[static 1])
 {
 }
 
@@ -73,7 +74,7 @@ __org_qemu_x_Union1 *qmp___org_qemu_x_command(__org_qemu_x_EnumList *a,
                                               __org_qemu_x_StructList *b,
                                               __org_qemu_x_Union2 *c,
                                               __org_qemu_x_Alt *d,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     __org_qemu_x_Union1 *ret = g_new0(__org_qemu_x_Union1, 1);
 
diff --git a/tests/test-qmp-event.c b/tests/test-qmp-event.c
index 4c0f09601d..e4fa2c5e3f 100644
--- a/tests/test-qmp-event.c
+++ b/tests/test-qmp-event.c
@@ -93,7 +93,8 @@ static bool qdict_cmp_simple(QDict *a, QDict *b)
 
 /* This function is hooked as final emit function, which can verify the
    correctness. */
-static void event_test_emit(test_QAPIEvent event, QDict *d, Error **errp)
+static void event_test_emit(test_QAPIEvent event, QDict *d,
+                            Error *errp[static 1])
 {
     QDict *t;
     int64_t s, ms;
diff --git a/tests/test-visitor-serialization.c b/tests/test-visitor-serialization.c
index 4d47ceec7a..9399ea5dcf 100644
--- a/tests/test-visitor-serialization.c
+++ b/tests/test-visitor-serialization.c
@@ -87,7 +87,8 @@ typedef struct PrimitiveList {
 
 typedef void (*VisitorFunc)(Visitor *v, void **native, Error **errp);
 
-static void dealloc_helper(void *native_in, VisitorFunc visit, Error **errp)
+static void dealloc_helper(void *native_in, VisitorFunc visit,
+                           Error *errp[static 1])
 {
     Visitor *v = qapi_dealloc_visitor_new();
 
@@ -96,7 +97,8 @@ static void dealloc_helper(void *native_in, VisitorFunc visit, Error **errp)
     visit_free(v);
 }
 
-static void visit_primitive_type(Visitor *v, void **native, Error **errp)
+static void visit_primitive_type(Visitor *v, void **native,
+                                 Error *errp[static 1])
 {
     PrimitiveType *pt = *native;
     switch(pt->type) {
@@ -141,7 +143,8 @@ static void visit_primitive_type(Visitor *v, void **native, Error **errp)
     }
 }
 
-static void visit_primitive_list(Visitor *v, void **native, Error **errp)
+static void visit_primitive_list(Visitor *v, void **native,
+                                 Error *errp[static 1])
 {
     PrimitiveList *pl = *native;
     switch (pl->type) {
@@ -211,7 +214,7 @@ static void struct_cleanup(TestStruct *ts)
     g_free(ts);
 }
 
-static void visit_struct(Visitor *v, void **native, Error **errp)
+static void visit_struct(Visitor *v, void **native, Error *errp[static 1])
 {
     visit_type_TestStruct(v, NULL, (TestStruct **)native, errp);
 }
@@ -262,12 +265,14 @@ static void nested_struct_cleanup(UserDefTwo *udnp)
     qapi_free_UserDefTwo(udnp);
 }
 
-static void visit_nested_struct(Visitor *v, void **native, Error **errp)
+static void visit_nested_struct(Visitor *v, void **native,
+                                Error *errp[static 1])
 {
     visit_type_UserDefTwo(v, NULL, (UserDefTwo **)native, errp);
 }
 
-static void visit_nested_struct_list(Visitor *v, void **native, Error **errp)
+static void visit_nested_struct_list(Visitor *v, void **native,
+                                     Error *errp[static 1])
 {
     visit_type_UserDefTwoList(v, NULL, (UserDefTwoList **)native, errp);
 }
@@ -1018,7 +1023,7 @@ typedef struct QmpSerializeData {
 } QmpSerializeData;
 
 static void qmp_serialize(void *native_in, void **datap,
-                          VisitorFunc visit, Error **errp)
+                          VisitorFunc visit, Error *errp[static 1])
 {
     QmpSerializeData *d = g_malloc0(sizeof(*d));
 
@@ -1028,7 +1033,7 @@ static void qmp_serialize(void *native_in, void **datap,
 }
 
 static void qmp_deserialize(void **native_out, void *datap,
-                            VisitorFunc visit, Error **errp)
+                            VisitorFunc visit, Error *errp[static 1])
 {
     QmpSerializeData *d = datap;
     QString *output_json;
@@ -1062,7 +1067,7 @@ typedef struct StringSerializeData {
 } StringSerializeData;
 
 static void string_serialize(void *native_in, void **datap,
-                             VisitorFunc visit, Error **errp)
+                             VisitorFunc visit, Error *errp[static 1])
 {
     StringSerializeData *d = g_malloc0(sizeof(*d));
 
@@ -1072,7 +1077,7 @@ static void string_serialize(void *native_in, void **datap,
 }
 
 static void string_deserialize(void **native_out, void *datap,
-                               VisitorFunc visit, Error **errp)
+                               VisitorFunc visit, Error *errp[static 1])
 {
     StringSerializeData *d = datap;
 
diff --git a/tpm.c b/tpm.c
index d89b1e6cd6..0f028c5a78 100644
--- a/tpm.c
+++ b/tpm.c
@@ -182,7 +182,7 @@ static int configure_tpm(QemuOpts *opts)
     return 0;
 }
 
-static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
+static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error *errp[static 1])
 {
     return configure_tpm(opts);
 }
@@ -283,7 +283,7 @@ static TPMInfo *qmp_query_tpm_inst(TPMBackend *drv)
  * Walk the list of active TPM backends and collect information about them
  * following the schema description in qapi-schema.json.
  */
-TPMInfoList *qmp_query_tpm(Error **errp)
+TPMInfoList *qmp_query_tpm(Error *errp[static 1])
 {
     TPMBackend *drv;
     TPMInfoList *info, *head = NULL, *cur_item = NULL;
@@ -306,7 +306,7 @@ TPMInfoList *qmp_query_tpm(Error **errp)
     return head;
 }
 
-TpmTypeList *qmp_query_tpm_types(Error **errp)
+TpmTypeList *qmp_query_tpm_types(Error *errp[static 1])
 {
     unsigned int i = 0;
     TpmTypeList *head = NULL, *prev = NULL, *cur_item;
@@ -330,7 +330,7 @@ TpmTypeList *qmp_query_tpm_types(Error **errp)
     return head;
 }
 
-TpmModelList *qmp_query_tpm_models(Error **errp)
+TpmModelList *qmp_query_tpm_models(Error *errp[static 1])
 {
     unsigned int i = 0;
     TpmModelList *head = NULL, *prev = NULL, *cur_item;
diff --git a/trace/qmp.c b/trace/qmp.c
index ac777d154f..528f02b785 100644
--- a/trace/qmp.c
+++ b/trace/qmp.c
@@ -12,7 +12,7 @@
 #include "trace/control.h"
 
 
-static CPUState *get_cpu(bool has_vcpu, int vcpu, Error **errp)
+static CPUState *get_cpu(bool has_vcpu, int vcpu, Error *errp[static 1])
 {
     if (has_vcpu) {
         CPUState *cpu = qemu_get_cpu(vcpu);
@@ -26,7 +26,7 @@ static CPUState *get_cpu(bool has_vcpu, int vcpu, Error **errp)
 }
 
 static bool check_events(bool has_vcpu, bool ignore_unavailable, bool is_pattern,
-                         const char *name, Error **errp)
+                         const char *name, Error *errp[static 1])
 {
     if (!is_pattern) {
         TraceEvent *ev = trace_event_name(name);
@@ -67,7 +67,7 @@ static bool check_events(bool has_vcpu, bool ignore_unavailable, bool is_pattern
 
 TraceEventInfoList *qmp_trace_event_get_state(const char *name,
                                               bool has_vcpu, int64_t vcpu,
-                                              Error **errp)
+                                              Error *errp[static 1])
 {
     Error *err = NULL;
     TraceEventInfoList *events = NULL;
@@ -132,7 +132,7 @@ TraceEventInfoList *qmp_trace_event_get_state(const char *name,
 void qmp_trace_event_set_state(const char *name, bool enable,
                                bool has_ignore_unavailable, bool ignore_unavailable,
                                bool has_vcpu, int64_t vcpu,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     Error *err = NULL;
     TraceEventIter iter;
diff --git a/ui/console.c b/ui/console.c
index d914cced53..e6a09e446f 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -295,7 +295,7 @@ void graphic_hw_invalidate(QemuConsole *con)
 }
 
 static void ppm_save(const char *filename, DisplaySurface *ds,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     int width = pixman_image_get_width(ds->image);
     int height = pixman_image_get_height(ds->image);
@@ -342,7 +342,7 @@ write_err:
     goto out;
 }
 
-void qmp_screendump(const char *filename, Error **errp)
+void qmp_screendump(const char *filename, Error *errp[static 1])
 {
     QemuConsole *con = qemu_console_lookup_by_index(0);
     DisplaySurface *surface;
@@ -1883,7 +1883,8 @@ QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head)
 }
 
 QemuConsole *qemu_console_lookup_by_device_name(const char *device_id,
-                                                uint32_t head, Error **errp)
+                                                uint32_t head,
+                                                Error *errp[static 1])
 {
     DeviceState *dev;
     QemuConsole *con;
@@ -2082,7 +2083,7 @@ static void text_console_do_init(Chardev *chr, DisplayState *ds)
 static void vc_chr_open(Chardev *chr,
                         ChardevBackend *backend,
                         bool *be_opened,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     ChardevVC *vc = backend->u.vc.data;
     VCChardev *drv = VC_CHARDEV(chr);
@@ -2156,7 +2157,8 @@ PixelFormat qemu_default_pixelformat(int bpp)
     return pf;
 }
 
-void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp)
+void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend,
+                       Error *errp[static 1])
 {
     int val;
     ChardevVC *vc;
diff --git a/ui/gtk.c b/ui/gtk.c
index 49921fa5a5..9242382591 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1744,7 +1744,7 @@ static Chardev *vcs[MAX_VCS];
 static void gd_vc_open(Chardev *chr,
                        ChardevBackend *backend,
                        bool *be_opened,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     if (nb_vcs == MAX_VCS) {
         error_setg(errp, "Maximum number of consoles reached");
diff --git a/ui/input-legacy.c b/ui/input-legacy.c
index 7159747404..720a184ccb 100644
--- a/ui/input-legacy.c
+++ b/ui/input-legacy.c
@@ -80,7 +80,7 @@ static KeyValue *copy_key_value(KeyValue *src)
 }
 
 void qmp_send_key(KeyValueList *keys, bool has_hold_time, int64_t hold_time,
-                  Error **errp)
+                  Error *errp[static 1])
 {
     KeyValueList *p;
     KeyValue **up = NULL;
diff --git a/ui/input-linux.c b/ui/input-linux.c
index 6783ac1e5d..cb881b8a30 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -373,7 +373,7 @@ static void input_linux_event(void *opaque)
     }
 }
 
-static void input_linux_complete(UserCreatable *uc, Error **errp)
+static void input_linux_complete(UserCreatable *uc, Error *errp[static 1])
 {
     InputLinux *il = INPUT_LINUX(uc);
     uint8_t evtmap, relmap, absmap;
@@ -474,7 +474,7 @@ static void input_linux_instance_finalize(Object *obj)
     g_free(il->evdev);
 }
 
-static char *input_linux_get_evdev(Object *obj, Error **errp)
+static char *input_linux_get_evdev(Object *obj, Error *errp[static 1])
 {
     InputLinux *il = INPUT_LINUX(obj);
 
@@ -482,7 +482,7 @@ static char *input_linux_get_evdev(Object *obj, Error **errp)
 }
 
 static void input_linux_set_evdev(Object *obj, const char *value,
-                                  Error **errp)
+                                  Error *errp[static 1])
 {
     InputLinux *il = INPUT_LINUX(obj);
 
@@ -493,7 +493,7 @@ static void input_linux_set_evdev(Object *obj, const char *value,
     il->evdev = g_strdup(value);
 }
 
-static bool input_linux_get_grab_all(Object *obj, Error **errp)
+static bool input_linux_get_grab_all(Object *obj, Error *errp[static 1])
 {
     InputLinux *il = INPUT_LINUX(obj);
 
@@ -501,14 +501,14 @@ static bool input_linux_get_grab_all(Object *obj, Error **errp)
 }
 
 static void input_linux_set_grab_all(Object *obj, bool value,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     InputLinux *il = INPUT_LINUX(obj);
 
     il->grab_all = value;
 }
 
-static bool input_linux_get_repeat(Object *obj, Error **errp)
+static bool input_linux_get_repeat(Object *obj, Error *errp[static 1])
 {
     InputLinux *il = INPUT_LINUX(obj);
 
@@ -516,7 +516,7 @@ static bool input_linux_get_repeat(Object *obj, Error **errp)
 }
 
 static void input_linux_set_repeat(Object *obj, bool value,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     InputLinux *il = INPUT_LINUX(obj);
 
diff --git a/ui/input.c b/ui/input.c
index 290ca9f54d..4ae91052c3 100644
--- a/ui/input.c
+++ b/ui/input.c
@@ -82,7 +82,7 @@ void qemu_input_handler_unregister(QemuInputHandlerState *s)
 
 void qemu_input_handler_bind(QemuInputHandlerState *s,
                              const char *device_id, int head,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     QemuConsole *con;
     Error *err = NULL;
@@ -123,7 +123,7 @@ qemu_input_find_handler(uint32_t mask, QemuConsole *con)
 
 void qmp_input_send_event(bool has_device, const char *device,
                           bool has_head, int64_t head,
-                          InputEventList *events, Error **errp)
+                          InputEventList *events, Error *errp[static 1])
 {
     InputEventList *e;
     QemuConsole *con;
@@ -543,7 +543,7 @@ void qemu_remove_mouse_mode_change_notifier(Notifier *notify)
     notifier_remove(notify);
 }
 
-MouseInfoList *qmp_query_mice(Error **errp)
+MouseInfoList *qmp_query_mice(Error *errp[static 1])
 {
     MouseInfoList *mice_list = NULL;
     MouseInfoList *info;
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 88d6d16faf..f22f71da1f 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -517,7 +517,7 @@ static QemuOptsList qemu_spice_opts = {
     },
 };
 
-SpiceInfo *qmp_query_spice(Error **errp)
+SpiceInfo *qmp_query_spice(Error *errp[static 1])
 {
     QemuOpts *opts = QTAILQ_FIRST(&qemu_spice_opts.head);
     int port, tls_port;
@@ -605,7 +605,7 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
 }
 
 static int add_channel(void *opaque, const char *name, const char *value,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     int security = 0;
     int rc;
diff --git a/ui/vnc-auth-sasl.c b/ui/vnc-auth-sasl.c
index 4b6f0e5d5a..4e70fe15d4 100644
--- a/ui/vnc-auth-sasl.c
+++ b/ui/vnc-auth-sasl.c
@@ -496,7 +496,7 @@ static int protocol_client_auth_sasl_mechname_len(VncState *vs, uint8_t *data, s
 static char *
 vnc_socket_ip_addr_string(QIOChannelSocket *ioc,
                           bool local,
-                          Error **errp)
+                          Error *errp[static 1])
 {
     SocketAddress *addr;
     char *ret;
diff --git a/ui/vnc.c b/ui/vnc.c
index 7acd3fe225..b4dcea747a 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -110,7 +110,7 @@ static void vnc_set_share_mode(VncState *vs, VncShareMode mode)
 
 static void vnc_init_basic_info(SocketAddress *addr,
                                 VncBasicInfo *info,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     switch (addr->type) {
     case SOCKET_ADDRESS_TYPE_INET:
@@ -143,7 +143,7 @@ static void vnc_init_basic_info(SocketAddress *addr,
 
 static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
                                                  VncBasicInfo *info,
-                                                 Error **errp)
+                                                 Error *errp[static 1])
 {
     SocketAddress *addr = NULL;
 
@@ -163,7 +163,7 @@ static void vnc_init_basic_info_from_server_addr(QIOChannelSocket *ioc,
 
 static void vnc_init_basic_info_from_remote_addr(QIOChannelSocket *ioc,
                                                  VncBasicInfo *info,
-                                                 Error **errp)
+                                                 Error *errp[static 1])
 {
     SocketAddress *addr = NULL;
 
@@ -373,7 +373,7 @@ static VncClientInfoList *qmp_query_client_list(VncDisplay *vd)
     return prev;
 }
 
-VncInfo *qmp_query_vnc(Error **errp)
+VncInfo *qmp_query_vnc(Error *errp[static 1])
 {
     VncInfo *info = g_malloc0(sizeof(*info));
     VncDisplay *vd = vnc_display_find(NULL);
@@ -552,7 +552,7 @@ static void qmp_query_auth(int auth, int subauth,
     }
 }
 
-VncInfo2List *qmp_query_vnc_servers(Error **errp)
+VncInfo2List *qmp_query_vnc_servers(Error *errp[static 1])
 {
     VncInfo2List *item, *prev = NULL;
     VncInfo2 *info;
@@ -3261,7 +3261,7 @@ vnc_display_setup_auth(int *auth,
                        bool password,
                        bool sasl,
                        bool websocket,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     /*
      * We have a choice of 3 authentication options
@@ -3375,7 +3375,7 @@ vnc_display_create_creds(bool x509,
                          bool x509verify,
                          const char *dir,
                          const char *id,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     gchar *credsid = g_strdup_printf("tlsvnc%s", id);
     Object *parent = object_get_objects_root();
@@ -3421,7 +3421,7 @@ static int vnc_display_get_address(const char *addrstr,
                                    bool ipv4,
                                    bool ipv6,
                                    SocketAddress **retaddr,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     int ret = -1;
     SocketAddress *addr = NULL;
@@ -3534,7 +3534,7 @@ static int vnc_display_get_addresses(QemuOpts *opts,
                                      size_t *retnsaddr,
                                      SocketAddress ***retwsaddr,
                                      size_t *retnwsaddr,
-                                     Error **errp)
+                                     Error *errp[static 1])
 {
     SocketAddress *saddr = NULL;
     SocketAddress *wsaddr = NULL;
@@ -3640,7 +3640,7 @@ static int vnc_display_connect(VncDisplay *vd,
                                size_t nsaddr,
                                SocketAddress **wsaddr,
                                size_t nwsaddr,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     /* connect to viewer */
     QIOChannelSocket *sioc = NULL;
@@ -3671,7 +3671,7 @@ static int vnc_display_listen_addr(VncDisplay *vd,
                                    QIOChannelSocket ***lsock,
                                    guint **lsock_tag,
                                    size_t *nlsock,
-                                   Error **errp)
+                                   Error *errp[static 1])
 {
     QIODNSResolver *resolver = qio_dns_resolver_get_instance();
     SocketAddress **rawaddrs = NULL;
@@ -3732,7 +3732,7 @@ static int vnc_display_listen(VncDisplay *vd,
                               size_t nsaddr,
                               SocketAddress **wsaddr,
                               size_t nwsaddr,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     size_t i;
 
@@ -3761,7 +3761,7 @@ static int vnc_display_listen(VncDisplay *vd,
 }
 
 
-void vnc_display_open(const char *id, Error **errp)
+void vnc_display_open(const char *id, Error *errp[static 1])
 {
     VncDisplay *vd = vnc_display_find(id);
     QemuOpts *opts = qemu_opts_find(&qemu_vnc_opts, id);
@@ -4043,7 +4043,7 @@ static void vnc_auto_assign_id(QemuOptsList *olist, QemuOpts *opts)
     qemu_opts_set_id(opts, id);
 }
 
-QemuOpts *vnc_parse(const char *str, Error **errp)
+QemuOpts *vnc_parse(const char *str, Error *errp[static 1])
 {
     QemuOptsList *olist = qemu_find_opts("vnc");
     QemuOpts *opts = qemu_opts_parse(olist, str, true, errp);
@@ -4061,7 +4061,7 @@ QemuOpts *vnc_parse(const char *str, Error **errp)
     return opts;
 }
 
-int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
+int vnc_init_func(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     Error *local_err = NULL;
     char *id = (char *)qemu_opts_id(opts);
diff --git a/util/aio-posix.c b/util/aio-posix.c
index 2d51239ec6..2286ae64cf 100644
--- a/util/aio-posix.c
+++ b/util/aio-posix.c
@@ -714,7 +714,8 @@ void aio_context_setup(AioContext *ctx)
 }
 
 void aio_context_set_poll_params(AioContext *ctx, int64_t max_ns,
-                                 int64_t grow, int64_t shrink, Error **errp)
+                                 int64_t grow, int64_t shrink,
+                                 Error *errp[static 1])
 {
     /* No thread synchronization here, it doesn't matter if an incorrect value
      * is used once.
diff --git a/util/aio-win32.c b/util/aio-win32.c
index bca496a47a..d29162d459 100644
--- a/util/aio-win32.c
+++ b/util/aio-win32.c
@@ -401,7 +401,8 @@ void aio_context_setup(AioContext *ctx)
 }
 
 void aio_context_set_poll_params(AioContext *ctx, int64_t max_ns,
-                                 int64_t grow, int64_t shrink, Error **errp)
+                                 int64_t grow, int64_t shrink,
+                                 Error *errp[static 1])
 {
     error_setg(errp, "AioContext polling is not implemented on Windows");
 }
diff --git a/util/async.c b/util/async.c
index 355af73ee7..900655f4f9 100644
--- a/util/async.c
+++ b/util/async.c
@@ -393,7 +393,7 @@ static void co_schedule_bh_cb(void *opaque)
     }
 }
 
-AioContext *aio_context_new(Error **errp)
+AioContext *aio_context_new(Error *errp[static 1])
 {
     int ret;
     AioContext *ctx;
diff --git a/util/base64.c b/util/base64.c
index 9d3c46cbcc..e998eb4f50 100644
--- a/util/base64.c
+++ b/util/base64.c
@@ -28,7 +28,7 @@ static const char *base64_valid_chars =
 uint8_t *qbase64_decode(const char *input,
                         size_t in_len,
                         size_t *out_len,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     *out_len = 0;
 
diff --git a/util/error.c b/util/error.c
index 2e16ad371c..8d765204e1 100644
--- a/util/error.c
+++ b/util/error.c
@@ -262,7 +262,7 @@ void error_free(Error *err)
     }
 }
 
-void error_free_or_abort(Error **errp)
+void error_free_or_abort(Error *errp[static 1])
 {
     assert(!ERR_IS_IGNORED(errp) && ERR_IS_SET(errp));
     error_free(*errp);
diff --git a/util/keyval.c b/util/keyval.c
index 7dbda62305..2c5d9d0aa5 100644
--- a/util/keyval.c
+++ b/util/keyval.c
@@ -133,7 +133,7 @@ static int key_to_index(const char *key, const char **end)
 static QObject *keyval_parse_put(QDict *cur,
                                  const char *key_in_cur, QString *value,
                                  const char *key, const char *key_cursor,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     QObject *old, *new;
 
@@ -166,7 +166,7 @@ static QObject *keyval_parse_put(QDict *cur,
  */
 static const char *keyval_parse_one(QDict *qdict, const char *params,
                                     const char *implied_key,
-                                    Error **errp)
+                                    Error *errp[static 1])
 {
     const char *key, *key_end, *s, *end;
     size_t len;
@@ -285,7 +285,8 @@ static char *reassemble_key(GSList *key)
  * On success, return either @cur or its replacement.
  * On failure, store an error through @errp and return NULL.
  */
-static QObject *keyval_listify(QDict *cur, GSList *key_of_cur, Error **errp)
+static QObject *keyval_listify(QDict *cur, GSList *key_of_cur,
+                               Error *errp[static 1])
 {
     GSList key_node;
     bool has_index, has_member;
@@ -393,7 +394,7 @@ static QObject *keyval_listify(QDict *cur, GSList *key_of_cur, Error **errp)
  * On failure, store an error through @errp and return NULL.
  */
 QDict *keyval_parse(const char *params, const char *implied_key,
-                    Error **errp)
+                    Error *errp[static 1])
 {
     QDict *qdict = qdict_new();
     QObject *listified;
diff --git a/util/log.c b/util/log.c
index 96f30dd21a..7244acbc6b 100644
--- a/util/log.c
+++ b/util/log.c
@@ -110,7 +110,7 @@ void qemu_log_needs_buffers(void)
  * substituted with the current PID. This is useful for debugging many
  * nested linux-user tasks but will result in lots of logs.
  */
-void qemu_set_log_filename(const char *filename, Error **errp)
+void qemu_set_log_filename(const char *filename, Error *errp[static 1])
 {
     char *pidstr;
     g_free(logfilename);
@@ -150,7 +150,7 @@ bool qemu_log_in_addr_range(uint64_t addr)
 }
 
 
-void qemu_set_dfilter_ranges(const char *filter_spec, Error **errp)
+void qemu_set_dfilter_ranges(const char *filter_spec, Error *errp[static 1])
 {
     gchar **ranges = g_strsplit(filter_spec, ",", 0);
     int i;
diff --git a/util/main-loop.c b/util/main-loop.c
index 19cad6b8b6..750000776d 100644
--- a/util/main-loop.c
+++ b/util/main-loop.c
@@ -138,7 +138,7 @@ void qemu_notify_event(void)
 
 static GArray *gpollfds;
 
-int qemu_init_main_loop(Error **errp)
+int qemu_init_main_loop(Error *errp[static 1])
 {
     int ret;
     GSource *src;
diff --git a/util/qemu-config.c b/util/qemu-config.c
index 48e5691f8d..4008d184ff 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -10,7 +10,7 @@ static QemuOptsList *vm_config_groups[48];
 static QemuOptsList *drive_config_groups[5];
 
 static QemuOptsList *find_list(QemuOptsList **lists, const char *group,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     int i;
 
@@ -241,7 +241,7 @@ static QemuOptsList machine_opts = {
 
 CommandLineOptionInfoList *qmp_query_command_line_options(bool has_option,
                                                           const char *option,
-                                                          Error **errp)
+                                                          Error *errp[static 1])
 {
     CommandLineOptionInfoList *conf_list = NULL, *entry;
     CommandLineOptionInfo *info;
@@ -273,7 +273,7 @@ CommandLineOptionInfoList *qmp_query_command_line_options(bool has_option,
     return conf_list;
 }
 
-QemuOptsList *qemu_find_opts_err(const char *group, Error **errp)
+QemuOptsList *qemu_find_opts_err(const char *group, Error *errp[static 1])
 {
     return find_list(vm_config_groups, group, errp);
 }
@@ -350,7 +350,7 @@ struct ConfigWriteData {
 };
 
 static int config_write_opt(void *opaque, const char *name, const char *value,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     struct ConfigWriteData *data = opaque;
 
@@ -358,7 +358,8 @@ static int config_write_opt(void *opaque, const char *name, const char *value,
     return 0;
 }
 
-static int config_write_opts(void *opaque, QemuOpts *opts, Error **errp)
+static int config_write_opts(void *opaque, QemuOpts *opts,
+                             Error *errp[static 1])
 {
     struct ConfigWriteData *data = opaque;
     const char *id = qemu_opts_id(opts);
@@ -474,7 +475,7 @@ int qemu_read_config_file(const char *filename)
 }
 
 static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
-                                       Error **errp)
+                                       Error *errp[static 1])
 {
     QemuOpts *subopts;
     QDict *subqdict;
@@ -565,7 +566,7 @@ out:
 }
 
 void qemu_config_parse_qdict(QDict *options, QemuOptsList **lists,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     int i;
 
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 4a4b145d42..5a5653acaa 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -126,7 +126,7 @@ int get_param_value(char *buf, int buf_size,
 }
 
 static void parse_option_bool(const char *name, const char *value, bool *ret,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     if (!strcmp(value, "on")) {
         *ret = 1;
@@ -139,7 +139,7 @@ static void parse_option_bool(const char *name, const char *value, bool *ret,
 }
 
 static void parse_option_number(const char *name, const char *value,
-                                uint64_t *ret, Error **errp)
+                                uint64_t *ret, Error *errp[static 1])
 {
     uint64_t number;
     int err;
@@ -172,7 +172,7 @@ static const QemuOptDesc *find_desc_by_name(const QemuOptDesc *desc,
 }
 
 void parse_option_size(const char *name, const char *value,
-                       uint64_t *ret, Error **errp)
+                       uint64_t *ret, Error *errp[static 1])
 {
     uint64_t size;
     int err;
@@ -479,7 +479,7 @@ uint64_t qemu_opt_get_size_del(QemuOpts *opts, const char *name,
     return qemu_opt_get_size_helper(opts, name, defval, true);
 }
 
-static void qemu_opt_parse(QemuOpt *opt, Error **errp)
+static void qemu_opt_parse(QemuOpt *opt, Error *errp[static 1])
 {
     if (opt->desc == NULL)
         return;
@@ -522,7 +522,7 @@ int qemu_opt_unset(QemuOpts *opts, const char *name)
 }
 
 static void opt_set(QemuOpts *opts, const char *name, const char *value,
-                    bool prepend, Error **errp)
+                    bool prepend, Error *errp[static 1])
 {
     QemuOpt *opt;
     const QemuOptDesc *desc;
@@ -551,13 +551,13 @@ static void opt_set(QemuOpts *opts, const char *name, const char *value,
 }
 
 void qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
-                  Error **errp)
+                  Error *errp[static 1])
 {
     opt_set(opts, name, value, false, errp);
 }
 
 void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     QemuOpt *opt;
     const QemuOptDesc *desc = opts->list->desc;
@@ -578,7 +578,7 @@ void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
 }
 
 void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
-                         Error **errp)
+                         Error *errp[static 1])
 {
     QemuOpt *opt;
     const QemuOptDesc *desc = opts->list->desc;
@@ -605,7 +605,7 @@ void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
  * Return zero when the loop completes.
  */
 int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
-                     Error **errp)
+                     Error *errp[static 1])
 {
     QemuOpt *opt;
     int rc;
@@ -636,7 +636,7 @@ QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id)
 }
 
 QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
-                           int fail_if_exists, Error **errp)
+                           int fail_if_exists, Error *errp[static 1])
 {
     QemuOpts *opts = NULL;
 
@@ -687,7 +687,7 @@ void qemu_opts_loc_restore(QemuOpts *opts)
 }
 
 void qemu_opts_set(QemuOptsList *list, const char *id,
-                   const char *name, const char *value, Error **errp)
+                   const char *name, const char *value, Error *errp[static 1])
 {
     QemuOpts *opts;
     Error *local_err = NULL;
@@ -784,7 +784,8 @@ void qemu_opts_print(QemuOpts *opts, const char *separator)
 }
 
 static void opts_do_parse(QemuOpts *opts, const char *params,
-                          const char *firstname, bool prepend, Error **errp)
+                          const char *firstname, bool prepend,
+                          Error *errp[static 1])
 {
     char option[128], value[1024];
     const char *p,*pe,*pc;
@@ -837,13 +838,14 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
  * On error, store an error object through @errp if non-null.
  */
 void qemu_opts_do_parse(QemuOpts *opts, const char *params,
-                       const char *firstname, Error **errp)
+                       const char *firstname, Error *errp[static 1])
 {
     opts_do_parse(opts, params, firstname, false, errp);
 }
 
 static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
-                            bool permit_abbrev, bool defaults, Error **errp)
+                            bool permit_abbrev, bool defaults,
+                            Error *errp[static 1])
 {
     const char *firstname;
     char value[1024], *id = NULL;
@@ -894,7 +896,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
  * Return the new QemuOpts on success, null pointer on error.
  */
 QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params,
-                          bool permit_abbrev, Error **errp)
+                          bool permit_abbrev, Error *errp[static 1])
 {
     return opts_parse(list, params, permit_abbrev, false, errp);
 }
@@ -980,7 +982,7 @@ static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
  * other types are silently ignored.
  */
 QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     OptsFromQDictState state;
     Error *local_err = NULL;
@@ -1012,7 +1014,8 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
  * from the QDict. When this function returns, the QDict contains only those
  * entries that couldn't be added to the QemuOpts.
  */
-void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp)
+void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict,
+                            Error *errp[static 1])
 {
     const QDictEntry *entry, *next;
 
@@ -1066,7 +1069,8 @@ QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict)
 /* Validate parsed opts against descriptions where no
  * descriptions were provided in the QemuOptsList.
  */
-void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
+void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc,
+                        Error *errp[static 1])
 {
     QemuOpt *opt;
 
@@ -1094,7 +1098,7 @@ void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
  * Return zero when the loop completes.
  */
 int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
-                      void *opaque, Error **errp)
+                      void *opaque, Error *errp[static 1])
 {
     Location loc;
     QemuOpts *opts;
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index d2ea5377dc..a47f771865 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -117,7 +117,7 @@ NetworkAddressFamily inet_netfamily(int family)
  * callers at all.
  */
 int inet_ai_family_from_address(InetSocketAddress *addr,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     if (addr->has_ipv6 && addr->has_ipv4 &&
         !addr->ipv6 && !addr->ipv4) {
@@ -136,7 +136,7 @@ int inet_ai_family_from_address(InetSocketAddress *addr,
 static int inet_listen_saddr(InetSocketAddress *saddr,
                              int port_offset,
                              bool update_addr,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     struct addrinfo ai,*res,*e;
     char port[33];
@@ -273,7 +273,8 @@ typedef struct ConnectState {
 } ConnectState;
 
 static int inet_connect_addr(struct addrinfo *addr, bool *in_progress,
-                             ConnectState *connect_state, Error **errp);
+                             ConnectState *connect_state,
+                             Error *errp[static 1]);
 
 static void wait_for_connect(void *opaque)
 {
@@ -331,7 +332,8 @@ out:
 }
 
 static int inet_connect_addr(struct addrinfo *addr, bool *in_progress,
-                             ConnectState *connect_state, Error **errp)
+                             ConnectState *connect_state,
+                             Error *errp[static 1])
 {
     int sock, rc;
 
@@ -367,7 +369,7 @@ static int inet_connect_addr(struct addrinfo *addr, bool *in_progress,
 }
 
 static struct addrinfo *inet_parse_connect_saddr(InetSocketAddress *saddr,
-                                                 Error **errp)
+                                                 Error *errp[static 1])
 {
     struct addrinfo ai, *res;
     int rc;
@@ -431,7 +433,7 @@ static struct addrinfo *inet_parse_connect_saddr(InetSocketAddress *saddr,
  */
 int inet_connect_saddr(InetSocketAddress *saddr,
                        NonBlockingConnectHandler *callback, void *opaque,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     Error *local_err = NULL;
     struct addrinfo *res, *e;
@@ -480,7 +482,7 @@ int inet_connect_saddr(InetSocketAddress *saddr,
 
 static int inet_dgram_saddr(InetSocketAddress *sraddr,
                             InetSocketAddress *sladdr,
-                            Error **errp)
+                            Error *errp[static 1])
 {
     struct addrinfo ai, *peer = NULL, *local = NULL;
     const char *addr;
@@ -580,7 +582,8 @@ err:
 }
 
 /* compatibility wrapper */
-int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
+int inet_parse(InetSocketAddress *addr, const char *str,
+               Error *errp[static 1])
 {
     const char *optstr, *h;
     char host[65];
@@ -650,7 +653,7 @@ int inet_parse(InetSocketAddress *addr, const char *str, Error **errp)
  *
  * Returns -1 in case of error, file descriptor on success
  **/
-int inet_connect(const char *str, Error **errp)
+int inet_connect(const char *str, Error *errp[static 1])
 {
     int sock = -1;
     InetSocketAddress *addr = g_new(InetSocketAddress, 1);
@@ -690,7 +693,8 @@ static bool vsock_parse_vaddr_to_sockaddr(const VsockSocketAddress *vaddr,
 }
 
 static int vsock_connect_addr(const struct sockaddr_vm *svm, bool *in_progress,
-                              ConnectState *connect_state, Error **errp)
+                              ConnectState *connect_state,
+                              Error *errp[static 1])
 {
     int sock, rc;
 
@@ -727,7 +731,7 @@ static int vsock_connect_addr(const struct sockaddr_vm *svm, bool *in_progress,
 static int vsock_connect_saddr(VsockSocketAddress *vaddr,
                                NonBlockingConnectHandler *callback,
                                void *opaque,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     struct sockaddr_vm svm;
     int sock = -1;
@@ -760,7 +764,7 @@ static int vsock_connect_saddr(VsockSocketAddress *vaddr,
 }
 
 static int vsock_listen_saddr(VsockSocketAddress *vaddr,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     struct sockaddr_vm svm;
     int slisten;
@@ -790,7 +794,7 @@ static int vsock_listen_saddr(VsockSocketAddress *vaddr,
 }
 
 static int vsock_parse(VsockSocketAddress *addr, const char *str,
-                       Error **errp)
+                       Error *errp[static 1])
 {
     char cid[33];
     char port[33];
@@ -810,28 +814,28 @@ static int vsock_parse(VsockSocketAddress *addr, const char *str,
     return 0;
 }
 #else
-static void vsock_unsupported(Error **errp)
+static void vsock_unsupported(Error *errp[static 1])
 {
     error_setg(errp, "socket family AF_VSOCK unsupported");
 }
 
 static int vsock_connect_saddr(VsockSocketAddress *vaddr,
                                NonBlockingConnectHandler *callback,
-                               void *opaque, Error **errp)
+                               void *opaque, Error *errp[static 1])
 {
     vsock_unsupported(errp);
     return -1;
 }
 
 static int vsock_listen_saddr(VsockSocketAddress *vaddr,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     vsock_unsupported(errp);
     return -1;
 }
 
 static int vsock_parse(VsockSocketAddress *addr, const char *str,
-                        Error **errp)
+                        Error *errp[static 1])
 {
     vsock_unsupported(errp);
     return -1;
@@ -842,7 +846,7 @@ static int vsock_parse(VsockSocketAddress *addr, const char *str,
 
 static int unix_listen_saddr(UnixSocketAddress *saddr,
                              bool update_addr,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     struct sockaddr_un un;
     int sock, fd;
@@ -922,7 +926,7 @@ err:
 
 static int unix_connect_saddr(UnixSocketAddress *saddr,
                               NonBlockingConnectHandler *callback, void *opaque,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     struct sockaddr_un un;
     ConnectState *connect_state = NULL;
@@ -994,7 +998,7 @@ static int unix_connect_saddr(UnixSocketAddress *saddr,
 
 static int unix_listen_saddr(UnixSocketAddress *saddr,
                              bool update_addr,
-                             Error **errp)
+                             Error *errp[static 1])
 {
     error_setg(errp, "unix sockets are not available on windows");
     errno = ENOTSUP;
@@ -1003,7 +1007,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 
 static int unix_connect_saddr(UnixSocketAddress *saddr,
                               NonBlockingConnectHandler *callback, void *opaque,
-                              Error **errp)
+                              Error *errp[static 1])
 {
     error_setg(errp, "unix sockets are not available on windows");
     errno = ENOTSUP;
@@ -1012,7 +1016,7 @@ static int unix_connect_saddr(UnixSocketAddress *saddr,
 #endif
 
 /* compatibility wrapper */
-int unix_listen(const char *str, char *ostr, int olen, Error **errp)
+int unix_listen(const char *str, char *ostr, int olen, Error *errp[static 1])
 {
     char *path, *optstr;
     int sock, len;
@@ -1042,7 +1046,7 @@ int unix_listen(const char *str, char *ostr, int olen, Error **errp)
     return sock;
 }
 
-int unix_connect(const char *path, Error **errp)
+int unix_connect(const char *path, Error *errp[static 1])
 {
     UnixSocketAddress *saddr;
     int sock;
@@ -1055,7 +1059,7 @@ int unix_connect(const char *path, Error **errp)
 }
 
 
-SocketAddress *socket_parse(const char *str, Error **errp)
+SocketAddress *socket_parse(const char *str, Error *errp[static 1])
 {
     SocketAddress *addr;
 
@@ -1095,7 +1099,7 @@ fail:
 }
 
 int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
-                   void *opaque, Error **errp)
+                   void *opaque, Error *errp[static 1])
 {
     int fd;
 
@@ -1126,7 +1130,7 @@ int socket_connect(SocketAddress *addr, NonBlockingConnectHandler *callback,
     return fd;
 }
 
-int socket_listen(SocketAddress *addr, Error **errp)
+int socket_listen(SocketAddress *addr, Error *errp[static 1])
 {
     int fd;
 
@@ -1153,7 +1157,7 @@ int socket_listen(SocketAddress *addr, Error **errp)
     return fd;
 }
 
-void socket_listen_cleanup(int fd, Error **errp)
+void socket_listen_cleanup(int fd, Error *errp[static 1])
 {
     SocketAddress *addr;
 
@@ -1171,7 +1175,8 @@ void socket_listen_cleanup(int fd, Error **errp)
     qapi_free_SocketAddress(addr);
 }
 
-int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
+int socket_dgram(SocketAddress *remote, SocketAddress *local,
+                 Error *errp[static 1])
 {
     int fd;
 
@@ -1196,7 +1201,7 @@ int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
 static SocketAddress *
 socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
                                 socklen_t salen,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     char host[NI_MAXHOST];
     char serv[NI_MAXSERV];
@@ -1233,7 +1238,7 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
 static SocketAddress *
 socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
                                 socklen_t salen,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     SocketAddress *addr;
     struct sockaddr_un *su = (struct sockaddr_un *)sa;
@@ -1252,7 +1257,7 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
 static SocketAddress *
 socket_sockaddr_to_address_vsock(struct sockaddr_storage *sa,
                                  socklen_t salen,
-                                 Error **errp)
+                                 Error *errp[static 1])
 {
     SocketAddress *addr;
     VsockSocketAddress *vaddr;
@@ -1271,7 +1276,7 @@ socket_sockaddr_to_address_vsock(struct sockaddr_storage *sa,
 SocketAddress *
 socket_sockaddr_to_address(struct sockaddr_storage *sa,
                            socklen_t salen,
-                           Error **errp)
+                           Error *errp[static 1])
 {
     switch (sa->ss_family) {
     case AF_INET:
@@ -1297,7 +1302,7 @@ socket_sockaddr_to_address(struct sockaddr_storage *sa,
 }
 
 
-SocketAddress *socket_local_address(int fd, Error **errp)
+SocketAddress *socket_local_address(int fd, Error *errp[static 1])
 {
     struct sockaddr_storage ss;
     socklen_t sslen = sizeof(ss);
@@ -1312,7 +1317,7 @@ SocketAddress *socket_local_address(int fd, Error **errp)
 }
 
 
-SocketAddress *socket_remote_address(int fd, Error **errp)
+SocketAddress *socket_remote_address(int fd, Error *errp[static 1])
 {
     struct sockaddr_storage ss;
     socklen_t sslen = sizeof(ss);
@@ -1326,7 +1331,8 @@ SocketAddress *socket_remote_address(int fd, Error **errp)
     return socket_sockaddr_to_address(&ss, sslen, errp);
 }
 
-char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
+char *socket_address_to_string(struct SocketAddress *addr,
+                               Error *errp[static 1])
 {
     char *buf;
     InetSocketAddress *inet;
diff --git a/util/throttle.c b/util/throttle.c
index 3570ed25fc..8d5955ae61 100644
--- a/util/throttle.c
+++ b/util/throttle.c
@@ -287,7 +287,7 @@ bool throttle_enabled(ThrottleConfig *cfg)
  * @ret: true if valid else false
  * @errp: error object
  */
-bool throttle_is_valid(ThrottleConfig *cfg, Error **errp)
+bool throttle_is_valid(ThrottleConfig *cfg, Error *errp[static 1])
 {
     int i;
     bool bps_flag, ops_flag;
diff --git a/vl.c b/vl.c
index 32068db274..4926770561 100644
--- a/vl.c
+++ b/vl.c
@@ -564,7 +564,8 @@ static void res_free(void)
     boot_splash_filedata = NULL;
 }
 
-static int default_driver_check(void *opaque, QemuOpts *opts, Error **errp)
+static int default_driver_check(void *opaque, QemuOpts *opts,
+                                Error *errp[static 1])
 {
     const char *driver = qemu_opt_get(opts, "driver");
     int i;
@@ -741,7 +742,7 @@ bool runstate_needs_reset(void)
         runstate_check(RUN_STATE_SHUTDOWN);
 }
 
-StatusInfo *qmp_query_status(Error **errp)
+StatusInfo *qmp_query_status(Error *errp[static 1])
 {
     StatusInfo *info = g_malloc0(sizeof(*info));
 
@@ -1029,7 +1030,7 @@ static int bt_parse(const char *opt)
     return 1;
 }
 
-static int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
+static int parse_sandbox(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     /* FIXME: change this to true for 1.3 */
     if (qemu_opt_get_bool(opts, "enable", false)) {
@@ -1048,7 +1049,7 @@ static int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
     return 0;
 }
 
-static int parse_name(void *opaque, QemuOpts *opts, Error **errp)
+static int parse_name(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     const char *proc_name;
 
@@ -1071,7 +1072,7 @@ bool defaults_enabled(void)
 }
 
 #ifndef _WIN32
-static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
+static int parse_add_fd(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     int fd, dupfd, flags;
     int64_t fdset_id;
@@ -1128,7 +1129,7 @@ static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
     return 0;
 }
 
-static int cleanup_add_fd(void *opaque, QemuOpts *opts, Error **errp)
+static int cleanup_add_fd(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     int fd;
 
@@ -1149,14 +1150,16 @@ static int cleanup_add_fd(void *opaque, QemuOpts *opts, Error **errp)
 #define MTD_OPTS ""
 #define SD_OPTS ""
 
-static int drive_init_func(void *opaque, QemuOpts *opts, Error **errp)
+static int drive_init_func(void *opaque, QemuOpts *opts,
+                           Error *errp[static 1])
 {
     BlockInterfaceType *block_default_type = opaque;
 
     return drive_new(opts, *block_default_type) == NULL;
 }
 
-static int drive_enable_snapshot(void *opaque, QemuOpts *opts, Error **errp)
+static int drive_enable_snapshot(void *opaque, QemuOpts *opts,
+                                 Error *errp[static 1])
 {
     if (qemu_opt_get(opts, "snapshot") == NULL) {
         qemu_opt_set(opts, "snapshot", "on", &error_abort);
@@ -1333,7 +1336,7 @@ const char *semihosting_get_cmdline(void)
 
 static int add_semihosting_arg(void *opaque,
                                const char *name, const char *val,
-                               Error **errp)
+                               Error *errp[static 1])
 {
     SemihostingConfig *s = opaque;
     if (strcmp(name, "arg") == 0) {
@@ -1502,7 +1505,7 @@ MachineClass *find_default_machine(void)
     return mc;
 }
 
-MachineInfoList *qmp_query_machines(Error **errp)
+MachineInfoList *qmp_query_machines(Error *errp[static 1])
 {
     GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
     MachineInfoList *mach_list = NULL;
@@ -2274,7 +2277,7 @@ static inline bool nonempty_str(const char *str)
     return str && *str;
 }
 
-static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
+static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     gchar *buf;
     size_t size;
@@ -2322,12 +2325,14 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
     return 0;
 }
 
-static int device_help_func(void *opaque, QemuOpts *opts, Error **errp)
+static int device_help_func(void *opaque, QemuOpts *opts,
+                            Error *errp[static 1])
 {
     return qdev_device_help(opts);
 }
 
-static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
+static int device_init_func(void *opaque, QemuOpts *opts,
+                            Error *errp[static 1])
 {
     Error *err = NULL;
     DeviceState *dev;
@@ -2341,7 +2346,8 @@ static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
     return 0;
 }
 
-static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
+static int chardev_init_func(void *opaque, QemuOpts *opts,
+                             Error *errp[static 1])
 {
     Error *local_err = NULL;
 
@@ -2354,13 +2360,14 @@ static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
 }
 
 #ifdef CONFIG_VIRTFS
-static int fsdev_init_func(void *opaque, QemuOpts *opts, Error **errp)
+static int fsdev_init_func(void *opaque, QemuOpts *opts,
+                           Error *errp[static 1])
 {
     return qemu_fsdev_add(opts);
 }
 #endif
 
-static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
+static int mon_init_func(void *opaque, QemuOpts *opts, Error *errp[static 1])
 {
     Chardev *chr;
     const char *chardev;
@@ -2771,7 +2778,7 @@ static MachineClass *select_machine(void)
 
 static int machine_set_property(void *opaque,
                                 const char *name, const char *value,
-                                Error **errp)
+                                Error *errp[static 1])
 {
     Object *obj = OBJECT(opaque);
     Error *local_err = NULL;
@@ -2944,7 +2951,8 @@ static void set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
     loc_pop(&loc);
 }
 
-static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
+static int global_init_func(void *opaque, QemuOpts *opts,
+                            Error *errp[static 1])
 {
     GlobalProperty *g;
 
-- 
2.11.0.259.g40922b1

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

* Re: [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments
       [not found]   ` <20170615121407.GA2399@work-vm>
@ 2017-06-17 19:33     ` Eduardo Habkost
  2017-06-19  8:48       ` Dr. David Alan Gilbert
  0 siblings, 1 reply; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-17 19:33 UTC (permalink / raw)
  To: Dr. David Alan Gilbert; +Cc: qemu-devel, Markus Armbruster, Michael Roth

On Thu, Jun 15, 2017 at 01:14:15PM +0100, Dr. David Alan Gilbert wrote:
> * Eduardo Habkost (ehabkost@redhat.com) wrote:
> > This is being included in the RFC just to help validating the series,
> > and ensure we don't use NULL errp anywhere.
> > 
> > I don't propose we actually change all code to use the
> > 'Error *errp[static 1]' syntax because it confuses Cocinelle.
> > 
> > I am considering including a assert(errp) line in the ERR_IS_SET()
> > macro, so we can catch NULL errp at runtime in case somebody forgets
> > about it.
> > 
> > Generated by the following Coccinelle patch:
> > 
> >   @@
> >   typedef Error;
> >   type T;
> >   identifier FN !~ "os_mem_prealloc|qemu_fork";
> >   identifier errp;
> >   @@
> >    T FN(...,
> >   -     Error **errp
> >   +     Error *errp[STATIC_1]
> >        );
> > 
> >   @@
> >   typedef Error;
> >   type T;
> >   identifier FN !~ "os_mem_prealloc|qemu_fork";
> >   identifier errp;
> >   @@
> >    T FN(...,
> >   -     Error **errp
> >   +     Error *errp[STATIC_1]
> >        ) { ... }
> > 
> > Followed by the following sed command:
> > 
> >   $ sed -i -e 's/\[STATIC_1\]/[static 1]/g' $(g grep -w -l STATIC_1)
> > 
> > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> > ---
> 
> <snip>
> 
> >  void visit_start_struct(Visitor *v, const char *name, void **obj,
> > -                        size_t size, Error **errp);
> > +                        size_t size, Error *errp[static 1]);
> >  
> 
> Is it possible to typedef that to something that hides the magic syntax?
> Then we could get that down to QError errp   or something like that?

Unfortunately it is not possible to hide it in a typedef: the
"static" keyword inside the square brackets is a feature of
function parameter declarations only.  Using it on a typedef
results in:

a.c:3:16: error: static or type qualifiers in non-parameter array declarator
 typedef Error *ErrorPtr[static 1];

We could use a preprocessor macro, but I suspect this would also
confuse Coccinelle.

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments
  2017-06-17 19:33     ` Eduardo Habkost
@ 2017-06-19  8:48       ` Dr. David Alan Gilbert
  2017-06-19  9:43         ` Peter Maydell
  0 siblings, 1 reply; 41+ messages in thread
From: Dr. David Alan Gilbert @ 2017-06-19  8:48 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: qemu-devel, Markus Armbruster, Michael Roth

* Eduardo Habkost (ehabkost@redhat.com) wrote:
> On Thu, Jun 15, 2017 at 01:14:15PM +0100, Dr. David Alan Gilbert wrote:
> > * Eduardo Habkost (ehabkost@redhat.com) wrote:
> > > This is being included in the RFC just to help validating the series,
> > > and ensure we don't use NULL errp anywhere.
> > > 
> > > I don't propose we actually change all code to use the
> > > 'Error *errp[static 1]' syntax because it confuses Cocinelle.
> > > 
> > > I am considering including a assert(errp) line in the ERR_IS_SET()
> > > macro, so we can catch NULL errp at runtime in case somebody forgets
> > > about it.
> > > 
> > > Generated by the following Coccinelle patch:
> > > 
> > >   @@
> > >   typedef Error;
> > >   type T;
> > >   identifier FN !~ "os_mem_prealloc|qemu_fork";
> > >   identifier errp;
> > >   @@
> > >    T FN(...,
> > >   -     Error **errp
> > >   +     Error *errp[STATIC_1]
> > >        );
> > > 
> > >   @@
> > >   typedef Error;
> > >   type T;
> > >   identifier FN !~ "os_mem_prealloc|qemu_fork";
> > >   identifier errp;
> > >   @@
> > >    T FN(...,
> > >   -     Error **errp
> > >   +     Error *errp[STATIC_1]
> > >        ) { ... }
> > > 
> > > Followed by the following sed command:
> > > 
> > >   $ sed -i -e 's/\[STATIC_1\]/[static 1]/g' $(g grep -w -l STATIC_1)
> > > 
> > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> > > ---
> > 
> > <snip>
> > 
> > >  void visit_start_struct(Visitor *v, const char *name, void **obj,
> > > -                        size_t size, Error **errp);
> > > +                        size_t size, Error *errp[static 1]);
> > >  
> > 
> > Is it possible to typedef that to something that hides the magic syntax?
> > Then we could get that down to QError errp   or something like that?
> 
> Unfortunately it is not possible to hide it in a typedef: the
> "static" keyword inside the square brackets is a feature of
> function parameter declarations only.  Using it on a typedef
> results in:
> 
> a.c:3:16: error: static or type qualifiers in non-parameter array declarator
>  typedef Error *ErrorPtr[static 1];

That's a shame; it's rather odd looking; still I think it's
worth it if it simplifies the error code.

> We could use a preprocessor macro, but I suspect this would also
> confuse Coccinelle.
> 
> -- 
> Eduardo

Dave
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

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

* Re: [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments
  2017-06-19  8:48       ` Dr. David Alan Gilbert
@ 2017-06-19  9:43         ` Peter Maydell
  2017-06-19 13:26           ` Eduardo Habkost
  0 siblings, 1 reply; 41+ messages in thread
From: Peter Maydell @ 2017-06-19  9:43 UTC (permalink / raw)
  To: Dr. David Alan Gilbert
  Cc: Eduardo Habkost, Michael Roth, QEMU Developers, Markus Armbruster

On 19 June 2017 at 09:48, Dr. David Alan Gilbert <dgilbert@redhat.com> wrote:
> * Eduardo Habkost (ehabkost@redhat.com) wrote:
>> On Thu, Jun 15, 2017 at 01:14:15PM +0100, Dr. David Alan Gilbert wrote:
>> > * Eduardo Habkost (ehabkost@redhat.com) wrote:
>> > >  void visit_start_struct(Visitor *v, const char *name, void **obj,
>> > > -                        size_t size, Error **errp);
>> > > +                        size_t size, Error *errp[static 1]);
>> > >
>> >
>> > Is it possible to typedef that to something that hides the magic syntax?
>> > Then we could get that down to QError errp   or something like that?
>>
>> Unfortunately it is not possible to hide it in a typedef: the
>> "static" keyword inside the square brackets is a feature of
>> function parameter declarations only.  Using it on a typedef
>> results in:
>>
>> a.c:3:16: error: static or type qualifiers in non-parameter array declarator
>>  typedef Error *ErrorPtr[static 1];
>
> That's a shame; it's rather odd looking; still I think it's
> worth it if it simplifies the error code.

Is gcc's __attribute__((nonnull)) any better? It seems to apply
to the whole function prototype rather than an individual argument
though so probably not :-(

thanks
-- PMM

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

* Re: [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments
  2017-06-19  9:43         ` Peter Maydell
@ 2017-06-19 13:26           ` Eduardo Habkost
  2017-06-27 20:12             ` Eric Blake
  0 siblings, 1 reply; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-19 13:26 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Dr. David Alan Gilbert, Michael Roth, QEMU Developers, Markus Armbruster

On Mon, Jun 19, 2017 at 10:43:51AM +0100, Peter Maydell wrote:
> On 19 June 2017 at 09:48, Dr. David Alan Gilbert <dgilbert@redhat.com> wrote:
> > * Eduardo Habkost (ehabkost@redhat.com) wrote:
> >> On Thu, Jun 15, 2017 at 01:14:15PM +0100, Dr. David Alan Gilbert wrote:
> >> > * Eduardo Habkost (ehabkost@redhat.com) wrote:
> >> > >  void visit_start_struct(Visitor *v, const char *name, void **obj,
> >> > > -                        size_t size, Error **errp);
> >> > > +                        size_t size, Error *errp[static 1]);
> >> > >
> >> >
> >> > Is it possible to typedef that to something that hides the magic syntax?
> >> > Then we could get that down to QError errp   or something like that?
> >>
> >> Unfortunately it is not possible to hide it in a typedef: the
> >> "static" keyword inside the square brackets is a feature of
> >> function parameter declarations only.  Using it on a typedef
> >> results in:
> >>
> >> a.c:3:16: error: static or type qualifiers in non-parameter array declarator
> >>  typedef Error *ErrorPtr[static 1];
> >
> > That's a shame; it's rather odd looking; still I think it's
> > worth it if it simplifies the error code.
> 
> Is gcc's __attribute__((nonnull)) any better? It seems to apply
> to the whole function prototype rather than an individual argument
> though so probably not :-(

It's possible to specify which arguments are non-null with
nonnull(<arg-index>, ...).  It's harder to use, but probably more
Coccinelle-friendly.

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments
  2017-06-19 13:26           ` Eduardo Habkost
@ 2017-06-27 20:12             ` Eric Blake
  2017-06-27 21:31               ` Eduardo Habkost
  0 siblings, 1 reply; 41+ messages in thread
From: Eric Blake @ 2017-06-27 20:12 UTC (permalink / raw)
  To: Eduardo Habkost, Peter Maydell
  Cc: QEMU Developers, Markus Armbruster, Dr. David Alan Gilbert, Michael Roth

[-- Attachment #1: Type: text/plain, Size: 1224 bytes --]

On 06/19/2017 08:26 AM, Eduardo Habkost wrote:

>> Is gcc's __attribute__((nonnull)) any better? It seems to apply
>> to the whole function prototype rather than an individual argument
>> though so probably not :-(
> 
> It's possible to specify which arguments are non-null with
> nonnull(<arg-index>, ...).  It's harder to use, but probably more
> Coccinelle-friendly.

Libvirt uses it, wrapped in a macro; for example:

int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
virCPUDefCopyModel(virCPUDefPtr dst,
                   const virCPUDef *src,
                   bool resetPolicy)
{ ...

and at least Coverity is able to use that information (libvirt had
problems in the past where older gcc _silently_ mis-optimized a program
that used the attribute, and ended up having our macro defined only
during Coverity and not during normal compilation; but I think that's
finally been resolved now that newer gcc is saner in its behavior). I
don't know how much smarts Coccinelle has for coming up with the right
parameter number in an automated conversion patch, though.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (14 preceding siblings ...)
  2017-06-13 16:53 ` [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments Eduardo Habkost
@ 2017-06-27 20:22 ` Eric Blake
  2017-06-28  9:05 ` Markus Armbruster
  16 siblings, 0 replies; 41+ messages in thread
From: Eric Blake @ 2017-06-27 20:22 UTC (permalink / raw)
  To: Eduardo Habkost, qemu-devel; +Cc: Markus Armbruster, Michael Roth

[-- Attachment #1: Type: text/plain, Size: 3221 bytes --]

On 06/13/2017 11:52 AM, Eduardo Habkost wrote:

> The Proposal
> ------------
> 
> I'm proposing replacing NULL errp with a special macro:
> IGNORE_ERRORS.  The macro will trigger special behavior in the
> error API that will make it not save any error information in the
> error pointer, but still keep track of boolean error state in
> *errp.
> 
> This will allow us to simplify the documented method to propagate errors
> from:
> 
>     Error *err = NULL;
>     foo(arg, &err);
>     if (err) {
>         handle the error...
>         error_propagate(errp, err);
>     }
> 
> to:
> 
>     foo(arg, errp);
>     if (ERR_IS_SET(errp)) {
>         handle the error...
>     }

Seems kind of neat to me!


> 
> This way, we can make ERR_IS_SET work even if errp was
> IGNORE_ERRORS.  The ERR_IS_* macros are reimplemented as:
> 
>   #define ERR_IS_SET(e) (*(e) && *(e) != &ignored_error_unset)
>   #define ERR_IS_IGNORED(e) (!(e) || *(e) == &ignored_error_unset || *(e) == &ignored_error_set)

Where the initial NULL checks go away if you get your way with a final
patch.

> 
> Ensuring errp is never NULL
> ---------------------------
> 
> The last patch on this series changes the (Error **errp)
> parameters in functions to (Error *errp[static 1]), just to help
> validate the existing code, as clang warns about NULL arguments
> on that case.  I don't think we should apply that patch, though,
> because the "[static 1]" syntax confuses Coccinelle.

Have you filed a bug report to the Coccinelle folks?  But yeah, it is
rather arcane C99 syntax that you don't see much of in common code.

> (Probably the easiest solution for that is to add assert(errp)
> lines to the ERR_IS_*() macros.)

Or even having the macros use a forced dereference through errp->xxx may
at least be enough for Coverity to catch things.

> Git branch
> ----------
> 
> This series depend on a few extra cleanups that I didn't submit
> to qemu-devel yet.  A git branch including this series is
> available at:
> 
>   git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1
> 
> Eduardo Habkost (15):
>   tests: Test cases for error API
>   error: New IGNORE_ERRORS macro
>   Add qapi/error.h includes on files that will need it
>   [coccinelle] Use IGNORE_ERRORS instead of NULL as errp argument
>   qapi: Use IGNORE_ERRORS instead of NULL on generated code
>   test-qapi-util: Use IGNORE_ERRORS instead of NULL
>   Manual changes to use IGNORE_ERRORS instead of NULL
>   error: New ERR_IS_* macros for checking Error** values
>   [coccinelle] Use ERR_IS_* macros
>   test-qapi-util: Use ERR_IS_* macros
>   Manual changes to use ERR_IS_* macros
>   error: Make IGNORED_ERRORS not a NULL pointer
>   rdma: Simplify var declaration to avoid confusing Coccinelle
>   [coccinelle] Eliminate unnecessary local_err/error_propagate() usage
>   [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to
>     catch NULL errp arguments

I have not reviewed the series yet, but the idea looks promising.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

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

* Re: [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments
  2017-06-27 20:12             ` Eric Blake
@ 2017-06-27 21:31               ` Eduardo Habkost
  0 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-27 21:31 UTC (permalink / raw)
  To: Eric Blake
  Cc: Peter Maydell, QEMU Developers, Markus Armbruster,
	Dr. David Alan Gilbert, Michael Roth

On Tue, Jun 27, 2017 at 03:12:25PM -0500, Eric Blake wrote:
> On 06/19/2017 08:26 AM, Eduardo Habkost wrote:
> 
> >> Is gcc's __attribute__((nonnull)) any better? It seems to apply
> >> to the whole function prototype rather than an individual argument
> >> though so probably not :-(
> > 
> > It's possible to specify which arguments are non-null with
> > nonnull(<arg-index>, ...).  It's harder to use, but probably more
> > Coccinelle-friendly.
> 
> Libvirt uses it, wrapped in a macro; for example:
> 
> int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
> virCPUDefCopyModel(virCPUDefPtr dst,
>                    const virCPUDef *src,
>                    bool resetPolicy)
> { ...
> 
> and at least Coverity is able to use that information (libvirt had
> problems in the past where older gcc _silently_ mis-optimized a program
> that used the attribute, and ended up having our macro defined only
> during Coverity and not during normal compilation; but I think that's
> finally been resolved now that newer gcc is saner in its behavior). I
> don't know how much smarts Coccinelle has for coming up with the right
> parameter number in an automated conversion patch, though.

In the worst case, the script could have a dozen transformations, one
transformation for each possible number of function arguments.

However, I hit this Coccinelle bug when trying to implement that:
https://github.com/coccinelle/coccinelle/issues/107

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
                   ` (15 preceding siblings ...)
  2017-06-27 20:22 ` [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eric Blake
@ 2017-06-28  9:05 ` Markus Armbruster
  2017-06-28 17:41   ` Eduardo Habkost
                     ` (2 more replies)
  16 siblings, 3 replies; 41+ messages in thread
From: Markus Armbruster @ 2017-06-28  9:05 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: qemu-devel, Michael Roth

Eduardo Habkost <ehabkost@redhat.com> writes:

> Rationale
> ---------
>
> I'm often bothered by the fact that we can't write the following:
>
>     foo(arg, errp);
>     if (*errp) {
>         handle the error...
>         error_propagate(errp, err);
>     }
>
> because errp can be NULL.

If foo() additionally returned an indication of success, you could write

      if (!foo(arg, errp)) {    // assuming foo() returns a bool
          handle the error...
      }

Nicely concise.

For what it's worth, this is how GLib wants GError to be used.  We
deviated from it, and it has turned out to be a self-inflicted wound.

> I understand the reason we need to support errp==NULL, as it
> makes life simpler for callers that don't want any extra error
> information.  However, this has the cost of making the functions
> that report errors more complex and error-prone.
>
> (Evidence of that: the 34 ERR_IS_* cases handled by the "use
> ERR_IS_* macros" patches in the series.  Where existing code will
> crash or behave differently if errp is NULL.)

Which of them could *not* use a suitable return value instead of *errp?

> I considered suggesting forbidding NULL errp, and just changing
> all callers that use NULL to have an err variable and call
> error_free(), but this would mean changing 690 function callers
> that pass NULL errp as argument.

Would also add lots of pointless malloc churn.  The ability to ignore
errors is a feature.

> Here I'm proposing a mechanism to have the best of both worlds:
> allow callers to ignore errors easily while allowing functions to
> propagate errors without an intermediate local_err variable.
>
> The Proposal
> ------------
>
> I'm proposing replacing NULL errp with a special macro:
> IGNORE_ERRORS.  The macro will trigger special behavior in the
> error API that will make it not save any error information in the
> error pointer, but still keep track of boolean error state in
> *errp.
>
> This will allow us to simplify the documented method to propagate errors
> from:
>
>     Error *err = NULL;
>     foo(arg, &err);
>     if (err) {
>         handle the error...
>         error_propagate(errp, err);
>     }
>
> to:
>
>     foo(arg, errp);
>     if (ERR_IS_SET(errp)) {
>         handle the error...
>     }
>
> This will allow us to stop using local_err variables and
> error_propagate() on hundreds of cases.

Getting rid of unnecessary local_err boilerplate is good.  The question
is how.  A possible alternative to your proposal is to follow GLib and
make functions return success/failure.

How do the two compare?

> Implementation
> --------------
>
> This replaces NULL errp arguments on function calls with a
> IGNORE_ERRORS macro.  Checks for (!errp) are replaced by
> ERR_IS_IGNORED(errp).  Checks for (*errp) are replaced by
> ERR_IS_SET(errp).  No extra changes are required on function
> callers.

That's a lot of churn.  One time pain, of course.

> Then IGNORE_ERRORS is implemend as:
>
>   (& { &ignored_error_unset })
>
> When error_set() is called and IGNORE_ERRORS was used, we set
> error state using:
>
>   *errp = &ignored_error_set;
>
> This way, we can make ERR_IS_SET work even if errp was
> IGNORE_ERRORS.  The ERR_IS_* macros are reimplemented as:
>
>   #define ERR_IS_SET(e) (*(e) && *(e) != &ignored_error_unset)
>   #define ERR_IS_IGNORED(e) (!(e) || *(e) == &ignored_error_unset || *(e) == &ignored_error_set)
>
> Ensuring errp is never NULL
> ---------------------------
>
> The last patch on this series changes the (Error **errp)
> parameters in functions to (Error *errp[static 1]), just to help
> validate the existing code, as clang warns about NULL arguments
> on that case.  I don't think we should apply that patch, though,
> because the "[static 1]" syntax confuses Coccinelle.
>
> I have a branch where I experimented with the idea of replacing
> (Error **errp) parameters with an opaque type (void*, or a struct
> type).  I gave up when I noticed it would require touching all
> callers to replace &err with a wrapper macro to convert to the
> right type.  Suggestions to make NULL errp easier to detect at
> build time are welcome.
>
> (Probably the easiest solution for that is to add assert(errp)
> lines to the ERR_IS_*() macros.)

We'll obviously struggle with null arguments until all the developers
adjusted to the new interface.  Possibly with occasional mistakes
forever.  Compile-time checking would really, really help.

> Desirable side-effects
> ----------------------
>
> Some of additional benefits from parts of this series:
>
> * Making code that ignore error information more visible and
>   greppable (using IGNORE_ERRORS).

True.

Drawback: Passing an address takes more code than passing null.  Not
sure it matters.

>                                     I believe many of those cases
>   are actually bugs and should use &error_abort or &error_fatal
>   instead.

I've seen such bugs.

Of course, making possible offenders more greppable doesn't necessarily
mean existing ones will get fixed and new ones will be avoided.

> * Making code that depends on errp more visible and
>   greppable (using ERR_IS_* macros).  Some of those cases are
>   also likely to be bugs, and need to be investigated.

Grepping for (local_)?errp? works well enough, doesn't it?

> TODO
> ----
>
> * Simplify more cases of local_error/error_propagate() to use
>   errp directly.
> * Update API documentation and code examples.
> * Add a mechanism to ensure errp is never NULL.
>
> Git branch
> ----------
>
> This series depend on a few extra cleanups that I didn't submit
> to qemu-devel yet.  A git branch including this series is
> available at:
>
>   git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-28  9:05 ` Markus Armbruster
@ 2017-06-28 17:41   ` Eduardo Habkost
  2017-06-29  6:54     ` Markus Armbruster
  2017-06-29 14:01     ` Daniel P. Berrange
  2017-06-29 13:39   ` Paolo Bonzini
  2017-06-29 14:14   ` Daniel P. Berrange
  2 siblings, 2 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-28 17:41 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael Roth

On Wed, Jun 28, 2017 at 11:05:26AM +0200, Markus Armbruster wrote:
> Eduardo Habkost <ehabkost@redhat.com> writes:
> 
> > Rationale
> > ---------
> >
> > I'm often bothered by the fact that we can't write the following:
> >
> >     foo(arg, errp);
> >     if (*errp) {
> >         handle the error...
> >         error_propagate(errp, err);
> >     }
> >
> > because errp can be NULL.
> 
> If foo() additionally returned an indication of success, you could write
> 
>       if (!foo(arg, errp)) {    // assuming foo() returns a bool
>           handle the error...
>       }
> 
> Nicely concise.
> 
> For what it's worth, this is how GLib wants GError to be used.  We
> deviated from it, and it has turned out to be a self-inflicted wound.

Interesting, I didn't know about that.


> 
> > I understand the reason we need to support errp==NULL, as it
> > makes life simpler for callers that don't want any extra error
> > information.  However, this has the cost of making the functions
> > that report errors more complex and error-prone.
> >
> > (Evidence of that: the 34 ERR_IS_* cases handled by the "use
> > ERR_IS_* macros" patches in the series.  Where existing code will
> > crash or behave differently if errp is NULL.)
> 
> Which of them could *not* use a suitable return value instead of *errp?

I don't know.  But I'm not trying to improve those 34 ERR_IS_* cases.  I
am trying to improve the 700+ functions that need the
local_err/error_propagate() boilerplate code today.  This series already
handles 346 of them automatically (see patch 14/15).

> 
> > I considered suggesting forbidding NULL errp, and just changing
> > all callers that use NULL to have an err variable and call
> > error_free(), but this would mean changing 690 function callers
> > that pass NULL errp as argument.
> 
> Would also add lots of pointless malloc churn.  The ability to ignore
> errors is a feature.

Exactly.  My proposal keeps that ability.


> 
> > Here I'm proposing a mechanism to have the best of both worlds:
> > allow callers to ignore errors easily while allowing functions to
> > propagate errors without an intermediate local_err variable.
> >
> > The Proposal
> > ------------
> >
> > I'm proposing replacing NULL errp with a special macro:
> > IGNORE_ERRORS.  The macro will trigger special behavior in the
> > error API that will make it not save any error information in the
> > error pointer, but still keep track of boolean error state in
> > *errp.
> >
> > This will allow us to simplify the documented method to propagate errors
> > from:
> >
> >     Error *err = NULL;
> >     foo(arg, &err);
> >     if (err) {
> >         handle the error...
> >         error_propagate(errp, err);
> >     }
> >
> > to:
> >
> >     foo(arg, errp);
> >     if (ERR_IS_SET(errp)) {
> >         handle the error...
> >     }
> >
> > This will allow us to stop using local_err variables and
> > error_propagate() on hundreds of cases.
> 
> Getting rid of unnecessary local_err boilerplate is good.  The question
> is how.  A possible alternative to your proposal is to follow GLib and
> make functions return success/failure.
> 
> How do the two compare?

This proposal proposal already gets rid of 346 error_propagate() calls
automatically, and we probably can get rid of many others with
additional Coccinelle scripts.

Making functions return success/failure, on the other hand, would
require rewriting them manually.  This proposal doesn't even prevent
that from happening.  I'd say it helps on that, because we can now find
cases that still need to be converted by grepping for ERR_IS_SET.


> 
> > Implementation
> > --------------
> >
> > This replaces NULL errp arguments on function calls with a
> > IGNORE_ERRORS macro.  Checks for (!errp) are replaced by
> > ERR_IS_IGNORED(errp).  Checks for (*errp) are replaced by
> > ERR_IS_SET(errp).  No extra changes are required on function
> > callers.
> 
> That's a lot of churn.  One time pain, of course.

Yes, and it was automated using Coccinelle.

> 
> > Then IGNORE_ERRORS is implemend as:
> >
> >   (& { &ignored_error_unset })
> >
> > When error_set() is called and IGNORE_ERRORS was used, we set
> > error state using:
> >
> >   *errp = &ignored_error_set;
> >
> > This way, we can make ERR_IS_SET work even if errp was
> > IGNORE_ERRORS.  The ERR_IS_* macros are reimplemented as:
> >
> >   #define ERR_IS_SET(e) (*(e) && *(e) != &ignored_error_unset)
> >   #define ERR_IS_IGNORED(e) (!(e) || *(e) == &ignored_error_unset || *(e) == &ignored_error_set)
> >
> > Ensuring errp is never NULL
> > ---------------------------
> >
> > The last patch on this series changes the (Error **errp)
> > parameters in functions to (Error *errp[static 1]), just to help
> > validate the existing code, as clang warns about NULL arguments
> > on that case.  I don't think we should apply that patch, though,
> > because the "[static 1]" syntax confuses Coccinelle.
> >
> > I have a branch where I experimented with the idea of replacing
> > (Error **errp) parameters with an opaque type (void*, or a struct
> > type).  I gave up when I noticed it would require touching all
> > callers to replace &err with a wrapper macro to convert to the
> > right type.  Suggestions to make NULL errp easier to detect at
> > build time are welcome.
> >
> > (Probably the easiest solution for that is to add assert(errp)
> > lines to the ERR_IS_*() macros.)
> 
> We'll obviously struggle with null arguments until all the developers
> adjusted to the new interface.  Possibly with occasional mistakes
> forever.  Compile-time checking would really, really help.

True.  I'm investigating the possibility of using
__attribute__((nonull(...))) with Coccinelle's help.


> 
> > Desirable side-effects
> > ----------------------
> >
> > Some of additional benefits from parts of this series:
> >
> > * Making code that ignore error information more visible and
> >   greppable (using IGNORE_ERRORS).
> 
> True.
> 
> Drawback: Passing an address takes more code than passing null.  Not
> sure it matters.

I don't know what you mean by "more code".  It requires just replacing
NULL with IGNORE_ERRORS.  The magic is hidden behind the macro.


> 
> >                                     I believe many of those cases
> >   are actually bugs and should use &error_abort or &error_fatal
> >   instead.
> 
> I've seen such bugs.
> 
> Of course, making possible offenders more greppable doesn't necessarily
> mean existing ones will get fixed and new ones will be avoided.
> 
> > * Making code that depends on errp more visible and
> >   greppable (using ERR_IS_* macros).  Some of those cases are
> >   also likely to be bugs, and need to be investigated.
> 
> Grepping for (local_)?errp? works well enough, doesn't it?

I don't see how.  I'm talking about two cases:

1) Code like this:

  int func1(..., Error **errp)
  {
      do_something(errp);
      if (errp && *errp) {
          /* handle error */
          return;
      }
      /* do something else */
  }

func1() is buggy because it behaves differently if errp is NULL.


2) Code like this:

  int func2(..., Error **errp)
  {
      do_something(errp);
      if (*errp) {
          /* handle error */
      }
  }

func2() is buggy because if crashes if errp is NULL.


I don't see an easy way to grep for them with the current code.  With
this series, (1) can be detected by grepping for ERR_IS_IGNORED, and (2)
is fixed because ERR_IS_SET(errp) will work even if errp is NULL.


> 
> > TODO
> > ----
> >
> > * Simplify more cases of local_error/error_propagate() to use
> >   errp directly.
> > * Update API documentation and code examples.
> > * Add a mechanism to ensure errp is never NULL.
> >
> > Git branch
> > ----------
> >
> > This series depend on a few extra cleanups that I didn't submit
> > to qemu-devel yet.  A git branch including this series is
> > available at:
> >
> >   git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-28 17:41   ` Eduardo Habkost
@ 2017-06-29  6:54     ` Markus Armbruster
  2017-06-29 12:57       ` Eduardo Habkost
  2017-06-29 14:01     ` Daniel P. Berrange
  1 sibling, 1 reply; 41+ messages in thread
From: Markus Armbruster @ 2017-06-29  6:54 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: qemu-devel, Michael Roth

Eduardo Habkost <ehabkost@redhat.com> writes:

> On Wed, Jun 28, 2017 at 11:05:26AM +0200, Markus Armbruster wrote:
>> Eduardo Habkost <ehabkost@redhat.com> writes:
>> 
>> > Rationale
>> > ---------
>> >
>> > I'm often bothered by the fact that we can't write the following:
>> >
>> >     foo(arg, errp);
>> >     if (*errp) {
>> >         handle the error...
>> >         error_propagate(errp, err);
>> >     }
>> >
>> > because errp can be NULL.
>> 
>> If foo() additionally returned an indication of success, you could write
>> 
>>       if (!foo(arg, errp)) {    // assuming foo() returns a bool
>>           handle the error...
>>       }
>> 
>> Nicely concise.
>> 
>> For what it's worth, this is how GLib wants GError to be used.  We
>> deviated from it, and it has turned out to be a self-inflicted wound.
>
> Interesting, I didn't know about that.

See section "Description", in particular subsection "Rules for use of
GError" at
https://developer.gnome.org/glib/unstable/glib-Error-Reporting.html

>> > I understand the reason we need to support errp==NULL, as it
>> > makes life simpler for callers that don't want any extra error
>> > information.  However, this has the cost of making the functions
>> > that report errors more complex and error-prone.
>> >
>> > (Evidence of that: the 34 ERR_IS_* cases handled by the "use
>> > ERR_IS_* macros" patches in the series.  Where existing code will
>> > crash or behave differently if errp is NULL.)
>> 
>> Which of them could *not* use a suitable return value instead of *errp?
>
> I don't know.  But I'm not trying to improve those 34 ERR_IS_* cases.  I
> am trying to improve the 700+ functions that need the
> local_err/error_propagate() boilerplate code today.  This series already
> handles 346 of them automatically (see patch 14/15).

I agree the goal is reducing error_propagate() boilerplate.  I latched
onto the 34 ERR_IS_* cases only because you presented them as examples.

>> > I considered suggesting forbidding NULL errp, and just changing
>> > all callers that use NULL to have an err variable and call
>> > error_free(), but this would mean changing 690 function callers
>> > that pass NULL errp as argument.
>> 
>> Would also add lots of pointless malloc churn.  The ability to ignore
>> errors is a feature.
>
> Exactly.  My proposal keeps that ability.
>
>
>> 
>> > Here I'm proposing a mechanism to have the best of both worlds:
>> > allow callers to ignore errors easily while allowing functions to
>> > propagate errors without an intermediate local_err variable.
>> >
>> > The Proposal
>> > ------------
>> >
>> > I'm proposing replacing NULL errp with a special macro:
>> > IGNORE_ERRORS.  The macro will trigger special behavior in the
>> > error API that will make it not save any error information in the
>> > error pointer, but still keep track of boolean error state in
>> > *errp.
>> >
>> > This will allow us to simplify the documented method to propagate errors
>> > from:
>> >
>> >     Error *err = NULL;
>> >     foo(arg, &err);
>> >     if (err) {
>> >         handle the error...
>> >         error_propagate(errp, err);
>> >     }
>> >
>> > to:
>> >
>> >     foo(arg, errp);
>> >     if (ERR_IS_SET(errp)) {
>> >         handle the error...
>> >     }
>> >
>> > This will allow us to stop using local_err variables and
>> > error_propagate() on hundreds of cases.
>> 
>> Getting rid of unnecessary local_err boilerplate is good.  The question
>> is how.  A possible alternative to your proposal is to follow GLib and
>> make functions return success/failure.
>> 
>> How do the two compare?
>
> This proposal proposal already gets rid of 346 error_propagate() calls
> automatically, and we probably can get rid of many others with
> additional Coccinelle scripts.
>
> Making functions return success/failure, on the other hand, would
> require rewriting them manually.

Yes, but how would the *result* compare?  I feel we should at least
explore this.  I'll try to find some time to play with it.

Coccinelle might let us automate some, but determining success
vs. failure will commonly require human smarts.

How many such functions we have?  Hmm...

    @r@
    identifier fun, errp;
    typedef Error;
    position p;
    @@
     void fun(..., Error **errp)@p
     {
         ...
     }
    @script:python@
        p << r.p;
        fun << r.fun;
    @@
    print("%s:%s:%s: %s()" % (p[0].file, p[0].line, p[0].column, fun))

Finds 1525.  Correcting the void mistake will be a huge pain, but
procrastinating can only make it grow.

>                                   This proposal doesn't even prevent
> that from happening.  I'd say it helps on that, because we can now find
> cases that still need to be converted by grepping for ERR_IS_SET.

I honestly doubt finding the cases is a problem.  We just grep for
error_propagate().

>> > Implementation
>> > --------------
>> >
>> > This replaces NULL errp arguments on function calls with a
>> > IGNORE_ERRORS macro.  Checks for (!errp) are replaced by
>> > ERR_IS_IGNORED(errp).  Checks for (*errp) are replaced by
>> > ERR_IS_SET(errp).  No extra changes are required on function
>> > callers.
>> 
>> That's a lot of churn.  One time pain, of course.
>
> Yes, and it was automated using Coccinelle.
>
>> 
>> > Then IGNORE_ERRORS is implemend as:
>> >
>> >   (& { &ignored_error_unset })
>> >
>> > When error_set() is called and IGNORE_ERRORS was used, we set
>> > error state using:
>> >
>> >   *errp = &ignored_error_set;
>> >
>> > This way, we can make ERR_IS_SET work even if errp was
>> > IGNORE_ERRORS.  The ERR_IS_* macros are reimplemented as:
>> >
>> >   #define ERR_IS_SET(e) (*(e) && *(e) != &ignored_error_unset)
>> >   #define ERR_IS_IGNORED(e) (!(e) || *(e) == &ignored_error_unset || *(e) == &ignored_error_set)
>> >
>> > Ensuring errp is never NULL
>> > ---------------------------
>> >
>> > The last patch on this series changes the (Error **errp)
>> > parameters in functions to (Error *errp[static 1]), just to help
>> > validate the existing code, as clang warns about NULL arguments
>> > on that case.  I don't think we should apply that patch, though,
>> > because the "[static 1]" syntax confuses Coccinelle.
>> >
>> > I have a branch where I experimented with the idea of replacing
>> > (Error **errp) parameters with an opaque type (void*, or a struct
>> > type).  I gave up when I noticed it would require touching all
>> > callers to replace &err with a wrapper macro to convert to the
>> > right type.  Suggestions to make NULL errp easier to detect at
>> > build time are welcome.
>> >
>> > (Probably the easiest solution for that is to add assert(errp)
>> > lines to the ERR_IS_*() macros.)
>> 
>> We'll obviously struggle with null arguments until all the developers
>> adjusted to the new interface.  Possibly with occasional mistakes
>> forever.  Compile-time checking would really, really help.
>
> True.  I'm investigating the possibility of using
> __attribute__((nonull(...))) with Coccinelle's help.
>
>
>> 
>> > Desirable side-effects
>> > ----------------------
>> >
>> > Some of additional benefits from parts of this series:
>> >
>> > * Making code that ignore error information more visible and
>> >   greppable (using IGNORE_ERRORS).
>> 
>> True.
>> 
>> Drawback: Passing an address takes more code than passing null.  Not
>> sure it matters.
>
> I don't know what you mean by "more code".  It requires just replacing
> NULL with IGNORE_ERRORS.  The magic is hidden behind the macro.

Creating the IGNORE_ERRORS value and passing it requires more machine
instructions than passing NULL.  When ignored_error_unset is in another
DSO, it also requires a relocation.

>> >                                     I believe many of those cases
>> >   are actually bugs and should use &error_abort or &error_fatal
>> >   instead.
>> 
>> I've seen such bugs.
>> 
>> Of course, making possible offenders more greppable doesn't necessarily
>> mean existing ones will get fixed and new ones will be avoided.
>> 
>> > * Making code that depends on errp more visible and
>> >   greppable (using ERR_IS_* macros).  Some of those cases are
>> >   also likely to be bugs, and need to be investigated.
>> 
>> Grepping for (local_)?errp? works well enough, doesn't it?
>
> I don't see how.

Full list of possible Error ** variables not named errp:

    $ git-grep -E '\bError \*\*' | grep -vE '\bError \*\*(errp\b|\))'
    HACKING:the eyes than propagating an Error object through an Error ** parameter.
    HACKING:only the function really knows, use Error **, and set suitable errors.
    block/quorum.c:    /* XXX - would be nice if we could pass in the Error **
    block/snapshot.c:                             Error **err)
    blockjob.c:/* A wrapper around block_job_cancel() taking an Error ** parameter so it may be
    docs/devel/writing-qmp-commands.txt:3. It takes an "Error **" argument. This is required. Later we will see how to
    hw/core/qdev.c:static bool check_only_migratable(Object *obj, Error **err)
    hw/core/qdev.c:        Error **local_errp = NULL;
    hw/core/qdev.c:static bool device_get_hotplugged(Object *obj, Error **err)
    hw/i386/amd_iommu.c:static void amdvi_realize(DeviceState *dev, Error **err)
    hw/sd/sdhci.c:static void sdhci_sysbus_realize(DeviceState *dev, Error ** errp)
    hw/usb/dev-network.c:static void usb_net_realize(USBDevice *dev, Error **errrp)
    include/block/snapshot.h:                             Error **err);
    include/qapi/error.h:void error_propagate(Error **dst_errp, Error *local_err);
    include/qom/object.h:                                    const uint64_t *v, Error **Errp);
    include/qom/object.h:                                          const uint64_t *v, Error **Errp);
    qga/commands-posix.c:GuestUserList *qmp_guest_get_users(Error **err)
    qga/commands-win32.c:GuestUserList *qmp_guest_get_users(Error **err)
    qga/commands.c:GuestExecStatus *qmp_guest_exec_status(int64_t pid, Error **err)
    qga/commands.c:                       Error **err)
    qga/commands.c:GuestHostName *qmp_guest_get_host_name(Error **err)
    qmp.c:void qmp_system_powerdown(Error **erp)
    util/error.c:void error_propagate(Error **dst_errp, Error *local_err)

I'll post a patch to rename the offenders.

>                   I'm talking about two cases:
>
> 1) Code like this:
>
>   int func1(..., Error **errp)
>   {
>       do_something(errp);
>       if (errp && *errp) {
>           /* handle error */
>           return;
>       }
>       /* do something else */
>   }
>
> func1() is buggy because it behaves differently if errp is NULL.

Does your series fix any such bugs?  We hunted them all down long ago...
Perhaps a few new ones have crept in since.  Hmm... I can see two:

    $ git-grep -F 'errp && *errp'
    exec.c:        if (errp && *errp) {
    hw/mem/pc-dimm.c:        if (errp && *errp) {
    util/error.c:    assert(errp && *errp);

> 2) Code like this:
>
>   int func2(..., Error **errp)
>   {
>       do_something(errp);
>       if (*errp) {
>           /* handle error */
>       }
>   }
>
> func2() is buggy because if crashes if errp is NULL.

Does your series fix any such bugs?  grep coughs up quite a few
candidates...

> I don't see an easy way to grep for them with the current code.  With
> this series, (1) can be detected by grepping for ERR_IS_IGNORED,

How would example (1) look like then?

>                                                                  and (2)
> is fixed because ERR_IS_SET(errp) will work even if errp is NULL.
>
>> > TODO
>> > ----
>> >
>> > * Simplify more cases of local_error/error_propagate() to use
>> >   errp directly.
>> > * Update API documentation and code examples.
>> > * Add a mechanism to ensure errp is never NULL.
>> >
>> > Git branch
>> > ----------
>> >
>> > This series depend on a few extra cleanups that I didn't submit
>> > to qemu-devel yet.  A git branch including this series is
>> > available at:
>> >
>> >   git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-29  6:54     ` Markus Armbruster
@ 2017-06-29 12:57       ` Eduardo Habkost
  2017-06-30 11:40         ` Markus Armbruster
  0 siblings, 1 reply; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-29 12:57 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael Roth

On Thu, Jun 29, 2017 at 08:54:29AM +0200, Markus Armbruster wrote:
> Eduardo Habkost <ehabkost@redhat.com> writes:
> 
> > On Wed, Jun 28, 2017 at 11:05:26AM +0200, Markus Armbruster wrote:
> >> Eduardo Habkost <ehabkost@redhat.com> writes:
[...]
> >> > I understand the reason we need to support errp==NULL, as it
> >> > makes life simpler for callers that don't want any extra error
> >> > information.  However, this has the cost of making the functions
> >> > that report errors more complex and error-prone.
> >> >
> >> > (Evidence of that: the 34 ERR_IS_* cases handled by the "use
> >> > ERR_IS_* macros" patches in the series.  Where existing code will
> >> > crash or behave differently if errp is NULL.)
> >> 
> >> Which of them could *not* use a suitable return value instead of *errp?
> >
> > I don't know.  But I'm not trying to improve those 34 ERR_IS_* cases.  I
> > am trying to improve the 700+ functions that need the
> > local_err/error_propagate() boilerplate code today.  This series already
> > handles 346 of them automatically (see patch 14/15).
> 
> I agree the goal is reducing error_propagate() boilerplate.  I latched
> onto the 34 ERR_IS_* cases only because you presented them as examples.

The 34 ERR_IS_* cases were evidence of how easy it is to introduce
mistakes with the current API.  Probably most of them are instances of
(1) and (2) below.

> 
[...]
> >> > The Proposal
> >> > ------------
> >> >
> >> > I'm proposing replacing NULL errp with a special macro:
> >> > IGNORE_ERRORS.  The macro will trigger special behavior in the
> >> > error API that will make it not save any error information in the
> >> > error pointer, but still keep track of boolean error state in
> >> > *errp.
> >> >
> >> > This will allow us to simplify the documented method to propagate errors
> >> > from:
> >> >
> >> >     Error *err = NULL;
> >> >     foo(arg, &err);
> >> >     if (err) {
> >> >         handle the error...
> >> >         error_propagate(errp, err);
> >> >     }
> >> >
> >> > to:
> >> >
> >> >     foo(arg, errp);
> >> >     if (ERR_IS_SET(errp)) {
> >> >         handle the error...
> >> >     }
> >> >
> >> > This will allow us to stop using local_err variables and
> >> > error_propagate() on hundreds of cases.
> >> 
> >> Getting rid of unnecessary local_err boilerplate is good.  The question
> >> is how.  A possible alternative to your proposal is to follow GLib and
> >> make functions return success/failure.
> >> 
> >> How do the two compare?
> >
> > This proposal proposal already gets rid of 346 error_propagate() calls
> > automatically, and we probably can get rid of many others with
> > additional Coccinelle scripts.
> >
> > Making functions return success/failure, on the other hand, would
> > require rewriting them manually.
> 
> Yes, but how would the *result* compare?  I feel we should at least
> explore this.  I'll try to find some time to play with it.

I think the results of using the return value to indicate errors are
possibly better.  But even on that case, I think ERR_IS_SET will be
useful to avoid error_propagate() boilerplate until we convert all of
them.


> 
> Coccinelle might let us automate some, but determining success
> vs. failure will commonly require human smarts.
> 
> How many such functions we have?  Hmm...
> 
>     @r@
>     identifier fun, errp;
>     typedef Error;
>     position p;
>     @@
>      void fun(..., Error **errp)@p
>      {
>          ...
>      }
>     @script:python@
>         p << r.p;
>         fun << r.fun;
>     @@
>     print("%s:%s:%s: %s()" % (p[0].file, p[0].line, p[0].column, fun))
> 
> Finds 1525.  Correcting the void mistake will be a huge pain, but
> procrastinating can only make it grow.
> 
> >                                   This proposal doesn't even prevent
> > that from happening.  I'd say it helps on that, because we can now find
> > cases that still need to be converted by grepping for ERR_IS_SET.
> 
> I honestly doubt finding the cases is a problem.  We just grep for
> error_propagate().

True.  But I think finding low-hanging fruits will still be a problem. e.g.:

  void f1(Error *errp);

  void f2(Error *errp)
  {
      do_something();
      f1(errp);
  }

The Coccinelle script above will find f1() and f2() (grep won't find
either, but will probably find f2() callers).  We will probably want to
convert f1() before f2(), as converting f2() before f1() would require
adding error_propagete() boilerplate to f2().


> 
[...]
> >> > Desirable side-effects
> >> > ----------------------
> >> >
> >> > Some of additional benefits from parts of this series:
> >> >
> >> > * Making code that ignore error information more visible and
> >> >   greppable (using IGNORE_ERRORS).
> >> 
> >> True.
> >> 
> >> Drawback: Passing an address takes more code than passing null.  Not
> >> sure it matters.
> >
> > I don't know what you mean by "more code".  It requires just replacing
> > NULL with IGNORE_ERRORS.  The magic is hidden behind the macro.
> 
> Creating the IGNORE_ERRORS value and passing it requires more machine
> instructions than passing NULL.  When ignored_error_unset is in another
> DSO, it also requires a relocation.

Yes, it requires a few more machine instructions.  Is this a problem in
practice?


> 
> >> >                                     I believe many of those cases
> >> >   are actually bugs and should use &error_abort or &error_fatal
> >> >   instead.
> >> 
> >> I've seen such bugs.
> >> 
> >> Of course, making possible offenders more greppable doesn't necessarily
> >> mean existing ones will get fixed and new ones will be avoided.
> >> 
> >> > * Making code that depends on errp more visible and
> >> >   greppable (using ERR_IS_* macros).  Some of those cases are
> >> >   also likely to be bugs, and need to be investigated.
> >> 
> >> Grepping for (local_)?errp? works well enough, doesn't it?
> >
> > I don't see how.
> 
> Full list of possible Error ** variables not named errp:
> 
>     $ git-grep -E '\bError \*\*' | grep -vE '\bError \*\*(errp\b|\))'
>     HACKING:the eyes than propagating an Error object through an Error ** parameter.
>     HACKING:only the function really knows, use Error **, and set suitable errors.
>     block/quorum.c:    /* XXX - would be nice if we could pass in the Error **
>     block/snapshot.c:                             Error **err)
>     blockjob.c:/* A wrapper around block_job_cancel() taking an Error ** parameter so it may be
>     docs/devel/writing-qmp-commands.txt:3. It takes an "Error **" argument. This is required. Later we will see how to
>     hw/core/qdev.c:static bool check_only_migratable(Object *obj, Error **err)
>     hw/core/qdev.c:        Error **local_errp = NULL;
>     hw/core/qdev.c:static bool device_get_hotplugged(Object *obj, Error **err)
>     hw/i386/amd_iommu.c:static void amdvi_realize(DeviceState *dev, Error **err)
>     hw/sd/sdhci.c:static void sdhci_sysbus_realize(DeviceState *dev, Error ** errp)
>     hw/usb/dev-network.c:static void usb_net_realize(USBDevice *dev, Error **errrp)
>     include/block/snapshot.h:                             Error **err);
>     include/qapi/error.h:void error_propagate(Error **dst_errp, Error *local_err);
>     include/qom/object.h:                                    const uint64_t *v, Error **Errp);
>     include/qom/object.h:                                          const uint64_t *v, Error **Errp);
>     qga/commands-posix.c:GuestUserList *qmp_guest_get_users(Error **err)
>     qga/commands-win32.c:GuestUserList *qmp_guest_get_users(Error **err)
>     qga/commands.c:GuestExecStatus *qmp_guest_exec_status(int64_t pid, Error **err)
>     qga/commands.c:                       Error **err)
>     qga/commands.c:GuestHostName *qmp_guest_get_host_name(Error **err)
>     qmp.c:void qmp_system_powerdown(Error **erp)
>     util/error.c:void error_propagate(Error **dst_errp, Error *local_err)
> 
> I'll post a patch to rename the offenders.
> 
> >                   I'm talking about two cases:
> >
> > 1) Code like this:
> >
> >   int func1(..., Error **errp)
> >   {
> >       do_something(errp);
> >       if (errp && *errp) {
> >           /* handle error */
> >           return;
> >       }
> >       /* do something else */
> >   }
> >
> > func1() is buggy because it behaves differently if errp is NULL.
> 
> Does your series fix any such bugs?  We hunted them all down long ago...
> Perhaps a few new ones have crept in since.  Hmm... I can see two:
> 
>     $ git-grep -F 'errp && *errp'
>     exec.c:        if (errp && *errp) {
>     hw/mem/pc-dimm.c:        if (errp && *errp) {
>     util/error.c:    assert(errp && *errp);

This RFC doesn't fix those bugs, but just makes them more obvious and
easier to fix.  I plan to fix them in the final version of the series.

> 
> > 2) Code like this:
> >
> >   int func2(..., Error **errp)
> >   {
> >       do_something(errp);
> >       if (*errp) {
> >           /* handle error */
> >       }
> >   }
> >
> > func2() is buggy because if crashes if errp is NULL.
> 
> Does your series fix any such bugs?  grep coughs up quite a few
> candidates...
> 
> > I don't see an easy way to grep for them with the current code.  With
> > this series, (1) can be detected by grepping for ERR_IS_IGNORED,
> 
> How would example (1) look like then?


  diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
  index 92fb482..4e5e2c9 100644
  --- a/hw/mem/pc-dimm.c
  +++ b/hw/mem/pc-dimm.c
  @@ -316,7 +316,7 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
           uint64_t dimm_size = object_property_get_int(OBJECT(dimm),
                                                        PC_DIMM_SIZE_PROP,
                                                        errp);
  -        if (errp && *errp) {
  +        if (!ERR_IS_IGNORED(errp) && ERR_IS_SET(errp)) {
               goto out;
           }

Without this series, the fix for (1) requires adding error_propagate()
boilerplate.  With this series, the fix is to just drop the
!ERR_IS_IGNORED check and keep the ERR_IS_SET check


> 
> >                                                                  and (2)
> > is fixed because ERR_IS_SET(errp) will work even if errp is NULL.
> >
> >> > TODO
> >> > ----
> >> >
> >> > * Simplify more cases of local_error/error_propagate() to use
> >> >   errp directly.
> >> > * Update API documentation and code examples.
> >> > * Add a mechanism to ensure errp is never NULL.
> >> >
> >> > Git branch
> >> > ----------
> >> >
> >> > This series depend on a few extra cleanups that I didn't submit
> >> > to qemu-devel yet.  A git branch including this series is
> >> > available at:
> >> >
> >> >   git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-28  9:05 ` Markus Armbruster
  2017-06-28 17:41   ` Eduardo Habkost
@ 2017-06-29 13:39   ` Paolo Bonzini
  2017-06-29 14:18     ` Daniel P. Berrange
  2017-06-29 14:14   ` Daniel P. Berrange
  2 siblings, 1 reply; 41+ messages in thread
From: Paolo Bonzini @ 2017-06-29 13:39 UTC (permalink / raw)
  To: Markus Armbruster, Eduardo Habkost; +Cc: qemu-devel, Michael Roth

On 28/06/2017 11:05, Markus Armbruster wrote:
> If foo() additionally returned an indication of success, you could write
> 
>       if (!foo(arg, errp)) {    // assuming foo() returns a bool
>           handle the error...
>       }
> 
> Nicely concise.
> 
> For what it's worth, this is how GLib wants GError to be used.  We
> deviated from it, and it has turned out to be a self-inflicted wound.
> 

I find Eduardo's proposal better.  With GLib's way it's easy to confuse
functions that return 0/-1, 0/-errno, TRUE/FALSE, FALSE/TRUE or
NULL/non-NULL.

Declaring and testing local_err doesn't introduce much boilerplate, it's
propagation to errp that does.  The disadvantage of Eduardo's mechanism
is that it produces slightly worse code, but Error** is rarely used in
hot code.  It could also be improved slightly by changing
ignored_error_unset and ignored_error_set to a 2-element array.

Paolo

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-28 17:41   ` Eduardo Habkost
  2017-06-29  6:54     ` Markus Armbruster
@ 2017-06-29 14:01     ` Daniel P. Berrange
  1 sibling, 0 replies; 41+ messages in thread
From: Daniel P. Berrange @ 2017-06-29 14:01 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: Markus Armbruster, qemu-devel, Michael Roth

On Wed, Jun 28, 2017 at 02:41:58PM -0300, Eduardo Habkost wrote:
> On Wed, Jun 28, 2017 at 11:05:26AM +0200, Markus Armbruster wrote:

> > > Ensuring errp is never NULL
> > > ---------------------------
> > >
> > > The last patch on this series changes the (Error **errp)
> > > parameters in functions to (Error *errp[static 1]), just to help
> > > validate the existing code, as clang warns about NULL arguments
> > > on that case.  I don't think we should apply that patch, though,
> > > because the "[static 1]" syntax confuses Coccinelle.
> > >
> > > I have a branch where I experimented with the idea of replacing
> > > (Error **errp) parameters with an opaque type (void*, or a struct
> > > type).  I gave up when I noticed it would require touching all
> > > callers to replace &err with a wrapper macro to convert to the
> > > right type.  Suggestions to make NULL errp easier to detect at
> > > build time are welcome.
> > >
> > > (Probably the easiest solution for that is to add assert(errp)
> > > lines to the ERR_IS_*() macros.)
> > 
> > We'll obviously struggle with null arguments until all the developers
> > adjusted to the new interface.  Possibly with occasional mistakes
> > forever.  Compile-time checking would really, really help.
> 
> True.  I'm investigating the possibility of using
> __attribute__((nonull(...))) with Coccinelle's help.

Beware that '__attribute__((nonnull))' has two distinct effects,
one of which is a potentially nasty trap which leads to crashes....

The useful part is that it allows compilers & analysis tools
like coverity to warn if you accidentally pass NULL into
a method. These warnings, particularly from gcc, only catch
a fraction of scenarios where you pass NULL in though.

The less useful part is that if GCC sees a nonnull annotation
on a parameter, then in the body of the method, it will silently
remove any code which does  "if (!paramname)". So if you added
a check for the parameter being NULL to avoid a crash, gcc will
remove that protection, so you'll once again get a crash at
runtime if passing NULL.

So if you use the nonnull annotation, they you probably want
to make sure to pass  -fno-delete-null-pointer-checks to
GCC to stop it removing your protection code, or you need to
be very confident that nothing will mistakenly pass NULL into
the methods annotated nonnull.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-28  9:05 ` Markus Armbruster
  2017-06-28 17:41   ` Eduardo Habkost
  2017-06-29 13:39   ` Paolo Bonzini
@ 2017-06-29 14:14   ` Daniel P. Berrange
  2 siblings, 0 replies; 41+ messages in thread
From: Daniel P. Berrange @ 2017-06-29 14:14 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: Eduardo Habkost, qemu-devel, Michael Roth

On Wed, Jun 28, 2017 at 11:05:26AM +0200, Markus Armbruster wrote:
> Eduardo Habkost <ehabkost@redhat.com> writes:
> 
> > Rationale
> > ---------
> >
> > I'm often bothered by the fact that we can't write the following:
> >
> >     foo(arg, errp);
> >     if (*errp) {
> >         handle the error...
> >         error_propagate(errp, err);
> >     }
> >
> > because errp can be NULL.
> 
> If foo() additionally returned an indication of success, you could write
> 
>       if (!foo(arg, errp)) {    // assuming foo() returns a bool
>           handle the error...
>       }
> 
> Nicely concise.
> 
> For what it's worth, this is how GLib wants GError to be used.  We
> deviated from it, and it has turned out to be a self-inflicted wound.

FWIW, I took that approach for the io & crypto layers - except
returning 0 vs -1, rather than true/false, precisely because
it lead to simpler code by not having to use local errors and
propagation.

For added benefit you can potentially then also annotate the
method as  __attribute__(return_check)  to force the caller
to include a check for error conditions, which is often a
useful compile time protection to have.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-29 13:39   ` Paolo Bonzini
@ 2017-06-29 14:18     ` Daniel P. Berrange
  2017-06-29 17:09       ` Eduardo Habkost
  0 siblings, 1 reply; 41+ messages in thread
From: Daniel P. Berrange @ 2017-06-29 14:18 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Markus Armbruster, Eduardo Habkost, qemu-devel, Michael Roth

On Thu, Jun 29, 2017 at 03:39:58PM +0200, Paolo Bonzini wrote:
> On 28/06/2017 11:05, Markus Armbruster wrote:
> > If foo() additionally returned an indication of success, you could write
> > 
> >       if (!foo(arg, errp)) {    // assuming foo() returns a bool
> >           handle the error...
> >       }
> > 
> > Nicely concise.
> > 
> > For what it's worth, this is how GLib wants GError to be used.  We
> > deviated from it, and it has turned out to be a self-inflicted wound.
> > 
> 
> I find Eduardo's proposal better.  With GLib's way it's easy to confuse
> functions that return 0/-1, 0/-errno, TRUE/FALSE, FALSE/TRUE or
> NULL/non-NULL.

NB, glib basically standardizes on just FALSE/TRUE and NULL/non-NULL,
avoiding anything returning -1, or errno values, so in their usage
there isn't really any confusion.

QEMU of course has lots of pre-existing code, but we could at least
declare a preferred approach, and work towards it.

Having the return value indicate error is slightly shorter, and it
avoids all the blackmagic with special Error values in Eduardo's
series. Most usefully, it lets you use __attribute__(return_check)
to get compile time checking of callers who forget to check for
failure.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-29 14:18     ` Daniel P. Berrange
@ 2017-06-29 17:09       ` Eduardo Habkost
  2017-06-29 17:38         ` Daniel P. Berrange
  0 siblings, 1 reply; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-29 17:09 UTC (permalink / raw)
  To: Daniel P. Berrange
  Cc: Paolo Bonzini, Markus Armbruster, qemu-devel, Michael Roth

On Thu, Jun 29, 2017 at 03:18:05PM +0100, Daniel P. Berrange wrote:
> On Thu, Jun 29, 2017 at 03:39:58PM +0200, Paolo Bonzini wrote:
> > On 28/06/2017 11:05, Markus Armbruster wrote:
> > > If foo() additionally returned an indication of success, you could write
> > > 
> > >       if (!foo(arg, errp)) {    // assuming foo() returns a bool
> > >           handle the error...
> > >       }
> > > 
> > > Nicely concise.
> > > 
> > > For what it's worth, this is how GLib wants GError to be used.  We
> > > deviated from it, and it has turned out to be a self-inflicted wound.
> > > 
> > 
> > I find Eduardo's proposal better.  With GLib's way it's easy to confuse
> > functions that return 0/-1, 0/-errno, TRUE/FALSE, FALSE/TRUE or
> > NULL/non-NULL.
> 
> NB, glib basically standardizes on just FALSE/TRUE and NULL/non-NULL,
> avoiding anything returning -1, or errno values, so in their usage
> there isn't really any confusion.
> 
> QEMU of course has lots of pre-existing code, but we could at least
> declare a preferred approach, and work towards it.
> 
> Having the return value indicate error is slightly shorter, and it
> avoids all the blackmagic with special Error values in Eduardo's
> series. Most usefully, it lets you use __attribute__(return_check)
> to get compile time checking of callers who forget to check for
> failure.

I agree it's better when the return value is obvious, but I still think
the Error value magic in IGNORE_ERRORS/ERR_IS_SET is preferable to the
existing 700+ error_propagate() calls in the tree.

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-29 17:09       ` Eduardo Habkost
@ 2017-06-29 17:38         ` Daniel P. Berrange
  2017-06-29 17:47           ` Eduardo Habkost
  0 siblings, 1 reply; 41+ messages in thread
From: Daniel P. Berrange @ 2017-06-29 17:38 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Paolo Bonzini, Markus Armbruster, qemu-devel, Michael Roth

On Thu, Jun 29, 2017 at 02:09:39PM -0300, Eduardo Habkost wrote:
> On Thu, Jun 29, 2017 at 03:18:05PM +0100, Daniel P. Berrange wrote:
> > On Thu, Jun 29, 2017 at 03:39:58PM +0200, Paolo Bonzini wrote:
> > > On 28/06/2017 11:05, Markus Armbruster wrote:
> > > > If foo() additionally returned an indication of success, you could write
> > > > 
> > > >       if (!foo(arg, errp)) {    // assuming foo() returns a bool
> > > >           handle the error...
> > > >       }
> > > > 
> > > > Nicely concise.
> > > > 
> > > > For what it's worth, this is how GLib wants GError to be used.  We
> > > > deviated from it, and it has turned out to be a self-inflicted wound.
> > > > 
> > > 
> > > I find Eduardo's proposal better.  With GLib's way it's easy to confuse
> > > functions that return 0/-1, 0/-errno, TRUE/FALSE, FALSE/TRUE or
> > > NULL/non-NULL.
> > 
> > NB, glib basically standardizes on just FALSE/TRUE and NULL/non-NULL,
> > avoiding anything returning -1, or errno values, so in their usage
> > there isn't really any confusion.
> > 
> > QEMU of course has lots of pre-existing code, but we could at least
> > declare a preferred approach, and work towards it.
> > 
> > Having the return value indicate error is slightly shorter, and it
> > avoids all the blackmagic with special Error values in Eduardo's
> > series. Most usefully, it lets you use __attribute__(return_check)
> > to get compile time checking of callers who forget to check for
> > failure.
> 
> I agree it's better when the return value is obvious, but I still think
> the Error value magic in IGNORE_ERRORS/ERR_IS_SET is preferable to the
> existing 700+ error_propagate() calls in the tree.

Both approaches would let us kill the error_propagate() calls. I think
we're all agreed those would be better off gone, no matter which
approach is used.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-29 17:38         ` Daniel P. Berrange
@ 2017-06-29 17:47           ` Eduardo Habkost
  2017-06-29 18:04             ` Daniel P. Berrange
  0 siblings, 1 reply; 41+ messages in thread
From: Eduardo Habkost @ 2017-06-29 17:47 UTC (permalink / raw)
  To: Daniel P. Berrange
  Cc: Paolo Bonzini, Markus Armbruster, qemu-devel, Michael Roth

On Thu, Jun 29, 2017 at 06:38:50PM +0100, Daniel P. Berrange wrote:
> On Thu, Jun 29, 2017 at 02:09:39PM -0300, Eduardo Habkost wrote:
> > On Thu, Jun 29, 2017 at 03:18:05PM +0100, Daniel P. Berrange wrote:
> > > On Thu, Jun 29, 2017 at 03:39:58PM +0200, Paolo Bonzini wrote:
> > > > On 28/06/2017 11:05, Markus Armbruster wrote:
> > > > > If foo() additionally returned an indication of success, you could write
> > > > > 
> > > > >       if (!foo(arg, errp)) {    // assuming foo() returns a bool
> > > > >           handle the error...
> > > > >       }
> > > > > 
> > > > > Nicely concise.
> > > > > 
> > > > > For what it's worth, this is how GLib wants GError to be used.  We
> > > > > deviated from it, and it has turned out to be a self-inflicted wound.
> > > > > 
> > > > 
> > > > I find Eduardo's proposal better.  With GLib's way it's easy to confuse
> > > > functions that return 0/-1, 0/-errno, TRUE/FALSE, FALSE/TRUE or
> > > > NULL/non-NULL.
> > > 
> > > NB, glib basically standardizes on just FALSE/TRUE and NULL/non-NULL,
> > > avoiding anything returning -1, or errno values, so in their usage
> > > there isn't really any confusion.
> > > 
> > > QEMU of course has lots of pre-existing code, but we could at least
> > > declare a preferred approach, and work towards it.
> > > 
> > > Having the return value indicate error is slightly shorter, and it
> > > avoids all the blackmagic with special Error values in Eduardo's
> > > series. Most usefully, it lets you use __attribute__(return_check)
> > > to get compile time checking of callers who forget to check for
> > > failure.
> > 
> > I agree it's better when the return value is obvious, but I still think
> > the Error value magic in IGNORE_ERRORS/ERR_IS_SET is preferable to the
> > existing 700+ error_propagate() calls in the tree.
> 
> Both approaches would let us kill the error_propagate() calls. I think
> we're all agreed those would be better off gone, no matter which
> approach is used.

Changing the return value of the 1500+ void functions that return errors
will take a very long while.  I would like to get rid of the
error_propagate() calls before that, even if the long term plan is to
eventually get rid of ERR_IS_SET.

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-29 17:47           ` Eduardo Habkost
@ 2017-06-29 18:04             ` Daniel P. Berrange
  0 siblings, 0 replies; 41+ messages in thread
From: Daniel P. Berrange @ 2017-06-29 18:04 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Paolo Bonzini, Markus Armbruster, qemu-devel, Michael Roth

On Thu, Jun 29, 2017 at 02:47:34PM -0300, Eduardo Habkost wrote:
> On Thu, Jun 29, 2017 at 06:38:50PM +0100, Daniel P. Berrange wrote:
> > On Thu, Jun 29, 2017 at 02:09:39PM -0300, Eduardo Habkost wrote:
> > > On Thu, Jun 29, 2017 at 03:18:05PM +0100, Daniel P. Berrange wrote:
> > > > On Thu, Jun 29, 2017 at 03:39:58PM +0200, Paolo Bonzini wrote:
> > > > > On 28/06/2017 11:05, Markus Armbruster wrote:
> > > > > > If foo() additionally returned an indication of success, you could write
> > > > > > 
> > > > > >       if (!foo(arg, errp)) {    // assuming foo() returns a bool
> > > > > >           handle the error...
> > > > > >       }
> > > > > > 
> > > > > > Nicely concise.
> > > > > > 
> > > > > > For what it's worth, this is how GLib wants GError to be used.  We
> > > > > > deviated from it, and it has turned out to be a self-inflicted wound.
> > > > > > 
> > > > > 
> > > > > I find Eduardo's proposal better.  With GLib's way it's easy to confuse
> > > > > functions that return 0/-1, 0/-errno, TRUE/FALSE, FALSE/TRUE or
> > > > > NULL/non-NULL.
> > > > 
> > > > NB, glib basically standardizes on just FALSE/TRUE and NULL/non-NULL,
> > > > avoiding anything returning -1, or errno values, so in their usage
> > > > there isn't really any confusion.
> > > > 
> > > > QEMU of course has lots of pre-existing code, but we could at least
> > > > declare a preferred approach, and work towards it.
> > > > 
> > > > Having the return value indicate error is slightly shorter, and it
> > > > avoids all the blackmagic with special Error values in Eduardo's
> > > > series. Most usefully, it lets you use __attribute__(return_check)
> > > > to get compile time checking of callers who forget to check for
> > > > failure.
> > > 
> > > I agree it's better when the return value is obvious, but I still think
> > > the Error value magic in IGNORE_ERRORS/ERR_IS_SET is preferable to the
> > > existing 700+ error_propagate() calls in the tree.
> > 
> > Both approaches would let us kill the error_propagate() calls. I think
> > we're all agreed those would be better off gone, no matter which
> > approach is used.
> 
> Changing the return value of the 1500+ void functions that return errors
> will take a very long while.  I would like to get rid of the
> error_propagate() calls before that, even if the long term plan is to
> eventually get rid of ERR_IS_SET.

Ah, I see what you mean, that's fine.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-29 12:57       ` Eduardo Habkost
@ 2017-06-30 11:40         ` Markus Armbruster
  2017-07-01 14:20           ` Eduardo Habkost
  2017-07-01 14:29           ` Eduardo Habkost
  0 siblings, 2 replies; 41+ messages in thread
From: Markus Armbruster @ 2017-06-30 11:40 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: qemu-devel, Michael Roth

Eduardo Habkost <ehabkost@redhat.com> writes:

> On Thu, Jun 29, 2017 at 08:54:29AM +0200, Markus Armbruster wrote:
>> Eduardo Habkost <ehabkost@redhat.com> writes:
>> 
>> > On Wed, Jun 28, 2017 at 11:05:26AM +0200, Markus Armbruster wrote:
>> >> Eduardo Habkost <ehabkost@redhat.com> writes:
> [...]
>> >> > I understand the reason we need to support errp==NULL, as it
>> >> > makes life simpler for callers that don't want any extra error
>> >> > information.  However, this has the cost of making the functions
>> >> > that report errors more complex and error-prone.
>> >> >
>> >> > (Evidence of that: the 34 ERR_IS_* cases handled by the "use
>> >> > ERR_IS_* macros" patches in the series.  Where existing code will
>> >> > crash or behave differently if errp is NULL.)
>> >> 
>> >> Which of them could *not* use a suitable return value instead of *errp?
>> >
>> > I don't know.  But I'm not trying to improve those 34 ERR_IS_* cases.  I
>> > am trying to improve the 700+ functions that need the
>> > local_err/error_propagate() boilerplate code today.  This series already
>> > handles 346 of them automatically (see patch 14/15).
>> 
>> I agree the goal is reducing error_propagate() boilerplate.  I latched
>> onto the 34 ERR_IS_* cases only because you presented them as examples.
>
> The 34 ERR_IS_* cases were evidence of how easy it is to introduce
> mistakes with the current API.  Probably most of them are instances of
> (1) and (2) below.

The current interface can be abused, but how much abuse actually creeps
in?  I think we've been doing reasonably well there since we got rid of
the bad examples and improved documentation.

Moreover, the revised interface could also be abused.  Nothing stops you
from dereferencing errp before or after, the only thing that changes are
the examples people see in code.  I'm afraid the people who reinvent bad
examples from scratch despite the documentation telling them not to will
also bypass any macros the documentation tells them to use.

*Especially* if we use macros only sometimes.  ERR_IS_SET(&err) makes no
sense, so we'd still test err directly there, wouldn't we?

> [...]
>> >> > The Proposal
>> >> > ------------
>> >> >
>> >> > I'm proposing replacing NULL errp with a special macro:
>> >> > IGNORE_ERRORS.  The macro will trigger special behavior in the
>> >> > error API that will make it not save any error information in the
>> >> > error pointer, but still keep track of boolean error state in
>> >> > *errp.
>> >> >
>> >> > This will allow us to simplify the documented method to propagate errors
>> >> > from:
>> >> >
>> >> >     Error *err = NULL;
>> >> >     foo(arg, &err);
>> >> >     if (err) {
>> >> >         handle the error...
>> >> >         error_propagate(errp, err);
>> >> >     }
>> >> >
>> >> > to:
>> >> >
>> >> >     foo(arg, errp);
>> >> >     if (ERR_IS_SET(errp)) {
>> >> >         handle the error...
>> >> >     }
>> >> >
>> >> > This will allow us to stop using local_err variables and
>> >> > error_propagate() on hundreds of cases.
>> >> 
>> >> Getting rid of unnecessary local_err boilerplate is good.  The question
>> >> is how.  A possible alternative to your proposal is to follow GLib and
>> >> make functions return success/failure.
>> >> 
>> >> How do the two compare?
>> >
>> > This proposal proposal already gets rid of 346 error_propagate() calls
>> > automatically, and we probably can get rid of many others with
>> > additional Coccinelle scripts.
>> >
>> > Making functions return success/failure, on the other hand, would
>> > require rewriting them manually.
>> 
>> Yes, but how would the *result* compare?  I feel we should at least
>> explore this.  I'll try to find some time to play with it.
>
> I think the results of using the return value to indicate errors are
> possibly better.  But even on that case, I think ERR_IS_SET will be
> useful to avoid error_propagate() boilerplate until we convert all of
> them.

See my assessment below.

>> Coccinelle might let us automate some, but determining success
>> vs. failure will commonly require human smarts.
>> 
>> How many such functions we have?  Hmm...
>> 
>>     @r@
>>     identifier fun, errp;
>>     typedef Error;
>>     position p;
>>     @@
>>      void fun(..., Error **errp)@p
>>      {
>>          ...
>>      }
>>     @script:python@
>>         p << r.p;
>>         fun << r.fun;
>>     @@
>>     print("%s:%s:%s: %s()" % (p[0].file, p[0].line, p[0].column, fun))
>> 
>> Finds 1525.  Correcting the void mistake will be a huge pain, but
>> procrastinating can only make it grow.
>> 
>> >                                   This proposal doesn't even prevent
>> > that from happening.  I'd say it helps on that, because we can now find
>> > cases that still need to be converted by grepping for ERR_IS_SET.
>> 
>> I honestly doubt finding the cases is a problem.  We just grep for
>> error_propagate().
>
> True.  But I think finding low-hanging fruits will still be a problem. e.g.:
>
>   void f1(Error *errp);
>
>   void f2(Error *errp)
>   {
>       do_something();
>       f1(errp);
>   }
>
> The Coccinelle script above will find f1() and f2() (grep won't find
> either, but will probably find f2() callers).  We will probably want to
> convert f1() before f2(), as converting f2() before f1() would require
> adding error_propagete() boilerplate to f2().
>
>
>> 
> [...]
>> >> > Desirable side-effects
>> >> > ----------------------
>> >> >
>> >> > Some of additional benefits from parts of this series:
>> >> >
>> >> > * Making code that ignore error information more visible and
>> >> >   greppable (using IGNORE_ERRORS).
>> >> 
>> >> True.
>> >> 
>> >> Drawback: Passing an address takes more code than passing null.  Not
>> >> sure it matters.
>> >
>> > I don't know what you mean by "more code".  It requires just replacing
>> > NULL with IGNORE_ERRORS.  The magic is hidden behind the macro.
>> 
>> Creating the IGNORE_ERRORS value and passing it requires more machine
>> instructions than passing NULL.  When ignored_error_unset is in another
>> DSO, it also requires a relocation.
>
> Yes, it requires a few more machine instructions.  Is this a problem in
> practice?

Quoting myself: "Not sure it matters."

>> >> >                                     I believe many of those cases
>> >> >   are actually bugs and should use &error_abort or &error_fatal
>> >> >   instead.
>> >> 
>> >> I've seen such bugs.
>> >> 
>> >> Of course, making possible offenders more greppable doesn't necessarily
>> >> mean existing ones will get fixed and new ones will be avoided.
>> >> 
>> >> > * Making code that depends on errp more visible and
>> >> >   greppable (using ERR_IS_* macros).  Some of those cases are
>> >> >   also likely to be bugs, and need to be investigated.
>> >> 
>> >> Grepping for (local_)?errp? works well enough, doesn't it?
>> >
>> > I don't see how.
>> 
>> Full list of possible Error ** variables not named errp:
>> 
>>     $ git-grep -E '\bError \*\*' | grep -vE '\bError \*\*(errp\b|\))'
>>     HACKING:the eyes than propagating an Error object through an Error ** parameter.
>>     HACKING:only the function really knows, use Error **, and set suitable errors.
>>     block/quorum.c:    /* XXX - would be nice if we could pass in the Error **
>>     block/snapshot.c:                             Error **err)
>>     blockjob.c:/* A wrapper around block_job_cancel() taking an Error ** parameter so it may be
>>     docs/devel/writing-qmp-commands.txt:3. It takes an "Error **" argument. This is required. Later we will see how to
>>     hw/core/qdev.c:static bool check_only_migratable(Object *obj, Error **err)
>>     hw/core/qdev.c:        Error **local_errp = NULL;
>>     hw/core/qdev.c:static bool device_get_hotplugged(Object *obj, Error **err)
>>     hw/i386/amd_iommu.c:static void amdvi_realize(DeviceState *dev, Error **err)
>>     hw/sd/sdhci.c:static void sdhci_sysbus_realize(DeviceState *dev, Error ** errp)
>>     hw/usb/dev-network.c:static void usb_net_realize(USBDevice *dev, Error **errrp)
>>     include/block/snapshot.h:                             Error **err);
>>     include/qapi/error.h:void error_propagate(Error **dst_errp, Error *local_err);
>>     include/qom/object.h:                                    const uint64_t *v, Error **Errp);
>>     include/qom/object.h:                                          const uint64_t *v, Error **Errp);
>>     qga/commands-posix.c:GuestUserList *qmp_guest_get_users(Error **err)
>>     qga/commands-win32.c:GuestUserList *qmp_guest_get_users(Error **err)
>>     qga/commands.c:GuestExecStatus *qmp_guest_exec_status(int64_t pid, Error **err)
>>     qga/commands.c:                       Error **err)
>>     qga/commands.c:GuestHostName *qmp_guest_get_host_name(Error **err)
>>     qmp.c:void qmp_system_powerdown(Error **erp)
>>     util/error.c:void error_propagate(Error **dst_errp, Error *local_err)
>> 
>> I'll post a patch to rename the offenders.
>> 
>> >                   I'm talking about two cases:
>> >
>> > 1) Code like this:
>> >
>> >   int func1(..., Error **errp)
>> >   {
>> >       do_something(errp);
>> >       if (errp && *errp) {
>> >           /* handle error */
>> >           return;
>> >       }
>> >       /* do something else */
>> >   }
>> >
>> > func1() is buggy because it behaves differently if errp is NULL.
>> 
>> Does your series fix any such bugs?  We hunted them all down long ago...
>> Perhaps a few new ones have crept in since.  Hmm... I can see two:
>> 
>>     $ git-grep -F 'errp && *errp'
>>     exec.c:        if (errp && *errp) {
>>     hw/mem/pc-dimm.c:        if (errp && *errp) {
>>     util/error.c:    assert(errp && *errp);
>
> This RFC doesn't fix those bugs, but just makes them more obvious and
> easier to fix.  I plan to fix them in the final version of the series.

Well, these two are plenty obvious already :)

>> > 2) Code like this:
>> >
>> >   int func2(..., Error **errp)
>> >   {
>> >       do_something(errp);
>> >       if (*errp) {
>> >           /* handle error */
>> >       }
>> >   }
>> >
>> > func2() is buggy because if crashes if errp is NULL.
>> 
>> Does your series fix any such bugs?  grep coughs up quite a few
>> candidates...
>> 
>> > I don't see an easy way to grep for them with the current code.  With
>> > this series, (1) can be detected by grepping for ERR_IS_IGNORED,
>> 
>> How would example (1) look like then?
>
>
>   diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
>   index 92fb482..4e5e2c9 100644
>   --- a/hw/mem/pc-dimm.c
>   +++ b/hw/mem/pc-dimm.c
>   @@ -316,7 +316,7 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
>            uint64_t dimm_size = object_property_get_int(OBJECT(dimm),
>                                                         PC_DIMM_SIZE_PROP,
>                                                         errp);
>   -        if (errp && *errp) {
>   +        if (!ERR_IS_IGNORED(errp) && ERR_IS_SET(errp)) {
>                goto out;
>            }
>
> Without this series, the fix for (1) requires adding error_propagate()
> boilerplate.  With this series, the fix is to just drop the
> !ERR_IS_IGNORED check and keep the ERR_IS_SET check

I think creating the fix is roughly the same work as before.  The
resulting code is a bit more compact: we avoid error_propagate()
boilerplate, but pay for that with an ERR_IS_SET() macro.

>> > is fixed because ERR_IS_SET(errp) will work even if errp is NULL.
>> >
>> >> > TODO
>> >> > ----
>> >> >
>> >> > * Simplify more cases of local_error/error_propagate() to use
>> >> >   errp directly.
>> >> > * Update API documentation and code examples.
>> >> > * Add a mechanism to ensure errp is never NULL.
>> >> >
>> >> > Git branch
>> >> > ----------
>> >> >
>> >> > This series depend on a few extra cleanups that I didn't submit
>> >> > to qemu-devel yet.  A git branch including this series is
>> >> > available at:
>> >> >
>> >> >   git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1

I doubt the macros make the bug fixing materially easier, and I doubt
they can reduce future bugs of this kind.  What they can do is letting
us get rid of error_propagate() boilerplate with relative ease.

If we switch to returning success/failure (which also gets rid of the
boilerplate), then the macros may still let us get rid of boilerplate
more quickly, for some additional churn.  Worthwhile?  Depends on how
long the return value change takes us.

I think the first order of business is to figure out whether we want to
pursue returning success/failure.

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-30 11:40         ` Markus Armbruster
@ 2017-07-01 14:20           ` Eduardo Habkost
  2017-07-03 12:51             ` Markus Armbruster
  2017-07-01 14:29           ` Eduardo Habkost
  1 sibling, 1 reply; 41+ messages in thread
From: Eduardo Habkost @ 2017-07-01 14:20 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael Roth

On Fri, Jun 30, 2017 at 01:40:58PM +0200, Markus Armbruster wrote:
> Eduardo Habkost <ehabkost@redhat.com> writes:
> 
> > On Thu, Jun 29, 2017 at 08:54:29AM +0200, Markus Armbruster wrote:
> >> Eduardo Habkost <ehabkost@redhat.com> writes:
> >> 
> >> > On Wed, Jun 28, 2017 at 11:05:26AM +0200, Markus Armbruster wrote:
> >> >> Eduardo Habkost <ehabkost@redhat.com> writes:
> > [...]
> >> >> > I understand the reason we need to support errp==NULL, as it
> >> >> > makes life simpler for callers that don't want any extra error
> >> >> > information.  However, this has the cost of making the functions
> >> >> > that report errors more complex and error-prone.
> >> >> >
> >> >> > (Evidence of that: the 34 ERR_IS_* cases handled by the "use
> >> >> > ERR_IS_* macros" patches in the series.  Where existing code will
> >> >> > crash or behave differently if errp is NULL.)
> >> >> 
> >> >> Which of them could *not* use a suitable return value instead of *errp?
> >> >
> >> > I don't know.  But I'm not trying to improve those 34 ERR_IS_* cases.  I
> >> > am trying to improve the 700+ functions that need the
> >> > local_err/error_propagate() boilerplate code today.  This series already
> >> > handles 346 of them automatically (see patch 14/15).
> >> 
> >> I agree the goal is reducing error_propagate() boilerplate.  I latched
> >> onto the 34 ERR_IS_* cases only because you presented them as examples.
> >
> > The 34 ERR_IS_* cases were evidence of how easy it is to introduce
> > mistakes with the current API.  Probably most of them are instances of
> > (1) and (2) below.
> 
> The current interface can be abused, but how much abuse actually creeps
> in?  I think we've been doing reasonably well there since we got rid of
> the bad examples and improved documentation.

See the 30+ cases touched by patch 09/15.  Except for the ones in
error.c, all of them look like bugs to me.

I didn't investigate when each of them were introduced, though.

> 
> Moreover, the revised interface could also be abused.  Nothing stops you
> from dereferencing errp before or after, the only thing that changes are
> the examples people see in code.  I'm afraid the people who reinvent bad
> examples from scratch despite the documentation telling them not to will
> also bypass any macros the documentation tells them to use.
> 
> *Especially* if we use macros only sometimes.  ERR_IS_SET(&err) makes no
> sense, so we'd still test err directly there, wouldn't we?

Any interface can be abused.  But I still believe a simpler and easier
interface for propagating errors is less likely to be abused.

But in either case, tools to detect abuse would be welcome.  We can
write Coccinelle scripts to detect most abuse of the existing error API.

> 
[...]
> >> > is fixed because ERR_IS_SET(errp) will work even if errp is NULL.
> >> >
> >> >> > TODO
> >> >> > ----
> >> >> >
> >> >> > * Simplify more cases of local_error/error_propagate() to use
> >> >> >   errp directly.
> >> >> > * Update API documentation and code examples.
> >> >> > * Add a mechanism to ensure errp is never NULL.
> >> >> >
> >> >> > Git branch
> >> >> > ----------
> >> >> >
> >> >> > This series depend on a few extra cleanups that I didn't submit
> >> >> > to qemu-devel yet.  A git branch including this series is
> >> >> > available at:
> >> >> >
> >> >> >   git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1
> 
> I doubt the macros make the bug fixing materially easier, and I doubt
> they can reduce future bugs of this kind.  What they can do is letting
> us get rid of error_propagate() boilerplate with relative ease.
> 
> If we switch to returning success/failure (which also gets rid of the
> boilerplate), then the macros may still let us get rid of boilerplate
> more quickly, for some additional churn.  Worthwhile?  Depends on how
> long the return value change takes us.

My assumption is that it will take a very long time.

> 
> I think the first order of business is to figure out whether we want to
> pursue returning success/failure.

OK.  I will reply about that in a separate message.

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-06-30 11:40         ` Markus Armbruster
  2017-07-01 14:20           ` Eduardo Habkost
@ 2017-07-01 14:29           ` Eduardo Habkost
  2017-07-03 13:21             ` Markus Armbruster
  1 sibling, 1 reply; 41+ messages in thread
From: Eduardo Habkost @ 2017-07-01 14:29 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael Roth

On Fri, Jun 30, 2017 at 01:40:58PM +0200, Markus Armbruster wrote:
[...]
> 
> I doubt the macros make the bug fixing materially easier, and I doubt
> they can reduce future bugs of this kind.  What they can do is letting
> us get rid of error_propagate() boilerplate with relative ease.
> 
> If we switch to returning success/failure (which also gets rid of the
> boilerplate), then the macros may still let us get rid of boilerplate
> more quickly, for some additional churn.  Worthwhile?  Depends on how
> long the return value change takes us.
> 
> I think the first order of business is to figure out whether we want to
> pursue returning success/failure.

About this, I'm unsure.  Returning error information in two separate
locations (the return value and *errp) makes it easier to introduce bugs
that are hard to detect.  Especially when the tree is an inconsistent
state where we mix -1/0, -errno/0, FALSE/TRUE, NULL/non-NULL and void
functions.

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-07-01 14:20           ` Eduardo Habkost
@ 2017-07-03 12:51             ` Markus Armbruster
  0 siblings, 0 replies; 41+ messages in thread
From: Markus Armbruster @ 2017-07-03 12:51 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: qemu-devel, Michael Roth

Eduardo Habkost <ehabkost@redhat.com> writes:

> On Fri, Jun 30, 2017 at 01:40:58PM +0200, Markus Armbruster wrote:
>> Eduardo Habkost <ehabkost@redhat.com> writes:
>> 
>> > On Thu, Jun 29, 2017 at 08:54:29AM +0200, Markus Armbruster wrote:
>> >> Eduardo Habkost <ehabkost@redhat.com> writes:
>> >> 
>> >> > On Wed, Jun 28, 2017 at 11:05:26AM +0200, Markus Armbruster wrote:
>> >> >> Eduardo Habkost <ehabkost@redhat.com> writes:
>> > [...]
>> >> >> > I understand the reason we need to support errp==NULL, as it
>> >> >> > makes life simpler for callers that don't want any extra error
>> >> >> > information.  However, this has the cost of making the functions
>> >> >> > that report errors more complex and error-prone.
>> >> >> >
>> >> >> > (Evidence of that: the 34 ERR_IS_* cases handled by the "use
>> >> >> > ERR_IS_* macros" patches in the series.  Where existing code will
>> >> >> > crash or behave differently if errp is NULL.)
>> >> >> 
>> >> >> Which of them could *not* use a suitable return value instead of *errp?
>> >> >
>> >> > I don't know.  But I'm not trying to improve those 34 ERR_IS_* cases.  I
>> >> > am trying to improve the 700+ functions that need the
>> >> > local_err/error_propagate() boilerplate code today.  This series already
>> >> > handles 346 of them automatically (see patch 14/15).
>> >> 
>> >> I agree the goal is reducing error_propagate() boilerplate.  I latched
>> >> onto the 34 ERR_IS_* cases only because you presented them as examples.
>> >
>> > The 34 ERR_IS_* cases were evidence of how easy it is to introduce
>> > mistakes with the current API.  Probably most of them are instances of
>> > (1) and (2) below.
>> 
>> The current interface can be abused, but how much abuse actually creeps
>> in?  I think we've been doing reasonably well there since we got rid of
>> the bad examples and improved documentation.
>
> See the 30+ cases touched by patch 09/15.  Except for the ones in
> error.c, all of them look like bugs to me.
>
> I didn't investigate when each of them were introduced, though.
>
>> 
>> Moreover, the revised interface could also be abused.  Nothing stops you
>> from dereferencing errp before or after, the only thing that changes are
>> the examples people see in code.  I'm afraid the people who reinvent bad
>> examples from scratch despite the documentation telling them not to will
>> also bypass any macros the documentation tells them to use.
>> 
>> *Especially* if we use macros only sometimes.  ERR_IS_SET(&err) makes no
>> sense, so we'd still test err directly there, wouldn't we?
>
> Any interface can be abused.  But I still believe a simpler and easier
> interface for propagating errors is less likely to be abused.

Can you substantiate this claim with examples?  I'm looking for
arguments like "if existing code looks like $this, people could
plausibly write $mistake, which is wrong.  If it looks like $that, they
could still write $related_mistake, but it seems far less likely."

> But in either case, tools to detect abuse would be welcome.  We can
> write Coccinelle scripts to detect most abuse of the existing error API.

checkpatch.pl would be nice, too.  It's too stupid for rigorous checks.
However, the ones you fix in PATCH 09 all involve *errp.  Many of the
*errp your patch doesn't touch look fishy to me.  Should checkpatch.pl
warn when it sees *errp in new code?

> [...]
>> >> > is fixed because ERR_IS_SET(errp) will work even if errp is NULL.
>> >> >
>> >> >> > TODO
>> >> >> > ----
>> >> >> >
>> >> >> > * Simplify more cases of local_error/error_propagate() to use
>> >> >> >   errp directly.
>> >> >> > * Update API documentation and code examples.
>> >> >> > * Add a mechanism to ensure errp is never NULL.
>> >> >> >
>> >> >> > Git branch
>> >> >> > ----------
>> >> >> >
>> >> >> > This series depend on a few extra cleanups that I didn't submit
>> >> >> > to qemu-devel yet.  A git branch including this series is
>> >> >> > available at:
>> >> >> >
>> >> >> >   git://github.com/ehabkost/qemu-hacks.git work/err-api-rework-ignore-ptr-v1
>> 
>> I doubt the macros make the bug fixing materially easier, and I doubt
>> they can reduce future bugs of this kind.  What they can do is letting
>> us get rid of error_propagate() boilerplate with relative ease.
>> 
>> If we switch to returning success/failure (which also gets rid of the
>> boilerplate), then the macros may still let us get rid of boilerplate
>> more quickly, for some additional churn.  Worthwhile?  Depends on how
>> long the return value change takes us.
>
> My assumption is that it will take a very long time.

"Very long time" would be bad, because unconverted code breeds more
unconverted code by serving as bad example.

Big "convert from old way to do things to new way" tasks should only be
started with a reasonable idea on how to end them.  We've started too
many such tasks sanguinely, and have had the darndest time ending any
of them.

I'm investigating ways to automate parts of the job.

>> I think the first order of business is to figure out whether we want to
>> pursue returning success/failure.
>
> OK.  I will reply about that in a separate message.

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-07-01 14:29           ` Eduardo Habkost
@ 2017-07-03 13:21             ` Markus Armbruster
  2017-07-03 13:47               ` Eduardo Habkost
  0 siblings, 1 reply; 41+ messages in thread
From: Markus Armbruster @ 2017-07-03 13:21 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: qemu-devel, Michael Roth

Eduardo Habkost <ehabkost@redhat.com> writes:

> On Fri, Jun 30, 2017 at 01:40:58PM +0200, Markus Armbruster wrote:
> [...]
>> 
>> I doubt the macros make the bug fixing materially easier, and I doubt
>> they can reduce future bugs of this kind.  What they can do is letting
>> us get rid of error_propagate() boilerplate with relative ease.
>> 
>> If we switch to returning success/failure (which also gets rid of the
>> boilerplate), then the macros may still let us get rid of boilerplate
>> more quickly, for some additional churn.  Worthwhile?  Depends on how
>> long the return value change takes us.
>> 
>> I think the first order of business is to figure out whether we want to
>> pursue returning success/failure.
>
> About this, I'm unsure.  Returning error information in two separate
> locations (the return value and *errp) makes it easier to introduce bugs
> that are hard to detect.

I sympathize with this argument.  It's exactly what that made us avoid
returning a success/failure indication.

Except when we don't actually avoid it:

* Functions returning a pointer typically return non-null on success,
  null on failure.  Has inconsistency between return value and Error
  setting been a problem in practice?  Nope.

* Quite a few functions return 0 on success, -errno on failure, to let
  callers handle different errors differently.  Has inconsistency been a
  problem in practice?  Nope again.

  Aside: the original Error plan was to have callers check ErrorClass,
  but that didn't work out.

* Functions with a side effect typically either do their side effect and
  succeed, or do nothing and fail.  Inconsistency between side effect
  and claimed success is theoretically possible no matter how success is
  claimed: it's possible if the function returns success/failure, it's
  possible if it sets an Error on failure and doesn't on success, and
  it's possible if it does both.

My point is: returning void instead of success/failure gets rid only of
a part of a theoretical problem, which turns out not much of a problem
in practice.

>                           Especially when the tree is an inconsistent
> state where we mix -1/0, -errno/0, FALSE/TRUE, NULL/non-NULL and void
> functions.

This is basically ret<0/ret>=0, !ret/ret, void.

Getting rid of void would improve matters, wouldn't it?

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

* Re: [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored
  2017-07-03 13:21             ` Markus Armbruster
@ 2017-07-03 13:47               ` Eduardo Habkost
  0 siblings, 0 replies; 41+ messages in thread
From: Eduardo Habkost @ 2017-07-03 13:47 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael Roth

On Mon, Jul 03, 2017 at 03:21:56PM +0200, Markus Armbruster wrote:
> Eduardo Habkost <ehabkost@redhat.com> writes:
> 
> > On Fri, Jun 30, 2017 at 01:40:58PM +0200, Markus Armbruster wrote:
> > [...]
> >> 
> >> I doubt the macros make the bug fixing materially easier, and I doubt
> >> they can reduce future bugs of this kind.  What they can do is letting
> >> us get rid of error_propagate() boilerplate with relative ease.
> >> 
> >> If we switch to returning success/failure (which also gets rid of the
> >> boilerplate), then the macros may still let us get rid of boilerplate
> >> more quickly, for some additional churn.  Worthwhile?  Depends on how
> >> long the return value change takes us.
> >> 
> >> I think the first order of business is to figure out whether we want to
> >> pursue returning success/failure.
> >
> > About this, I'm unsure.  Returning error information in two separate
> > locations (the return value and *errp) makes it easier to introduce bugs
> > that are hard to detect.
> 
> I sympathize with this argument.  It's exactly what that made us avoid
> returning a success/failure indication.
> 
> Except when we don't actually avoid it:
> 
> * Functions returning a pointer typically return non-null on success,
>   null on failure.  Has inconsistency between return value and Error
>   setting been a problem in practice?  Nope.
> 
> * Quite a few functions return 0 on success, -errno on failure, to let
>   callers handle different errors differently.  Has inconsistency been a
>   problem in practice?  Nope again.
> 
>   Aside: the original Error plan was to have callers check ErrorClass,
>   but that didn't work out.
> 
> * Functions with a side effect typically either do their side effect and
>   succeed, or do nothing and fail.  Inconsistency between side effect
>   and claimed success is theoretically possible no matter how success is
>   claimed: it's possible if the function returns success/failure, it's
>   possible if it sets an Error on failure and doesn't on success, and
>   it's possible if it does both.
> 
> My point is: returning void instead of success/failure gets rid only of
> a part of a theoretical problem, which turns out not much of a problem
> in practice.
> 

You are probably right.  And I guess we will find out quickly if this is
not the case and the conversion to bool starts introducing more complex
or buggy code.


> >                           Especially when the tree is an inconsistent
> > state where we mix -1/0, -errno/0, FALSE/TRUE, NULL/non-NULL and void
> > functions.
> 
> This is basically ret<0/ret>=0, !ret/ret, void.
> 
> Getting rid of void would improve matters, wouldn't it?

Yes.

-- 
Eduardo

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

end of thread, other threads:[~2017-07-03 13:48 UTC | newest]

Thread overview: 41+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-13 16:52 [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eduardo Habkost
2017-06-13 16:52 ` [Qemu-devel] [RFC 01/15] tests: Test cases for error API Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 02/15] error: New IGNORE_ERRORS macro Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 03/15] Add qapi/error.h includes on files that will need it Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 04/15] [coccinelle] Use IGNORE_ERRORS instead of NULL as errp argument Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 05/15] qapi: Use IGNORE_ERRORS instead of NULL on generated code Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 06/15] test-qapi-util: Use IGNORE_ERRORS instead of NULL Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 07/15] Manual changes to use " Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 08/15] error: New ERR_IS_* macros for checking Error** values Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 09/15] [coccinelle] Use ERR_IS_* macros Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 10/15] test-qapi-util: " Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 11/15] Manual changes to use " Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 12/15] error: Make IGNORED_ERRORS not a NULL pointer Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 13/15] rdma: Simplify var declaration to avoid confusing Coccinelle Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 14/15] [coccinelle] Eliminate unnecessary local_err/error_propagate() usage Eduardo Habkost
2017-06-13 16:53 ` [Qemu-devel] [RFC 15/15] [test only] Use 'Error *err[static 1]' instead of 'Error **errp' to catch NULL errp arguments Eduardo Habkost
     [not found]   ` <20170615121407.GA2399@work-vm>
2017-06-17 19:33     ` Eduardo Habkost
2017-06-19  8:48       ` Dr. David Alan Gilbert
2017-06-19  9:43         ` Peter Maydell
2017-06-19 13:26           ` Eduardo Habkost
2017-06-27 20:12             ` Eric Blake
2017-06-27 21:31               ` Eduardo Habkost
2017-06-27 20:22 ` [Qemu-devel] [RFC 00/15] Error API: Flag errors in *errp even if errors are being ignored Eric Blake
2017-06-28  9:05 ` Markus Armbruster
2017-06-28 17:41   ` Eduardo Habkost
2017-06-29  6:54     ` Markus Armbruster
2017-06-29 12:57       ` Eduardo Habkost
2017-06-30 11:40         ` Markus Armbruster
2017-07-01 14:20           ` Eduardo Habkost
2017-07-03 12:51             ` Markus Armbruster
2017-07-01 14:29           ` Eduardo Habkost
2017-07-03 13:21             ` Markus Armbruster
2017-07-03 13:47               ` Eduardo Habkost
2017-06-29 14:01     ` Daniel P. Berrange
2017-06-29 13:39   ` Paolo Bonzini
2017-06-29 14:18     ` Daniel P. Berrange
2017-06-29 17:09       ` Eduardo Habkost
2017-06-29 17:38         ` Daniel P. Berrange
2017-06-29 17:47           ` Eduardo Habkost
2017-06-29 18:04             ` Daniel P. Berrange
2017-06-29 14:14   ` Daniel P. Berrange

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.