All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties
@ 2018-11-27  9:27 Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 01/28] target/xtensa: gdbstub fix register counting Marc-André Lureau
                   ` (30 more replies)
  0 siblings, 31 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau

Hi,

During "[PATCH v2 05/10] qom/globals: generalize
object_property_set_globals()" review, Eduardo suggested to rework the
GlobalProperty handling, so that -global is limited to QDev only and
we avoid mixing the machine compats and the user-provided -global
properties (instead of generalizing -global to various object kinds,
like I proposed in v2).

"qdev: do not mix compat props with global props" patch decouples a
bit user-provided -global from machine compat properties. This allows
to get rid of "user_provided" and "errp" fields in following patches.

Instead of explcitely calling object_apply_global_props() in the
various object post_init, I opted for creating a new TYPE_COMPAT_PROPS
interface. The interface approach gives a lot more flexibility on
which objects can have compat props. This requires some interface
improvments in "qom: teach interfaces to implement post-init".

A new compat property "x-use-canonical-path-for-ramblock-id" is added
to hostmem for legacy canonical path names, set to true for -file and
-memfd with qemu < 3.2.

(this series was initially titled "[PATCH v2 00/10] hostmem: use
object "id" for memory region name with >= 3.1", but its focus is more
in refactoring the global and compatilibity properties handling now)

v4:
- fix accel/machine compat props apply order inversion
- split "qdev: do not mix compat props with global props": replace
  using current_machine by new compat_props global, introduce
  SET_COMPAT() macro, use GPtrArray.
- add a comment about "qdev-props: call object_apply_global_props()"
  error reporting
- add "arm: replace instance_post_init()", to solve the post-init
  ordering issue
- add "hw/arm/virt: add virt-3.2 machine type" for completeness
- commit message improvements
- rebased, add r-b tags

v3:
- GlobalProperties improvements/cleanups
- drop generalizing the -global idea
- "replace" the set_globals flag with a TYPE_COMPAT_PROPS interface
- update hw/i386 machine version to 3.2
- add "qom: make interface types abstract" interface cleanup

v2:
- replace "qom/user-creatable: add a few helper macros" patch for a
  more optimized "qom: make user_creatable_complete() specific to
  UserCreatable"
- rename register_global_list() to register_global_properties()
- call object_property_set_globals() after post-init
- add and use a ObjectClass.set_globals flag, instead of dynamically
  check object class in object_property_set_globals()
- use object "id" in >= 3.1 instead of canonical path, add compat
  property "x-use-canonical-path-for-ramblock-id" in base hostmem
  class.

Edgar E. Iglesias (1):
  net: cadence_gem: Remove incorrect assert()

Eric Auger (1):
  MAINTAINERS: Add an ARM SMMU section

Greg Kurz (1):
  9p: fix QEMU crash when renaming files

Marc-André Lureau (20):
  tests: qdev_prop_check_globals() doesn't return "all_used"
  qom: make interface types abstract
  qom: make user_creatable_complete() specific to UserCreatable
  accel: register global_props like machine globals
  qdev: move qdev_prop_register_global_list() to tests
  qom: remove unimplemented class_finalize
  hw: apply accel compat properties without touching globals
  hw: apply machine compat properties without touching globals
  hw: remove SET_MACHINE_COMPAT
  qdev: all globals are now user-provided
  qdev-props: convert global_props to GPtrArray
  qdev-props: remove errp from GlobalProperty
  qdev-props: call object_apply_global_props()
  qom: teach interfaces to implement post-init
  qom: add object_class_get_class_data()
  arm: replace instance_post_init()
  machine: add compat-props interface
  hw/i386: add pc-i440fx-3.2 & pc-q35-3.2
  hw/arm/virt: add virt-3.2 machine type
  hostmem: use object id for memory region name with >= 3.1

Max Filippov (4):
  target/xtensa: gdbstub fix register counting
  target/xtensa: drop num_[core_]regs from dc232b/dc233c configs
  target/xtensa: xtfpga: provide default memory sizes
  MAINTAINERS: add missing xtensa patterns

Thomas Huth (1):
  MAINTAINERS: Assign some more files in the hw/arm/ directory

-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 01/28] target/xtensa: gdbstub fix register counting
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 02/28] target/xtensa: drop num_[core_]regs from dc232b/dc233c configs Marc-André Lureau
                   ` (29 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Max Filippov

From: Max Filippov <jcmvbkbc@gmail.com>

In order to communicate correctly with gdb xtensa gdbstub must provide
expected number of registers in 'g' packet response. xtensa-elf-gdb
expects both nonprivileged and privileged registers. xtensa-linux-gdb
only expects nonprivileged registers. gdb only counts one contiguous
stretch of registers, do the same for the core registers in the
xtensa_count_regs.

With this change qemu-system-xtensa is able to communicate with all
xtensa-elf-gdb versions (versions prior to 8.2 require overlay fixup),
and qemu-xtensa is able to communicate with all xtensa-linux-gdb
versions, except 8.2.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 target/xtensa/gdbstub.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/target/xtensa/gdbstub.c b/target/xtensa/gdbstub.c
index c9450914c7..d43bb190c6 100644
--- a/target/xtensa/gdbstub.c
+++ b/target/xtensa/gdbstub.c
@@ -45,15 +45,20 @@ void xtensa_count_regs(const XtensaConfig *config,
                        unsigned *n_regs, unsigned *n_core_regs)
 {
     unsigned i;
+    bool count_core_regs = true;
 
     for (i = 0; config->gdb_regmap.reg[i].targno >= 0; ++i) {
         if (config->gdb_regmap.reg[i].type != xtRegisterTypeTieState &&
             config->gdb_regmap.reg[i].type != xtRegisterTypeMapped &&
             config->gdb_regmap.reg[i].type != xtRegisterTypeUnmapped) {
             ++*n_regs;
-            if ((config->gdb_regmap.reg[i].flags &
-                 XTENSA_REGISTER_FLAGS_PRIVILEGED) == 0) {
-                ++*n_core_regs;
+            if (count_core_regs) {
+                if ((config->gdb_regmap.reg[i].flags &
+                     XTENSA_REGISTER_FLAGS_PRIVILEGED) == 0) {
+                    ++*n_core_regs;
+                } else {
+                    count_core_regs = false;
+                }
             }
         }
     }
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 02/28] target/xtensa: drop num_[core_]regs from dc232b/dc233c configs
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 01/28] target/xtensa: gdbstub fix register counting Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 03/28] target/xtensa: xtfpga: provide default memory sizes Marc-André Lureau
                   ` (28 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Max Filippov

From: Max Filippov <jcmvbkbc@gmail.com>

Now that xtensa_count_regs does the right thing, remove manual
initialization of these fields from the affected configurations and let
xtensa_finalize_config initialize them. Add XTREG_END to terminate
register lists.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
---
 target/xtensa/core-dc232b.c                | 2 --
 target/xtensa/core-dc232b/gdb-config.inc.c | 1 +
 target/xtensa/core-dc233c.c                | 2 --
 target/xtensa/core-dc233c/gdb-config.inc.c | 1 +
 4 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/target/xtensa/core-dc232b.c b/target/xtensa/core-dc232b.c
index 7131337840..7851bcb636 100644
--- a/target/xtensa/core-dc232b.c
+++ b/target/xtensa/core-dc232b.c
@@ -40,8 +40,6 @@
 static XtensaConfig dc232b __attribute__((unused)) = {
     .name = "dc232b",
     .gdb_regmap = {
-        .num_regs = 120,
-        .num_core_regs = 52,
         .reg = {
 #include "core-dc232b/gdb-config.inc.c"
         }
diff --git a/target/xtensa/core-dc232b/gdb-config.inc.c b/target/xtensa/core-dc232b/gdb-config.inc.c
index 13aba5edec..d87168628b 100644
--- a/target/xtensa/core-dc232b/gdb-config.inc.c
+++ b/target/xtensa/core-dc232b/gdb-config.inc.c
@@ -259,3 +259,4 @@
           0, 0, 0, 0, 0, 0)
   XTREG(119, 476, 32, 4, 4, 0x000f, 0x0006, -2, 8, 0x0100, a15,
           0, 0, 0, 0, 0, 0)
+  XTREG_END
diff --git a/target/xtensa/core-dc233c.c b/target/xtensa/core-dc233c.c
index d701e3f5de..8853bfd4d0 100644
--- a/target/xtensa/core-dc233c.c
+++ b/target/xtensa/core-dc233c.c
@@ -40,8 +40,6 @@
 static XtensaConfig dc233c __attribute__((unused)) = {
     .name = "dc233c",
     .gdb_regmap = {
-        .num_regs = 121,
-        .num_core_regs = 52,
         .reg = {
 #include "core-dc233c/gdb-config.inc.c"
         }
diff --git a/target/xtensa/core-dc233c/gdb-config.inc.c b/target/xtensa/core-dc233c/gdb-config.inc.c
index b632341b28..7e8963227f 100644
--- a/target/xtensa/core-dc233c/gdb-config.inc.c
+++ b/target/xtensa/core-dc233c/gdb-config.inc.c
@@ -143,3 +143,4 @@ XTREG(117, 468, 32, 4, 4, 0x000c, 0x0006, -2, 8, 0x0100, a12,         0, 0, 0, 0
 XTREG(118, 472, 32, 4, 4, 0x000d, 0x0006, -2, 8, 0x0100, a13,         0, 0, 0, 0, 0, 0)
 XTREG(119, 476, 32, 4, 4, 0x000e, 0x0006, -2, 8, 0x0100, a14,         0, 0, 0, 0, 0, 0)
 XTREG(120, 480, 32, 4, 4, 0x000f, 0x0006, -2, 8, 0x0100, a15,         0, 0, 0, 0, 0, 0)
+XTREG_END
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 03/28] target/xtensa: xtfpga: provide default memory sizes
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 01/28] target/xtensa: gdbstub fix register counting Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 02/28] target/xtensa: drop num_[core_]regs from dc232b/dc233c configs Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 04/28] MAINTAINERS: add missing xtensa patterns Marc-André Lureau
                   ` (27 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Max Filippov, Philippe Mathieu-Daudé

From: Max Filippov <jcmvbkbc@gmail.com>

Provide default RAM sizes for all XTFPGA boards, so that when started
without -m option they do the right thing.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/xtensa/xtfpga.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index b3161de320..21094319a6 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -446,6 +446,8 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
     }
 }
 
+#define XTFPGA_MMU_RESERVED_MEMORY_SIZE (128 * MiB)
+
 static const hwaddr xtfpga_mmu_io[2] = {
     0xf0000000,
 };
@@ -568,6 +570,7 @@ static void xtfpga_lx60_class_init(ObjectClass *oc, void *data)
     mc->init = xtfpga_lx60_init;
     mc->max_cpus = 4;
     mc->default_cpu_type = XTENSA_DEFAULT_CPU_TYPE;
+    mc->default_ram_size = 64 * MiB;
 }
 
 static const TypeInfo xtfpga_lx60_type = {
@@ -584,6 +587,7 @@ static void xtfpga_lx60_nommu_class_init(ObjectClass *oc, void *data)
     mc->init = xtfpga_lx60_nommu_init;
     mc->max_cpus = 4;
     mc->default_cpu_type = XTENSA_DEFAULT_CPU_NOMMU_TYPE;
+    mc->default_ram_size = 64 * MiB;
 }
 
 static const TypeInfo xtfpga_lx60_nommu_type = {
@@ -600,6 +604,7 @@ static void xtfpga_lx200_class_init(ObjectClass *oc, void *data)
     mc->init = xtfpga_lx200_init;
     mc->max_cpus = 4;
     mc->default_cpu_type = XTENSA_DEFAULT_CPU_TYPE;
+    mc->default_ram_size = 96 * MiB;
 }
 
 static const TypeInfo xtfpga_lx200_type = {
@@ -616,6 +621,7 @@ static void xtfpga_lx200_nommu_class_init(ObjectClass *oc, void *data)
     mc->init = xtfpga_lx200_nommu_init;
     mc->max_cpus = 4;
     mc->default_cpu_type = XTENSA_DEFAULT_CPU_NOMMU_TYPE;
+    mc->default_ram_size = 96 * MiB;
 }
 
 static const TypeInfo xtfpga_lx200_nommu_type = {
@@ -632,6 +638,7 @@ static void xtfpga_ml605_class_init(ObjectClass *oc, void *data)
     mc->init = xtfpga_ml605_init;
     mc->max_cpus = 4;
     mc->default_cpu_type = XTENSA_DEFAULT_CPU_TYPE;
+    mc->default_ram_size = 512 * MiB - XTFPGA_MMU_RESERVED_MEMORY_SIZE;
 }
 
 static const TypeInfo xtfpga_ml605_type = {
@@ -648,6 +655,7 @@ static void xtfpga_ml605_nommu_class_init(ObjectClass *oc, void *data)
     mc->init = xtfpga_ml605_nommu_init;
     mc->max_cpus = 4;
     mc->default_cpu_type = XTENSA_DEFAULT_CPU_NOMMU_TYPE;
+    mc->default_ram_size = 256 * MiB;
 }
 
 static const TypeInfo xtfpga_ml605_nommu_type = {
@@ -664,6 +672,7 @@ static void xtfpga_kc705_class_init(ObjectClass *oc, void *data)
     mc->init = xtfpga_kc705_init;
     mc->max_cpus = 4;
     mc->default_cpu_type = XTENSA_DEFAULT_CPU_TYPE;
+    mc->default_ram_size = 1 * GiB - XTFPGA_MMU_RESERVED_MEMORY_SIZE;
 }
 
 static const TypeInfo xtfpga_kc705_type = {
@@ -680,6 +689,7 @@ static void xtfpga_kc705_nommu_class_init(ObjectClass *oc, void *data)
     mc->init = xtfpga_kc705_nommu_init;
     mc->max_cpus = 4;
     mc->default_cpu_type = XTENSA_DEFAULT_CPU_NOMMU_TYPE;
+    mc->default_ram_size = 256 * MiB;
 }
 
 static const TypeInfo xtfpga_kc705_nommu_type = {
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 04/28] MAINTAINERS: add missing xtensa patterns
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (2 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 03/28] target/xtensa: xtfpga: provide default memory sizes Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 05/28] 9p: fix QEMU crash when renaming files Marc-André Lureau
                   ` (26 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Max Filippov, Philippe Mathieu-Daudé

From: Max Filippov <jcmvbkbc@gmail.com>

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 MAINTAINERS | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 1032406c56..f4a7e453c0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -311,6 +311,8 @@ F: target/xtensa/
 F: hw/xtensa/
 F: tests/tcg/xtensa/
 F: disas/xtensa.c
+F: include/hw/xtensa/xtensa-isa.h
+F: default-configs/xtensa*.mak
 
 TriCore
 M: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 05/28] 9p: fix QEMU crash when renaming files
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (3 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 04/28] MAINTAINERS: add missing xtensa patterns Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 06/28] MAINTAINERS: Assign some more files in the hw/arm/ directory Marc-André Lureau
                   ` (25 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Greg Kurz, P J P, zhibin hu, Prasad J Pandit

From: Greg Kurz <groug@kaod.org>

When using the 9P2000.u version of the protocol, the following shell
command line in the guest can cause QEMU to crash:

    while true; do rm -rf aa; mkdir -p a/b & touch a/b/c & mv a aa; done

With 9P2000.u, file renaming is handled by the WSTAT command. The
v9fs_wstat() function calls v9fs_complete_rename(), which calls
v9fs_fix_path() for every fid whose path is affected by the change.
The involved calls to v9fs_path_copy() may race with any other access
to the fid path performed by some worker thread, causing a crash like
shown below:

Thread 12 "qemu-system-x86" received signal SIGSEGV, Segmentation fault.
0x0000555555a25da2 in local_open_nofollow (fs_ctx=0x555557d958b8, path=0x0,
 flags=65536, mode=0) at hw/9pfs/9p-local.c:59
59          while (*path && fd != -1) {
(gdb) bt
#0  0x0000555555a25da2 in local_open_nofollow (fs_ctx=0x555557d958b8,
 path=0x0, flags=65536, mode=0) at hw/9pfs/9p-local.c:59
#1  0x0000555555a25e0c in local_opendir_nofollow (fs_ctx=0x555557d958b8,
 path=0x0) at hw/9pfs/9p-local.c:92
#2  0x0000555555a261b8 in local_lstat (fs_ctx=0x555557d958b8,
 fs_path=0x555556b56858, stbuf=0x7fff84830ef0) at hw/9pfs/9p-local.c:185
#3  0x0000555555a2b367 in v9fs_co_lstat (pdu=0x555557d97498,
 path=0x555556b56858, stbuf=0x7fff84830ef0) at hw/9pfs/cofile.c:53
#4  0x0000555555a1e9e2 in v9fs_stat (opaque=0x555557d97498)
 at hw/9pfs/9p.c:1083
#5  0x0000555555e060a2 in coroutine_trampoline (i0=-669165424, i1=32767)
 at util/coroutine-ucontext.c:116
#6  0x00007fffef4f5600 in __start_context () at /lib64/libc.so.6
#7  0x0000000000000000 in  ()
(gdb)

The fix is to take the path write lock when calling v9fs_complete_rename(),
like in v9fs_rename().

Impact:  DoS triggered by unprivileged guest users.

Fixes: CVE-2018-19489
Cc: P J P <ppandit@redhat.com>
Reported-by: zhibin hu <noirfate@gmail.com>
Reviewed-by: Prasad J Pandit <pjp@fedoraproject.org>
Signed-off-by: Greg Kurz <groug@kaod.org>
---
 hw/9pfs/9p.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
index 267a25533b..bdf7919abf 100644
--- a/hw/9pfs/9p.c
+++ b/hw/9pfs/9p.c
@@ -2855,6 +2855,7 @@ static void coroutine_fn v9fs_wstat(void *opaque)
     struct stat stbuf;
     V9fsFidState *fidp;
     V9fsPDU *pdu = opaque;
+    V9fsState *s = pdu->s;
 
     v9fs_stat_init(&v9stat);
     err = pdu_unmarshal(pdu, offset, "dwS", &fid, &unused, &v9stat);
@@ -2920,7 +2921,9 @@ static void coroutine_fn v9fs_wstat(void *opaque)
         }
     }
     if (v9stat.name.size != 0) {
+        v9fs_path_write_lock(s);
         err = v9fs_complete_rename(pdu, fidp, -1, &v9stat.name);
+        v9fs_path_unlock(s);
         if (err < 0) {
             goto out;
         }
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 06/28] MAINTAINERS: Assign some more files in the hw/arm/ directory
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (4 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 05/28] 9p: fix QEMU crash when renaming files Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 07/28] MAINTAINERS: Add an ARM SMMU section Marc-André Lureau
                   ` (24 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Thomas Huth, Philippe Mathieu-Daudé, Peter Maydell

From: Thomas Huth <thuth@redhat.com>

I apparently missed some more files and even a complete machine (the
"imx25-pdk") in my previous patch... but now we should hopefully have
a completely coverage for all available ARM boards.

Fixes: 95a5db3ae5698b49c63144610ad02913e780c828
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-id: 1542782568-20059-1-git-send-email-thuth@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 MAINTAINERS | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index f4a7e453c0..43d0d9d578 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -535,6 +535,17 @@ L: qemu-arm@nongnu.org
 S: Odd Fixes
 F: hw/arm/gumstix.c
 
+i.MX25 PDK
+M: Peter Maydell <peter.maydell@linaro.org>
+R: Jean-Christophe Dubois <jcd@tribudubois.net>
+L: qemu-arm@nongnu.org
+S: Odd Fixes
+F: hw/arm/fsl-imx25.c
+F: hw/arm/imx25_pdk.c
+F: hw/misc/imx25_ccm.c
+F: include/hw/arm/fsl-imx25.h
+F: include/hw/misc/imx25_ccm.h
+
 i.MX31 (kzm)
 M: Peter Chubb <peter.chubb@nicta.com.au>
 M: Peter Maydell <peter.maydell@linaro.org>
@@ -617,6 +628,7 @@ R: Andrew Baumann <Andrew.Baumann@microsoft.com>
 R: Philippe Mathieu-Daudé <f4bug@amsat.org>
 L: qemu-arm@nongnu.org
 S: Odd Fixes
+F: hw/arm/raspi.c
 F: hw/arm/raspi_platform.h
 F: hw/*/bcm283*
 F: include/hw/arm/raspi*
@@ -641,8 +653,12 @@ F: hw/arm/spitz.c
 F: hw/arm/tosa.c
 F: hw/arm/z2.c
 F: hw/*/pxa2xx*
+F: hw/display/tc6393xb.c
+F: hw/gpio/max7310.c
+F: hw/gpio/zaurus.c
 F: hw/misc/mst_fpga.c
 F: include/hw/arm/pxa.h
+F: include/hw/arm/sharpsl.h
 
 SABRELITE / i.MX6
 M: Peter Maydell <peter.maydell@linaro.org>
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 07/28] MAINTAINERS: Add an ARM SMMU section
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (5 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 06/28] MAINTAINERS: Assign some more files in the hw/arm/ directory Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 08/28] net: cadence_gem: Remove incorrect assert() Marc-André Lureau
                   ` (23 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Eric Auger, Peter Maydell

From: Eric Auger <eric.auger@redhat.com>

Add a new ARM SMMU section and set Eric Auger as the maintainer
for ARM SMMU emulation sources.

Signed-off-by: Eric Auger <eric.auger@redhat.com>
Message-id: 20181122180143.14237-1-eric.auger@redhat.com
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 MAINTAINERS | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 43d0d9d578..9410bbb7cf 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -151,6 +151,13 @@ F: disas/arm.c
 F: disas/arm-a64.cc
 F: disas/libvixl/
 
+ARM SMMU
+M: Eric Auger <eric.auger@redhat.com>
+L: qemu-arm@nongnu.org
+S: Maintained
+F: hw/arm/smmu*
+F: include/hw/arm/smmu*
+
 CRIS
 M: Edgar E. Iglesias <edgar.iglesias@gmail.com>
 S: Maintained
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 08/28] net: cadence_gem: Remove incorrect assert()
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (6 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 07/28] MAINTAINERS: Add an ARM SMMU section Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 09/28] tests: qdev_prop_check_globals() doesn't return "all_used" Marc-André Lureau
                   ` (22 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Edgar E. Iglesias, mbilal, Philippe Mathieu-Daudé,
	Peter Maydell, Edgar E. Iglesias, Alistair Francis, Jason Wang,
	open list:Xilinx Zynq

From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

Don't assert on RX descriptor settings when the receiver is
disabled. This fixes an issue with incoming packets on an
unused GEM.

Reported-by: mbilal <muhammad_bilal@mentor.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-id: 20181123135450.24829-2-edgar.iglesias@gmail.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/net/cadence_gem.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index d95cc27f58..7f63411430 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -979,7 +979,6 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
 
         /* Do nothing if receive is not enabled. */
         if (!gem_can_receive(nc)) {
-            assert(!first_desc);
             return -1;
         }
 
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 09/28] tests: qdev_prop_check_globals() doesn't return "all_used"
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (7 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 08/28] net: cadence_gem: Remove incorrect assert() Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27 13:40   ` Eduardo Habkost
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 10/28] qom: make interface types abstract Marc-André Lureau
                   ` (21 subsequent siblings)
  30 siblings, 1 reply; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau

Instead, it returns 1 if an error was detected, which is the case for:

/qdev/properties/dynamic/global/subprocess:
warning: global dynamic-prop-type-bad.prop3 has invalid class name
warning: global nohotplug-type.prop5=105 not used
warning: global nondevice-type.prop6 has invalid class name

Clarify the function return value.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/test-qdev-global-props.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c
index d81b0862d5..ccdf6c57c1 100644
--- a/tests/test-qdev-global-props.c
+++ b/tests/test-qdev-global-props.c
@@ -214,7 +214,7 @@ static void test_dynamic_globalprop_subprocess(void)
         { TYPE_NONDEVICE, "prop6", "106", true },
         {}
     };
-    int all_used;
+    int global_error;
 
     qdev_prop_register_global_list(props);
 
@@ -223,8 +223,8 @@ static void test_dynamic_globalprop_subprocess(void)
 
     g_assert_cmpuint(mt->prop1, ==, 101);
     g_assert_cmpuint(mt->prop2, ==, 102);
-    all_used = qdev_prop_check_globals();
-    g_assert_cmpuint(all_used, ==, 1);
+    global_error = qdev_prop_check_globals();
+    g_assert_cmpuint(global_error, ==, 1);
     g_assert(props[0].used);
     g_assert(props[1].used);
     g_assert(!props[2].used);
@@ -259,7 +259,7 @@ static void test_dynamic_globalprop_nouser_subprocess(void)
         { TYPE_NONDEVICE, "prop6", "106" },
         {}
     };
-    int all_used;
+    int global_error;
 
     qdev_prop_register_global_list(props);
 
@@ -268,8 +268,8 @@ static void test_dynamic_globalprop_nouser_subprocess(void)
 
     g_assert_cmpuint(mt->prop1, ==, 101);
     g_assert_cmpuint(mt->prop2, ==, 102);
-    all_used = qdev_prop_check_globals();
-    g_assert_cmpuint(all_used, ==, 0);
+    global_error = qdev_prop_check_globals();
+    g_assert_cmpuint(global_error, ==, 0);
     g_assert(props[0].used);
     g_assert(props[1].used);
     g_assert(!props[2].used);
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 10/28] qom: make interface types abstract
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (8 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 09/28] tests: qdev_prop_check_globals() doesn't return "all_used" Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27 13:41   ` Eduardo Habkost
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 11/28] qom: make user_creatable_complete() specific to UserCreatable Marc-André Lureau
                   ` (20 subsequent siblings)
  30 siblings, 1 reply; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Michael S. Tsirkin,
	Corey Minyard, Hervé Poussineau, Andreas Färber,
	Stefan Berger, Peter Maydell, open list:PReP, open list:ARM

Interfaces don't have instance, let's make the interface type really
abstract to avoid confusion.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/acpi/acpi_dev_interface.h | 6 +-----
 include/hw/arm/linux-boot-if.h       | 5 +----
 include/hw/fw-path-provider.h        | 4 +---
 include/hw/hotplug.h                 | 6 +-----
 include/hw/intc/intc.h               | 4 +---
 include/hw/ipmi/ipmi.h               | 4 +---
 include/hw/isa/isa.h                 | 4 ----
 include/hw/mem/memory-device.h       | 4 +---
 include/hw/nmi.h                     | 4 +---
 include/hw/stream.h                  | 4 +---
 include/hw/timer/m48t59.h            | 4 +---
 include/qom/object_interfaces.h      | 6 +-----
 include/sysemu/tpm.h                 | 4 +---
 target/arm/idau.h                    | 4 +---
 tests/check-qom-interface.c          | 4 +---
 15 files changed, 14 insertions(+), 53 deletions(-)

diff --git a/include/hw/acpi/acpi_dev_interface.h b/include/hw/acpi/acpi_dev_interface.h
index dabf4c4fc9..43ff119179 100644
--- a/include/hw/acpi/acpi_dev_interface.h
+++ b/include/hw/acpi/acpi_dev_interface.h
@@ -25,11 +25,7 @@ typedef enum {
      INTERFACE_CHECK(AcpiDeviceIf, (obj), \
                      TYPE_ACPI_DEVICE_IF)
 
-
-typedef struct AcpiDeviceIf {
-    /* <private> */
-    Object Parent;
-} AcpiDeviceIf;
+typedef struct AcpiDeviceIf AcpiDeviceIf;
 
 void acpi_send_event(DeviceState *dev, AcpiEventStatusBits event);
 
diff --git a/include/hw/arm/linux-boot-if.h b/include/hw/arm/linux-boot-if.h
index aba4479a14..7bbdfd1cc6 100644
--- a/include/hw/arm/linux-boot-if.h
+++ b/include/hw/arm/linux-boot-if.h
@@ -16,10 +16,7 @@
 #define ARM_LINUX_BOOT_IF(obj) \
     INTERFACE_CHECK(ARMLinuxBootIf, (obj), TYPE_ARM_LINUX_BOOT_IF)
 
-typedef struct ARMLinuxBootIf {
-    /*< private >*/
-    Object parent_obj;
-} ARMLinuxBootIf;
+typedef struct ARMLinuxBootIf ARMLinuxBootIf;
 
 typedef struct ARMLinuxBootIfClass {
     /*< private >*/
diff --git a/include/hw/fw-path-provider.h b/include/hw/fw-path-provider.h
index 050cb05d92..5df893a3d8 100644
--- a/include/hw/fw-path-provider.h
+++ b/include/hw/fw-path-provider.h
@@ -30,9 +30,7 @@
 #define FW_PATH_PROVIDER(obj) \
      INTERFACE_CHECK(FWPathProvider, (obj), TYPE_FW_PATH_PROVIDER)
 
-typedef struct FWPathProvider {
-    Object parent_obj;
-} FWPathProvider;
+typedef struct FWPathProvider FWPathProvider;
 
 typedef struct FWPathProviderClass {
     InterfaceClass parent_class;
diff --git a/include/hw/hotplug.h b/include/hw/hotplug.h
index 1a0516a479..6321e292fd 100644
--- a/include/hw/hotplug.h
+++ b/include/hw/hotplug.h
@@ -23,11 +23,7 @@
 #define HOTPLUG_HANDLER(obj) \
      INTERFACE_CHECK(HotplugHandler, (obj), TYPE_HOTPLUG_HANDLER)
 
-
-typedef struct HotplugHandler {
-    /* <private> */
-    Object Parent;
-} HotplugHandler;
+typedef struct HotplugHandler HotplugHandler;
 
 /**
  * hotplug_fn:
diff --git a/include/hw/intc/intc.h b/include/hw/intc/intc.h
index 27d9828943..fb3e8e621f 100644
--- a/include/hw/intc/intc.h
+++ b/include/hw/intc/intc.h
@@ -15,9 +15,7 @@
     INTERFACE_CHECK(InterruptStatsProvider, (obj), \
                     TYPE_INTERRUPT_STATS_PROVIDER)
 
-typedef struct InterruptStatsProvider {
-    Object parent;
-} InterruptStatsProvider;
+typedef struct InterruptStatsProvider InterruptStatsProvider;
 
 typedef struct InterruptStatsProviderClass {
     InterfaceClass parent;
diff --git a/include/hw/ipmi/ipmi.h b/include/hw/ipmi/ipmi.h
index 0affe5a4d8..99661d2bf0 100644
--- a/include/hw/ipmi/ipmi.h
+++ b/include/hw/ipmi/ipmi.h
@@ -114,9 +114,7 @@ uint32_t ipmi_next_uuid(void);
 #define IPMI_INTERFACE_GET_CLASS(class) \
      OBJECT_GET_CLASS(IPMIInterfaceClass, (class), TYPE_IPMI_INTERFACE)
 
-typedef struct IPMIInterface {
-    Object parent;
-} IPMIInterface;
+typedef struct IPMIInterface IPMIInterface;
 
 typedef struct IPMIInterfaceClass {
     InterfaceClass parent;
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index b9dbab24b4..e62ac91c19 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -43,10 +43,6 @@ static inline uint16_t applesmc_port(void)
 #define ISADMA(obj) \
     INTERFACE_CHECK(IsaDma, (obj), TYPE_ISADMA)
 
-struct IsaDma {
-    Object parent;
-};
-
 typedef enum {
     ISADMA_TRANSFER_VERIFY,
     ISADMA_TRANSFER_READ,
diff --git a/include/hw/mem/memory-device.h b/include/hw/mem/memory-device.h
index e904e194d5..0293a96abb 100644
--- a/include/hw/mem/memory-device.h
+++ b/include/hw/mem/memory-device.h
@@ -25,9 +25,7 @@
 #define MEMORY_DEVICE(obj) \
      INTERFACE_CHECK(MemoryDeviceState, (obj), TYPE_MEMORY_DEVICE)
 
-typedef struct MemoryDeviceState {
-    Object parent_obj;
-} MemoryDeviceState;
+typedef struct MemoryDeviceState MemoryDeviceState;
 
 /**
  * MemoryDeviceClass:
diff --git a/include/hw/nmi.h b/include/hw/nmi.h
index d092c684a1..ad857f3832 100644
--- a/include/hw/nmi.h
+++ b/include/hw/nmi.h
@@ -34,9 +34,7 @@
 #define NMI(obj) \
      INTERFACE_CHECK(NMI, (obj), TYPE_NMI)
 
-typedef struct NMIState {
-    Object parent_obj;
-} NMIState;
+typedef struct NMIState NMIState;
 
 typedef struct NMIClass {
     InterfaceClass parent_class;
diff --git a/include/hw/stream.h b/include/hw/stream.h
index c370ba0c66..15774f07ab 100644
--- a/include/hw/stream.h
+++ b/include/hw/stream.h
@@ -14,9 +14,7 @@
 #define STREAM_SLAVE(obj) \
      INTERFACE_CHECK(StreamSlave, (obj), TYPE_STREAM_SLAVE)
 
-typedef struct StreamSlave {
-    Object Parent;
-} StreamSlave;
+typedef struct StreamSlave StreamSlave;
 
 typedef void (*StreamCanPushNotifyFn)(void *opaque);
 
diff --git a/include/hw/timer/m48t59.h b/include/hw/timer/m48t59.h
index db5e43a8da..6f8db04fce 100644
--- a/include/hw/timer/m48t59.h
+++ b/include/hw/timer/m48t59.h
@@ -13,9 +13,7 @@
 #define NVRAM(obj) \
     INTERFACE_CHECK(Nvram, (obj), TYPE_NVRAM)
 
-typedef struct Nvram {
-    Object parent;
-} Nvram;
+typedef struct Nvram Nvram;
 
 typedef struct NvramClass {
     InterfaceClass parent;
diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index 4d513fb329..652a16d2ba 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -16,11 +16,7 @@
      INTERFACE_CHECK(UserCreatable, (obj), \
                      TYPE_USER_CREATABLE)
 
-
-typedef struct UserCreatable {
-    /* <private> */
-    Object Parent;
-} UserCreatable;
+typedef struct UserCreatable UserCreatable;
 
 /**
  * UserCreatableClass:
diff --git a/include/sysemu/tpm.h b/include/sysemu/tpm.h
index 17a97ed77a..5b541a71c8 100644
--- a/include/sysemu/tpm.h
+++ b/include/sysemu/tpm.h
@@ -33,9 +33,7 @@ typedef enum TPMVersion {
 #define TPM_IF(obj)                             \
     INTERFACE_CHECK(TPMIf, (obj), TYPE_TPM_IF)
 
-typedef struct TPMIf {
-    Object parent_obj;
-} TPMIf;
+typedef struct TPMIf TPMIf;
 
 typedef struct TPMIfClass {
     InterfaceClass parent_class;
diff --git a/target/arm/idau.h b/target/arm/idau.h
index cac27b95fa..7c0e4e3776 100644
--- a/target/arm/idau.h
+++ b/target/arm/idau.h
@@ -38,9 +38,7 @@
 #define IDAU_INTERFACE_GET_CLASS(obj) \
     OBJECT_GET_CLASS(IDAUInterfaceClass, (obj), TYPE_IDAU_INTERFACE)
 
-typedef struct IDAUInterface {
-    Object parent;
-} IDAUInterface;
+typedef struct IDAUInterface IDAUInterface;
 
 #define IREGION_NOTVALID -1
 
diff --git a/tests/check-qom-interface.c b/tests/check-qom-interface.c
index f87c9aaa8a..2177f0dce5 100644
--- a/tests/check-qom-interface.c
+++ b/tests/check-qom-interface.c
@@ -23,9 +23,7 @@
 #define TEST_IF(obj) \
      INTERFACE_CHECK(TestIf, (obj), TYPE_TEST_IF)
 
-typedef struct TestIf {
-    Object parent_obj;
-} TestIf;
+typedef struct TestIf TestIf;
 
 typedef struct TestIfClass {
     InterfaceClass parent_class;
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 11/28] qom: make user_creatable_complete() specific to UserCreatable
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (9 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 10/28] qom: make interface types abstract Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27 13:45   ` Eduardo Habkost
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 12/28] accel: register global_props like machine globals Marc-André Lureau
                   ` (19 subsequent siblings)
  30 siblings, 1 reply; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Michael S. Tsirkin, Amit Shah,
	Andreas Färber

Instead of accepting any Object*, change user_creatable_complete() to
require a UserCreatable*. Modify the callers to pass the appropriate
argument, removing redundant dynamic cast checks in object creation.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
---
 include/qom/object_interfaces.h |  4 ++--
 hw/misc/ivshmem.c               |  2 +-
 hw/virtio/virtio-rng.c          |  2 +-
 qom/object.c                    | 12 ++++++++----
 qom/object_interfaces.c         | 14 +++-----------
 5 files changed, 15 insertions(+), 19 deletions(-)

diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index 652a16d2ba..682ba1d9b0 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -51,14 +51,14 @@ typedef struct UserCreatableClass {
 
 /**
  * user_creatable_complete:
- * @obj: the object whose complete() method is called if defined
+ * @uc: the user-creatable object whose complete() method is called if defined
  * @errp: if an error occurs, a pointer to an area to store the error
  *
  * Wrapper to call complete() method if one of types it's inherited
  * from implements USER_CREATABLE interface, otherwise the call does
  * nothing.
  */
-void user_creatable_complete(Object *obj, Error **errp);
+void user_creatable_complete(UserCreatable *uc, Error **errp);
 
 /**
  * user_creatable_can_be_deleted:
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index ecfd10a29a..8213659602 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -1280,7 +1280,7 @@ static void desugar_shm(IVShmemState *s)
     object_property_add_child(OBJECT(s), "internal-shm-backend", obj,
                               &error_abort);
     object_unref(obj);
-    user_creatable_complete(obj, &error_abort);
+    user_creatable_complete(USER_CREATABLE(obj), &error_abort);
     s->hostmem = MEMORY_BACKEND(obj);
 }
 
diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c
index 855f1b41d1..30493a2586 100644
--- a/hw/virtio/virtio-rng.c
+++ b/hw/virtio/virtio-rng.c
@@ -191,7 +191,7 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
     if (vrng->conf.rng == NULL) {
         vrng->conf.default_backend = RNG_RANDOM(object_new(TYPE_RNG_RANDOM));
 
-        user_creatable_complete(OBJECT(vrng->conf.default_backend),
+        user_creatable_complete(USER_CREATABLE(vrng->conf.default_backend),
                                 &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
diff --git a/qom/object.c b/qom/object.c
index 547dcf97c3..eb770dbf7f 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -417,6 +417,7 @@ void object_initialize_childv(Object *parentobj, const char *propname,
 {
     Error *local_err = NULL;
     Object *obj;
+    UserCreatable *uc;
 
     object_initialize(childobj, size, type);
     obj = OBJECT(childobj);
@@ -431,8 +432,9 @@ void object_initialize_childv(Object *parentobj, const char *propname,
         goto out;
     }
 
-    if (object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
-        user_creatable_complete(obj, &local_err);
+    uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
+    if (uc) {
+        user_creatable_complete(uc, &local_err);
         if (local_err) {
             object_unparent(obj);
             goto out;
@@ -590,6 +592,7 @@ Object *object_new_with_propv(const char *typename,
     Object *obj;
     ObjectClass *klass;
     Error *local_err = NULL;
+    UserCreatable *uc;
 
     klass = object_class_by_name(typename);
     if (!klass) {
@@ -612,8 +615,9 @@ Object *object_new_with_propv(const char *typename,
         goto error;
     }
 
-    if (object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
-        user_creatable_complete(obj, &local_err);
+    uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
+    if (uc) {
+        user_creatable_complete(uc, &local_err);
         if (local_err) {
             object_unparent(obj);
             goto error;
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 97b79b48bb..db85d1eb75 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -8,18 +8,10 @@
 #include "qapi/opts-visitor.h"
 #include "qemu/config-file.h"
 
-void user_creatable_complete(Object *obj, Error **errp)
+void user_creatable_complete(UserCreatable *uc, Error **errp)
 {
+    UserCreatableClass *ucc = USER_CREATABLE_GET_CLASS(uc);
 
-    UserCreatableClass *ucc;
-    UserCreatable *uc =
-        (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
-
-    if (!uc) {
-        return;
-    }
-
-    ucc = USER_CREATABLE_GET_CLASS(uc);
     if (ucc->complete) {
         ucc->complete(uc, errp);
     }
@@ -89,7 +81,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
         goto out;
     }
 
-    user_creatable_complete(obj, &local_err);
+    user_creatable_complete(USER_CREATABLE(obj), &local_err);
     if (local_err) {
         object_property_del(object_get_objects_root(),
                             id, &error_abort);
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 12/28] accel: register global_props like machine globals
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (10 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 11/28] qom: make user_creatable_complete() specific to UserCreatable Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 13/28] qdev: move qdev_prop_register_global_list() to tests Marc-André Lureau
                   ` (18 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau

global_props is only used for Xen xen_compat_props. It's a static
array of GlobalProperty, like machine globals in SET_MACHINE_COMPAT().
Let's register the globals the same way, without extra copy allocation.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/qdev-properties.h | 29 -----------------------------
 accel/accel.c                |  9 ++++++++-
 hw/core/qdev-properties.c    | 21 ---------------------
 3 files changed, 8 insertions(+), 51 deletions(-)

diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 4f60cc88f3..a95f4a73eb 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -255,35 +255,6 @@ void qdev_prop_set_globals(DeviceState *dev);
 void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
                                     Property *prop, const char *value);
 
-/**
- * register_compat_prop:
- *
- * Register internal (not user-provided) global property, changing the
- * default value of a given property in a device type.  This can be used
- * for enabling machine-type compatibility or for enabling
- * accelerator-specific defaults in devices.
- *
- * The property values set using this function must be always valid and
- * never report setter errors, as the property will have
- * GlobalProperty::errp set to &error_abort.
- *
- * User-provided global properties should override internal global
- * properties, so callers of this function should ensure that it is
- * called before user-provided global properties are registered.
- *
- * @driver: Device type to be affected
- * @property: Property whose default value is going to be changed
- * @value: New default value for the property
- */
-void register_compat_prop(const char *driver, const char *property,
-                          const char *value);
-/*
- * register_compat_props_array(): using register_compat_prop(), which
- * only registers internal global properties (which has lower priority
- * than user-provided global properties)
- */
-void register_compat_props_array(GlobalProperty *prop);
-
 /**
  * qdev_property_add_static:
  * @dev: Device to add the property to.
diff --git a/accel/accel.c b/accel/accel.c
index 966b2d8f53..3da26eb90f 100644
--- a/accel/accel.c
+++ b/accel/accel.c
@@ -34,6 +34,7 @@
 #include "qom/object.h"
 #include "qemu/error-report.h"
 #include "qemu/option.h"
+#include "qapi/error.h"
 
 static const TypeInfo accel_type = {
     .name = TYPE_ACCEL,
@@ -121,7 +122,13 @@ void configure_accelerator(MachineState *ms)
 void accel_register_compat_props(AccelState *accel)
 {
     AccelClass *class = ACCEL_GET_CLASS(accel);
-    register_compat_props_array(class->global_props);
+    GlobalProperty *prop = class->global_props;
+
+    for (; prop && prop->driver; prop++) {
+        /* Any compat_props must never cause error */
+        prop->errp = &error_abort;
+        qdev_prop_register_global(prop);
+    }
 }
 
 void accel_setup_post(MachineState *ms)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 35072dec1e..ab61d502fd 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1180,27 +1180,6 @@ void qdev_prop_register_global(GlobalProperty *prop)
     global_props = g_list_append(global_props, prop);
 }
 
-void register_compat_prop(const char *driver,
-                          const char *property,
-                          const char *value)
-{
-    GlobalProperty *p = g_new0(GlobalProperty, 1);
-
-    /* Any compat_props must never cause error */
-    p->errp = &error_abort;
-    p->driver = driver;
-    p->property = property;
-    p->value = value;
-    qdev_prop_register_global(p);
-}
-
-void register_compat_props_array(GlobalProperty *prop)
-{
-    for (; prop && prop->driver; prop++) {
-        register_compat_prop(prop->driver, prop->property, prop->value);
-    }
-}
-
 void qdev_prop_register_global_list(GlobalProperty *props)
 {
     int i;
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 13/28] qdev: move qdev_prop_register_global_list() to tests
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (11 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 12/28] accel: register global_props like machine globals Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 14/28] qom: remove unimplemented class_finalize Marc-André Lureau
                   ` (17 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Eduardo Habkost,
	Philippe Mathieu-Daudé

The function is only used by a test, move it there.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 include/hw/qdev-properties.h   |  1 -
 hw/core/qdev-properties.c      |  9 ---------
 tests/test-qdev-global-props.c | 18 ++++++++++++++----
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index a95f4a73eb..3ab9cd2eb6 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -249,7 +249,6 @@ void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);
 void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);
 
 void qdev_prop_register_global(GlobalProperty *prop);
-void qdev_prop_register_global_list(GlobalProperty *props);
 int qdev_prop_check_globals(void);
 void qdev_prop_set_globals(DeviceState *dev);
 void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index ab61d502fd..bd84c4ea4c 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1180,15 +1180,6 @@ void qdev_prop_register_global(GlobalProperty *prop)
     global_props = g_list_append(global_props, prop);
 }
 
-void qdev_prop_register_global_list(GlobalProperty *props)
-{
-    int i;
-
-    for (i = 0; props[i].driver != NULL; i++) {
-        qdev_prop_register_global(props+i);
-    }
-}
-
 int qdev_prop_check_globals(void)
 {
     GList *l;
diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c
index ccdf6c57c1..b1eb505442 100644
--- a/tests/test-qdev-global-props.c
+++ b/tests/test-qdev-global-props.c
@@ -89,6 +89,16 @@ static void test_static_prop(void)
     g_test_trap_assert_stdout("");
 }
 
+static void register_global_properties(GlobalProperty *props)
+{
+    int i;
+
+    for (i = 0; props[i].driver != NULL; i++) {
+        qdev_prop_register_global(props + i);
+    }
+}
+
+
 /* Test setting of static property using global properties */
 static void test_static_globalprop_subprocess(void)
 {
@@ -98,7 +108,7 @@ static void test_static_globalprop_subprocess(void)
         {}
     };
 
-    qdev_prop_register_global_list(props);
+    register_global_properties(props);
 
     mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS));
     qdev_init_nofail(DEVICE(mt));
@@ -216,7 +226,7 @@ static void test_dynamic_globalprop_subprocess(void)
     };
     int global_error;
 
-    qdev_prop_register_global_list(props);
+    register_global_properties(props);
 
     mt = DYNAMIC_TYPE(object_new(TYPE_DYNAMIC_PROPS));
     qdev_init_nofail(DEVICE(mt));
@@ -261,7 +271,7 @@ static void test_dynamic_globalprop_nouser_subprocess(void)
     };
     int global_error;
 
-    qdev_prop_register_global_list(props);
+    register_global_properties(props);
 
     mt = DYNAMIC_TYPE(object_new(TYPE_DYNAMIC_PROPS));
     qdev_init_nofail(DEVICE(mt));
@@ -299,7 +309,7 @@ static void test_subclass_global_props(void)
         {}
     };
 
-    qdev_prop_register_global_list(props);
+    register_global_properties(props);
 
     mt = STATIC_TYPE(object_new(TYPE_SUBCLASS));
     qdev_init_nofail(DEVICE(mt));
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 14/28] qom: remove unimplemented class_finalize
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (12 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 13/28] qdev: move qdev_prop_register_global_list() to tests Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27 12:52   ` Eduardo Habkost
  2018-11-28 17:44   ` Igor Mammedov
  2018-11-27  9:27   ` Marc-André Lureau
                   ` (16 subsequent siblings)
  30 siblings, 2 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Eduardo Habkost,
	Marcel Apfelbaum, Andreas Färber

Instead of trying to implement something that isn't well specified,
remove it. (it would be tricky to implement, since a class struct is
memcpy on children types...)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h |  7 ++-----
 hw/core/machine.c    | 11 -----------
 qom/object.c         |  2 --
 3 files changed, 2 insertions(+), 18 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index f0b0bf39cc..0139838b69 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -455,10 +455,8 @@ struct Object
  *   parent class initialization has occurred, but before the class itself
  *   is initialized.  This is the function to use to undo the effects of
  *   memcpy from the parent class to the descendants.
- * @class_finalize: This function is called during class destruction and is
- *   meant to release and dynamic parameters allocated by @class_init.
- * @class_data: Data to pass to the @class_init, @class_base_init and
- *   @class_finalize functions.  This can be useful when building dynamic
+ * @class_data: Data to pass to the @class_init,
+ *   @class_base_init. This can be useful when building dynamic
  *   classes.
  * @interfaces: The list of interfaces associated with this type.  This
  *   should point to a static array that's terminated with a zero filled
@@ -479,7 +477,6 @@ struct TypeInfo
 
     void (*class_init)(ObjectClass *klass, void *data);
     void (*class_base_init)(ObjectClass *klass, void *data);
-    void (*class_finalize)(ObjectClass *klass, void *data);
     void *class_data;
 
     InterfaceInfo *interfaces;
diff --git a/hw/core/machine.c b/hw/core/machine.c
index da50ad6de7..c51423b647 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -834,16 +834,6 @@ void machine_run_board_init(MachineState *machine)
     machine_class->init(machine);
 }
 
-static void machine_class_finalize(ObjectClass *klass, void *data)
-{
-    MachineClass *mc = MACHINE_CLASS(klass);
-
-    if (mc->compat_props) {
-        g_array_free(mc->compat_props, true);
-    }
-    g_free(mc->name);
-}
-
 void machine_register_compat_props(MachineState *machine)
 {
     MachineClass *mc = MACHINE_GET_CLASS(machine);
@@ -869,7 +859,6 @@ static const TypeInfo machine_info = {
     .class_size = sizeof(MachineClass),
     .class_init    = machine_class_init,
     .class_base_init = machine_class_base_init,
-    .class_finalize = machine_class_finalize,
     .instance_size = sizeof(MachineState),
     .instance_init = machine_initfn,
     .instance_finalize = machine_finalize,
diff --git a/qom/object.c b/qom/object.c
index eb770dbf7f..17921c0a71 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -49,7 +49,6 @@ struct TypeImpl
 
     void (*class_init)(ObjectClass *klass, void *data);
     void (*class_base_init)(ObjectClass *klass, void *data);
-    void (*class_finalize)(ObjectClass *klass, void *data);
 
     void *class_data;
 
@@ -114,7 +113,6 @@ static TypeImpl *type_new(const TypeInfo *info)
 
     ti->class_init = info->class_init;
     ti->class_base_init = info->class_base_init;
-    ti->class_finalize = info->class_finalize;
     ti->class_data = info->class_data;
 
     ti->instance_init = info->instance_init;
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
@ 2018-11-27  9:27   ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 02/28] target/xtensa: drop num_[core_]regs from dc232b/dc233c configs Marc-André Lureau
                     ` (29 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Stefano Stabellini,
	Anthony Perard, Andreas Färber, Paolo Bonzini,
	open list:X86

Introduce object_apply_global_props() function, to apply compatibility
properties from a GPtrArray.

For accel compatibility properties, apply them during
device_post_init(), after accel_register_compat_props() has set them.

To populate the compatibility properties, introduce SET_COMPAT(), a
more generic version of SET_MACHINE_COMPAT() that can set compat
properties on other objects than Machine, and using GPtrArray.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/qdev-core.h | 13 +++++++++++++
 include/qom/object.h   |  3 +++
 include/sysemu/accel.h |  4 +---
 accel/accel.c          | 12 ------------
 hw/core/qdev.c         | 11 +++++++++++
 hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
 qom/object.c           | 25 +++++++++++++++++++++++++
 vl.c                   |  2 +-
 8 files changed, 73 insertions(+), 35 deletions(-)

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index a24d0dd566..82afd3c50d 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -267,6 +267,19 @@ typedef struct GlobalProperty {
     Error **errp;
 } GlobalProperty;
 
+#define SET_COMPAT(S, COMPAT)                                       \
+    do {                                                            \
+        int i;                                                      \
+        static GlobalProperty props[] = {                           \
+            COMPAT                                                  \
+        };                                                          \
+        for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
+            g_ptr_array_add((S)->compat_props, (void *)&props[i]);  \
+        }                                                           \
+    } while (0)
+
+void accel_register_compat_props(const GPtrArray *props);
+
 /*** Board API.  This should go away once we have a machine config file.  ***/
 
 DeviceState *qdev_create(BusState *bus, const char *name);
diff --git a/include/qom/object.h b/include/qom/object.h
index 0139838b69..5183c587f3 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -676,6 +676,9 @@ Object *object_new_with_propv(const char *typename,
                               Error **errp,
                               va_list vargs);
 
+void object_apply_global_props(Object *obj, const GPtrArray *props,
+                               Error **errp);
+
 /**
  * object_set_props:
  * @obj: the object instance to set properties on
diff --git a/include/sysemu/accel.h b/include/sysemu/accel.h
index 637358f430..f331d128e9 100644
--- a/include/sysemu/accel.h
+++ b/include/sysemu/accel.h
@@ -49,7 +49,7 @@ typedef struct AccelClass {
      * global properties may be overridden by machine-type
      * compat_props or user-provided global properties.
      */
-    GlobalProperty *global_props;
+    GPtrArray *compat_props;
 } AccelClass;
 
 #define TYPE_ACCEL "accel"
@@ -67,8 +67,6 @@ typedef struct AccelClass {
 extern unsigned long tcg_tb_size;
 
 void configure_accelerator(MachineState *ms);
-/* Register accelerator specific global properties */
-void accel_register_compat_props(AccelState *accel);
 /* Called just before os_setup_post (ie just before drop OS privs) */
 void accel_setup_post(MachineState *ms);
 
diff --git a/accel/accel.c b/accel/accel.c
index 3da26eb90f..6db5d8f4df 100644
--- a/accel/accel.c
+++ b/accel/accel.c
@@ -119,18 +119,6 @@ void configure_accelerator(MachineState *ms)
     }
 }
 
-void accel_register_compat_props(AccelState *accel)
-{
-    AccelClass *class = ACCEL_GET_CLASS(accel);
-    GlobalProperty *prop = class->global_props;
-
-    for (; prop && prop->driver; prop++) {
-        /* Any compat_props must never cause error */
-        prop->errp = &error_abort;
-        qdev_prop_register_global(prop);
-    }
-}
-
 void accel_setup_post(MachineState *ms)
 {
     AccelState *accel = ms->accelerator;
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 6b3cc55b27..7066d28271 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -970,8 +970,19 @@ static void device_initfn(Object *obj)
     QLIST_INIT(&dev->gpios);
 }
 
+static const GPtrArray *ac_compat_props;
+
+void accel_register_compat_props(const GPtrArray *props)
+{
+    ac_compat_props = props;
+}
+
 static void device_post_init(Object *obj)
 {
+    if (ac_compat_props) {
+        object_apply_global_props(obj, ac_compat_props, &error_abort);
+    }
+
     qdev_prop_set_globals(DEVICE(obj));
 }
 
diff --git a/hw/xen/xen-common.c b/hw/xen/xen-common.c
index 6ec14c73ca..4da0292b61 100644
--- a/hw/xen/xen-common.c
+++ b/hw/xen/xen-common.c
@@ -159,24 +159,22 @@ static int xen_init(MachineState *ms)
     return 0;
 }
 
-static GlobalProperty xen_compat_props[] = {
-    {
-        .driver = "migration",
-        .property = "store-global-state",
-        .value = "off",
-    },
-    {
-        .driver = "migration",
-        .property = "send-configuration",
-        .value = "off",
-    },
-    {
-        .driver = "migration",
-        .property = "send-section-footer",
-        .value = "off",
-    },
-    { /* end of list */ },
-};
+#define XEN_COMPAT                              \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "store-global-state",       \
+        .value = "off",                         \
+    },                                          \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "send-configuration",       \
+        .value = "off",                         \
+    },                                          \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "send-section-footer",      \
+        .value = "off",                         \
+    }
 
 static void xen_accel_class_init(ObjectClass *oc, void *data)
 {
@@ -185,7 +183,9 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
     ac->init_machine = xen_init;
     ac->setup_post = xen_setup_post;
     ac->allowed = &xen_allowed;
-    ac->global_props = xen_compat_props;
+    ac->compat_props = g_ptr_array_new();
+
+    SET_COMPAT(ac, XEN_COMPAT);
 }
 
 #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
diff --git a/qom/object.c b/qom/object.c
index 17921c0a71..dbdab0aead 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
     }
 }
 
+void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
+{
+    Error *err = NULL;
+    int i;
+
+    if (!props) {
+        return;
+    }
+
+    for (i = 0; i < props->len; i++) {
+        GlobalProperty *p = g_ptr_array_index(props, i);
+
+        if (object_dynamic_cast(obj, p->driver) == NULL) {
+            continue;
+        }
+        p->used = true;
+        object_property_parse(obj, p->value, p->property, &err);
+        if (err != NULL) {
+            error_prepend(&err, "can't apply global %s.%s=%s: ",
+                          p->driver, p->property, p->value);
+            error_propagate(errp, err);
+        }
+    }
+}
+
 static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
 {
     Object *obj = data;
diff --git a/vl.c b/vl.c
index fa25d1ae2d..c06e94271c 100644
--- a/vl.c
+++ b/vl.c
@@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
  */
 static void register_global_properties(MachineState *ms)
 {
-    accel_register_compat_props(ms->accelerator);
+    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
     machine_register_compat_props(ms);
     user_register_global_props();
 }
-- 
2.20.0.rc1

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

* [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
@ 2018-11-27  9:27   ` Marc-André Lureau
  0 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stefano Stabellini, open list:X86, Marc-André Lureau,
	Paolo Bonzini, Anthony Perard, imammedo, Andreas Färber

Introduce object_apply_global_props() function, to apply compatibility
properties from a GPtrArray.

For accel compatibility properties, apply them during
device_post_init(), after accel_register_compat_props() has set them.

To populate the compatibility properties, introduce SET_COMPAT(), a
more generic version of SET_MACHINE_COMPAT() that can set compat
properties on other objects than Machine, and using GPtrArray.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/qdev-core.h | 13 +++++++++++++
 include/qom/object.h   |  3 +++
 include/sysemu/accel.h |  4 +---
 accel/accel.c          | 12 ------------
 hw/core/qdev.c         | 11 +++++++++++
 hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
 qom/object.c           | 25 +++++++++++++++++++++++++
 vl.c                   |  2 +-
 8 files changed, 73 insertions(+), 35 deletions(-)

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index a24d0dd566..82afd3c50d 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -267,6 +267,19 @@ typedef struct GlobalProperty {
     Error **errp;
 } GlobalProperty;
 
+#define SET_COMPAT(S, COMPAT)                                       \
+    do {                                                            \
+        int i;                                                      \
+        static GlobalProperty props[] = {                           \
+            COMPAT                                                  \
+        };                                                          \
+        for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
+            g_ptr_array_add((S)->compat_props, (void *)&props[i]);  \
+        }                                                           \
+    } while (0)
+
+void accel_register_compat_props(const GPtrArray *props);
+
 /*** Board API.  This should go away once we have a machine config file.  ***/
 
 DeviceState *qdev_create(BusState *bus, const char *name);
diff --git a/include/qom/object.h b/include/qom/object.h
index 0139838b69..5183c587f3 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -676,6 +676,9 @@ Object *object_new_with_propv(const char *typename,
                               Error **errp,
                               va_list vargs);
 
+void object_apply_global_props(Object *obj, const GPtrArray *props,
+                               Error **errp);
+
 /**
  * object_set_props:
  * @obj: the object instance to set properties on
diff --git a/include/sysemu/accel.h b/include/sysemu/accel.h
index 637358f430..f331d128e9 100644
--- a/include/sysemu/accel.h
+++ b/include/sysemu/accel.h
@@ -49,7 +49,7 @@ typedef struct AccelClass {
      * global properties may be overridden by machine-type
      * compat_props or user-provided global properties.
      */
-    GlobalProperty *global_props;
+    GPtrArray *compat_props;
 } AccelClass;
 
 #define TYPE_ACCEL "accel"
@@ -67,8 +67,6 @@ typedef struct AccelClass {
 extern unsigned long tcg_tb_size;
 
 void configure_accelerator(MachineState *ms);
-/* Register accelerator specific global properties */
-void accel_register_compat_props(AccelState *accel);
 /* Called just before os_setup_post (ie just before drop OS privs) */
 void accel_setup_post(MachineState *ms);
 
diff --git a/accel/accel.c b/accel/accel.c
index 3da26eb90f..6db5d8f4df 100644
--- a/accel/accel.c
+++ b/accel/accel.c
@@ -119,18 +119,6 @@ void configure_accelerator(MachineState *ms)
     }
 }
 
-void accel_register_compat_props(AccelState *accel)
-{
-    AccelClass *class = ACCEL_GET_CLASS(accel);
-    GlobalProperty *prop = class->global_props;
-
-    for (; prop && prop->driver; prop++) {
-        /* Any compat_props must never cause error */
-        prop->errp = &error_abort;
-        qdev_prop_register_global(prop);
-    }
-}
-
 void accel_setup_post(MachineState *ms)
 {
     AccelState *accel = ms->accelerator;
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 6b3cc55b27..7066d28271 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -970,8 +970,19 @@ static void device_initfn(Object *obj)
     QLIST_INIT(&dev->gpios);
 }
 
+static const GPtrArray *ac_compat_props;
+
+void accel_register_compat_props(const GPtrArray *props)
+{
+    ac_compat_props = props;
+}
+
 static void device_post_init(Object *obj)
 {
+    if (ac_compat_props) {
+        object_apply_global_props(obj, ac_compat_props, &error_abort);
+    }
+
     qdev_prop_set_globals(DEVICE(obj));
 }
 
diff --git a/hw/xen/xen-common.c b/hw/xen/xen-common.c
index 6ec14c73ca..4da0292b61 100644
--- a/hw/xen/xen-common.c
+++ b/hw/xen/xen-common.c
@@ -159,24 +159,22 @@ static int xen_init(MachineState *ms)
     return 0;
 }
 
-static GlobalProperty xen_compat_props[] = {
-    {
-        .driver = "migration",
-        .property = "store-global-state",
-        .value = "off",
-    },
-    {
-        .driver = "migration",
-        .property = "send-configuration",
-        .value = "off",
-    },
-    {
-        .driver = "migration",
-        .property = "send-section-footer",
-        .value = "off",
-    },
-    { /* end of list */ },
-};
+#define XEN_COMPAT                              \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "store-global-state",       \
+        .value = "off",                         \
+    },                                          \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "send-configuration",       \
+        .value = "off",                         \
+    },                                          \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "send-section-footer",      \
+        .value = "off",                         \
+    }
 
 static void xen_accel_class_init(ObjectClass *oc, void *data)
 {
@@ -185,7 +183,9 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
     ac->init_machine = xen_init;
     ac->setup_post = xen_setup_post;
     ac->allowed = &xen_allowed;
-    ac->global_props = xen_compat_props;
+    ac->compat_props = g_ptr_array_new();
+
+    SET_COMPAT(ac, XEN_COMPAT);
 }
 
 #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
diff --git a/qom/object.c b/qom/object.c
index 17921c0a71..dbdab0aead 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
     }
 }
 
+void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
+{
+    Error *err = NULL;
+    int i;
+
+    if (!props) {
+        return;
+    }
+
+    for (i = 0; i < props->len; i++) {
+        GlobalProperty *p = g_ptr_array_index(props, i);
+
+        if (object_dynamic_cast(obj, p->driver) == NULL) {
+            continue;
+        }
+        p->used = true;
+        object_property_parse(obj, p->value, p->property, &err);
+        if (err != NULL) {
+            error_prepend(&err, "can't apply global %s.%s=%s: ",
+                          p->driver, p->property, p->value);
+            error_propagate(errp, err);
+        }
+    }
+}
+
 static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
 {
     Object *obj = data;
diff --git a/vl.c b/vl.c
index fa25d1ae2d..c06e94271c 100644
--- a/vl.c
+++ b/vl.c
@@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
  */
 static void register_global_properties(MachineState *ms)
 {
-    accel_register_compat_props(ms->accelerator);
+    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
     machine_register_compat_props(ms);
     user_register_global_props();
 }
-- 
2.20.0.rc1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

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

* [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (14 preceding siblings ...)
  2018-11-27  9:27   ` Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27 12:56   ` Eduardo Habkost
  2018-11-29 16:09   ` Eduardo Habkost
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 17/28] hw: remove SET_MACHINE_COMPAT Marc-André Lureau
                   ` (14 subsequent siblings)
  30 siblings, 2 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Peter Maydell, Eduardo Habkost,
	Marcel Apfelbaum, Paolo Bonzini, Richard Henderson,
	Michael S. Tsirkin, David Gibson, Cornelia Huck,
	David Hildenbrand, Christian Borntraeger, open list:Virt,
	open list:sPAPR, open list:S390

Similarly to accel properties, move compat properties out of globals
registration, and apply the machine compat properties during
device_post_init().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/boards.h        |  3 +-
 include/hw/qdev-core.h     |  1 +
 hw/arm/virt.c              | 16 +++++------
 hw/core/machine.c          | 19 +------------
 hw/core/qdev.c             |  9 ++++++
 hw/i386/pc_piix.c          | 56 +++++++++++++++++++-------------------
 hw/i386/pc_q35.c           | 20 +++++++-------
 hw/ppc/spapr.c             | 26 +++++++++---------
 hw/s390x/s390-virtio-ccw.c | 20 +++++++-------
 vl.c                       |  2 +-
 10 files changed, 82 insertions(+), 90 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index f82f28468b..28c2b0af41 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -69,7 +69,6 @@ int machine_kvm_shadow_mem(MachineState *machine);
 int machine_phandle_start(MachineState *machine);
 bool machine_dump_guest_core(MachineState *machine);
 bool machine_mem_merge(MachineState *machine);
-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,
@@ -191,7 +190,7 @@ struct MachineClass {
     const char *default_machine_opts;
     const char *default_boot_order;
     const char *default_display;
-    GArray *compat_props;
+    GPtrArray *compat_props;
     const char *hw_version;
     ram_addr_t default_ram_size;
     const char *default_cpu_type;
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 82afd3c50d..f6a9503e23 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -279,6 +279,7 @@ typedef struct GlobalProperty {
     } while (0)
 
 void accel_register_compat_props(const GPtrArray *props);
+void machine_register_compat_props(const GPtrArray *props);
 
 /*** Board API.  This should go away once we have a machine config file.  ***/
 
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index a2b8d8f7c2..d106a8a8c7 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1882,7 +1882,7 @@ static void virt_3_0_instance_init(Object *obj)
 static void virt_machine_3_0_options(MachineClass *mc)
 {
     virt_machine_3_1_options(mc);
-    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_3_0);
+    SET_COMPAT(mc, VIRT_COMPAT_3_0);
 }
 DEFINE_VIRT_MACHINE(3, 0)
 
@@ -1899,7 +1899,7 @@ static void virt_machine_2_12_options(MachineClass *mc)
     VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
 
     virt_machine_3_0_options(mc);
-    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_12);
+    SET_COMPAT(mc, VIRT_COMPAT_2_12);
     vmc->no_highmem_ecam = true;
     mc->max_cpus = 255;
 }
@@ -1918,7 +1918,7 @@ static void virt_machine_2_11_options(MachineClass *mc)
     VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
 
     virt_machine_2_12_options(mc);
-    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_11);
+    SET_COMPAT(mc, VIRT_COMPAT_2_11);
     vmc->smbios_old_sys_ver = true;
 }
 DEFINE_VIRT_MACHINE(2, 11)
@@ -1934,7 +1934,7 @@ static void virt_2_10_instance_init(Object *obj)
 static void virt_machine_2_10_options(MachineClass *mc)
 {
     virt_machine_2_11_options(mc);
-    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_10);
+    SET_COMPAT(mc, VIRT_COMPAT_2_10);
     /* before 2.11 we never faulted accesses to bad addresses */
     mc->ignore_memory_transaction_failures = true;
 }
@@ -1951,7 +1951,7 @@ static void virt_2_9_instance_init(Object *obj)
 static void virt_machine_2_9_options(MachineClass *mc)
 {
     virt_machine_2_10_options(mc);
-    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_9);
+    SET_COMPAT(mc, VIRT_COMPAT_2_9);
 }
 DEFINE_VIRT_MACHINE(2, 9)
 
@@ -1968,7 +1968,7 @@ static void virt_machine_2_8_options(MachineClass *mc)
     VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
 
     virt_machine_2_9_options(mc);
-    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_8);
+    SET_COMPAT(mc, VIRT_COMPAT_2_8);
     /* For 2.8 and earlier we falsely claimed in the DT that
      * our timers were edge-triggered, not level-triggered.
      */
@@ -1989,7 +1989,7 @@ static void virt_machine_2_7_options(MachineClass *mc)
     VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
 
     virt_machine_2_8_options(mc);
-    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_7);
+    SET_COMPAT(mc, VIRT_COMPAT_2_7);
     /* ITS was introduced with 2.8 */
     vmc->no_its = true;
     /* Stick with 1K pages for migration compatibility */
@@ -2010,7 +2010,7 @@ static void virt_machine_2_6_options(MachineClass *mc)
     VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
 
     virt_machine_2_7_options(mc);
-    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_6);
+    SET_COMPAT(mc, VIRT_COMPAT_2_6);
     vmc->disallow_affinity_adjustment = true;
     /* Disable PMU for 2.6 as PMU support was first introduced in 2.7 */
     vmc->no_pmu = true;
diff --git a/hw/core/machine.c b/hw/core/machine.c
index c51423b647..6e24924aba 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -647,6 +647,7 @@ static void machine_class_base_init(ObjectClass *oc, void *data)
         assert(g_str_has_suffix(cname, TYPE_MACHINE_SUFFIX));
         mc->name = g_strndup(cname,
                             strlen(cname) - strlen(TYPE_MACHINE_SUFFIX));
+        mc->compat_props = g_ptr_array_new();
     }
 }
 
@@ -834,24 +835,6 @@ void machine_run_board_init(MachineState *machine)
     machine_class->init(machine);
 }
 
-void machine_register_compat_props(MachineState *machine)
-{
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
-    int i;
-    GlobalProperty *p;
-
-    if (!mc->compat_props) {
-        return;
-    }
-
-    for (i = 0; i < mc->compat_props->len; i++) {
-        p = g_array_index(mc->compat_props, GlobalProperty *, i);
-        /* Machine compat_props must never cause errors: */
-        p->errp = &error_abort;
-        qdev_prop_register_global(p);
-    }
-}
-
 static const TypeInfo machine_info = {
     .name = TYPE_MACHINE,
     .parent = TYPE_OBJECT,
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 7066d28271..3b31b2c025 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
 }
 
 static const GPtrArray *ac_compat_props;
+static const GPtrArray *mc_compat_props;
 
 void accel_register_compat_props(const GPtrArray *props)
 {
     ac_compat_props = props;
 }
 
+void machine_register_compat_props(const GPtrArray *props)
+{
+    mc_compat_props = props;
+}
+
 static void device_post_init(Object *obj)
 {
     if (ac_compat_props) {
         object_apply_global_props(obj, ac_compat_props, &error_abort);
     }
+    if (mc_compat_props) {
+        object_apply_global_props(obj, mc_compat_props, &error_abort);
+    }
 
     qdev_prop_set_globals(DEVICE(obj));
 }
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 7092d6d13f..3cc92b8eec 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -443,7 +443,7 @@ static void pc_i440fx_3_0_machine_options(MachineClass *m)
     pc_i440fx_3_1_machine_options(m);
     m->is_default = 0;
     m->alias = NULL;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_3_0);
+    SET_COMPAT(m, PC_COMPAT_3_0);
 }
 
 DEFINE_I440FX_MACHINE(v3_0, "pc-i440fx-3.0", NULL,
@@ -452,7 +452,7 @@ DEFINE_I440FX_MACHINE(v3_0, "pc-i440fx-3.0", NULL,
 static void pc_i440fx_2_12_machine_options(MachineClass *m)
 {
     pc_i440fx_3_0_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_12);
+    SET_COMPAT(m, PC_COMPAT_2_12);
 }
 
 DEFINE_I440FX_MACHINE(v2_12, "pc-i440fx-2.12", NULL,
@@ -461,7 +461,7 @@ DEFINE_I440FX_MACHINE(v2_12, "pc-i440fx-2.12", NULL,
 static void pc_i440fx_2_11_machine_options(MachineClass *m)
 {
     pc_i440fx_2_12_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_11);
+    SET_COMPAT(m, PC_COMPAT_2_11);
 }
 
 DEFINE_I440FX_MACHINE(v2_11, "pc-i440fx-2.11", NULL,
@@ -470,7 +470,7 @@ DEFINE_I440FX_MACHINE(v2_11, "pc-i440fx-2.11", NULL,
 static void pc_i440fx_2_10_machine_options(MachineClass *m)
 {
     pc_i440fx_2_11_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_10);
+    SET_COMPAT(m, PC_COMPAT_2_10);
     m->auto_enable_numa_with_memhp = false;
 }
 
@@ -480,7 +480,7 @@ DEFINE_I440FX_MACHINE(v2_10, "pc-i440fx-2.10", NULL,
 static void pc_i440fx_2_9_machine_options(MachineClass *m)
 {
     pc_i440fx_2_10_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_9);
+    SET_COMPAT(m, PC_COMPAT_2_9);
     m->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
 }
 
@@ -490,7 +490,7 @@ DEFINE_I440FX_MACHINE(v2_9, "pc-i440fx-2.9", NULL,
 static void pc_i440fx_2_8_machine_options(MachineClass *m)
 {
     pc_i440fx_2_9_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_8);
+    SET_COMPAT(m, PC_COMPAT_2_8);
 }
 
 DEFINE_I440FX_MACHINE(v2_8, "pc-i440fx-2.8", NULL,
@@ -500,7 +500,7 @@ DEFINE_I440FX_MACHINE(v2_8, "pc-i440fx-2.8", NULL,
 static void pc_i440fx_2_7_machine_options(MachineClass *m)
 {
     pc_i440fx_2_8_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_7);
+    SET_COMPAT(m, PC_COMPAT_2_7);
 }
 
 DEFINE_I440FX_MACHINE(v2_7, "pc-i440fx-2.7", NULL,
@@ -513,7 +513,7 @@ static void pc_i440fx_2_6_machine_options(MachineClass *m)
     pc_i440fx_2_7_machine_options(m);
     pcmc->legacy_cpu_hotplug = true;
     pcmc->linuxboot_dma_enabled = false;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_6);
+    SET_COMPAT(m, PC_COMPAT_2_6);
 }
 
 DEFINE_I440FX_MACHINE(v2_6, "pc-i440fx-2.6", NULL,
@@ -526,7 +526,7 @@ static void pc_i440fx_2_5_machine_options(MachineClass *m)
     pc_i440fx_2_6_machine_options(m);
     pcmc->save_tsc_khz = false;
     m->legacy_fw_cfg_order = 1;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_5);
+    SET_COMPAT(m, PC_COMPAT_2_5);
 }
 
 DEFINE_I440FX_MACHINE(v2_5, "pc-i440fx-2.5", NULL,
@@ -539,7 +539,7 @@ static void pc_i440fx_2_4_machine_options(MachineClass *m)
     pc_i440fx_2_5_machine_options(m);
     m->hw_version = "2.4.0";
     pcmc->broken_reserved_end = true;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_4);
+    SET_COMPAT(m, PC_COMPAT_2_4);
 }
 
 DEFINE_I440FX_MACHINE(v2_4, "pc-i440fx-2.4", NULL,
@@ -550,7 +550,7 @@ static void pc_i440fx_2_3_machine_options(MachineClass *m)
 {
     pc_i440fx_2_4_machine_options(m);
     m->hw_version = "2.3.0";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_3);
+    SET_COMPAT(m, PC_COMPAT_2_3);
 }
 
 DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3,
@@ -562,7 +562,7 @@ static void pc_i440fx_2_2_machine_options(MachineClass *m)
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_2_3_machine_options(m);
     m->hw_version = "2.2.0";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
+    SET_COMPAT(m, PC_COMPAT_2_2);
     pcmc->rsdp_in_ram = false;
 }
 
@@ -576,7 +576,7 @@ static void pc_i440fx_2_1_machine_options(MachineClass *m)
     pc_i440fx_2_2_machine_options(m);
     m->hw_version = "2.1.0";
     m->default_display = NULL;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
+    SET_COMPAT(m, PC_COMPAT_2_1);
     pcmc->smbios_uuid_encoded = false;
     pcmc->enforce_aligned_dimm = false;
 }
@@ -591,7 +591,7 @@ static void pc_i440fx_2_0_machine_options(MachineClass *m)
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_2_1_machine_options(m);
     m->hw_version = "2.0.0";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
+    SET_COMPAT(m, PC_COMPAT_2_0);
     pcmc->smbios_legacy_mode = true;
     pcmc->has_reserved_memory = false;
     /* This value depends on the actual DSDT and SSDT compiled into
@@ -625,7 +625,7 @@ static void pc_i440fx_1_7_machine_options(MachineClass *m)
     m->hw_version = "1.7.0";
     m->default_machine_opts = NULL;
     m->option_rom_has_mr = true;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
+    SET_COMPAT(m, PC_COMPAT_1_7);
     pcmc->smbios_defaults = false;
     pcmc->gigabyte_align = false;
     pcmc->legacy_acpi_table_size = 6414;
@@ -641,7 +641,7 @@ static void pc_i440fx_1_6_machine_options(MachineClass *m)
     pc_i440fx_1_7_machine_options(m);
     m->hw_version = "1.6.0";
     m->rom_file_has_mr = false;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
+    SET_COMPAT(m, PC_COMPAT_1_6);
     pcmc->has_acpi_build = false;
 }
 
@@ -653,7 +653,7 @@ static void pc_i440fx_1_5_machine_options(MachineClass *m)
 {
     pc_i440fx_1_6_machine_options(m);
     m->hw_version = "1.5.0";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_1_5);
+    SET_COMPAT(m, PC_COMPAT_1_5);
 }
 
 DEFINE_I440FX_MACHINE(v1_5, "pc-i440fx-1.5", pc_compat_1_5,
@@ -665,7 +665,7 @@ static void pc_i440fx_1_4_machine_options(MachineClass *m)
     pc_i440fx_1_5_machine_options(m);
     m->hw_version = "1.4.0";
     m->hot_add_cpu = NULL;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_1_4);
+    SET_COMPAT(m, PC_COMPAT_1_4);
 }
 
 DEFINE_I440FX_MACHINE(v1_4, "pc-i440fx-1.4", pc_compat_1_4,
@@ -697,7 +697,7 @@ static void pc_i440fx_1_3_machine_options(MachineClass *m)
 {
     pc_i440fx_1_4_machine_options(m);
     m->hw_version = "1.3.0";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_1_3);
+    SET_COMPAT(m, PC_COMPAT_1_3);
 }
 
 DEFINE_I440FX_MACHINE(v1_3, "pc-1.3", pc_compat_1_3,
@@ -736,7 +736,7 @@ static void pc_i440fx_1_2_machine_options(MachineClass *m)
 {
     pc_i440fx_1_3_machine_options(m);
     m->hw_version = "1.2.0";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_1_2);
+    SET_COMPAT(m, PC_COMPAT_1_2);
 }
 
 DEFINE_I440FX_MACHINE(v1_2, "pc-1.2", pc_compat_1_2,
@@ -779,7 +779,7 @@ static void pc_i440fx_1_1_machine_options(MachineClass *m)
 {
     pc_i440fx_1_2_machine_options(m);
     m->hw_version = "1.1.0";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_1_1);
+    SET_COMPAT(m, PC_COMPAT_1_1);
 }
 
 DEFINE_I440FX_MACHINE(v1_1, "pc-1.1", pc_compat_1_2,
@@ -810,7 +810,7 @@ static void pc_i440fx_1_0_machine_options(MachineClass *m)
 {
     pc_i440fx_1_1_machine_options(m);
     m->hw_version = "1.0";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_1_0);
+    SET_COMPAT(m, PC_COMPAT_1_0);
 }
 
 DEFINE_I440FX_MACHINE(v1_0, "pc-1.0", pc_compat_1_2,
@@ -824,7 +824,7 @@ static void pc_i440fx_0_15_machine_options(MachineClass *m)
 {
     pc_i440fx_1_0_machine_options(m);
     m->hw_version = "0.15";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_0_15);
+    SET_COMPAT(m, PC_COMPAT_0_15);
 }
 
 DEFINE_I440FX_MACHINE(v0_15, "pc-0.15", pc_compat_1_2,
@@ -863,7 +863,7 @@ static void pc_i440fx_0_14_machine_options(MachineClass *m)
 {
     pc_i440fx_0_15_machine_options(m);
     m->hw_version = "0.14";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_0_14);
+    SET_COMPAT(m, PC_COMPAT_0_14);
 }
 
 DEFINE_I440FX_MACHINE(v0_14, "pc-0.14", pc_compat_1_2,
@@ -899,7 +899,7 @@ static void pc_i440fx_0_13_machine_options(MachineClass *m)
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_0_14_machine_options(m);
     m->hw_version = "0.13";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_0_13);
+    SET_COMPAT(m, PC_COMPAT_0_13);
     pcmc->kvmclock_enabled = false;
 }
 
@@ -935,7 +935,7 @@ static void pc_i440fx_0_12_machine_options(MachineClass *m)
 {
     pc_i440fx_0_13_machine_options(m);
     m->hw_version = "0.12";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_0_12);
+    SET_COMPAT(m, PC_COMPAT_0_12);
 }
 
 DEFINE_I440FX_MACHINE(v0_12, "pc-0.12", pc_compat_0_13,
@@ -967,7 +967,7 @@ static void pc_i440fx_0_11_machine_options(MachineClass *m)
     pc_i440fx_0_12_machine_options(m);
     m->hw_version = "0.11";
     m->deprecation_reason = "use a newer machine type instead";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_0_11);
+    SET_COMPAT(m, PC_COMPAT_0_11);
 }
 
 DEFINE_I440FX_MACHINE(v0_11, "pc-0.11", pc_compat_0_13,
@@ -1002,7 +1002,7 @@ static void pc_i440fx_0_10_machine_options(MachineClass *m)
 {
     pc_i440fx_0_11_machine_options(m);
     m->hw_version = "0.10";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_0_10);
+    SET_COMPAT(m, PC_COMPAT_0_10);
 }
 
 DEFINE_I440FX_MACHINE(v0_10, "pc-0.10", pc_compat_0_13,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 4702bb13c4..19e6ec6675 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -324,7 +324,7 @@ static void pc_q35_3_0_machine_options(MachineClass *m)
 {
     pc_q35_3_1_machine_options(m);
     m->alias = NULL;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_3_0);
+    SET_COMPAT(m, PC_COMPAT_3_0);
 }
 
 DEFINE_Q35_MACHINE(v3_0, "pc-q35-3.0", NULL,
@@ -333,7 +333,7 @@ DEFINE_Q35_MACHINE(v3_0, "pc-q35-3.0", NULL,
 static void pc_q35_2_12_machine_options(MachineClass *m)
 {
     pc_q35_3_0_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_12);
+    SET_COMPAT(m, PC_COMPAT_2_12);
 }
 
 DEFINE_Q35_MACHINE(v2_12, "pc-q35-2.12", NULL,
@@ -345,7 +345,7 @@ static void pc_q35_2_11_machine_options(MachineClass *m)
 
     pc_q35_2_12_machine_options(m);
     pcmc->default_nic_model = "e1000";
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_11);
+    SET_COMPAT(m, PC_COMPAT_2_11);
 }
 
 DEFINE_Q35_MACHINE(v2_11, "pc-q35-2.11", NULL,
@@ -354,7 +354,7 @@ DEFINE_Q35_MACHINE(v2_11, "pc-q35-2.11", NULL,
 static void pc_q35_2_10_machine_options(MachineClass *m)
 {
     pc_q35_2_11_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_10);
+    SET_COMPAT(m, PC_COMPAT_2_10);
     m->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
     m->auto_enable_numa_with_memhp = false;
 }
@@ -365,7 +365,7 @@ DEFINE_Q35_MACHINE(v2_10, "pc-q35-2.10", NULL,
 static void pc_q35_2_9_machine_options(MachineClass *m)
 {
     pc_q35_2_10_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_9);
+    SET_COMPAT(m, PC_COMPAT_2_9);
 }
 
 DEFINE_Q35_MACHINE(v2_9, "pc-q35-2.9", NULL,
@@ -374,7 +374,7 @@ DEFINE_Q35_MACHINE(v2_9, "pc-q35-2.9", NULL,
 static void pc_q35_2_8_machine_options(MachineClass *m)
 {
     pc_q35_2_9_machine_options(m);
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_8);
+    SET_COMPAT(m, PC_COMPAT_2_8);
 }
 
 DEFINE_Q35_MACHINE(v2_8, "pc-q35-2.8", NULL,
@@ -384,7 +384,7 @@ static void pc_q35_2_7_machine_options(MachineClass *m)
 {
     pc_q35_2_8_machine_options(m);
     m->max_cpus = 255;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_7);
+    SET_COMPAT(m, PC_COMPAT_2_7);
 }
 
 DEFINE_Q35_MACHINE(v2_7, "pc-q35-2.7", NULL,
@@ -396,7 +396,7 @@ static void pc_q35_2_6_machine_options(MachineClass *m)
     pc_q35_2_7_machine_options(m);
     pcmc->legacy_cpu_hotplug = true;
     pcmc->linuxboot_dma_enabled = false;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_6);
+    SET_COMPAT(m, PC_COMPAT_2_6);
 }
 
 DEFINE_Q35_MACHINE(v2_6, "pc-q35-2.6", NULL,
@@ -408,7 +408,7 @@ static void pc_q35_2_5_machine_options(MachineClass *m)
     pc_q35_2_6_machine_options(m);
     pcmc->save_tsc_khz = false;
     m->legacy_fw_cfg_order = 1;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_5);
+    SET_COMPAT(m, PC_COMPAT_2_5);
 }
 
 DEFINE_Q35_MACHINE(v2_5, "pc-q35-2.5", NULL,
@@ -420,7 +420,7 @@ static void pc_q35_2_4_machine_options(MachineClass *m)
     pc_q35_2_5_machine_options(m);
     m->hw_version = "2.4.0";
     pcmc->broken_reserved_end = true;
-    SET_MACHINE_COMPAT(m, PC_COMPAT_2_4);
+    SET_COMPAT(m, PC_COMPAT_2_4);
 }
 
 DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL,
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 7afd1a175b..f36554687f 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3986,7 +3986,7 @@ static void spapr_machine_3_0_class_options(MachineClass *mc)
     sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 
     spapr_machine_3_1_class_options(mc);
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_3_0);
+    SET_COMPAT(mc, SPAPR_COMPAT_3_0);
 
     smc->legacy_irq_allocation = true;
     smc->irq = &spapr_irq_xics_legacy;
@@ -4020,7 +4020,7 @@ static void spapr_machine_2_12_class_options(MachineClass *mc)
     sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 
     spapr_machine_3_0_class_options(mc);
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_12);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_12);
 
     /* We depend on kvm_enabled() to choose a default value for the
      * hpt-max-page-size capability. Of course we can't do it here
@@ -4066,7 +4066,7 @@ static void spapr_machine_2_11_class_options(MachineClass *mc)
 
     spapr_machine_2_12_class_options(mc);
     smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_ON;
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_11);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_11);
 }
 
 DEFINE_SPAPR_MACHINE(2_11, "2.11", false);
@@ -4085,7 +4085,7 @@ static void spapr_machine_2_10_instance_options(MachineState *machine)
 static void spapr_machine_2_10_class_options(MachineClass *mc)
 {
     spapr_machine_2_11_class_options(mc);
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_10);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_10);
 }
 
 DEFINE_SPAPR_MACHINE(2_10, "2.10", false);
@@ -4111,7 +4111,7 @@ static void spapr_machine_2_9_class_options(MachineClass *mc)
     sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 
     spapr_machine_2_10_class_options(mc);
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_9);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_9);
     mc->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
     smc->pre_2_10_has_unused_icps = true;
     smc->resize_hpt_default = SPAPR_RESIZE_HPT_DISABLED;
@@ -4138,7 +4138,7 @@ static void spapr_machine_2_8_instance_options(MachineState *machine)
 static void spapr_machine_2_8_class_options(MachineClass *mc)
 {
     spapr_machine_2_9_class_options(mc);
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_8);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_8);
     mc->numa_mem_align_shift = 23;
 }
 
@@ -4233,7 +4233,7 @@ static void spapr_machine_2_7_class_options(MachineClass *mc)
 
     spapr_machine_2_8_class_options(mc);
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power7_v2.3");
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_7);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_7);
     smc->phb_placement = phb_placement_2_7;
 }
 
@@ -4259,7 +4259,7 @@ static void spapr_machine_2_6_class_options(MachineClass *mc)
 {
     spapr_machine_2_7_class_options(mc);
     mc->has_hotpluggable_cpus = false;
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_6);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_6);
 }
 
 DEFINE_SPAPR_MACHINE(2_6, "2.6", false);
@@ -4286,7 +4286,7 @@ static void spapr_machine_2_5_class_options(MachineClass *mc)
 
     spapr_machine_2_6_class_options(mc);
     smc->use_ohci_by_default = true;
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_5);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_5);
 }
 
 DEFINE_SPAPR_MACHINE(2_5, "2.5", false);
@@ -4308,7 +4308,7 @@ static void spapr_machine_2_4_class_options(MachineClass *mc)
 
     spapr_machine_2_5_class_options(mc);
     smc->dr_lmb_enabled = false;
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_4);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_4);
 }
 
 DEFINE_SPAPR_MACHINE(2_4, "2.4", false);
@@ -4332,7 +4332,7 @@ static void spapr_machine_2_3_instance_options(MachineState *machine)
 static void spapr_machine_2_3_class_options(MachineClass *mc)
 {
     spapr_machine_2_4_class_options(mc);
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_3);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_3);
 }
 DEFINE_SPAPR_MACHINE(2_3, "2.3", false);
 
@@ -4357,7 +4357,7 @@ static void spapr_machine_2_2_instance_options(MachineState *machine)
 static void spapr_machine_2_2_class_options(MachineClass *mc)
 {
     spapr_machine_2_3_class_options(mc);
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_2);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_2);
 }
 DEFINE_SPAPR_MACHINE(2_2, "2.2", false);
 
@@ -4375,7 +4375,7 @@ static void spapr_machine_2_1_instance_options(MachineState *machine)
 static void spapr_machine_2_1_class_options(MachineClass *mc)
 {
     spapr_machine_2_2_class_options(mc);
-    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_1);
+    SET_COMPAT(mc, SPAPR_COMPAT_2_1);
 }
 DEFINE_SPAPR_MACHINE(2_1, "2.1", false);
 
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index a0615a8b35..41b72356e9 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -762,7 +762,7 @@ static void ccw_machine_3_0_class_options(MachineClass *mc)
 
     s390mc->hpage_1m_allowed = false;
     ccw_machine_3_1_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_3_0);
+    SET_COMPAT(mc, CCW_COMPAT_3_0);
 }
 DEFINE_CCW_MACHINE(3_0, "3.0", false);
 
@@ -776,7 +776,7 @@ static void ccw_machine_2_12_instance_options(MachineState *machine)
 static void ccw_machine_2_12_class_options(MachineClass *mc)
 {
     ccw_machine_3_0_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_12);
+    SET_COMPAT(mc, CCW_COMPAT_2_12);
 }
 DEFINE_CCW_MACHINE(2_12, "2.12", false);
 
@@ -792,7 +792,7 @@ static void ccw_machine_2_11_instance_options(MachineState *machine)
 static void ccw_machine_2_11_class_options(MachineClass *mc)
 {
     ccw_machine_2_12_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_11);
+    SET_COMPAT(mc, CCW_COMPAT_2_11);
 }
 DEFINE_CCW_MACHINE(2_11, "2.11", false);
 
@@ -804,7 +804,7 @@ static void ccw_machine_2_10_instance_options(MachineState *machine)
 static void ccw_machine_2_10_class_options(MachineClass *mc)
 {
     ccw_machine_2_11_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_10);
+    SET_COMPAT(mc, CCW_COMPAT_2_10);
 }
 DEFINE_CCW_MACHINE(2_10, "2.10", false);
 
@@ -823,7 +823,7 @@ static void ccw_machine_2_9_class_options(MachineClass *mc)
     S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
 
     ccw_machine_2_10_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_9);
+    SET_COMPAT(mc, CCW_COMPAT_2_9);
     s390mc->css_migration_enabled = false;
 }
 DEFINE_CCW_MACHINE(2_9, "2.9", false);
@@ -836,7 +836,7 @@ static void ccw_machine_2_8_instance_options(MachineState *machine)
 static void ccw_machine_2_8_class_options(MachineClass *mc)
 {
     ccw_machine_2_9_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_8);
+    SET_COMPAT(mc, CCW_COMPAT_2_8);
 }
 DEFINE_CCW_MACHINE(2_8, "2.8", false);
 
@@ -851,7 +851,7 @@ static void ccw_machine_2_7_class_options(MachineClass *mc)
 
     s390mc->cpu_model_allowed = false;
     ccw_machine_2_8_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_7);
+    SET_COMPAT(mc, CCW_COMPAT_2_7);
 }
 DEFINE_CCW_MACHINE(2_7, "2.7", false);
 
@@ -866,7 +866,7 @@ static void ccw_machine_2_6_class_options(MachineClass *mc)
 
     s390mc->ri_allowed = false;
     ccw_machine_2_7_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_6);
+    SET_COMPAT(mc, CCW_COMPAT_2_6);
 }
 DEFINE_CCW_MACHINE(2_6, "2.6", false);
 
@@ -878,7 +878,7 @@ static void ccw_machine_2_5_instance_options(MachineState *machine)
 static void ccw_machine_2_5_class_options(MachineClass *mc)
 {
     ccw_machine_2_6_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_5);
+    SET_COMPAT(mc, CCW_COMPAT_2_5);
 }
 DEFINE_CCW_MACHINE(2_5, "2.5", false);
 
@@ -890,7 +890,7 @@ static void ccw_machine_2_4_instance_options(MachineState *machine)
 static void ccw_machine_2_4_class_options(MachineClass *mc)
 {
     ccw_machine_2_5_class_options(mc);
-    SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_4);
+    SET_COMPAT(mc, CCW_COMPAT_2_4);
 }
 DEFINE_CCW_MACHINE(2_4, "2.4", false);
 
diff --git a/vl.c b/vl.c
index c06e94271c..943e9b6a69 100644
--- a/vl.c
+++ b/vl.c
@@ -2964,7 +2964,7 @@ static void user_register_global_props(void)
 static void register_global_properties(MachineState *ms)
 {
     accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
-    machine_register_compat_props(ms);
+    machine_register_compat_props(MACHINE_GET_CLASS(ms)->compat_props);
     user_register_global_props();
 }
 
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 17/28] hw: remove SET_MACHINE_COMPAT
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (15 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine " Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 18/28] qdev: all globals are now user-provided Marc-André Lureau
                   ` (13 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Eduardo Habkost, Marcel Apfelbaum

Now replaced with more generic SET_COMPAT().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/boards.h | 16 ----------------
 1 file changed, 16 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 28c2b0af41..f743d9d4a4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -287,20 +287,4 @@ struct MachineState {
     } \
     type_init(machine_initfn##_register_types)
 
-#define SET_MACHINE_COMPAT(m, COMPAT) \
-    do {                              \
-        int i;                        \
-        static GlobalProperty props[] = {       \
-            COMPAT                              \
-            { /* end of list */ }               \
-        };                                      \
-        if (!m->compat_props) { \
-            m->compat_props = g_array_new(false, false, sizeof(void *)); \
-        } \
-        for (i = 0; props[i].driver != NULL; i++) {    \
-            GlobalProperty *prop = &props[i];          \
-            g_array_append_val(m->compat_props, prop); \
-        }                                              \
-    } while (0)
-
 #endif
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 18/28] qdev: all globals are now user-provided
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (16 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 17/28] hw: remove SET_MACHINE_COMPAT Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 19/28] qdev-props: convert global_props to GPtrArray Marc-André Lureau
                   ` (12 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau, Paolo Bonzini

All globals are now either provided via -global or through -cpu
features (CPU features are implemented by registering globals).

If the global isn't being used, it should warn in either case.

We can thus consider that all global_props are "user-provided"
globals. No need to track this per-globals anymore.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/qdev-core.h         |  3 --
 hw/core/qdev-properties.c      |  4 ---
 tests/test-qdev-global-props.c | 57 ++++------------------------------
 vl.c                           |  1 -
 4 files changed, 6 insertions(+), 59 deletions(-)

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index f6a9503e23..7a53213297 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -249,8 +249,6 @@ struct PropertyInfo {
 
 /**
  * GlobalProperty:
- * @user_provided: Set to true if property comes from user-provided config
- * (command-line or config file).
  * @used: Set to true if property was used when initializing a device.
  * @errp: Error destination, used like first argument of error_setg()
  *        in case property setting fails later. If @errp is NULL, we
@@ -262,7 +260,6 @@ typedef struct GlobalProperty {
     const char *driver;
     const char *property;
     const char *value;
-    bool user_provided;
     bool used;
     Error **errp;
 } GlobalProperty;
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index bd84c4ea4c..43c30a57f4 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1192,9 +1192,6 @@ int qdev_prop_check_globals(void)
         if (prop->used) {
             continue;
         }
-        if (!prop->user_provided) {
-            continue;
-        }
         oc = object_class_by_name(prop->driver);
         oc = object_class_dynamic_cast(oc, TYPE_DEVICE);
         if (!oc) {
@@ -1233,7 +1230,6 @@ void qdev_prop_set_globals(DeviceState *dev)
             if (!dev->hotplugged && prop->errp) {
                 error_propagate(prop->errp, err);
             } else {
-                assert(prop->user_provided);
                 warn_report_err(err);
             }
         }
diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c
index b1eb505442..60231b1372 100644
--- a/tests/test-qdev-global-props.c
+++ b/tests/test-qdev-global-props.c
@@ -216,12 +216,12 @@ static void test_dynamic_globalprop_subprocess(void)
 {
     MyType *mt;
     static GlobalProperty props[] = {
-        { TYPE_DYNAMIC_PROPS, "prop1", "101", true },
-        { TYPE_DYNAMIC_PROPS, "prop2", "102", true },
-        { TYPE_DYNAMIC_PROPS"-bad", "prop3", "103", true },
-        { TYPE_UNUSED_HOTPLUG, "prop4", "104", true },
-        { TYPE_UNUSED_NOHOTPLUG, "prop5", "105", true },
-        { TYPE_NONDEVICE, "prop6", "106", true },
+        { TYPE_DYNAMIC_PROPS, "prop1", "101", },
+        { TYPE_DYNAMIC_PROPS, "prop2", "102", },
+        { TYPE_DYNAMIC_PROPS"-bad", "prop3", "103", },
+        { TYPE_UNUSED_HOTPLUG, "prop4", "104", },
+        { TYPE_UNUSED_NOHOTPLUG, "prop5", "105", },
+        { TYPE_NONDEVICE, "prop6", "106", },
         {}
     };
     int global_error;
@@ -256,46 +256,6 @@ static void test_dynamic_globalprop(void)
     g_test_trap_assert_stdout("");
 }
 
-/* Test setting of dynamic properties using user_provided=false properties */
-static void test_dynamic_globalprop_nouser_subprocess(void)
-{
-    MyType *mt;
-    static GlobalProperty props[] = {
-        { TYPE_DYNAMIC_PROPS, "prop1", "101" },
-        { TYPE_DYNAMIC_PROPS, "prop2", "102" },
-        { TYPE_DYNAMIC_PROPS"-bad", "prop3", "103" },
-        { TYPE_UNUSED_HOTPLUG, "prop4", "104" },
-        { TYPE_UNUSED_NOHOTPLUG, "prop5", "105" },
-        { TYPE_NONDEVICE, "prop6", "106" },
-        {}
-    };
-    int global_error;
-
-    register_global_properties(props);
-
-    mt = DYNAMIC_TYPE(object_new(TYPE_DYNAMIC_PROPS));
-    qdev_init_nofail(DEVICE(mt));
-
-    g_assert_cmpuint(mt->prop1, ==, 101);
-    g_assert_cmpuint(mt->prop2, ==, 102);
-    global_error = qdev_prop_check_globals();
-    g_assert_cmpuint(global_error, ==, 0);
-    g_assert(props[0].used);
-    g_assert(props[1].used);
-    g_assert(!props[2].used);
-    g_assert(!props[3].used);
-    g_assert(!props[4].used);
-    g_assert(!props[5].used);
-}
-
-static void test_dynamic_globalprop_nouser(void)
-{
-    g_test_trap_subprocess("/qdev/properties/dynamic/global/nouser/subprocess", 0, 0);
-    g_test_trap_assert_passed();
-    g_test_trap_assert_stderr("");
-    g_test_trap_assert_stdout("");
-}
-
 /* Test if global props affecting subclasses are applied in the right order */
 static void test_subclass_global_props(void)
 {
@@ -345,11 +305,6 @@ int main(int argc, char **argv)
     g_test_add_func("/qdev/properties/dynamic/global",
                     test_dynamic_globalprop);
 
-    g_test_add_func("/qdev/properties/dynamic/global/nouser/subprocess",
-                    test_dynamic_globalprop_nouser_subprocess);
-    g_test_add_func("/qdev/properties/dynamic/global/nouser",
-                    test_dynamic_globalprop_nouser);
-
     g_test_add_func("/qdev/properties/global/subclass",
                     test_subclass_global_props);
 
diff --git a/vl.c b/vl.c
index 943e9b6a69..6414259b48 100644
--- a/vl.c
+++ b/vl.c
@@ -2931,7 +2931,6 @@ static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
     g->driver   = qemu_opt_get(opts, "driver");
     g->property = qemu_opt_get(opts, "property");
     g->value    = qemu_opt_get(opts, "value");
-    g->user_provided = true;
     g->errp = &error_fatal;
     qdev_prop_register_global(g);
     return 0;
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 19/28] qdev-props: convert global_props to GPtrArray
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (17 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 18/28] qdev: all globals are now user-provided Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 20/28] qdev-props: remove errp from GlobalProperty Marc-André Lureau
                   ` (11 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau

A step towards being able to call object_apply_global_props().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/core/qdev-properties.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 43c30a57f4..3467e0485c 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1173,22 +1173,32 @@ void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
     *ptr = value;
 }
 
-static GList *global_props;
+static GPtrArray *global_props(void)
+{
+    static GPtrArray *gp;
+
+    if (!gp) {
+        gp = g_ptr_array_new();
+    }
+
+    return gp;
+}
 
 void qdev_prop_register_global(GlobalProperty *prop)
 {
-    global_props = g_list_append(global_props, prop);
+    g_ptr_array_add(global_props(), prop);
 }
 
 int qdev_prop_check_globals(void)
 {
-    GList *l;
-    int ret = 0;
+    int i, ret = 0;
 
-    for (l = global_props; l; l = l->next) {
-        GlobalProperty *prop = l->data;
+    for (i = 0; i < global_props()->len; i++) {
+        GlobalProperty *prop;
         ObjectClass *oc;
         DeviceClass *dc;
+
+        prop = g_ptr_array_index(global_props(), i);
         if (prop->used) {
             continue;
         }
@@ -1213,12 +1223,13 @@ int qdev_prop_check_globals(void)
 
 void qdev_prop_set_globals(DeviceState *dev)
 {
-    GList *l;
+    int i;
 
-    for (l = global_props; l; l = l->next) {
-        GlobalProperty *prop = l->data;
+    for (i = 0; i < global_props()->len; i++) {
+        GlobalProperty *prop;
         Error *err = NULL;
 
+        prop = g_ptr_array_index(global_props(), i);
         if (object_dynamic_cast(OBJECT(dev), prop->driver) == NULL) {
             continue;
         }
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 20/28] qdev-props: remove errp from GlobalProperty
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (18 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 19/28] qdev-props: convert global_props to GPtrArray Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 21/28] qdev-props: call object_apply_global_props() Marc-André Lureau
                   ` (10 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Mark Cave-Ayland,
	Artyom Tarasenko

All qdev_prop_register_global() set &error_fatal for errp, except
'-rtc driftfix=slew', which arguably should also use &error_fatal, as
otherwise failing to apply the property would only report a warning.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/qdev-core.h    | 6 ------
 hw/core/qdev-properties.c | 4 ++--
 qom/cpu.c                 | 1 -
 target/i386/cpu.c         | 1 -
 target/sparc/cpu.c        | 1 -
 vl.c                      | 1 -
 6 files changed, 2 insertions(+), 12 deletions(-)

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 7a53213297..eaaf20fc40 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -250,18 +250,12 @@ struct PropertyInfo {
 /**
  * GlobalProperty:
  * @used: Set to true if property was used when initializing a device.
- * @errp: Error destination, used like first argument of error_setg()
- *        in case property setting fails later. If @errp is NULL, we
- *        print warnings instead of ignoring errors silently. For
- *        hotplugged devices, errp is always ignored and warnings are
- *        printed instead.
  */
 typedef struct GlobalProperty {
     const char *driver;
     const char *property;
     const char *value;
     bool used;
-    Error **errp;
 } GlobalProperty;
 
 #define SET_COMPAT(S, COMPAT)                                       \
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 3467e0485c..a2d25d3d37 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1238,8 +1238,8 @@ void qdev_prop_set_globals(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) {
-                error_propagate(prop->errp, err);
+            if (!dev->hotplugged) {
+                error_propagate(&error_fatal, err);
             } else {
                 warn_report_err(err);
             }
diff --git a/qom/cpu.c b/qom/cpu.c
index 9ad1372d57..5442a7323b 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -312,7 +312,6 @@ static void cpu_common_parse_features(const char *typename, char *features,
             prop->driver = typename;
             prop->property = g_strdup(featurestr);
             prop->value = g_strdup(val);
-            prop->errp = &error_fatal;
             qdev_prop_register_global(prop);
         } else {
             error_setg(errp, "Expected key=value format, found %s.",
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index f81d35e1f9..c687a9b694 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -3568,7 +3568,6 @@ static void x86_cpu_parse_featurestr(const char *typename, char *features,
         prop->driver = typename;
         prop->property = g_strdup(name);
         prop->value = g_strdup(val);
-        prop->errp = &error_fatal;
         qdev_prop_register_global(prop);
     }
 
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index 0f090ece54..4a4445bdf5 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -111,7 +111,6 @@ cpu_add_feat_as_prop(const char *typename, const char *name, const char *val)
     prop->driver = typename;
     prop->property = g_strdup(name);
     prop->value = g_strdup(val);
-    prop->errp = &error_fatal;
     qdev_prop_register_global(prop);
 }
 
diff --git a/vl.c b/vl.c
index 6414259b48..fad335106c 100644
--- a/vl.c
+++ b/vl.c
@@ -2931,7 +2931,6 @@ static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
     g->driver   = qemu_opt_get(opts, "driver");
     g->property = qemu_opt_get(opts, "property");
     g->value    = qemu_opt_get(opts, "value");
-    g->errp = &error_fatal;
     qdev_prop_register_global(g);
     return 0;
 }
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 21/28] qdev-props: call object_apply_global_props()
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (19 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 20/28] qdev-props: remove errp from GlobalProperty Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 22/28] qom: teach interfaces to implement post-init Marc-André Lureau
                   ` (9 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau, Andreas Färber

It's now possible to use the common function.

Teach object_apply_global_props() to warn if Error argument is NULL.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/core/qdev-properties.c | 24 ++----------------------
 qom/object.c              | 12 +++++++++++-
 2 files changed, 13 insertions(+), 23 deletions(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index a2d25d3d37..6061090dc2 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1223,28 +1223,8 @@ int qdev_prop_check_globals(void)
 
 void qdev_prop_set_globals(DeviceState *dev)
 {
-    int i;
-
-    for (i = 0; i < global_props()->len; i++) {
-        GlobalProperty *prop;
-        Error *err = NULL;
-
-        prop = g_ptr_array_index(global_props(), i);
-        if (object_dynamic_cast(OBJECT(dev), prop->driver) == NULL) {
-            continue;
-        }
-        prop->used = true;
-        object_property_parse(OBJECT(dev), prop->value, prop->property, &err);
-        if (err != NULL) {
-            error_prepend(&err, "can't apply global %s.%s=%s: ",
-                          prop->driver, prop->property, prop->value);
-            if (!dev->hotplugged) {
-                error_propagate(&error_fatal, err);
-            } else {
-                warn_report_err(err);
-            }
-        }
-    }
+    object_apply_global_props(OBJECT(dev), global_props(),
+                              dev->hotplugged ? NULL : &error_fatal);
 }
 
 /* --- 64bit unsigned int 'size' type --- */
diff --git a/qom/object.c b/qom/object.c
index dbdab0aead..aa6f3a2a71 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -390,7 +390,17 @@ void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp
         if (err != NULL) {
             error_prepend(&err, "can't apply global %s.%s=%s: ",
                           p->driver, p->property, p->value);
-            error_propagate(errp, err);
+            /*
+             * If errp != NULL, propagate error and return.
+             * If errp == NULL, report a warning, but keep going
+             * with the remaining globals.
+             */
+            if (errp) {
+                error_propagate(errp, err);
+                return;
+            } else {
+                warn_report_err(err);
+            }
         }
     }
 }
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 22/28] qom: teach interfaces to implement post-init
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (20 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 21/28] qdev-props: call object_apply_global_props() Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 23/28] qom: add object_class_get_class_data() Marc-André Lureau
                   ` (8 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau, Andreas Färber

The following patches are going to implement post_init callbacks for
settings properties. The interface post_init are called before the
instance post_init, so the default interface behaviour can be
overriden if necessary.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 qom/object.c                |  8 +++++++-
 tests/check-qom-interface.c | 23 +++++++++++++++++++++--
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index aa6f3a2a71..8fa59026c5 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -288,7 +288,6 @@ static void type_initialize(TypeImpl *ti)
         assert(ti->instance_size == 0);
         assert(ti->abstract);
         assert(!ti->instance_init);
-        assert(!ti->instance_post_init);
         assert(!ti->instance_finalize);
         assert(!ti->num_interfaces);
     }
@@ -361,6 +360,13 @@ static void object_init_with_type(Object *obj, TypeImpl *ti)
 
 static void object_post_init_with_type(Object *obj, TypeImpl *ti)
 {
+    GSList *e;
+
+    for (e = ti->class->interfaces; e; e = e->next) {
+        TypeImpl *itype = OBJECT_CLASS(e->data)->type;
+        object_post_init_with_type(obj, itype);
+    }
+
     if (ti->instance_post_init) {
         ti->instance_post_init(obj);
     }
diff --git a/tests/check-qom-interface.c b/tests/check-qom-interface.c
index 2177f0dce5..cd2dd6dcee 100644
--- a/tests/check-qom-interface.c
+++ b/tests/check-qom-interface.c
@@ -31,9 +31,27 @@ typedef struct TestIfClass {
     uint32_t test;
 } TestIfClass;
 
+typedef struct DirectImpl {
+    Object parent_obj;
+
+    bool if_post_init;
+} DirectImpl;
+
+#define TYPE_DIRECT_IMPL "direct-impl"
+#define DIRECT_IMPL(obj) \
+    OBJECT_CHECK(DirectImpl, (obj), TYPE_DIRECT_IMPL)
+
+static void test_if_post_init(Object *obj)
+{
+    DirectImpl *d = DIRECT_IMPL(obj);
+
+    d->if_post_init = true;
+}
+
 static const TypeInfo test_if_info = {
     .name          = TYPE_TEST_IF,
     .parent        = TYPE_INTERFACE,
+    .instance_post_init = test_if_post_init,
     .class_size = sizeof(TestIfClass),
 };
 
@@ -47,11 +65,10 @@ static void test_class_init(ObjectClass *oc, void *data)
     tc->test = PATTERN;
 }
 
-#define TYPE_DIRECT_IMPL "direct-impl"
-
 static const TypeInfo direct_impl_info = {
     .name = TYPE_DIRECT_IMPL,
     .parent = TYPE_OBJECT,
+    .instance_size = sizeof(DirectImpl),
     .class_init = test_class_init,
     .interfaces = (InterfaceInfo[]) {
         { TYPE_TEST_IF },
@@ -70,10 +87,12 @@ static void test_interface_impl(const char *type)
 {
     Object *obj = object_new(type);
     TestIf *iobj = TEST_IF(obj);
+    DirectImpl *d = DIRECT_IMPL(obj);
     TestIfClass *ioc = TEST_IF_GET_CLASS(iobj);
 
     g_assert(iobj);
     g_assert(ioc->test == PATTERN);
+    g_assert(d->if_post_init == true);
     object_unref(obj);
 }
 
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 23/28] qom: add object_class_get_class_data()
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (21 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 22/28] qom: teach interfaces to implement post-init Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 24/28] arm: replace instance_post_init() Marc-André Lureau
                   ` (7 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau, Andreas Färber

Add a simple function to retrieve the associated class data.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qom/object.h | 9 +++++++++
 qom/object.c         | 5 +++++
 2 files changed, 14 insertions(+)

diff --git a/include/qom/object.h b/include/qom/object.h
index 5183c587f3..d5266405da 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -916,6 +916,15 @@ ObjectClass *object_class_dynamic_cast(ObjectClass *klass,
  */
 ObjectClass *object_class_get_parent(ObjectClass *klass);
 
+
+/**
+ * object_class_get_class_data:
+ * @klass: The class to obtain associated data.
+ *
+ * Returns: the class_data given when registering the type.
+ */
+void *object_class_get_class_data(ObjectClass *klass);
+
 /**
  * object_class_get_name:
  * @klass: The class to obtain the QOM typename for.
diff --git a/qom/object.c b/qom/object.c
index 8fa59026c5..036ff6da00 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -873,6 +873,11 @@ const char *object_class_get_name(ObjectClass *klass)
     return klass->type->name;
 }
 
+void *object_class_get_class_data(ObjectClass *klass)
+{
+    return klass->type->class_data;
+}
+
 ObjectClass *object_class_by_name(const char *typename)
 {
     TypeImpl *type = type_get_by_name(typename);
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 24/28] arm: replace instance_post_init()
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (22 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 23/28] qom: add object_class_get_class_data() Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-30 11:48   ` Igor Mammedov
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface Marc-André Lureau
                   ` (6 subsequent siblings)
  30 siblings, 1 reply; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau, Peter Maydell, open list:ARM

Replace arm_cpu_post_init() instance callback by calling it from leaf
classes, to avoid potential the ordering issue with interfaces
post-init.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Suggested-by: Igor Mammedov <imammedo@redhat.com>
---
 target/arm/cpu.h   |  2 ++
 target/arm/cpu.c   | 15 ++++++++++++---
 target/arm/cpu64.c | 11 ++++++++++-
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 2a73fed9a0..84fba2b24b 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -884,6 +884,8 @@ static inline ARMCPU *arm_env_get_cpu(CPUARMState *env)
     return container_of(env, ARMCPU, env);
 }
 
+void arm_cpu_post_init(Object *obj);
+
 uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz);
 
 #define ENV_GET_CPU(e) CPU(arm_env_get_cpu(e))
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 60411f6bfe..8a4aae7438 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -734,7 +734,7 @@ static Property arm_cpu_pmsav7_dregion_property =
 static Property arm_cpu_initsvtor_property =
             DEFINE_PROP_UINT32("init-svtor", ARMCPU, init_svtor, 0);
 
-static void arm_cpu_post_init(Object *obj)
+void arm_cpu_post_init(Object *obj)
 {
     ARMCPU *cpu = ARM_CPU(obj);
 
@@ -2094,6 +2094,7 @@ static void arm_host_initfn(Object *obj)
     ARMCPU *cpu = ARM_CPU(obj);
 
     kvm_arm_set_cpu_features_from_host(cpu);
+    arm_cpu_post_init(ARM_CPU(obj));
 }
 
 static const TypeInfo host_arm_cpu_type_info = {
@@ -2108,14 +2109,23 @@ static const TypeInfo host_arm_cpu_type_info = {
 
 #endif
 
+static void arm_cpu_instance_init(Object *obj)
+{
+    const ARMCPUInfo *info = object_class_get_class_data(object_get_class(obj));
+
+    info->initfn(obj);
+    arm_cpu_post_init(obj);
+}
+
 static void cpu_register(const ARMCPUInfo *info)
 {
     TypeInfo type_info = {
         .parent = TYPE_ARM_CPU,
         .instance_size = sizeof(ARMCPU),
-        .instance_init = info->initfn,
+        .instance_init = arm_cpu_instance_init,
         .class_size = sizeof(ARMCPUClass),
         .class_init = info->class_init,
+        .class_data = (void *)info,
     };
 
     type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name);
@@ -2128,7 +2138,6 @@ static const TypeInfo arm_cpu_type_info = {
     .parent = TYPE_CPU,
     .instance_size = sizeof(ARMCPU),
     .instance_init = arm_cpu_initfn,
-    .instance_post_init = arm_cpu_post_init,
     .instance_finalize = arm_cpu_finalizefn,
     .abstract = true,
     .class_size = sizeof(ARMCPUClass),
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 873f059bf2..dbfc3ee490 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -447,14 +447,23 @@ static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
     cc->gdb_arch_name = aarch64_gdb_arch_name;
 }
 
+static void aarch64_cpu_instance_init(Object *obj)
+{
+    const ARMCPUInfo *info = object_class_get_class_data(object_get_class(obj));
+
+    info->initfn(obj);
+    arm_cpu_post_init(obj);
+}
+
 static void aarch64_cpu_register(const ARMCPUInfo *info)
 {
     TypeInfo type_info = {
         .parent = TYPE_AARCH64_CPU,
         .instance_size = sizeof(ARMCPU),
-        .instance_init = info->initfn,
+        .instance_init = aarch64_cpu_instance_init,
         .class_size = sizeof(ARMCPUClass),
         .class_init = info->class_init,
+        .class_data = (void *)info,
     };
 
     type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name);
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (23 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 24/28] arm: replace instance_post_init() Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-29 17:49   ` Eduardo Habkost
  2018-11-30 12:39   ` Igor Mammedov
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 26/28] hw/i386: add pc-i440fx-3.2 & pc-q35-3.2 Marc-André Lureau
                   ` (5 subsequent siblings)
  30 siblings, 2 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Eduardo Habkost, Marcel Apfelbaum

Let's make compatiblity properties an interface, so that objects other
than QDev can benefit from having machine compatiblity properties.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/boards.h    |  2 ++
 hw/core/compat-props.c | 55 ++++++++++++++++++++++++++++++++++++++++++
 hw/core/qdev.c         | 24 +++---------------
 MAINTAINERS            |  1 +
 hw/core/Makefile.objs  |  1 +
 tests/Makefile.include |  1 +
 6 files changed, 64 insertions(+), 20 deletions(-)
 create mode 100644 hw/core/compat-props.c

diff --git a/include/hw/boards.h b/include/hw/boards.h
index f743d9d4a4..77d1fc1bef 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -9,6 +9,8 @@
 #include "qom/object.h"
 #include "qom/cpu.h"
 
+#define TYPE_COMPAT_PROPS "compat-props"
+
 /**
  * memory_region_allocate_system_memory - Allocate a board's main memory
  * @mr: the #MemoryRegion to be initialized
diff --git a/hw/core/compat-props.c b/hw/core/compat-props.c
new file mode 100644
index 0000000000..538378e71f
--- /dev/null
+++ b/hw/core/compat-props.c
@@ -0,0 +1,55 @@
+/*
+ * QEMU Machine compat properties
+ *
+ * Copyright (C) 2018 Red Hat Inc
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "hw/boards.h"
+#include "qapi/error.h"
+
+typedef struct CompatProps CompatProps;
+
+typedef struct CompatPropsClass {
+    InterfaceClass parent_class;
+} CompatPropsClass;
+
+static const GPtrArray *ac_compat_props;
+static const GPtrArray *mc_compat_props;
+
+void accel_register_compat_props(const GPtrArray *props)
+{
+    ac_compat_props = props;
+}
+
+void machine_register_compat_props(const GPtrArray *props)
+{
+    mc_compat_props = props;
+}
+
+static void compat_props_post_init(Object *obj)
+{
+    if (ac_compat_props) {
+        object_apply_global_props(obj, ac_compat_props, &error_abort);
+    }
+    if (mc_compat_props) {
+        object_apply_global_props(obj, mc_compat_props, &error_abort);
+    }
+}
+
+static void compat_props_register_types(void)
+{
+    static const TypeInfo cp_interface_info = {
+        .name          = TYPE_COMPAT_PROPS,
+        .parent        = TYPE_INTERFACE,
+        .class_size = sizeof(CompatPropsClass),
+        .instance_post_init = compat_props_post_init,
+    };
+
+    type_register_static(&cp_interface_info);
+}
+
+type_init(compat_props_register_types)
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 3b31b2c025..b0ee05f837 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -970,28 +970,8 @@ static void device_initfn(Object *obj)
     QLIST_INIT(&dev->gpios);
 }
 
-static const GPtrArray *ac_compat_props;
-static const GPtrArray *mc_compat_props;
-
-void accel_register_compat_props(const GPtrArray *props)
-{
-    ac_compat_props = props;
-}
-
-void machine_register_compat_props(const GPtrArray *props)
-{
-    mc_compat_props = props;
-}
-
 static void device_post_init(Object *obj)
 {
-    if (ac_compat_props) {
-        object_apply_global_props(obj, ac_compat_props, &error_abort);
-    }
-    if (mc_compat_props) {
-        object_apply_global_props(obj, mc_compat_props, &error_abort);
-    }
-
     qdev_prop_set_globals(DEVICE(obj));
 }
 
@@ -1124,6 +1104,10 @@ static const TypeInfo device_type_info = {
     .class_init = device_class_init,
     .abstract = true,
     .class_size = sizeof(DeviceClass),
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_COMPAT_PROPS },
+        { }
+    }
 };
 
 static void qdev_register_types(void)
diff --git a/MAINTAINERS b/MAINTAINERS
index 9410bbb7cf..adff09627f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1145,6 +1145,7 @@ Machine core
 M: Eduardo Habkost <ehabkost@redhat.com>
 M: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
 S: Supported
+F: hw/core/compat-props.c
 F: hw/core/machine.c
 F: hw/core/null-machine.c
 F: include/hw/boards.h
diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
index a799c83815..f15b3c970a 100644
--- a/hw/core/Makefile.objs
+++ b/hw/core/Makefile.objs
@@ -1,5 +1,6 @@
 # core qdev-related obj files, also used by *-user:
 common-obj-y += qdev.o qdev-properties.o
+common-obj-y += compat-props.o
 common-obj-y += bus.o reset.o
 common-obj-$(CONFIG_SOFTMMU) += qdev-fw.o
 common-obj-$(CONFIG_SOFTMMU) += fw-path-provider.o
diff --git a/tests/Makefile.include b/tests/Makefile.include
index fb0b449c02..fc74358c0a 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -567,6 +567,7 @@ tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
 	hw/core/irq.o \
 	hw/core/fw-path-provider.o \
 	hw/core/reset.o \
+	hw/core/compat-props.o \
 	$(test-qapi-obj-y)
 tests/test-vmstate$(EXESUF): tests/test-vmstate.o \
 	migration/vmstate.o migration/vmstate-types.o migration/qemu-file.o \
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 26/28] hw/i386: add pc-i440fx-3.2 & pc-q35-3.2
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (24 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface Marc-André Lureau
@ 2018-11-27  9:27 ` Marc-André Lureau
  2018-11-27 13:01   ` Eduardo Habkost
  2018-11-27  9:28 ` [Qemu-devel] [PATCH for-3.2 v4 27/28] hw/arm/virt: add virt-3.2 machine type Marc-André Lureau
                   ` (4 subsequent siblings)
  30 siblings, 1 reply; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:27 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Michael S. Tsirkin,
	Marcel Apfelbaum

The following patch is going to add compatiblity parameters for
qemu <= 3.1.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/compat.h  |  3 +++
 include/hw/i386/pc.h |  3 +++
 hw/i386/pc_piix.c    | 15 ++++++++++++---
 hw/i386/pc_q35.c     | 13 +++++++++++--
 4 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/include/hw/compat.h b/include/hw/compat.h
index 6f4d5fc647..70958328fe 100644
--- a/include/hw/compat.h
+++ b/include/hw/compat.h
@@ -1,6 +1,9 @@
 #ifndef HW_COMPAT_H
 #define HW_COMPAT_H
 
+#define HW_COMPAT_3_1 \
+    /* empty */
+
 #define HW_COMPAT_3_0 \
     /* empty */
 
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 136fe497b6..c37d4333a0 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -294,6 +294,9 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
 int e820_get_num_entries(void);
 bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
 
+#define PC_COMPAT_3_1 \
+    HW_COMPAT_3_1
+
 #define PC_COMPAT_3_0 \
     HW_COMPAT_3_0 \
     {\
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 3cc92b8eec..a4dcadac37 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -428,21 +428,30 @@ static void pc_i440fx_machine_options(MachineClass *m)
     machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);
 }
 
-static void pc_i440fx_3_1_machine_options(MachineClass *m)
+static void pc_i440fx_3_2_machine_options(MachineClass *m)
 {
     pc_i440fx_machine_options(m);
     m->alias = "pc";
     m->is_default = 1;
 }
 
+DEFINE_I440FX_MACHINE(v3_2, "pc-i440fx-3.2", NULL,
+                      pc_i440fx_3_2_machine_options);
+
+static void pc_i440fx_3_1_machine_options(MachineClass *m)
+{
+    pc_i440fx_3_2_machine_options(m);
+    m->is_default = 0;
+    m->alias = NULL;
+    SET_COMPAT(m, PC_COMPAT_3_1);
+}
+
 DEFINE_I440FX_MACHINE(v3_1, "pc-i440fx-3.1", NULL,
                       pc_i440fx_3_1_machine_options);
 
 static void pc_i440fx_3_0_machine_options(MachineClass *m)
 {
     pc_i440fx_3_1_machine_options(m);
-    m->is_default = 0;
-    m->alias = NULL;
     SET_COMPAT(m, PC_COMPAT_3_0);
 }
 
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 19e6ec6675..a990a22f87 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -311,19 +311,28 @@ static void pc_q35_machine_options(MachineClass *m)
     m->max_cpus = 288;
 }
 
-static void pc_q35_3_1_machine_options(MachineClass *m)
+static void pc_q35_3_2_machine_options(MachineClass *m)
 {
     pc_q35_machine_options(m);
     m->alias = "q35";
 }
 
+DEFINE_Q35_MACHINE(v3_2, "pc-q35-3.2", NULL,
+                   pc_q35_3_2_machine_options);
+
+static void pc_q35_3_1_machine_options(MachineClass *m)
+{
+    pc_q35_3_2_machine_options(m);
+    m->alias = NULL;
+    SET_COMPAT(m, PC_COMPAT_3_1);
+}
+
 DEFINE_Q35_MACHINE(v3_1, "pc-q35-3.1", NULL,
                    pc_q35_3_1_machine_options);
 
 static void pc_q35_3_0_machine_options(MachineClass *m)
 {
     pc_q35_3_1_machine_options(m);
-    m->alias = NULL;
     SET_COMPAT(m, PC_COMPAT_3_0);
 }
 
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 27/28] hw/arm/virt: add virt-3.2 machine type
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (25 preceding siblings ...)
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 26/28] hw/i386: add pc-i440fx-3.2 & pc-q35-3.2 Marc-André Lureau
@ 2018-11-27  9:28 ` Marc-André Lureau
  2018-11-27  9:28 ` [Qemu-devel] [PATCH for-3.2 v4 28/28] hostmem: use object id for memory region name with >= 3.1 Marc-André Lureau
                   ` (3 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:28 UTC (permalink / raw)
  To: qemu-devel
  Cc: imammedo, Marc-André Lureau, Peter Maydell, open list:Virt

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/arm/virt.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index d106a8a8c7..22343db485 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1796,7 +1796,7 @@ static void machvirt_machine_init(void)
 }
 type_init(machvirt_machine_init);
 
-static void virt_3_1_instance_init(Object *obj)
+static void virt_3_2_instance_init(Object *obj)
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
     VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
@@ -1866,10 +1866,26 @@ static void virt_3_1_instance_init(Object *obj)
     vms->irqmap = a15irqmap;
 }
 
+static void virt_machine_3_2_options(MachineClass *mc)
+{
+}
+DEFINE_VIRT_MACHINE_AS_LATEST(3, 2)
+
+#define VIRT_COMPAT_3_1 \
+    HW_COMPAT_3_1
+
+static void virt_3_1_instance_init(Object *obj)
+{
+    virt_3_2_instance_init(obj);
+}
+
 static void virt_machine_3_1_options(MachineClass *mc)
 {
+    virt_machine_3_2_options(mc);
+    SET_COMPAT(mc, VIRT_COMPAT_3_1);
 }
-DEFINE_VIRT_MACHINE_AS_LATEST(3, 1)
+
+DEFINE_VIRT_MACHINE(3, 1)
 
 #define VIRT_COMPAT_3_0 \
     HW_COMPAT_3_0
-- 
2.20.0.rc1

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

* [Qemu-devel] [PATCH for-3.2 v4 28/28] hostmem: use object id for memory region name with >= 3.1
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (26 preceding siblings ...)
  2018-11-27  9:28 ` [Qemu-devel] [PATCH for-3.2 v4 27/28] hw/arm/virt: add virt-3.2 machine type Marc-André Lureau
@ 2018-11-27  9:28 ` Marc-André Lureau
  2018-11-27  9:53 ` [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Greg Kurz
                   ` (2 subsequent siblings)
  30 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: imammedo, Marc-André Lureau, Eduardo Habkost

hostmem-file and hostmem-memfd use the whole object path for the
memory region name, and hostname-ram uses only the path component (the
object id, or canonical path basename):

qemu -m 1024 -object memory-backend-file,id=mem,size=1G,mem-path=/tmp/foo -numa node,memdev=mem -monitor stdio
(qemu) info ramblock
              Block Name    PSize              Offset               Used              Total
            /objects/mem    4 KiB  0x0000000000000000 0x0000000040000000 0x0000000040000000

qemu -m 1024 -object memory-backend-memfd,id=mem,size=1G -numa node,memdev=mem -monitor stdio
(qemu) info ramblock
              Block Name    PSize              Offset               Used              Total
            /objects/mem    4 KiB  0x0000000000000000 0x0000000040000000 0x0000000040000000

qemu -m 1024 -object memory-backend-ram,id=mem,size=1G -numa node,memdev=mem -monitor stdio
(qemu) info ramblock
              Block Name    PSize              Offset               Used              Total
                     mem    4 KiB  0x0000000000000000 0x0000000040000000 0x0000000040000000

Use the object id for -file and -memfd with >= 3.1 for consistency.
Having a consistent naming allow to migrate to different hostmem
backends.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/compat.h      | 10 +++++++++-
 include/sysemu/hostmem.h |  3 ++-
 backends/hostmem-file.c  |  8 ++++----
 backends/hostmem-memfd.c |  2 +-
 backends/hostmem-ram.c   |  9 ++++-----
 backends/hostmem.c       | 31 +++++++++++++++++++++++++++++++
 6 files changed, 51 insertions(+), 12 deletions(-)

diff --git a/include/hw/compat.h b/include/hw/compat.h
index 70958328fe..99cf6b1e03 100644
--- a/include/hw/compat.h
+++ b/include/hw/compat.h
@@ -2,7 +2,15 @@
 #define HW_COMPAT_H
 
 #define HW_COMPAT_3_1 \
-    /* empty */
+    {\
+        .driver   = "memory-backend-file",\
+        .property = "x-use-canonical-path-for-ramblock-id",\
+        .value    = "true",\
+    },{\
+        .driver   = "memory-backend-memfd",\
+        .property = "x-use-canonical-path-for-ramblock-id",\
+        .value    = "true",\
+    },
 
 #define HW_COMPAT_3_0 \
     /* empty */
diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 6e6bd2c1cb..a023b372a4 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -53,7 +53,7 @@ struct HostMemoryBackend {
 
     /* protected */
     uint64_t size;
-    bool merge, dump;
+    bool merge, dump, use_canonical_path;
     bool prealloc, force_prealloc, is_mapped, share;
     DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
     HostMemPolicy policy;
@@ -67,5 +67,6 @@ MemoryRegion *host_memory_backend_get_memory(HostMemoryBackend *backend);
 void host_memory_backend_set_mapped(HostMemoryBackend *backend, bool mapped);
 bool host_memory_backend_is_mapped(HostMemoryBackend *backend);
 size_t host_memory_backend_pagesize(HostMemoryBackend *memdev);
+char *host_memory_backend_get_name(HostMemoryBackend *backend);
 
 #endif
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index 639c8d4307..c01a7cdf8d 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -55,16 +55,16 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
     error_setg(errp, "-mem-path not supported on this host");
 #else
     if (!host_memory_backend_mr_inited(backend)) {
-        gchar *path;
+        gchar *name;
         backend->force_prealloc = mem_prealloc;
-        path = object_get_canonical_path(OBJECT(backend));
+        name = host_memory_backend_get_name(backend);
         memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
-                                 path,
+                                 name,
                                  backend->size, fb->align,
                                  (backend->share ? RAM_SHARED : 0) |
                                  (fb->is_pmem ? RAM_PMEM : 0),
                                  fb->mem_path, errp);
-        g_free(path);
+        g_free(name);
     }
 #endif
 }
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index b6836b28e5..c5a4a9b530 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -57,7 +57,7 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
         return;
     }
 
-    name = object_get_canonical_path(OBJECT(backend));
+    name = host_memory_backend_get_name(backend);
     memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend),
                                    name, backend->size, true, fd, errp);
     g_free(name);
diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
index 7ddd08d370..24b65d9ae3 100644
--- a/backends/hostmem-ram.c
+++ b/backends/hostmem-ram.c
@@ -16,21 +16,20 @@
 
 #define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
 
-
 static void
 ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
 {
-    char *path;
+    char *name;
 
     if (!backend->size) {
         error_setg(errp, "can't create backend with size 0");
         return;
     }
 
-    path = object_get_canonical_path_component(OBJECT(backend));
-    memory_region_init_ram_shared_nomigrate(&backend->mr, OBJECT(backend), path,
+    name = host_memory_backend_get_name(backend);
+    memory_region_init_ram_shared_nomigrate(&backend->mr, OBJECT(backend), name,
                            backend->size, backend->share, errp);
-    g_free(path);
+    g_free(name);
 }
 
 static void
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 1a89342039..35c665fca2 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -28,6 +28,16 @@ QEMU_BUILD_BUG_ON(HOST_MEM_POLICY_BIND != MPOL_BIND);
 QEMU_BUILD_BUG_ON(HOST_MEM_POLICY_INTERLEAVE != MPOL_INTERLEAVE);
 #endif
 
+char *
+host_memory_backend_get_name(HostMemoryBackend *self)
+{
+    if (!self->use_canonical_path) {
+        return object_get_canonical_path_component(OBJECT(self));
+    }
+
+    return object_get_canonical_path(OBJECT(self));
+}
+
 static void
 host_memory_backend_get_size(Object *obj, Visitor *v, const char *name,
                              void *opaque, Error **errp)
@@ -386,6 +396,23 @@ static void host_memory_backend_set_share(Object *o, bool value, Error **errp)
     backend->share = value;
 }
 
+static bool
+host_memory_backend_get_use_canonical_path(Object *obj, Error **errp)
+{
+    HostMemoryBackend *self = MEMORY_BACKEND(obj);
+
+    return self->use_canonical_path;
+}
+
+static void
+host_memory_backend_set_use_canonical_path(Object *obj, bool value,
+                                           Error **errp)
+{
+    HostMemoryBackend *self = MEMORY_BACKEND(obj);
+
+    self->use_canonical_path = value;
+}
+
 static void
 host_memory_backend_class_init(ObjectClass *oc, void *data)
 {
@@ -432,6 +459,9 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
         &error_abort);
     object_class_property_set_description(oc, "share",
         "Mark the memory as private to QEMU or shared", &error_abort);
+    object_class_property_add_bool(oc, "x-use-canonical-path-for-ramblock-id",
+        host_memory_backend_get_use_canonical_path,
+        host_memory_backend_set_use_canonical_path, &error_abort);
 }
 
 static const TypeInfo host_memory_backend_info = {
@@ -444,6 +474,7 @@ static const TypeInfo host_memory_backend_info = {
     .instance_init = host_memory_backend_init,
     .interfaces = (InterfaceInfo[]) {
         { TYPE_USER_CREATABLE },
+        { TYPE_COMPAT_PROPS },
         { }
     }
 };
-- 
2.20.0.rc1

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (27 preceding siblings ...)
  2018-11-27  9:28 ` [Qemu-devel] [PATCH for-3.2 v4 28/28] hostmem: use object id for memory region name with >= 3.1 Marc-André Lureau
@ 2018-11-27  9:53 ` Greg Kurz
  2018-11-27  9:58   ` Marc-André Lureau
  2018-11-29  1:35 ` no-reply
  2018-11-29  1:45 ` no-reply
  30 siblings, 1 reply; 70+ messages in thread
From: Greg Kurz @ 2018-11-27  9:53 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, imammedo

Hi Marc-André,

Patches 1 to 8 don't seem to belong to this series, and they already got
merged in master actually. Also next release is expected to be 4.0.

Cheers,

--
Greg

On Tue, 27 Nov 2018 13:27:33 +0400
Marc-André Lureau <marcandre.lureau@redhat.com> wrote:

> Hi,
> 
> During "[PATCH v2 05/10] qom/globals: generalize
> object_property_set_globals()" review, Eduardo suggested to rework the
> GlobalProperty handling, so that -global is limited to QDev only and
> we avoid mixing the machine compats and the user-provided -global
> properties (instead of generalizing -global to various object kinds,
> like I proposed in v2).
> 
> "qdev: do not mix compat props with global props" patch decouples a
> bit user-provided -global from machine compat properties. This allows
> to get rid of "user_provided" and "errp" fields in following patches.
> 
> Instead of explcitely calling object_apply_global_props() in the
> various object post_init, I opted for creating a new TYPE_COMPAT_PROPS
> interface. The interface approach gives a lot more flexibility on
> which objects can have compat props. This requires some interface
> improvments in "qom: teach interfaces to implement post-init".
> 
> A new compat property "x-use-canonical-path-for-ramblock-id" is added
> to hostmem for legacy canonical path names, set to true for -file and
> -memfd with qemu < 3.2.
> 
> (this series was initially titled "[PATCH v2 00/10] hostmem: use
> object "id" for memory region name with >= 3.1", but its focus is more
> in refactoring the global and compatilibity properties handling now)
> 
> v4:
> - fix accel/machine compat props apply order inversion
> - split "qdev: do not mix compat props with global props": replace
>   using current_machine by new compat_props global, introduce
>   SET_COMPAT() macro, use GPtrArray.
> - add a comment about "qdev-props: call object_apply_global_props()"
>   error reporting
> - add "arm: replace instance_post_init()", to solve the post-init
>   ordering issue
> - add "hw/arm/virt: add virt-3.2 machine type" for completeness
> - commit message improvements
> - rebased, add r-b tags
> 
> v3:
> - GlobalProperties improvements/cleanups
> - drop generalizing the -global idea
> - "replace" the set_globals flag with a TYPE_COMPAT_PROPS interface
> - update hw/i386 machine version to 3.2
> - add "qom: make interface types abstract" interface cleanup
> 
> v2:
> - replace "qom/user-creatable: add a few helper macros" patch for a
>   more optimized "qom: make user_creatable_complete() specific to
>   UserCreatable"
> - rename register_global_list() to register_global_properties()
> - call object_property_set_globals() after post-init
> - add and use a ObjectClass.set_globals flag, instead of dynamically
>   check object class in object_property_set_globals()
> - use object "id" in >= 3.1 instead of canonical path, add compat
>   property "x-use-canonical-path-for-ramblock-id" in base hostmem
>   class.
> 
> Edgar E. Iglesias (1):
>   net: cadence_gem: Remove incorrect assert()
> 
> Eric Auger (1):
>   MAINTAINERS: Add an ARM SMMU section
> 
> Greg Kurz (1):
>   9p: fix QEMU crash when renaming files
> 
> Marc-André Lureau (20):
>   tests: qdev_prop_check_globals() doesn't return "all_used"
>   qom: make interface types abstract
>   qom: make user_creatable_complete() specific to UserCreatable
>   accel: register global_props like machine globals
>   qdev: move qdev_prop_register_global_list() to tests
>   qom: remove unimplemented class_finalize
>   hw: apply accel compat properties without touching globals
>   hw: apply machine compat properties without touching globals
>   hw: remove SET_MACHINE_COMPAT
>   qdev: all globals are now user-provided
>   qdev-props: convert global_props to GPtrArray
>   qdev-props: remove errp from GlobalProperty
>   qdev-props: call object_apply_global_props()
>   qom: teach interfaces to implement post-init
>   qom: add object_class_get_class_data()
>   arm: replace instance_post_init()
>   machine: add compat-props interface
>   hw/i386: add pc-i440fx-3.2 & pc-q35-3.2
>   hw/arm/virt: add virt-3.2 machine type
>   hostmem: use object id for memory region name with >= 3.1
> 
> Max Filippov (4):
>   target/xtensa: gdbstub fix register counting
>   target/xtensa: drop num_[core_]regs from dc232b/dc233c configs
>   target/xtensa: xtfpga: provide default memory sizes
>   MAINTAINERS: add missing xtensa patterns
> 
> Thomas Huth (1):
>   MAINTAINERS: Assign some more files in the hw/arm/ directory
> 

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties
  2018-11-27  9:53 ` [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Greg Kurz
@ 2018-11-27  9:58   ` Marc-André Lureau
  0 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27  9:58 UTC (permalink / raw)
  To: groug; +Cc: qemu-devel, Igor Mammedov

Hi

On Tue, Nov 27, 2018 at 1:53 PM Greg Kurz <groug@kaod.org> wrote:
>
> Hi Marc-André,
>
> Patches 1 to 8 don't seem to belong to this series, and they already got
> merged in master actually. Also next release is expected to be 4.0.

oops indeed, sorry. Please ignore 1-8.

> Cheers,
>
> --
> Greg
>
> On Tue, 27 Nov 2018 13:27:33 +0400
> Marc-André Lureau <marcandre.lureau@redhat.com> wrote:
>
> > Hi,
> >
> > During "[PATCH v2 05/10] qom/globals: generalize
> > object_property_set_globals()" review, Eduardo suggested to rework the
> > GlobalProperty handling, so that -global is limited to QDev only and
> > we avoid mixing the machine compats and the user-provided -global
> > properties (instead of generalizing -global to various object kinds,
> > like I proposed in v2).
> >
> > "qdev: do not mix compat props with global props" patch decouples a
> > bit user-provided -global from machine compat properties. This allows
> > to get rid of "user_provided" and "errp" fields in following patches.
> >
> > Instead of explcitely calling object_apply_global_props() in the
> > various object post_init, I opted for creating a new TYPE_COMPAT_PROPS
> > interface. The interface approach gives a lot more flexibility on
> > which objects can have compat props. This requires some interface
> > improvments in "qom: teach interfaces to implement post-init".
> >
> > A new compat property "x-use-canonical-path-for-ramblock-id" is added
> > to hostmem for legacy canonical path names, set to true for -file and
> > -memfd with qemu < 3.2.
> >
> > (this series was initially titled "[PATCH v2 00/10] hostmem: use
> > object "id" for memory region name with >= 3.1", but its focus is more
> > in refactoring the global and compatilibity properties handling now)
> >
> > v4:
> > - fix accel/machine compat props apply order inversion
> > - split "qdev: do not mix compat props with global props": replace
> >   using current_machine by new compat_props global, introduce
> >   SET_COMPAT() macro, use GPtrArray.
> > - add a comment about "qdev-props: call object_apply_global_props()"
> >   error reporting
> > - add "arm: replace instance_post_init()", to solve the post-init
> >   ordering issue
> > - add "hw/arm/virt: add virt-3.2 machine type" for completeness
> > - commit message improvements
> > - rebased, add r-b tags
> >
> > v3:
> > - GlobalProperties improvements/cleanups
> > - drop generalizing the -global idea
> > - "replace" the set_globals flag with a TYPE_COMPAT_PROPS interface
> > - update hw/i386 machine version to 3.2
> > - add "qom: make interface types abstract" interface cleanup
> >
> > v2:
> > - replace "qom/user-creatable: add a few helper macros" patch for a
> >   more optimized "qom: make user_creatable_complete() specific to
> >   UserCreatable"
> > - rename register_global_list() to register_global_properties()
> > - call object_property_set_globals() after post-init
> > - add and use a ObjectClass.set_globals flag, instead of dynamically
> >   check object class in object_property_set_globals()
> > - use object "id" in >= 3.1 instead of canonical path, add compat
> >   property "x-use-canonical-path-for-ramblock-id" in base hostmem
> >   class.
> >
> > Edgar E. Iglesias (1):
> >   net: cadence_gem: Remove incorrect assert()
> >
> > Eric Auger (1):
> >   MAINTAINERS: Add an ARM SMMU section
> >
> > Greg Kurz (1):
> >   9p: fix QEMU crash when renaming files
> >
> > Marc-André Lureau (20):
> >   tests: qdev_prop_check_globals() doesn't return "all_used"
> >   qom: make interface types abstract
> >   qom: make user_creatable_complete() specific to UserCreatable
> >   accel: register global_props like machine globals
> >   qdev: move qdev_prop_register_global_list() to tests
> >   qom: remove unimplemented class_finalize
> >   hw: apply accel compat properties without touching globals
> >   hw: apply machine compat properties without touching globals
> >   hw: remove SET_MACHINE_COMPAT
> >   qdev: all globals are now user-provided
> >   qdev-props: convert global_props to GPtrArray
> >   qdev-props: remove errp from GlobalProperty
> >   qdev-props: call object_apply_global_props()
> >   qom: teach interfaces to implement post-init
> >   qom: add object_class_get_class_data()
> >   arm: replace instance_post_init()
> >   machine: add compat-props interface
> >   hw/i386: add pc-i440fx-3.2 & pc-q35-3.2
> >   hw/arm/virt: add virt-3.2 machine type
> >   hostmem: use object id for memory region name with >= 3.1
> >
> > Max Filippov (4):
> >   target/xtensa: gdbstub fix register counting
> >   target/xtensa: drop num_[core_]regs from dc232b/dc233c configs
> >   target/xtensa: xtfpga: provide default memory sizes
> >   MAINTAINERS: add missing xtensa patterns
> >
> > Thomas Huth (1):
> >   MAINTAINERS: Assign some more files in the hw/arm/ directory
> >
>

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 14/28] qom: remove unimplemented class_finalize
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 14/28] qom: remove unimplemented class_finalize Marc-André Lureau
@ 2018-11-27 12:52   ` Eduardo Habkost
  2018-11-28 17:44   ` Igor Mammedov
  1 sibling, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 12:52 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, imammedo, Marcel Apfelbaum, Andreas Färber

On Tue, Nov 27, 2018 at 01:27:47PM +0400, Marc-André Lureau wrote:
> Instead of trying to implement something that isn't well specified,
> remove it. (it would be tricky to implement, since a class struct is
> memcpy on children types...)
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine " Marc-André Lureau
@ 2018-11-27 12:56   ` Eduardo Habkost
  2018-11-27 13:10     ` Marc-André Lureau
  2018-11-29 16:09   ` Eduardo Habkost
  1 sibling, 1 reply; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 12:56 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, imammedo, Peter Maydell, Marcel Apfelbaum,
	Paolo Bonzini, Richard Henderson, Michael S. Tsirkin,
	David Gibson, Cornelia Huck, David Hildenbrand,
	Christian Borntraeger, open list:Virt, open list:sPAPR,
	open list:S390

On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:
> Similarly to accel properties, move compat properties out of globals
> registration, and apply the machine compat properties during
> device_post_init().
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
[...]
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 7066d28271..3b31b2c025 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
>  }
>  
>  static const GPtrArray *ac_compat_props;
> +static const GPtrArray *mc_compat_props;
>  
>  void accel_register_compat_props(const GPtrArray *props)
>  {
>      ac_compat_props = props;
>  }
>  
> +void machine_register_compat_props(const GPtrArray *props)
> +{
> +    mc_compat_props = props;
> +}
> +
>  static void device_post_init(Object *obj)
>  {
>      if (ac_compat_props) {
>          object_apply_global_props(obj, ac_compat_props, &error_abort);
>      }

Why not just use MACHINE(qdev_get_machine())->accel->compat_props
directly?

> +    if (mc_compat_props) {
> +        object_apply_global_props(obj, mc_compat_props, &error_abort);
> +    }

Why not just use MACHINE(qdev_get_machine())->compat_props
directly?

>  
>      qdev_prop_set_globals(DEVICE(obj));
>  }
[...]

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 26/28] hw/i386: add pc-i440fx-3.2 & pc-q35-3.2
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 26/28] hw/i386: add pc-i440fx-3.2 & pc-q35-3.2 Marc-André Lureau
@ 2018-11-27 13:01   ` Eduardo Habkost
  0 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 13:01 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, imammedo, Paolo Bonzini, Richard Henderson,
	Michael S. Tsirkin, Marcel Apfelbaum

On Tue, Nov 27, 2018 at 01:27:59PM +0400, Marc-André Lureau wrote:
> The following patch is going to add compatiblity parameters for
> qemu <= 3.1.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

The next release will be 4.0.

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-27 12:56   ` Eduardo Habkost
@ 2018-11-27 13:10     ` Marc-André Lureau
  2018-11-27 13:35       ` Eduardo Habkost
  0 siblings, 1 reply; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27 13:10 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: qemu-devel, Igor Mammedov, Peter Maydell, Marcel Apfelbaum,
	Bonzini, Paolo, Richard Henderson, Michael S . Tsirkin, david,
	cohuck, David Hildenbrand, borntraeger, qemu-arm, qemu-ppc,
	qemu-s390x

On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
>
> On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:
> > Similarly to accel properties, move compat properties out of globals
> > registration, and apply the machine compat properties during
> > device_post_init().
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> [...]
> > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > index 7066d28271..3b31b2c025 100644
> > --- a/hw/core/qdev.c
> > +++ b/hw/core/qdev.c
> > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> >  }
> >
> >  static const GPtrArray *ac_compat_props;
> > +static const GPtrArray *mc_compat_props;
> >
> >  void accel_register_compat_props(const GPtrArray *props)
> >  {
> >      ac_compat_props = props;
> >  }
> >
> > +void machine_register_compat_props(const GPtrArray *props)
> > +{
> > +    mc_compat_props = props;
> > +}
> > +
> >  static void device_post_init(Object *obj)
> >  {
> >      if (ac_compat_props) {
> >          object_apply_global_props(obj, ac_compat_props, &error_abort);
> >      }
>
> Why not just use MACHINE(qdev_get_machine())->accel->compat_props
> directly?
>
> > +    if (mc_compat_props) {
> > +        object_apply_global_props(obj, mc_compat_props, &error_abort);
> > +    }
>
> Why not just use MACHINE(qdev_get_machine())->compat_props
> directly?

This was the approach in v3, but Igor didn't quite like referencing
machine in qdev:
https://lists.nongnu.org/archive/html/qemu-devel/2018-11/msg04774.html

>
> >
> >      qdev_prop_set_globals(DEVICE(obj));
> >  }
> [...]
>
> --
> Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-27 13:10     ` Marc-André Lureau
@ 2018-11-27 13:35       ` Eduardo Habkost
  2018-11-28 17:40         ` Igor Mammedov
  0 siblings, 1 reply; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 13:35 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, Igor Mammedov, Peter Maydell, Marcel Apfelbaum,
	Bonzini, Paolo, Richard Henderson, Michael S . Tsirkin, david,
	cohuck, David Hildenbrand, borntraeger, qemu-arm, qemu-ppc,
	qemu-s390x

On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:
> On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:
> > > Similarly to accel properties, move compat properties out of globals
> > > registration, and apply the machine compat properties during
> > > device_post_init().
> > >
> > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > [...]
> > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > index 7066d28271..3b31b2c025 100644
> > > --- a/hw/core/qdev.c
> > > +++ b/hw/core/qdev.c
> > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > >  }
> > >
> > >  static const GPtrArray *ac_compat_props;
> > > +static const GPtrArray *mc_compat_props;
> > >
> > >  void accel_register_compat_props(const GPtrArray *props)
> > >  {
> > >      ac_compat_props = props;
> > >  }
> > >
> > > +void machine_register_compat_props(const GPtrArray *props)
> > > +{
> > > +    mc_compat_props = props;
> > > +}
> > > +
> > >  static void device_post_init(Object *obj)
> > >  {
> > >      if (ac_compat_props) {
> > >          object_apply_global_props(obj, ac_compat_props, &error_abort);
> > >      }
> >
> > Why not just use MACHINE(qdev_get_machine())->accel->compat_props
> > directly?
> >
> > > +    if (mc_compat_props) {
> > > +        object_apply_global_props(obj, mc_compat_props, &error_abort);
> > > +    }
> >
> > Why not just use MACHINE(qdev_get_machine())->compat_props
> > directly?
> 
> This was the approach in v3, but Igor didn't quite like referencing
> machine in qdev:
> https://lists.nongnu.org/archive/html/qemu-devel/2018-11/msg04774.html

I disagree with Igor, here.  Core qdev code already have multiple
references to machine, I don't see any problem with that.

The previous code was clearer and easier to follow, and wasn't
sensitive to subtle changes in initialization ordering (e.g. what
happens if we create a device before *_register_compat_props() is
called?).


> 
> >
> > >
> > >      qdev_prop_set_globals(DEVICE(obj));
> > >  }
> > [...]
> >
> > --
> > Eduardo

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 09/28] tests: qdev_prop_check_globals() doesn't return "all_used"
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 09/28] tests: qdev_prop_check_globals() doesn't return "all_used" Marc-André Lureau
@ 2018-11-27 13:40   ` Eduardo Habkost
  0 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 13:40 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, imammedo

On Tue, Nov 27, 2018 at 01:27:42PM +0400, Marc-André Lureau wrote:
> Instead, it returns 1 if an error was detected, which is the case for:
> 
> /qdev/properties/dynamic/global/subprocess:
> warning: global dynamic-prop-type-bad.prop3 has invalid class name
> warning: global nohotplug-type.prop5=105 not used
> warning: global nondevice-type.prop6 has invalid class name
> 
> Clarify the function return value.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Reviewed-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 10/28] qom: make interface types abstract
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 10/28] qom: make interface types abstract Marc-André Lureau
@ 2018-11-27 13:41   ` Eduardo Habkost
  2018-11-27 13:55     ` Marc-André Lureau
  0 siblings, 1 reply; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 13:41 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, Peter Maydell, Corey Minyard, Michael S. Tsirkin,
	open list:PReP, open list:ARM, Hervé Poussineau, imammedo,
	Andreas Färber, Stefan Berger

On Tue, Nov 27, 2018 at 01:27:43PM +0400, Marc-André Lureau wrote:
> Interfaces don't have instance, let's make the interface type really
> abstract to avoid confusion.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Reviewed-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>

What about updating the documentation at qom/object.h with
examples?

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 11/28] qom: make user_creatable_complete() specific to UserCreatable
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 11/28] qom: make user_creatable_complete() specific to UserCreatable Marc-André Lureau
@ 2018-11-27 13:45   ` Eduardo Habkost
  0 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 13:45 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, imammedo, Michael S. Tsirkin, Andreas Färber, Amit Shah

On Tue, Nov 27, 2018 at 01:27:44PM +0400, Marc-André Lureau wrote:
> Instead of accepting any Object*, change user_creatable_complete() to
> require a UserCreatable*. Modify the callers to pass the appropriate
> argument, removing redundant dynamic cast checks in object creation.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Reviewed-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 10/28] qom: make interface types abstract
  2018-11-27 13:41   ` Eduardo Habkost
@ 2018-11-27 13:55     ` Marc-André Lureau
  0 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27 13:55 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: qemu-devel, Peter Maydell, minyard, Michael S . Tsirkin,
	qemu-ppc, qemu-arm, hpoussin, Igor Mammedov, Andreas Färber,
	stefanb

On Tue, Nov 27, 2018 at 5:42 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
>
> On Tue, Nov 27, 2018 at 01:27:43PM +0400, Marc-André Lureau wrote:
> > Interfaces don't have instance, let's make the interface type really
> > abstract to avoid confusion.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > Reviewed-by: Igor Mammedov <imammedo@redhat.com>
>
> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
>
> What about updating the documentation at qom/object.h with
> examples?

I don't like code example in documentation, they tend to bit rot
(hint: rustdoc :). Instead, we can point out
tests/check-qom-interface.c?

>
> --
> Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
  2018-11-27  9:27   ` Marc-André Lureau
@ 2018-11-27 19:40     ` Eduardo Habkost
  -1 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 19:40 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, Stefano Stabellini, open list:X86, Paolo Bonzini,
	Anthony Perard, imammedo, Andreas Färber

On Tue, Nov 27, 2018 at 01:27:48PM +0400, Marc-André Lureau wrote:
> Introduce object_apply_global_props() function, to apply compatibility
> properties from a GPtrArray.
> 
> For accel compatibility properties, apply them during
> device_post_init(), after accel_register_compat_props() has set them.
> 
> To populate the compatibility properties, introduce SET_COMPAT(), a
> more generic version of SET_MACHINE_COMPAT() that can set compat
> properties on other objects than Machine, and using GPtrArray.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/hw/qdev-core.h | 13 +++++++++++++
>  include/qom/object.h   |  3 +++
>  include/sysemu/accel.h |  4 +---
>  accel/accel.c          | 12 ------------
>  hw/core/qdev.c         | 11 +++++++++++
>  hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
>  qom/object.c           | 25 +++++++++++++++++++++++++
>  vl.c                   |  2 +-
>  8 files changed, 73 insertions(+), 35 deletions(-)
> 
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index a24d0dd566..82afd3c50d 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -267,6 +267,19 @@ typedef struct GlobalProperty {
>      Error **errp;
>  } GlobalProperty;
>  
> +#define SET_COMPAT(S, COMPAT)                                       \
> +    do {                                                            \
> +        int i;                                                      \
> +        static GlobalProperty props[] = {                           \
> +            COMPAT                                                  \
> +        };                                                          \
> +        for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
> +            g_ptr_array_add((S)->compat_props, (void *)&props[i]);  \
> +        }                                                           \
> +    } while (0)

I think this macro would be an acceptable alternative to the
existing SET_MACHINE_COMPAT macro trickery, but:

> +
> +void accel_register_compat_props(const GPtrArray *props);
[...]
> @@ -185,7 +183,9 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
>      ac->init_machine = xen_init;
>      ac->setup_post = xen_setup_post;
>      ac->allowed = &xen_allowed;
> -    ac->global_props = xen_compat_props;
> +    ac->compat_props = g_ptr_array_new();
> +
> +    SET_COMPAT(ac, XEN_COMPAT);

I think this is a step backwards.  I like us to be able to
register compat properties without macro magic.  The existence of
SET_MACHINE_COMPAT is a bug and not a feature.

If you really want to use GPtrArray instead of a simple
GlobalProperty* field (I'm not sure I understand the reasoning
behind the choice to use GPtrArray), what about:

static GPtrArray *build_compat_props_array(GlobalProperty *props)
{
    GlobalProperty *p = props;
    GPtrArray *array = g_ptr_array_new();
    while (p->driver) {
        g_ptr_array_add(array, (void *)p);
    }
    return array;
}


static void xen_accel_class_init(ObjectClass *oc, void *data)
{
    ...
    ac->compat_props = build_compat_props_array(xen_compat_props);
}



>  }
>  
>  #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
> diff --git a/qom/object.c b/qom/object.c
> index 17921c0a71..dbdab0aead 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
>      }
>  }
>  
> +void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
> +{
> +    Error *err = NULL;
> +    int i;
> +
> +    if (!props) {
> +        return;
> +    }
> +
> +    for (i = 0; i < props->len; i++) {
> +        GlobalProperty *p = g_ptr_array_index(props, i);
> +
> +        if (object_dynamic_cast(obj, p->driver) == NULL) {
> +            continue;
> +        }
> +        p->used = true;
> +        object_property_parse(obj, p->value, p->property, &err);
> +        if (err != NULL) {
> +            error_prepend(&err, "can't apply global %s.%s=%s: ",
> +                          p->driver, p->property, p->value);
> +            error_propagate(errp, err);
> +        }
> +    }
> +}
> +
>  static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
>  {
>      Object *obj = data;
> diff --git a/vl.c b/vl.c
> index fa25d1ae2d..c06e94271c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
>   */
>  static void register_global_properties(MachineState *ms)
>  {
> -    accel_register_compat_props(ms->accelerator);
> +    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
>      machine_register_compat_props(ms);
>      user_register_global_props();
>  }
> -- 
> 2.20.0.rc1
> 
> 

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
@ 2018-11-27 19:40     ` Eduardo Habkost
  0 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-27 19:40 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Stefano Stabellini, qemu-devel, Paolo Bonzini, imammedo,
	Anthony Perard, open list:X86, Andreas Färber

On Tue, Nov 27, 2018 at 01:27:48PM +0400, Marc-André Lureau wrote:
> Introduce object_apply_global_props() function, to apply compatibility
> properties from a GPtrArray.
> 
> For accel compatibility properties, apply them during
> device_post_init(), after accel_register_compat_props() has set them.
> 
> To populate the compatibility properties, introduce SET_COMPAT(), a
> more generic version of SET_MACHINE_COMPAT() that can set compat
> properties on other objects than Machine, and using GPtrArray.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/hw/qdev-core.h | 13 +++++++++++++
>  include/qom/object.h   |  3 +++
>  include/sysemu/accel.h |  4 +---
>  accel/accel.c          | 12 ------------
>  hw/core/qdev.c         | 11 +++++++++++
>  hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
>  qom/object.c           | 25 +++++++++++++++++++++++++
>  vl.c                   |  2 +-
>  8 files changed, 73 insertions(+), 35 deletions(-)
> 
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index a24d0dd566..82afd3c50d 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -267,6 +267,19 @@ typedef struct GlobalProperty {
>      Error **errp;
>  } GlobalProperty;
>  
> +#define SET_COMPAT(S, COMPAT)                                       \
> +    do {                                                            \
> +        int i;                                                      \
> +        static GlobalProperty props[] = {                           \
> +            COMPAT                                                  \
> +        };                                                          \
> +        for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
> +            g_ptr_array_add((S)->compat_props, (void *)&props[i]);  \
> +        }                                                           \
> +    } while (0)

I think this macro would be an acceptable alternative to the
existing SET_MACHINE_COMPAT macro trickery, but:

> +
> +void accel_register_compat_props(const GPtrArray *props);
[...]
> @@ -185,7 +183,9 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
>      ac->init_machine = xen_init;
>      ac->setup_post = xen_setup_post;
>      ac->allowed = &xen_allowed;
> -    ac->global_props = xen_compat_props;
> +    ac->compat_props = g_ptr_array_new();
> +
> +    SET_COMPAT(ac, XEN_COMPAT);

I think this is a step backwards.  I like us to be able to
register compat properties without macro magic.  The existence of
SET_MACHINE_COMPAT is a bug and not a feature.

If you really want to use GPtrArray instead of a simple
GlobalProperty* field (I'm not sure I understand the reasoning
behind the choice to use GPtrArray), what about:

static GPtrArray *build_compat_props_array(GlobalProperty *props)
{
    GlobalProperty *p = props;
    GPtrArray *array = g_ptr_array_new();
    while (p->driver) {
        g_ptr_array_add(array, (void *)p);
    }
    return array;
}


static void xen_accel_class_init(ObjectClass *oc, void *data)
{
    ...
    ac->compat_props = build_compat_props_array(xen_compat_props);
}



>  }
>  
>  #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
> diff --git a/qom/object.c b/qom/object.c
> index 17921c0a71..dbdab0aead 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
>      }
>  }
>  
> +void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
> +{
> +    Error *err = NULL;
> +    int i;
> +
> +    if (!props) {
> +        return;
> +    }
> +
> +    for (i = 0; i < props->len; i++) {
> +        GlobalProperty *p = g_ptr_array_index(props, i);
> +
> +        if (object_dynamic_cast(obj, p->driver) == NULL) {
> +            continue;
> +        }
> +        p->used = true;
> +        object_property_parse(obj, p->value, p->property, &err);
> +        if (err != NULL) {
> +            error_prepend(&err, "can't apply global %s.%s=%s: ",
> +                          p->driver, p->property, p->value);
> +            error_propagate(errp, err);
> +        }
> +    }
> +}
> +
>  static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
>  {
>      Object *obj = data;
> diff --git a/vl.c b/vl.c
> index fa25d1ae2d..c06e94271c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
>   */
>  static void register_global_properties(MachineState *ms)
>  {
> -    accel_register_compat_props(ms->accelerator);
> +    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
>      machine_register_compat_props(ms);
>      user_register_global_props();
>  }
> -- 
> 2.20.0.rc1
> 
> 

-- 
Eduardo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
  2018-11-27 19:40     ` Eduardo Habkost
@ 2018-11-27 20:02       ` Marc-André Lureau
  -1 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27 20:02 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: qemu-devel, sstabellini, xen-devel, Bonzini, Paolo,
	Anthony PERARD, Igor Mammedov, Andreas Färber

Hi

On Tue, Nov 27, 2018 at 11:40 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
>
> On Tue, Nov 27, 2018 at 01:27:48PM +0400, Marc-André Lureau wrote:
> > Introduce object_apply_global_props() function, to apply compatibility
> > properties from a GPtrArray.
> >
> > For accel compatibility properties, apply them during
> > device_post_init(), after accel_register_compat_props() has set them.
> >
> > To populate the compatibility properties, introduce SET_COMPAT(), a
> > more generic version of SET_MACHINE_COMPAT() that can set compat
> > properties on other objects than Machine, and using GPtrArray.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  include/hw/qdev-core.h | 13 +++++++++++++
> >  include/qom/object.h   |  3 +++
> >  include/sysemu/accel.h |  4 +---
> >  accel/accel.c          | 12 ------------
> >  hw/core/qdev.c         | 11 +++++++++++
> >  hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
> >  qom/object.c           | 25 +++++++++++++++++++++++++
> >  vl.c                   |  2 +-
> >  8 files changed, 73 insertions(+), 35 deletions(-)
> >
> > diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> > index a24d0dd566..82afd3c50d 100644
> > --- a/include/hw/qdev-core.h
> > +++ b/include/hw/qdev-core.h
> > @@ -267,6 +267,19 @@ typedef struct GlobalProperty {
> >      Error **errp;
> >  } GlobalProperty;
> >
> > +#define SET_COMPAT(S, COMPAT)                                       \
> > +    do {                                                            \
> > +        int i;                                                      \
> > +        static GlobalProperty props[] = {                           \
> > +            COMPAT                                                  \
> > +        };                                                          \
> > +        for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
> > +            g_ptr_array_add((S)->compat_props, (void *)&props[i]);  \
> > +        }                                                           \
> > +    } while (0)
>
> I think this macro would be an acceptable alternative to the
> existing SET_MACHINE_COMPAT macro trickery, but:
>
> > +
> > +void accel_register_compat_props(const GPtrArray *props);
> [...]
> > @@ -185,7 +183,9 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
> >      ac->init_machine = xen_init;
> >      ac->setup_post = xen_setup_post;
> >      ac->allowed = &xen_allowed;
> > -    ac->global_props = xen_compat_props;
> > +    ac->compat_props = g_ptr_array_new();
> > +
> > +    SET_COMPAT(ac, XEN_COMPAT);
>
> I think this is a step backwards.  I like us to be able to
> register compat properties without macro magic.  The existence of
> SET_MACHINE_COMPAT is a bug and not a feature.
>
> If you really want to use GPtrArray instead of a simple
> GlobalProperty* field (I'm not sure I understand the reasoning
> behind the choice to use GPtrArray), what about:

Except in the Xen case, It needs to register multiple GlobalProperty*,
not necessarily from contiguous in memory. That's why we have an array
of ptr.

>
> static GPtrArray *build_compat_props_array(GlobalProperty *props)
> {
>     GlobalProperty *p = props;
>     GPtrArray *array = g_ptr_array_new();
>     while (p->driver) {
>         g_ptr_array_add(array, (void *)p);
>     }
>     return array;
> }
>
>
> static void xen_accel_class_init(ObjectClass *oc, void *data)
> {
>     ...
>     ac->compat_props = build_compat_props_array(xen_compat_props);

If we would register from one place, that would be fine.

We could replace the macro by a function, then we would have to
declare the GlobalProperty arrays manually basically.

> }
>
>
>
> >  }
> >
> >  #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
> > diff --git a/qom/object.c b/qom/object.c
> > index 17921c0a71..dbdab0aead 100644
> > --- a/qom/object.c
> > +++ b/qom/object.c
> > @@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
> >      }
> >  }
> >
> > +void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
> > +{
> > +    Error *err = NULL;
> > +    int i;
> > +
> > +    if (!props) {
> > +        return;
> > +    }
> > +
> > +    for (i = 0; i < props->len; i++) {
> > +        GlobalProperty *p = g_ptr_array_index(props, i);
> > +
> > +        if (object_dynamic_cast(obj, p->driver) == NULL) {
> > +            continue;
> > +        }
> > +        p->used = true;
> > +        object_property_parse(obj, p->value, p->property, &err);
> > +        if (err != NULL) {
> > +            error_prepend(&err, "can't apply global %s.%s=%s: ",
> > +                          p->driver, p->property, p->value);
> > +            error_propagate(errp, err);
> > +        }
> > +    }
> > +}
> > +
> >  static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
> >  {
> >      Object *obj = data;
> > diff --git a/vl.c b/vl.c
> > index fa25d1ae2d..c06e94271c 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
> >   */
> >  static void register_global_properties(MachineState *ms)
> >  {
> > -    accel_register_compat_props(ms->accelerator);
> > +    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
> >      machine_register_compat_props(ms);
> >      user_register_global_props();
> >  }
> > --
> > 2.20.0.rc1
> >
> >
>
> --
> Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
@ 2018-11-27 20:02       ` Marc-André Lureau
  0 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-27 20:02 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: sstabellini, qemu-devel, Bonzini, Paolo, Igor Mammedov,
	Anthony PERARD, xen-devel, Andreas Färber

Hi

On Tue, Nov 27, 2018 at 11:40 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
>
> On Tue, Nov 27, 2018 at 01:27:48PM +0400, Marc-André Lureau wrote:
> > Introduce object_apply_global_props() function, to apply compatibility
> > properties from a GPtrArray.
> >
> > For accel compatibility properties, apply them during
> > device_post_init(), after accel_register_compat_props() has set them.
> >
> > To populate the compatibility properties, introduce SET_COMPAT(), a
> > more generic version of SET_MACHINE_COMPAT() that can set compat
> > properties on other objects than Machine, and using GPtrArray.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  include/hw/qdev-core.h | 13 +++++++++++++
> >  include/qom/object.h   |  3 +++
> >  include/sysemu/accel.h |  4 +---
> >  accel/accel.c          | 12 ------------
> >  hw/core/qdev.c         | 11 +++++++++++
> >  hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
> >  qom/object.c           | 25 +++++++++++++++++++++++++
> >  vl.c                   |  2 +-
> >  8 files changed, 73 insertions(+), 35 deletions(-)
> >
> > diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> > index a24d0dd566..82afd3c50d 100644
> > --- a/include/hw/qdev-core.h
> > +++ b/include/hw/qdev-core.h
> > @@ -267,6 +267,19 @@ typedef struct GlobalProperty {
> >      Error **errp;
> >  } GlobalProperty;
> >
> > +#define SET_COMPAT(S, COMPAT)                                       \
> > +    do {                                                            \
> > +        int i;                                                      \
> > +        static GlobalProperty props[] = {                           \
> > +            COMPAT                                                  \
> > +        };                                                          \
> > +        for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
> > +            g_ptr_array_add((S)->compat_props, (void *)&props[i]);  \
> > +        }                                                           \
> > +    } while (0)
>
> I think this macro would be an acceptable alternative to the
> existing SET_MACHINE_COMPAT macro trickery, but:
>
> > +
> > +void accel_register_compat_props(const GPtrArray *props);
> [...]
> > @@ -185,7 +183,9 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
> >      ac->init_machine = xen_init;
> >      ac->setup_post = xen_setup_post;
> >      ac->allowed = &xen_allowed;
> > -    ac->global_props = xen_compat_props;
> > +    ac->compat_props = g_ptr_array_new();
> > +
> > +    SET_COMPAT(ac, XEN_COMPAT);
>
> I think this is a step backwards.  I like us to be able to
> register compat properties without macro magic.  The existence of
> SET_MACHINE_COMPAT is a bug and not a feature.
>
> If you really want to use GPtrArray instead of a simple
> GlobalProperty* field (I'm not sure I understand the reasoning
> behind the choice to use GPtrArray), what about:

Except in the Xen case, It needs to register multiple GlobalProperty*,
not necessarily from contiguous in memory. That's why we have an array
of ptr.

>
> static GPtrArray *build_compat_props_array(GlobalProperty *props)
> {
>     GlobalProperty *p = props;
>     GPtrArray *array = g_ptr_array_new();
>     while (p->driver) {
>         g_ptr_array_add(array, (void *)p);
>     }
>     return array;
> }
>
>
> static void xen_accel_class_init(ObjectClass *oc, void *data)
> {
>     ...
>     ac->compat_props = build_compat_props_array(xen_compat_props);

If we would register from one place, that would be fine.

We could replace the macro by a function, then we would have to
declare the GlobalProperty arrays manually basically.

> }
>
>
>
> >  }
> >
> >  #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
> > diff --git a/qom/object.c b/qom/object.c
> > index 17921c0a71..dbdab0aead 100644
> > --- a/qom/object.c
> > +++ b/qom/object.c
> > @@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
> >      }
> >  }
> >
> > +void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
> > +{
> > +    Error *err = NULL;
> > +    int i;
> > +
> > +    if (!props) {
> > +        return;
> > +    }
> > +
> > +    for (i = 0; i < props->len; i++) {
> > +        GlobalProperty *p = g_ptr_array_index(props, i);
> > +
> > +        if (object_dynamic_cast(obj, p->driver) == NULL) {
> > +            continue;
> > +        }
> > +        p->used = true;
> > +        object_property_parse(obj, p->value, p->property, &err);
> > +        if (err != NULL) {
> > +            error_prepend(&err, "can't apply global %s.%s=%s: ",
> > +                          p->driver, p->property, p->value);
> > +            error_propagate(errp, err);
> > +        }
> > +    }
> > +}
> > +
> >  static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
> >  {
> >      Object *obj = data;
> > diff --git a/vl.c b/vl.c
> > index fa25d1ae2d..c06e94271c 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
> >   */
> >  static void register_global_properties(MachineState *ms)
> >  {
> > -    accel_register_compat_props(ms->accelerator);
> > +    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
> >      machine_register_compat_props(ms);
> >      user_register_global_props();
> >  }
> > --
> > 2.20.0.rc1
> >
> >
>
> --
> Eduardo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-27 13:35       ` Eduardo Habkost
@ 2018-11-28 17:40         ` Igor Mammedov
  2018-11-28 17:53           ` Eduardo Habkost
  2018-11-29 10:32           ` Marc-André Lureau
  0 siblings, 2 replies; 70+ messages in thread
From: Igor Mammedov @ 2018-11-28 17:40 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Marc-André Lureau, qemu-devel, Peter Maydell,
	Marcel Apfelbaum, Bonzini, Paolo, Richard Henderson,
	Michael S . Tsirkin, david, cohuck, David Hildenbrand,
	borntraeger, qemu-arm, qemu-ppc, qemu-s390x

On Tue, 27 Nov 2018 11:35:27 -0200
Eduardo Habkost <ehabkost@redhat.com> wrote:

> On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:
> > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:  
> > >
> > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:  
> > > > Similarly to accel properties, move compat properties out of globals
> > > > registration, and apply the machine compat properties during
> > > > device_post_init().
> > > >
> > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>  
> > > [...]  
> > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > index 7066d28271..3b31b2c025 100644
> > > > --- a/hw/core/qdev.c
> > > > +++ b/hw/core/qdev.c
> > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > >  }
> > > >
> > > >  static const GPtrArray *ac_compat_props;
> > > > +static const GPtrArray *mc_compat_props;
why you didn't use just 'compat_props' for both?
(it would be cleaner have single registry for compat
properties, and the place that takes care of registration
will take care of necessary ordering)

> > > >
> > > >  void accel_register_compat_props(const GPtrArray *props)
> > > >  {
> > > >      ac_compat_props = props;
> > > >  }
> > > >
> > > > +void machine_register_compat_props(const GPtrArray *props)
> > > > +{
> > > > +    mc_compat_props = props;
> > > > +}
> > > > +
> > > >  static void device_post_init(Object *obj)
> > > >  {
> > > >      if (ac_compat_props) {
> > > >          object_apply_global_props(obj, ac_compat_props, &error_abort);
> > > >      }  
> > >
> > > Why not just use MACHINE(qdev_get_machine())->accel->compat_props
> > > directly?
> > >  
> > > > +    if (mc_compat_props) {
> > > > +        object_apply_global_props(obj, mc_compat_props, &error_abort);
> > > > +    }  
> > >
> > > Why not just use MACHINE(qdev_get_machine())->compat_props
> > > directly?  
> > 
> > This was the approach in v3, but Igor didn't quite like referencing
> > machine in qdev:
> > https://lists.nongnu.org/archive/html/qemu-devel/2018-11/msg04774.html  
> 
> I disagree with Igor, here.  Core qdev code already have multiple
> references to machine, I don't see any problem with that.
(There are only 3 calls to qdev_get_machine() in core qdev.c
blame me for adding one there. Which were hacks so we won't
have to re-factor core qdev code. But that doesn't justify adding more.)

This patch is an interim one and later in 25/28
device_post_init() content is moved to a more generic compat interface
implementation. That intended for use with types derived from Object
(i.e. not only qdev stuff). Hence I'd like to decouple it from
machine as a standalone feature as much as possible. So that
machine (or whatever else) will opt in in using facility.

> The previous code was clearer and easier to follow, and wasn't
> sensitive to subtle changes in initialization ordering (e.g. what
> happens if we create a device before *_register_compat_props() is
> called?).
Indeed It seems clearer to follow (that was my first impression as well),
until I went through whole series and thought it's basically the same,
So my choice was to use cleaner approach that we won't have to rewrite
in near future.

Thanks for bringing up ordering issue, we probably have one in this series.

But beside possible issue here, even with v3 variant we would still have
issues if objects are created before machine and accelerator instances are
created.
More correct way could be to register compat properties right away at
select_machine() time, we don't really need an instance for that, just access
to machine_class and do the same for 'accel' option. (that's probably doable
within this series) + some time later (on top of this series) a check that
no TYPE_COMPAT_PROPS were created at the moment compat properties are registered
so we would notice when we write something wrong.

If it's too much of refactoring (series is already big as it is), I would
compromise on qdev_get_machine() and adding TODO comments (or a series on top)
to make it correct and "race-resistant".

Marc are you sure it actually will work as expected with Object derived types?
   register_global_properties()
is being called after
   qemu_opts_foreach(... user_creatable_add_opts_foreach, object_create_initial ...)
so there is no compat properties registered when objects are created.
 
> >   
> > >  
> > > >
> > > >      qdev_prop_set_globals(DEVICE(obj));
> > > >  }  
> > > [...]
> > >
> > > --
> > > Eduardo  
> 

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 14/28] qom: remove unimplemented class_finalize
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 14/28] qom: remove unimplemented class_finalize Marc-André Lureau
  2018-11-27 12:52   ` Eduardo Habkost
@ 2018-11-28 17:44   ` Igor Mammedov
  1 sibling, 0 replies; 70+ messages in thread
From: Igor Mammedov @ 2018-11-28 17:44 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Andreas Färber, Eduardo Habkost

On Tue, 27 Nov 2018 13:27:47 +0400
Marc-André Lureau <marcandre.lureau@redhat.com> wrote:

> Instead of trying to implement something that isn't well specified,
> remove it. (it would be tricky to implement, since a class struct is
> memcpy on children types...)
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Igor Mammedov <imammedo@redhat.com>

> ---
>  include/qom/object.h |  7 ++-----
>  hw/core/machine.c    | 11 -----------
>  qom/object.c         |  2 --
>  3 files changed, 2 insertions(+), 18 deletions(-)
> 
> diff --git a/include/qom/object.h b/include/qom/object.h
> index f0b0bf39cc..0139838b69 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -455,10 +455,8 @@ struct Object
>   *   parent class initialization has occurred, but before the class itself
>   *   is initialized.  This is the function to use to undo the effects of
>   *   memcpy from the parent class to the descendants.
> - * @class_finalize: This function is called during class destruction and is
> - *   meant to release and dynamic parameters allocated by @class_init.
> - * @class_data: Data to pass to the @class_init, @class_base_init and
> - *   @class_finalize functions.  This can be useful when building dynamic
> + * @class_data: Data to pass to the @class_init,
> + *   @class_base_init. This can be useful when building dynamic
>   *   classes.
>   * @interfaces: The list of interfaces associated with this type.  This
>   *   should point to a static array that's terminated with a zero filled
> @@ -479,7 +477,6 @@ struct TypeInfo
>  
>      void (*class_init)(ObjectClass *klass, void *data);
>      void (*class_base_init)(ObjectClass *klass, void *data);
> -    void (*class_finalize)(ObjectClass *klass, void *data);
>      void *class_data;
>  
>      InterfaceInfo *interfaces;
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index da50ad6de7..c51423b647 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -834,16 +834,6 @@ void machine_run_board_init(MachineState *machine)
>      machine_class->init(machine);
>  }
>  
> -static void machine_class_finalize(ObjectClass *klass, void *data)
> -{
> -    MachineClass *mc = MACHINE_CLASS(klass);
> -
> -    if (mc->compat_props) {
> -        g_array_free(mc->compat_props, true);
> -    }
> -    g_free(mc->name);
> -}
> -
>  void machine_register_compat_props(MachineState *machine)
>  {
>      MachineClass *mc = MACHINE_GET_CLASS(machine);
> @@ -869,7 +859,6 @@ static const TypeInfo machine_info = {
>      .class_size = sizeof(MachineClass),
>      .class_init    = machine_class_init,
>      .class_base_init = machine_class_base_init,
> -    .class_finalize = machine_class_finalize,
>      .instance_size = sizeof(MachineState),
>      .instance_init = machine_initfn,
>      .instance_finalize = machine_finalize,
> diff --git a/qom/object.c b/qom/object.c
> index eb770dbf7f..17921c0a71 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -49,7 +49,6 @@ struct TypeImpl
>  
>      void (*class_init)(ObjectClass *klass, void *data);
>      void (*class_base_init)(ObjectClass *klass, void *data);
> -    void (*class_finalize)(ObjectClass *klass, void *data);
>  
>      void *class_data;
>  
> @@ -114,7 +113,6 @@ static TypeImpl *type_new(const TypeInfo *info)
>  
>      ti->class_init = info->class_init;
>      ti->class_base_init = info->class_base_init;
> -    ti->class_finalize = info->class_finalize;
>      ti->class_data = info->class_data;
>  
>      ti->instance_init = info->instance_init;

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
  2018-11-27  9:27   ` Marc-André Lureau
@ 2018-11-28 17:49     ` Igor Mammedov
  -1 siblings, 0 replies; 70+ messages in thread
From: Igor Mammedov @ 2018-11-28 17:49 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, Stefano Stabellini, Anthony Perard,
	Andreas Färber, Paolo Bonzini, open list:X86

On Tue, 27 Nov 2018 13:27:48 +0400
Marc-André Lureau <marcandre.lureau@redhat.com> wrote:

> Introduce object_apply_global_props() function, to apply compatibility
> properties from a GPtrArray.
> 
> For accel compatibility properties, apply them during
> device_post_init(), after accel_register_compat_props() has set them.
> 
> To populate the compatibility properties, introduce SET_COMPAT(), a
> more generic version of SET_MACHINE_COMPAT() that can set compat
> properties on other objects than Machine, and using GPtrArray.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/hw/qdev-core.h | 13 +++++++++++++
>  include/qom/object.h   |  3 +++
>  include/sysemu/accel.h |  4 +---
>  accel/accel.c          | 12 ------------
>  hw/core/qdev.c         | 11 +++++++++++
>  hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
>  qom/object.c           | 25 +++++++++++++++++++++++++
>  vl.c                   |  2 +-
>  8 files changed, 73 insertions(+), 35 deletions(-)
> 
[...]

> diff --git a/vl.c b/vl.c
> index fa25d1ae2d..c06e94271c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
>   */
>  static void register_global_properties(MachineState *ms)
>  {
> -    accel_register_compat_props(ms->accelerator);
> +    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Acceptable way to do above is:
 Foo *foo =CAST(something)
 FUNC(foo->member)
if I recall correctly

>      machine_register_compat_props(ms);
>      user_register_global_props();
>  }

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

* Re: [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
@ 2018-11-28 17:49     ` Igor Mammedov
  0 siblings, 0 replies; 70+ messages in thread
From: Igor Mammedov @ 2018-11-28 17:49 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Stefano Stabellini, qemu-devel, open list:X86, Anthony Perard,
	Paolo Bonzini, Andreas Färber

On Tue, 27 Nov 2018 13:27:48 +0400
Marc-André Lureau <marcandre.lureau@redhat.com> wrote:

> Introduce object_apply_global_props() function, to apply compatibility
> properties from a GPtrArray.
> 
> For accel compatibility properties, apply them during
> device_post_init(), after accel_register_compat_props() has set them.
> 
> To populate the compatibility properties, introduce SET_COMPAT(), a
> more generic version of SET_MACHINE_COMPAT() that can set compat
> properties on other objects than Machine, and using GPtrArray.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/hw/qdev-core.h | 13 +++++++++++++
>  include/qom/object.h   |  3 +++
>  include/sysemu/accel.h |  4 +---
>  accel/accel.c          | 12 ------------
>  hw/core/qdev.c         | 11 +++++++++++
>  hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
>  qom/object.c           | 25 +++++++++++++++++++++++++
>  vl.c                   |  2 +-
>  8 files changed, 73 insertions(+), 35 deletions(-)
> 
[...]

> diff --git a/vl.c b/vl.c
> index fa25d1ae2d..c06e94271c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
>   */
>  static void register_global_properties(MachineState *ms)
>  {
> -    accel_register_compat_props(ms->accelerator);
> +    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Acceptable way to do above is:
 Foo *foo =CAST(something)
 FUNC(foo->member)
if I recall correctly

>      machine_register_compat_props(ms);
>      user_register_global_props();
>  }


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-28 17:40         ` Igor Mammedov
@ 2018-11-28 17:53           ` Eduardo Habkost
  2018-11-29 10:32           ` Marc-André Lureau
  1 sibling, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-28 17:53 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Marc-André Lureau, qemu-devel, Peter Maydell,
	Marcel Apfelbaum, Bonzini, Paolo, Richard Henderson,
	Michael S . Tsirkin, david, cohuck, David Hildenbrand,
	borntraeger, qemu-arm, qemu-ppc, qemu-s390x

On Wed, Nov 28, 2018 at 06:40:27PM +0100, Igor Mammedov wrote:
> On Tue, 27 Nov 2018 11:35:27 -0200
> Eduardo Habkost <ehabkost@redhat.com> wrote:
> 
> > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:
> > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:  
> > > >
> > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:  
> > > > > Similarly to accel properties, move compat properties out of globals
> > > > > registration, and apply the machine compat properties during
> > > > > device_post_init().
> > > > >
> > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>  
> > > > [...]  
> > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > index 7066d28271..3b31b2c025 100644
> > > > > --- a/hw/core/qdev.c
> > > > > +++ b/hw/core/qdev.c
> > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > >  }
> > > > >
> > > > >  static const GPtrArray *ac_compat_props;
> > > > > +static const GPtrArray *mc_compat_props;
> why you didn't use just 'compat_props' for both?
> (it would be cleaner have single registry for compat
> properties, and the place that takes care of registration
> will take care of necessary ordering)
> 
> > > > >
> > > > >  void accel_register_compat_props(const GPtrArray *props)
> > > > >  {
> > > > >      ac_compat_props = props;
> > > > >  }
> > > > >
> > > > > +void machine_register_compat_props(const GPtrArray *props)
> > > > > +{
> > > > > +    mc_compat_props = props;
> > > > > +}
> > > > > +
> > > > >  static void device_post_init(Object *obj)
> > > > >  {
> > > > >      if (ac_compat_props) {
> > > > >          object_apply_global_props(obj, ac_compat_props, &error_abort);
> > > > >      }  
> > > >
> > > > Why not just use MACHINE(qdev_get_machine())->accel->compat_props
> > > > directly?
> > > >  
> > > > > +    if (mc_compat_props) {
> > > > > +        object_apply_global_props(obj, mc_compat_props, &error_abort);
> > > > > +    }  
> > > >
> > > > Why not just use MACHINE(qdev_get_machine())->compat_props
> > > > directly?  
> > > 
> > > This was the approach in v3, but Igor didn't quite like referencing
> > > machine in qdev:
> > > https://lists.nongnu.org/archive/html/qemu-devel/2018-11/msg04774.html  
> > 
> > I disagree with Igor, here.  Core qdev code already have multiple
> > references to machine, I don't see any problem with that.
> (There are only 3 calls to qdev_get_machine() in core qdev.c
> blame me for adding one there. Which were hacks so we won't
> have to re-factor core qdev code. But that doesn't justify adding more.)
> 
> This patch is an interim one and later in 25/28
> device_post_init() content is moved to a more generic compat interface
> implementation. That intended for use with types derived from Object
> (i.e. not only qdev stuff). Hence I'd like to decouple it from
> machine as a standalone feature as much as possible. So that
> machine (or whatever else) will opt in in using facility.

Why do you want to decouple that from machine?  The whole purpose
of the code being added by this patch (and of TYPE_COMPAT_PROPS)
is to have objects being affected by machine-provided and
accel-provided compat properties.  Having a dependency on
machine+accel is part of its specification.


> 
> > The previous code was clearer and easier to follow, and wasn't
> > sensitive to subtle changes in initialization ordering (e.g. what
> > happens if we create a device before *_register_compat_props() is
> > called?).
> Indeed It seems clearer to follow (that was my first impression as well),
> until I went through whole series and thought it's basically the same,
> So my choice was to use cleaner approach that we won't have to rewrite
> in near future.

Why you think it is cleaner?  Copying data around to static
variables isn't cleaner and it's more fragile.

> 
> Thanks for bringing up ordering issue, we probably have one in this series.
> 
> But beside possible issue here, even with v3 variant we would still have
> issues if objects are created before machine and accelerator instances are
> created.
> More correct way could be to register compat properties right away at
> select_machine() time, we don't really need an instance for that, just access
> to machine_class and do the same for 'accel' option. (that's probably doable
> within this series) + some time later (on top of this series) a check that
> no TYPE_COMPAT_PROPS were created at the moment compat properties are registered
> so we would notice when we write something wrong.

What problem you are trying to solve with this extra complexity,
exactly?

> 
> If it's too much of refactoring (series is already big as it is), I would
> compromise on qdev_get_machine() and adding TODO comments (or a series on top)
> to make it correct and "race-resistant".

It's not clear to me what the TODO comment would say.  What's the
issue you're trying to solve?


> 
> Marc are you sure it actually will work as expected with Object derived types?
>    register_global_properties()
> is being called after
>    qemu_opts_foreach(... user_creatable_add_opts_foreach, object_create_initial ...)
> so there is no compat properties registered when objects are created.
>  
> > >   
> > > >  
> > > > >
> > > > >      qdev_prop_set_globals(DEVICE(obj));
> > > > >  }  
> > > > [...]
> > > >
> > > > --
> > > > Eduardo  
> > 
> 

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (28 preceding siblings ...)
  2018-11-27  9:53 ` [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Greg Kurz
@ 2018-11-29  1:35 ` no-reply
  2018-11-29  1:45 ` no-reply
  30 siblings, 0 replies; 70+ messages in thread
From: no-reply @ 2018-11-29  1:35 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: famz, qemu-devel, imammedo

Hi,

This series failed docker-mingw@fedora build test. Please find the testing commands and
their output below. If you have Docker installed, you can probably reproduce it
locally.

Type: series
Subject: [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties
Message-id: 20181127092801.21777-1-marcandre.lureau@redhat.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash
time make docker-test-mingw@fedora SHOW_ENV=1 J=8
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
dc9253d hostmem: use object id for memory region name with >= 3.1
fe3bf67 hw/arm/virt: add virt-3.2 machine type
31f5bd6 hw/i386: add pc-i440fx-3.2 & pc-q35-3.2
3b0b8e6 machine: add compat-props interface
4a14ed5 arm: replace instance_post_init()
f3d5327 qom: add object_class_get_class_data()
c29b239 qom: teach interfaces to implement post-init
9cc5ad4 qdev-props: call object_apply_global_props()
70e9d46 qdev-props: remove errp from GlobalProperty
0e3d981 qdev-props: convert global_props to GPtrArray
2a2ec6a qdev: all globals are now user-provided
0bc5b7b hw: remove SET_MACHINE_COMPAT
851e70b hw: apply machine compat properties without touching globals
acd5576 hw: apply accel compat properties without touching globals
c4af6bd qom: remove unimplemented class_finalize
db6199f qdev: move qdev_prop_register_global_list() to tests
fae3261 accel: register global_props like machine globals
e86b095 qom: make user_creatable_complete() specific to UserCreatable
758abb5 qom: make interface types abstract
f2b0f9b tests: qdev_prop_check_globals() doesn't return "all_used"
65d13a9 Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20181126' into staging
134e216 net: cadence_gem: Remove incorrect assert()
421842e MAINTAINERS: Add an ARM SMMU section
cda0d1d MAINTAINERS: Assign some more files in the hw/arm/ directory

=== OUTPUT BEGIN ===
  BUILD   fedora
make[1]: Entering directory `/var/tmp/patchew-tester-tmp-ifcyq5e1/src'
  GEN     /var/tmp/patchew-tester-tmp-ifcyq5e1/src/docker-src.2018-11-28-20.25.35.29416/qemu.tar
Cloning into '/var/tmp/patchew-tester-tmp-ifcyq5e1/src/docker-src.2018-11-28-20.25.35.29416/qemu.tar.vroot'...
done.
Checking out files:  46% (3030/6464)   
Checking out files:  47% (3039/6464)   
Checking out files:  48% (3103/6464)   
Checking out files:  49% (3168/6464)   
Checking out files:  50% (3232/6464)   
Checking out files:  51% (3297/6464)   
Checking out files:  52% (3362/6464)   
Checking out files:  53% (3426/6464)   
Checking out files:  54% (3491/6464)   
Checking out files:  55% (3556/6464)   
Checking out files:  56% (3620/6464)   
Checking out files:  57% (3685/6464)   
Checking out files:  58% (3750/6464)   
Checking out files:  59% (3814/6464)   
Checking out files:  60% (3879/6464)   
Checking out files:  61% (3944/6464)   
Checking out files:  62% (4008/6464)   
Checking out files:  63% (4073/6464)   
Checking out files:  64% (4137/6464)   
Checking out files:  65% (4202/6464)   
Checking out files:  66% (4267/6464)   
Checking out files:  67% (4331/6464)   
Checking out files:  68% (4396/6464)   
Checking out files:  69% (4461/6464)   
Checking out files:  70% (4525/6464)   
Checking out files:  71% (4590/6464)   
Checking out files:  72% (4655/6464)   
Checking out files:  73% (4719/6464)   
Checking out files:  74% (4784/6464)   
Checking out files:  75% (4848/6464)   
Checking out files:  76% (4913/6464)   
Checking out files:  77% (4978/6464)   
Checking out files:  78% (5042/6464)   
Checking out files:  79% (5107/6464)   
Checking out files:  80% (5172/6464)   
Checking out files:  81% (5236/6464)   
Checking out files:  82% (5301/6464)   
Checking out files:  83% (5366/6464)   
Checking out files:  84% (5430/6464)   
Checking out files:  85% (5495/6464)   
Checking out files:  86% (5560/6464)   
Checking out files:  87% (5624/6464)   
Checking out files:  88% (5689/6464)   
Checking out files:  89% (5753/6464)   
Checking out files:  90% (5818/6464)   
Checking out files:  91% (5883/6464)   
Checking out files:  92% (5947/6464)   
Checking out files:  93% (6012/6464)   
Checking out files:  94% (6077/6464)   
Checking out files:  95% (6141/6464)   
Checking out files:  96% (6206/6464)   
Checking out files:  97% (6271/6464)   
Checking out files:  98% (6335/6464)   
Checking out files:  99% (6400/6464)   
Checking out files: 100% (6464/6464)   
Checking out files: 100% (6464/6464), done.
Submodule 'dtc' (https://git.qemu.org/git/dtc.git) registered for path 'dtc'
Cloning into 'dtc'...
Submodule path 'dtc': checked out '88f18909db731a627456f26d779445f84e449536'
Submodule 'ui/keycodemapdb' (https://git.qemu.org/git/keycodemapdb.git) registered for path 'ui/keycodemapdb'
Cloning into 'ui/keycodemapdb'...
Submodule path 'ui/keycodemapdb': checked out '6b3d716e2b6472eb7189d3220552280ef3d832ce'
  COPY    RUNNER
    RUN test-mingw in qemu:fedora 
Packages installed:
SDL2-devel-2.0.9-1.fc28.x86_64
bc-1.07.1-5.fc28.x86_64
bison-3.0.4-9.fc28.x86_64
bluez-libs-devel-5.50-1.fc28.x86_64
brlapi-devel-0.6.7-19.fc28.x86_64
bzip2-1.0.6-26.fc28.x86_64
bzip2-devel-1.0.6-26.fc28.x86_64
ccache-3.4.2-2.fc28.x86_64
clang-6.0.1-2.fc28.x86_64
device-mapper-multipath-devel-0.7.4-3.git07e7bd5.fc28.x86_64
findutils-4.6.0-19.fc28.x86_64
flex-2.6.1-7.fc28.x86_64
gcc-8.2.1-5.fc28.x86_64
gcc-c++-8.2.1-5.fc28.x86_64
gettext-0.19.8.1-14.fc28.x86_64
git-2.17.2-1.fc28.x86_64
glib2-devel-2.56.3-2.fc28.x86_64
glusterfs-api-devel-4.1.5-1.fc28.x86_64
gnutls-devel-3.6.4-1.fc28.x86_64
gtk3-devel-3.22.30-1.fc28.x86_64
hostname-3.20-3.fc28.x86_64
libaio-devel-0.3.110-11.fc28.x86_64
libasan-8.2.1-5.fc28.x86_64
libattr-devel-2.4.48-3.fc28.x86_64
libcap-devel-2.25-9.fc28.x86_64
libcap-ng-devel-0.7.9-4.fc28.x86_64
libcurl-devel-7.59.0-8.fc28.x86_64
libfdt-devel-1.4.7-1.fc28.x86_64
libpng-devel-1.6.34-6.fc28.x86_64
librbd-devel-12.2.8-1.fc28.x86_64
libssh2-devel-1.8.0-7.fc28.x86_64
libubsan-8.2.1-5.fc28.x86_64
libusbx-devel-1.0.22-1.fc28.x86_64
libxml2-devel-2.9.8-4.fc28.x86_64
llvm-6.0.1-8.fc28.x86_64
lzo-devel-2.08-12.fc28.x86_64
make-4.2.1-6.fc28.x86_64
mingw32-SDL2-2.0.9-1.fc28.noarch
mingw32-bzip2-1.0.6-9.fc27.noarch
mingw32-curl-7.57.0-1.fc28.noarch
mingw32-glib2-2.56.1-1.fc28.noarch
mingw32-gmp-6.1.2-2.fc27.noarch
mingw32-gnutls-3.6.3-1.fc28.noarch
mingw32-gtk3-3.22.30-1.fc28.noarch
mingw32-libjpeg-turbo-1.5.1-3.fc27.noarch
mingw32-libpng-1.6.29-2.fc27.noarch
mingw32-libssh2-1.8.0-3.fc27.noarch
mingw32-libtasn1-4.13-1.fc28.noarch
mingw32-nettle-3.4-1.fc28.noarch
mingw32-pixman-0.34.0-3.fc27.noarch
mingw32-pkg-config-0.28-9.fc27.x86_64
mingw64-SDL2-2.0.9-1.fc28.noarch
mingw64-bzip2-1.0.6-9.fc27.noarch
mingw64-curl-7.57.0-1.fc28.noarch
mingw64-glib2-2.56.1-1.fc28.noarch
mingw64-gmp-6.1.2-2.fc27.noarch
mingw64-gnutls-3.6.3-1.fc28.noarch
mingw64-gtk3-3.22.30-1.fc28.noarch
mingw64-libjpeg-turbo-1.5.1-3.fc27.noarch
mingw64-libpng-1.6.29-2.fc27.noarch
mingw64-libssh2-1.8.0-3.fc27.noarch
mingw64-libtasn1-4.13-1.fc28.noarch
mingw64-nettle-3.4-1.fc28.noarch
mingw64-pixman-0.34.0-3.fc27.noarch
mingw64-pkg-config-0.28-9.fc27.x86_64
ncurses-devel-6.1-5.20180224.fc28.x86_64
nettle-devel-3.4-2.fc28.x86_64
nss-devel-3.39.0-1.0.fc28.x86_64
numactl-devel-2.0.11-8.fc28.x86_64
package PyYAML is not installed
package libjpeg-devel is not installed
perl-5.26.2-414.fc28.x86_64
pixman-devel-0.34.0-8.fc28.x86_64
python3-3.6.6-1.fc28.x86_64
snappy-devel-1.1.7-5.fc28.x86_64
sparse-0.5.2-1.fc28.x86_64
spice-server-devel-0.14.0-4.fc28.x86_64
systemtap-sdt-devel-4.0-1.fc28.x86_64
tar-1.30-3.fc28.x86_64
usbredir-devel-0.8.0-1.fc28.x86_64
virglrenderer-devel-0.6.0-4.20170210git76b3da97b.fc28.x86_64
vte3-devel-0.36.5-6.fc28.x86_64
which-2.21-8.fc28.x86_64
xen-devel-4.10.2-2.fc28.x86_64
zlib-devel-1.2.11-8.fc28.x86_64

Environment variables:
TARGET_LIST=
PACKAGES=bc     bison     bluez-libs-devel     brlapi-devel     bzip2     bzip2-devel     ccache     clang     device-mapper-multipath-devel     findutils     flex     gcc     gcc-c++     gettext     git     glib2-devel     glusterfs-api-devel     gnutls-devel     gtk3-devel     hostname     libaio-devel     libasan     libattr-devel     libcap-devel     libcap-ng-devel     libcurl-devel     libfdt-devel     libjpeg-devel     libpng-devel     librbd-devel     libssh2-devel     libubsan     libusbx-devel     libxml2-devel     llvm     lzo-devel     make     mingw32-bzip2     mingw32-curl     mingw32-glib2     mingw32-gmp     mingw32-gnutls     mingw32-gtk3     mingw32-libjpeg-turbo     mingw32-libpng     mingw32-libssh2     mingw32-libtasn1     mingw32-nettle     mingw32-pixman     mingw32-pkg-config     mingw32-SDL2     mingw64-bzip2     mingw64-curl     mingw64-glib2     mingw64-gmp     mingw64-gnutls     mingw64-gtk3     mingw64-libjpeg-turbo     mingw64-libpng     mingw64-libssh2     mingw64-libtasn1     mingw64-nettle     mingw64-pixman     mingw64-pkg-config     mingw64-SDL2     ncurses-devel     nettle-devel     nss-devel     numactl-devel     perl     pixman-devel     python3     PyYAML     SDL2-devel     snappy-devel     sparse     spice-server-devel     systemtap-sdt-devel     tar     usbredir-devel     virglrenderer-devel     vte3-devel     which     xen-devel     zlib-devel
J=8
V=
HOSTNAME=154f1b15c299
DEBUG=
SHOW_ENV=1
PWD=/
HOME=/
CCACHE_DIR=/var/tmp/ccache
FBR=f28
DISTTAG=f28container
QEMU_CONFIGURE_OPTS=--python=/usr/bin/python3
FGC=f28
TEST_DIR=/tmp/qemu-test
SHLVL=1
FEATURES=mingw clang pyyaml asan dtc
PATH=/usr/lib/ccache:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAKEFLAGS= -j8
EXTRA_CONFIGURE_OPTS=
_=/usr/bin/env

Configure options:
--enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/tmp/qemu-test/install --python=/usr/bin/python3 --cross-prefix=x86_64-w64-mingw32- --enable-trace-backends=simple --enable-gnutls --enable-nettle --enable-curl --enable-vnc --enable-bzip2 --enable-guest-agent --with-sdlabi=2.0
Install prefix    /tmp/qemu-test/install
BIOS directory    /tmp/qemu-test/install
firmware path     /tmp/qemu-test/install/share/qemu-firmware
binary directory  /tmp/qemu-test/install
library directory /tmp/qemu-test/install/lib
module directory  /tmp/qemu-test/install/lib
libexec directory /tmp/qemu-test/install/libexec
include directory /tmp/qemu-test/install/include
config directory  /tmp/qemu-test/install
local state directory   queried at runtime
Windows SDK       no
Source path       /tmp/qemu-test/src
GIT binary        git
GIT submodules    
C compiler        x86_64-w64-mingw32-gcc
Host C compiler   cc
C++ compiler      x86_64-w64-mingw32-g++
Objective-C compiler clang
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/pixman-1  -I$(SRC_PATH)/dtc/libfdt -Werror -DHAS_LIBSSH2_SFTP_FSYNC -I/usr/x86_64-w64-mingw32/sys-root/mingw/include  -mms-bitfields -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/glib-2.0 -I/usr/x86_64-w64-mingw32/sys-root/mingw/lib/glib-2.0/include -I/usr/x86_64-w64-mingw32/sys-root/mingw/include  -m64 -mcx16 -mthreads -D__USE_MINGW_ANSI_STDIO=1 -DWIN32_LEAN_AND_MEAN -DWINVER=0x501 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wexpansion-to-defined -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/x86_64-w64-mingw32/sys-root/mingw/include -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/p11-kit-1  -I/usr/x86_64-w64-mingw32/sys-root/mingw/include   -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/libpng16 
LDFLAGS           -Wl,--nxcompat -Wl,--no-seh -Wl,--dynamicbase -Wl,--warn-common -m64 -g 
QEMU_LDFLAGS      -L$(BUILD_DIR)/dtc/libfdt 
make              make
install           install
python            /usr/bin/python3 -B
smbd              /usr/sbin/smbd
module support    no
host CPU          x86_64
host big endian   no
target list       x86_64-softmmu aarch64-softmmu
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
SDL support       yes (2.0.9)
GTK support       yes (3.22.30)
GTK GL support    no
VTE support       no 
TLS priority      NORMAL
GNUTLS support    yes
libgcrypt         no
nettle            yes (3.4)
libtasn1          yes
curses support    no
virgl support     no 
curl support      yes
mingw32 support   yes
Audio drivers     dsound
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    no
Multipath support no
VNC support       yes
VNC SASL support  no
VNC JPEG support  yes
VNC PNG support   yes
xen support       no
brlapi support    no
bluez  support    no
Documentation     no
PIE               no
vde support       no
netmap support    no
Linux AIO support no
ATTR/XATTR support no
Install blobs     yes
KVM support       no
HAX support       yes
HVF support       no
WHPX support      no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
malloc trim support no
RDMA support      no
PVRDMA support    no
fdt support       git
membarrier        no
preadv support    no
fdatasync         no
madvise           no
posix_madvise     no
posix_memalign    no
libcap-ng support no
vhost-net support no
vhost-crypto support no
vhost-scsi support no
vhost-vsock support no
vhost-user support no
Trace backends    simple
Trace output file trace-<pid>
spice support     no 
rbd support       no
xfsctl support    no
smartcard support no
libusb            no
usb net redir     no
OpenGL support    no
OpenGL dmabufs    no
libiscsi support  no
libnfs support    no
build guest agent yes
QGA VSS support   no
QGA w32 disk info yes
QGA MSI support   no
seccomp support   no
coroutine backend win32
coroutine pool    yes
debug stack usage no
mutex debugging   no
crypto afalg      no
GlusterFS support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   yes
TPM passthrough   no
TPM emulator      no
QOM debugging     yes
Live block migration yes
lzo support       no
snappy support    no
bzip2 support     yes
NUMA host support no
libxml2           no
tcmalloc support  no
jemalloc support  no
avx2 optimization yes
replication support yes
VxHS block device no
bochs support     yes
cloop support     yes
dmg support       yes
qcow v1 support   yes
vdi support       yes
vvfat support     yes
qed support       yes
parallels support yes
sheepdog support  yes
capstone          no
docker            no
libpmem support   no
libudev           no

NOTE: cross-compilers enabled:  'x86_64-w64-mingw32-gcc'
  GEN     x86_64-softmmu/config-devices.mak.tmp
  GEN     aarch64-softmmu/config-devices.mak.tmp
  GEN     qemu-options.def
  GEN     config-host.h
  GEN     qapi-gen
  GEN     trace/generated-tcg-tracers.h
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-helpers.h
  GEN     trace/generated-helpers.c
  GEN     aarch64-softmmu/config-devices.mak
  GEN     x86_64-softmmu/config-devices.mak
  GEN     module_block.h
  GEN     ui/input-keymap-atset1-to-qcode.c
  GEN     ui/input-keymap-linux-to-qcode.c
  GEN     ui/input-keymap-qcode-to-atset1.c
  GEN     ui/input-keymap-qcode-to-atset2.c
  GEN     ui/input-keymap-qcode-to-atset3.c
  GEN     ui/input-keymap-qcode-to-linux.c
  GEN     ui/input-keymap-qcode-to-qnum.c
  GEN     ui/input-keymap-qcode-to-sun.c
  GEN     ui/input-keymap-qnum-to-qcode.c
  GEN     ui/input-keymap-usb-to-qcode.c
  GEN     ui/input-keymap-win32-to-qcode.c
  GEN     ui/input-keymap-x11-to-qcode.c
  GEN     ui/input-keymap-xorgevdev-to-qcode.c
  GEN     ui/input-keymap-xorgkbd-to-qcode.c
  GEN     ui/input-keymap-xorgxquartz-to-qcode.c
  GEN     ui/input-keymap-xorgxwin-to-qcode.c
  GEN     ui/input-keymap-osx-to-qcode.c
  GEN     tests/test-qapi-gen
  GEN     trace-root.h
  GEN     accel/kvm/trace.h
  GEN     accel/tcg/trace.h
  GEN     audio/trace.h
  GEN     block/trace.h
  GEN     chardev/trace.h
  GEN     crypto/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/display/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/hppa/trace.h
  GEN     hw/i2c/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/ide/trace.h
  GEN     hw/input/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/misc/macio/trace.h
  GEN     hw/net/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/pci-host/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/rdma/trace.h
  GEN     hw/rdma/vmw/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sparc64/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/tpm/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/watchdog/trace.h
  GEN     hw/xen/trace.h
  GEN     io/trace.h
  GEN     linux-user/trace.h
  GEN     migration/trace.h
  GEN     nbd/trace.h
  GEN     net/trace.h
  GEN     qapi/trace.h
  GEN     qom/trace.h
  GEN     scsi/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/mips/trace.h
  GEN     target/ppc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/sparc/trace.h
  GEN     ui/trace.h
  GEN     util/trace.h
  GEN     trace-root.c
  GEN     accel/kvm/trace.c
  GEN     accel/tcg/trace.c
  GEN     audio/trace.c
  GEN     block/trace.c
  GEN     chardev/trace.c
  GEN     crypto/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/display/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/hppa/trace.c
  GEN     hw/i2c/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/ide/trace.c
  GEN     hw/input/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/misc/macio/trace.c
  GEN     hw/net/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/pci-host/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/rdma/trace.c
  GEN     hw/rdma/vmw/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/sparc64/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/tpm/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/watchdog/trace.c
  GEN     hw/xen/trace.c
  GEN     io/trace.c
  GEN     linux-user/trace.c
  GEN     migration/trace.c
  GEN     nbd/trace.c
  GEN     net/trace.c
  GEN     qapi/trace.c
  GEN     qom/trace.c
  GEN     scsi/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/mips/trace.c
  GEN     target/ppc/trace.c
  GEN     target/s390x/trace.c
  GEN     target/sparc/trace.c
  GEN     ui/trace.c
  GEN     util/trace.c
  GEN     config-all-devices.mak
	 DEP /tmp/qemu-test/src/dtc/tests/dumptrees.c
	 DEP /tmp/qemu-test/src/dtc/tests/trees.S
	 DEP /tmp/qemu-test/src/dtc/tests/testutils.c
	 DEP /tmp/qemu-test/src/dtc/tests/value-labels.c
	 DEP /tmp/qemu-test/src/dtc/tests/asm_tree_dump.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_memrsv.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_string.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_full.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_header.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_path.c
	 DEP /tmp/qemu-test/src/dtc/tests/overlay_bad_fixup.c
	 DEP /tmp/qemu-test/src/dtc/tests/overlay.c
	 DEP /tmp/qemu-test/src/dtc/tests/subnode_iterate.c
	 DEP /tmp/qemu-test/src/dtc/tests/property_iterate.c
	 DEP /tmp/qemu-test/src/dtc/tests/integer-expressions.c
	 DEP /tmp/qemu-test/src/dtc/tests/utilfdt_test.c
	 DEP /tmp/qemu-test/src/dtc/tests/path_offset_aliases.c
	 DEP /tmp/qemu-test/src/dtc/tests/add_subnode_with_nops.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_unordered.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtb_reverse.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_ordered.c
	 DEP /tmp/qemu-test/src/dtc/tests/extra-terminating-null.c
	 DEP /tmp/qemu-test/src/dtc/tests/incbin.c
	 DEP /tmp/qemu-test/src/dtc/tests/boot-cpuid.c
	 DEP /tmp/qemu-test/src/dtc/tests/phandle_format.c
	 DEP /tmp/qemu-test/src/dtc/tests/path-references.c
	 DEP /tmp/qemu-test/src/dtc/tests/references.c
	 DEP /tmp/qemu-test/src/dtc/tests/string_escapes.c
	 DEP /tmp/qemu-test/src/dtc/tests/propname_escapes.c
	 DEP /tmp/qemu-test/src/dtc/tests/appendprop2.c
	 DEP /tmp/qemu-test/src/dtc/tests/appendprop1.c
	 DEP /tmp/qemu-test/src/dtc/tests/del_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/del_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/setprop.c
	 DEP /tmp/qemu-test/src/dtc/tests/set_name.c
	 DEP /tmp/qemu-test/src/dtc/tests/rw_tree1.c
	 DEP /tmp/qemu-test/src/dtc/tests/open_pack.c
	 DEP /tmp/qemu-test/src/dtc/tests/nopulate.c
	 DEP /tmp/qemu-test/src/dtc/tests/mangle-layout.c
	 DEP /tmp/qemu-test/src/dtc/tests/move_and_save.c
	 DEP /tmp/qemu-test/src/dtc/tests/sw_states.c
	 DEP /tmp/qemu-test/src/dtc/tests/sw_tree1.c
	 DEP /tmp/qemu-test/src/dtc/tests/nop_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/nop_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/setprop_inplace.c
	 DEP /tmp/qemu-test/src/dtc/tests/stringlist.c
	 DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells2.c
	 DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells.c
	 DEP /tmp/qemu-test/src/dtc/tests/notfound.c
	 DEP /tmp/qemu-test/src/dtc/tests/sized_cells.c
	 DEP /tmp/qemu-test/src/dtc/tests/char_literal.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_alias.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_compatible.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_check_compatible.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_phandle.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_prop_value.c
	 DEP /tmp/qemu-test/src/dtc/tests/parent_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/supernode_atdepth_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_path.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_phandle.c
	 DEP /tmp/qemu-test/src/dtc/tests/getprop.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_name.c
	 DEP /tmp/qemu-test/src/dtc/tests/path_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/subnode_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/find_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/root_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_mem_rsv.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_overlay.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_addresses.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_empty_tree.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_strerror.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_rw.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_sw.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_wip.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_ro.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt.c
	 DEP /tmp/qemu-test/src/dtc/util.c
	 DEP /tmp/qemu-test/src/dtc/fdtoverlay.c
	 DEP /tmp/qemu-test/src/dtc/fdtput.c
	 DEP /tmp/qemu-test/src/dtc/fdtget.c
	 DEP /tmp/qemu-test/src/dtc/fdtdump.c
	 LEX convert-dtsv0-lexer.lex.c
	 DEP /tmp/qemu-test/src/dtc/srcpos.c
	 BISON dtc-parser.tab.c
	 LEX dtc-lexer.lex.c
	 DEP /tmp/qemu-test/src/dtc/treesource.c
	 DEP /tmp/qemu-test/src/dtc/livetree.c
	 DEP /tmp/qemu-test/src/dtc/fstree.c
	 DEP /tmp/qemu-test/src/dtc/flattree.c
	 DEP /tmp/qemu-test/src/dtc/dtc.c
	 DEP /tmp/qemu-test/src/dtc/data.c
	 DEP /tmp/qemu-test/src/dtc/checks.c
	 DEP convert-dtsv0-lexer.lex.c
	 DEP dtc-lexer.lex.c
	 DEP dtc-parser.tab.c
	CHK version_gen.h
	UPD version_gen.h
	 DEP /tmp/qemu-test/src/dtc/util.c
	 CC libfdt/fdt.o
	 CC libfdt/fdt_ro.o
	 CC libfdt/fdt_wip.o
	 CC libfdt/fdt_sw.o
	 CC libfdt/fdt_rw.o
	 CC libfdt/fdt_strerror.o
	 CC libfdt/fdt_empty_tree.o
	 CC libfdt/fdt_addresses.o
	 CC libfdt/fdt_overlay.o
	 AR libfdt/libfdt.a
x86_64-w64-mingw32-ar: creating libfdt/libfdt.a
a - libfdt/fdt.o
a - libfdt/fdt_ro.o
a - libfdt/fdt_wip.o
a - libfdt/fdt_sw.o
a - libfdt/fdt_rw.o
a - libfdt/fdt_strerror.o
a - libfdt/fdt_empty_tree.o
a - libfdt/fdt_addresses.o
a - libfdt/fdt_overlay.o
  RC      version.o
  GEN     qga/qapi-generated/qapi-gen
  CC      qapi/qapi-builtin-types.o
  CC      qapi/qapi-types.o
  CC      qapi/qapi-types-block-core.o
  CC      qapi/qapi-types-block.o
  CC      qapi/qapi-types-char.o
  CC      qapi/qapi-types-common.o
  CC      qapi/qapi-types-crypto.o
  CC      qapi/qapi-types-introspect.o
  CC      qapi/qapi-types-job.o
  CC      qapi/qapi-types-migration.o
  CC      qapi/qapi-types-misc.o
  CC      qapi/qapi-types-net.o
  CC      qapi/qapi-types-rocker.o
  CC      qapi/qapi-types-run-state.o
  CC      qapi/qapi-types-sockets.o
  CC      qapi/qapi-types-tpm.o
  CC      qapi/qapi-types-trace.o
  CC      qapi/qapi-types-transaction.o
  CC      qapi/qapi-types-ui.o
  CC      qapi/qapi-builtin-visit.o
  CC      qapi/qapi-visit.o
  CC      qapi/qapi-visit-block-core.o
  CC      qapi/qapi-visit-block.o
  CC      qapi/qapi-visit-char.o
  CC      qapi/qapi-visit-common.o
  CC      qapi/qapi-visit-crypto.o
  CC      qapi/qapi-visit-introspect.o
  CC      qapi/qapi-visit-job.o
  CC      qapi/qapi-visit-migration.o
  CC      qapi/qapi-visit-misc.o
  CC      qapi/qapi-visit-net.o
  CC      qapi/qapi-visit-rocker.o
  CC      qapi/qapi-visit-run-state.o
  CC      qapi/qapi-visit-sockets.o
  CC      qapi/qapi-visit-tpm.o
  CC      qapi/qapi-visit-trace.o
  CC      qapi/qapi-visit-transaction.o
  CC      qapi/qapi-visit-ui.o
  CC      qapi/qapi-events.o
  CC      qapi/qapi-events-block-core.o
  CC      qapi/qapi-events-block.o
  CC      qapi/qapi-events-char.o
  CC      qapi/qapi-events-common.o
  CC      qapi/qapi-events-crypto.o
  CC      qapi/qapi-events-introspect.o
  CC      qapi/qapi-events-job.o
  CC      qapi/qapi-events-migration.o
  CC      qapi/qapi-events-misc.o
  CC      qapi/qapi-events-net.o
  CC      qapi/qapi-events-rocker.o
  CC      qapi/qapi-events-sockets.o
  CC      qapi/qapi-events-run-state.o
  CC      qapi/qapi-events-tpm.o
  CC      qapi/qapi-events-trace.o
  CC      qapi/qapi-events-transaction.o
  CC      qapi/qapi-events-ui.o
  CC      qapi/qapi-introspect.o
  CC      qapi/qapi-visit-core.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnull.o
  CC      qobject/qnum.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qbool.o
  CC      qobject/qlist.o
  CC      qobject/qlit.o
  CC      qobject/qobject.o
  CC      qobject/qjson.o
  CC      qobject/json-lexer.o
  CC      qobject/json-streamer.o
  CC      qobject/json-parser.o
  CC      qobject/block-qdict.o
  CC      trace/simple.o
  CC      trace/control.o
  CC      trace/qmp.o
  CC      util/osdep.o
  CC      util/cutils.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/aio-wait.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/iohandler.o
  CC      util/aio-win32.o
  CC      util/event_notifier-win32.o
  CC      util/oslib-win32.o
  CC      util/qemu-thread-win32.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/module.o
  CC      util/host-utils.o
  CC      util/bitmap.o
  CC      util/bitops.o
  CC      util/hbitmap.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/cacheinfo.o
  CC      util/error.o
  CC      util/qemu-error.o
  CC      util/id.o
  CC      util/iov.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/notify.o
  CC      util/qemu-option.o
  CC      util/qemu-progress.o
  CC      util/keyval.o
  CC      util/hexdump.o
  CC      util/crc32c.o
  CC      util/uuid.o
  CC      util/throttle.o
  CC      util/getauxval.o
  CC      util/readline.o
  CC      util/rcu.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine-io.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/coroutine-win32.o
  CC      util/buffer.o
  CC      util/timed-average.o
  CC      util/base64.o
  CC      util/log.o
  CC      util/pagesize.o
  CC      util/qdist.o
  CC      util/qht.o
  CC      util/qsp.o
  CC      util/range.o
  CC      util/stats64.o
  CC      util/systemd.o
  CC      util/iova-tree.o
  CC      trace-root.o
  CC      accel/kvm/trace.o
  CC      accel/tcg/trace.o
  CC      audio/trace.o
  CC      block/trace.o
  CC      chardev/trace.o
  CC      crypto/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/acpi/trace.o
  CC      hw/alpha/trace.o
  CC      hw/arm/trace.o
  CC      hw/audio/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/display/trace.o
  CC      hw/dma/trace.o
  CC      hw/hppa/trace.o
  CC      hw/i2c/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/ide/trace.o
  CC      hw/input/trace.o
  CC      hw/intc/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/misc/trace.o
  CC      hw/misc/macio/trace.o
  CC      hw/net/trace.o
  CC      hw/nvram/trace.o
  CC      hw/pci/trace.o
  CC      hw/pci-host/trace.o
  CC      hw/ppc/trace.o
  CC      hw/rdma/trace.o
  CC      hw/rdma/vmw/trace.o
  CC      hw/s390x/trace.o
  CC      hw/scsi/trace.o
  CC      hw/sd/trace.o
  CC      hw/sparc/trace.o
  CC      hw/sparc64/trace.o
  CC      hw/timer/trace.o
  CC      hw/tpm/trace.o
  CC      hw/usb/trace.o
  CC      hw/vfio/trace.o
  CC      hw/virtio/trace.o
  CC      hw/watchdog/trace.o
  CC      hw/xen/trace.o
  CC      io/trace.o
  CC      linux-user/trace.o
  CC      migration/trace.o
  CC      nbd/trace.o
  CC      net/trace.o
  CC      qapi/trace.o
  CC      qom/trace.o
  CC      scsi/trace.o
  CC      target/arm/trace.o
  CC      target/i386/trace.o
  CC      target/mips/trace.o
  CC      target/ppc/trace.o
  CC      target/s390x/trace.o
  CC      target/sparc/trace.o
  CC      ui/trace.o
  CC      util/trace.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/blk-commit-all.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/clock-warp.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/dump.o
  CC      stubs/error-printf.o
  CC      stubs/fdset.o
  CC      stubs/gdbstub.o
  CC      stubs/get-vm-name.o
  CC      stubs/iothread.o
  CC      stubs/iothread-lock.o
  CC      stubs/is-daemonized.o
  CC      stubs/machine-init-done.o
  CC      stubs/migr-blocker.o
  CC      stubs/monitor.o
  CC      stubs/change-state-handler.o
  CC      stubs/notify-event.o
  CC      stubs/qtest.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/set-fd-handler.o
  CC      stubs/slirp.o
  CC      stubs/sysbus.o
  CC      stubs/tpm.o
  CC      stubs/trace-control.o
  CC      stubs/uuid.o
  CC      stubs/vm-stop.o
  CC      stubs/vmstate.o
  CC      stubs/fd-register.o
  CC      stubs/qmp_memory_device.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      stubs/vmgenid.o
  CC      stubs/xen-common.o
  CC      stubs/xen-hvm.o
  CC      stubs/pci-host-piix.o
  CC      stubs/ram-block.o
  CC      stubs/ramfb.o
  GEN     qemu-img-cmds.h
  CC      block.o
  CC      blockjob.o
  CC      job.o
  CC      qemu-io-cmds.o
  CC      replication.o
  CC      block/raw-format.o
  CC      block/vmdk.o
  CC      block/vpc.o
  CC      block/qcow.o
  CC      block/vdi.o
  CC      block/cloop.o
  CC      block/bochs.o
  CC      block/vvfat.o
  CC      block/dmg.o
  CC      block/qcow2.o
  CC      block/qcow2-refcount.o
  CC      block/qcow2-cluster.o
  CC      block/qcow2-snapshot.o
  CC      block/qcow2-cache.o
  CC      block/qcow2-bitmap.o
  CC      block/qed.o
  CC      block/qed-l2-cache.o
  CC      block/qed-table.o
  CC      block/qed-cluster.o
  CC      block/qed-check.o
  CC      block/vhdx.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/quorum.o
  CC      block/blkdebug.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/parallels.o
  CC      block/blklogwrites.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/qapi.o
  CC      block/file-win32.o
  CC      block/win32-aio.o
  CC      block/null.o
  CC      block/mirror.o
  CC      block/commit.o
  CC      block/io.o
  CC      block/create.o
  CC      block/throttle-groups.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/accounting.o
  CC      block/dirty-bitmap.o
  CC      block/write-threshold.o
  CC      block/backup.o
  CC      block/replication.o
  CC      block/throttle.o
  CC      block/copy-on-read.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      scsi/utils.o
  CC      scsi/pr-manager-stub.o
  CC      block/curl.o
  CC      block/ssh.o
  CC      block/dmg-bz2.o
  CC      crypto/init.o
  CC      crypto/hash.o
  CC      crypto/hash-nettle.o
  CC      crypto/hmac.o
  CC      crypto/hmac-nettle.o
  CC      crypto/aes.o
  CC      crypto/desrfb.o
  CC      crypto/cipher.o
  CC      crypto/tlscreds.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredspsk.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/random-gnutls.o
  CC      crypto/pbkdf.o
  CC      crypto/pbkdf-nettle.o
  CC      crypto/ivgen.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/afsplit.o
  CC      crypto/xts.o
  CC      crypto/block-qcow.o
  CC      crypto/block.o
  CC      crypto/block-luks.o
  CC      io/channel.o
  CC      io/channel-buffer.o
  CC      io/channel-command.o
  CC      io/channel-file.o
  CC      io/channel-socket.o
  CC      io/channel-tls.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/dns-resolver.o
  CC      io/net-listener.o
  CC      io/task.o
  CC      qom/object.o
  CC      qom/container.o
  CC      qom/qom-qobject.o
  CC      qom/object_interfaces.o
  CC      qemu-io.o
  CC      qemu-edid.o
  CC      hw/display/edid-generate.o
  CC      blockdev.o
  CC      blockdev-nbd.o
  CC      bootdevice.o
  CC      iothread.o
  CC      job-qmp.o
  CC      qdev-monitor.o
  CC      device-hotplug.o
  CC      os-win32.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      device_tree.o
  CC      qapi/qapi-commands.o
  CC      qapi/qapi-commands-block-core.o
  CC      qapi/qapi-commands-block.o
  CC      qapi/qapi-commands-char.o
  CC      qapi/qapi-commands-common.o
  CC      qapi/qapi-commands-crypto.o
  CC      qapi/qapi-commands-introspect.o
  CC      qapi/qapi-commands-job.o
  CC      qapi/qapi-commands-migration.o
  CC      qapi/qapi-commands-misc.o
  CC      qapi/qapi-commands-net.o
  CC      qapi/qapi-commands-rocker.o
  CC      qapi/qapi-commands-run-state.o
  CC      qapi/qapi-commands-sockets.o
  CC      qapi/qapi-commands-tpm.o
  CC      qapi/qapi-commands-trace.o
  CC      qapi/qapi-commands-transaction.o
  CC      qapi/qapi-commands-ui.o
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/audio.o
  CC      audio/noaudio.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/dsoundaudio.o
  CC      audio/audio_win_int.o
  CC      audio/wavcapture.o
  CC      backends/rng.o
  CC      backends/rng-egd.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-ram.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      backends/cryptodev-vhost.o
  CC      block/stream.o
  CC      chardev/msmouse.o
  CC      chardev/wctablet.o
  CC      chardev/testdev.o
  CC      disas/arm.o
  CXX     disas/arm-a64.o
  CC      disas/i386.o
  CXX     disas/libvixl/vixl/utils.o
  CXX     disas/libvixl/vixl/compiler-intrinsics.o
  CXX     disas/libvixl/vixl/a64/instructions-a64.o
  CXX     disas/libvixl/vixl/a64/decoder-a64.o
  CXX     disas/libvixl/vixl/a64/disasm-a64.o
  CC      hw/acpi/core.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/nvdimm.o
  CC      hw/acpi/vmgenid.o
  CC      hw/acpi/acpi_interface.o
  CC      hw/acpi/bios-linker-loader.o
  CC      hw/acpi/aml-build.o
  CC      hw/acpi/ipmi.o
  CC      hw/acpi/acpi-stub.o
  CC      hw/acpi/ipmi-stub.o
  CC      hw/audio/sb16.o
  CC      hw/audio/es1370.o
  CC      hw/audio/ac97.o
  CC      hw/audio/fmopl.o
  CC      hw/audio/adlib.o
  CC      hw/audio/gus.o
  CC      hw/audio/gusemu_hal.o
  CC      hw/audio/gusemu_mixer.o
  CC      hw/audio/cs4231a.o
  CC      hw/audio/intel-hda.o
  CC      hw/audio/hda-codec.o
  CC      hw/audio/pcspk.o
  CC      hw/audio/wm8750.o
  CC      hw/audio/pl041.o
  CC      hw/audio/lm4549.o
  CC      hw/audio/marvell_88w8618.o
  CC      hw/audio/soundhw.o
  CC      hw/block/block.o
  CC      hw/block/cdrom.o
  CC      hw/block/hd-geometry.o
  CC      hw/block/fdc.o
  CC      hw/block/m25p80.o
  CC      hw/block/nand.o
  CC      hw/block/pflash_cfi01.o
  CC      hw/block/pflash_cfi02.o
  CC      hw/block/ecc.o
  CC      hw/block/onenand.o
  CC      hw/block/nvme.o
  CC      hw/bt/core.o
  CC      hw/bt/l2cap.o
  CC      hw/bt/sdp.o
  CC      hw/bt/hci.o
  CC      hw/bt/hid.o
  CC      hw/bt/hci-csr.o
  CC      hw/char/ipoctal232.o
  CC      hw/char/nrf51_uart.o
  CC      hw/char/parallel.o
  CC      hw/char/parallel-isa.o
  CC      hw/char/pl011.o
  CC      hw/char/serial.o
  CC      hw/char/serial-isa.o
  CC      hw/char/serial-pci.o
  CC      hw/char/virtio-console.o
  CC      hw/char/cadence_uart.o
  CC      hw/char/cmsdk-apb-uart.o
  CC      hw/char/debugcon.o
  CC      hw/char/imx_serial.o
  CC      hw/core/qdev-properties.o
  CC      hw/core/qdev.o
  CC      hw/core/compat-props.o
  CC      hw/core/bus.o
  CC      hw/core/reset.o
  CC      hw/core/qdev-fw.o
  CC      hw/core/fw-path-provider.o
  CC      hw/core/irq.o
  CC      hw/core/hotplug.o
  CC      hw/core/nmi.o
  CC      hw/core/stream.o
  CC      hw/core/ptimer.o
  CC      hw/core/sysbus.o
  CC      hw/core/machine.o
  CC      hw/core/loader.o
  CC      hw/core/qdev-properties-system.o
  CC      hw/core/register.o
  CC      hw/core/or-irq.o
  CC      hw/core/split-irq.o
  CC      hw/core/platform-bus.o
  CC      hw/core/generic-loader.o
  CC      hw/core/null-machine.o
  CC      hw/cpu/core.o
  CC      hw/display/ramfb.o
  CC      hw/display/ramfb-standalone.o
  CC      hw/display/ads7846.o
  CC      hw/display/cirrus_vga.o
  CC      hw/display/cirrus_vga_isa.o
  CC      hw/display/pl110.o
  CC      hw/display/sii9022.o
  CC      hw/display/ssd0303.o
  CC      hw/display/ssd0323.o
  CC      hw/display/vga-pci.o
  CC      hw/display/edid-region.o
  CC      hw/display/vga-isa.o
  CC      hw/display/vmware_vga.o
  CC      hw/display/bochs-display.o
  CC      hw/display/blizzard.o
  CC      hw/display/exynos4210_fimd.o
  CC      hw/display/framebuffer.o
  CC      hw/display/tc6393xb.o
  CC      hw/dma/pl080.o
  CC      hw/dma/pl330.o
  CC      hw/dma/i8257.o
  CC      hw/dma/xilinx_axidma.o
  CC      hw/dma/xlnx-zynq-devcfg.o
  CC      hw/dma/xlnx-zdma.o
  CC      hw/gpio/max7310.o
  CC      hw/gpio/pl061.o
  CC      hw/gpio/zaurus.o
  CC      hw/gpio/gpio_key.o
  CC      hw/i2c/core.o
  CC      hw/i2c/smbus.o
  CC      hw/i2c/smbus_eeprom.o
  CC      hw/i2c/i2c-ddc.o
  CC      hw/i2c/versatile_i2c.o
  CC      hw/i2c/smbus_ich9.o
  CC      hw/i2c/pm_smbus.o
  CC      hw/i2c/bitbang_i2c.o
  CC      hw/i2c/exynos4210_i2c.o
  CC      hw/i2c/imx_i2c.o
  CC      hw/i2c/aspeed_i2c.o
  CC      hw/ide/core.o
  CC      hw/ide/atapi.o
  CC      hw/ide/qdev.o
  CC      hw/ide/pci.o
  CC      hw/ide/isa.o
  CC      hw/ide/piix.o
  CC      hw/ide/microdrive.o
  CC      hw/ide/ahci.o
  CC      hw/ide/ich.o
  CC      hw/ide/ahci-allwinner.o
  CC      hw/input/hid.o
  CC      hw/input/lm832x.o
  CC      hw/input/pckbd.o
  CC      hw/input/pl050.o
  CC      hw/input/ps2.o
  CC      hw/input/stellaris_input.o
  CC      hw/input/tsc2005.o
  CC      hw/input/virtio-input.o
  CC      hw/input/virtio-input-hid.o
  CC      hw/intc/i8259_common.o
  CC      hw/intc/i8259.o
  CC      hw/intc/pl190.o
  CC      hw/intc/xlnx-pmu-iomod-intc.o
  CC      hw/intc/xlnx-zynqmp-ipi.o
  CC      hw/intc/imx_avic.o
  CC      hw/intc/imx_gpcv2.o
  CC      hw/intc/realview_gic.o
  CC      hw/intc/ioapic_common.o
  CC      hw/intc/arm_gic_common.o
  CC      hw/intc/arm_gic.o
  CC      hw/intc/arm_gicv2m.o
  CC      hw/intc/arm_gicv3_common.o
  CC      hw/intc/arm_gicv3.o
  CC      hw/intc/arm_gicv3_dist.o
  CC      hw/intc/arm_gicv3_redist.o
  CC      hw/intc/arm_gicv3_its_common.o
  CC      hw/intc/intc.o
  CC      hw/ipack/ipack.o
  CC      hw/ipack/tpci200.o
  CC      hw/ipmi/ipmi.o
  CC      hw/ipmi/ipmi_bmc_sim.o
  CC      hw/ipmi/ipmi_bmc_extern.o
  CC      hw/ipmi/isa_ipmi_kcs.o
  CC      hw/ipmi/isa_ipmi_bt.o
  CC      hw/isa/isa-bus.o
  CC      hw/isa/isa-superio.o
  CC      hw/isa/apm.o
  CC      hw/mem/pc-dimm.o
  CC      hw/mem/memory-device.o
  CC      hw/mem/nvdimm.o
  CC      hw/misc/applesmc.o
  CC      hw/misc/max111x.o
  CC      hw/misc/tmp105.o
  CC      hw/misc/tmp421.o
  CC      hw/misc/debugexit.o
  CC      hw/misc/sga.o
  CC      hw/misc/pc-testdev.o
  CC      hw/misc/pci-testdev.o
  CC      hw/misc/edu.o
  CC      hw/misc/pca9552.o
  CC      hw/misc/unimp.o
  CC      hw/misc/vmcoreinfo.o
  CC      hw/misc/arm_l2x0.o
  CC      hw/misc/arm_integrator_debug.o
  CC      hw/misc/a9scu.o
  CC      hw/misc/arm11scu.o
  CC      hw/net/ne2000.o
  CC      hw/net/eepro100.o
  CC      hw/net/pcnet-pci.o
  CC      hw/net/pcnet.o
  CC      hw/net/e1000.o
  CC      hw/net/e1000x_common.o
  CC      hw/net/net_tx_pkt.o
  CC      hw/net/net_rx_pkt.o
  CC      hw/net/e1000e.o
  CC      hw/net/e1000e_core.o
  CC      hw/net/rtl8139.o
  CC      hw/net/vmxnet3.o
  CC      hw/net/smc91c111.o
  CC      hw/net/lan9118.o
  CC      hw/net/ne2000-isa.o
  CC      hw/net/xgmac.o
  CC      hw/net/xilinx_axienet.o
  CC      hw/net/allwinner_emac.o
  CC      hw/net/imx_fec.o
  CC      hw/net/cadence_gem.o
  CC      hw/net/stellaris_enet.o
  CC      hw/net/ftgmac100.o
  CC      hw/net/rocker/rocker.o
  CC      hw/net/rocker/rocker_fp.o
  CC      hw/net/rocker/rocker_desc.o
  CC      hw/net/rocker/rocker_world.o
  CC      hw/net/rocker/rocker_of_dpa.o
  CC      hw/net/can/can_sja1000.o
  CC      hw/net/can/can_kvaser_pci.o
  CC      hw/net/can/can_pcm3680_pci.o
  CC      hw/net/can/can_mioe3680_pci.o
  CC      hw/nvram/eeprom93xx.o
  CC      hw/nvram/fw_cfg.o
  CC      hw/nvram/chrp_nvram.o
  CC      hw/pci-bridge/pci_bridge_dev.o
  CC      hw/pci-bridge/gen_pcie_root_port.o
  CC      hw/pci-bridge/pcie_root_port.o
  CC      hw/pci-bridge/pcie_pci_bridge.o
  CC      hw/pci-bridge/pci_expander_bridge.o
  CC      hw/pci-bridge/xio3130_upstream.o
  CC      hw/pci-bridge/xio3130_downstream.o
  CC      hw/pci-bridge/ioh3420.o
  CC      hw/pci-bridge/i82801b11.o
  CC      hw/pci-host/pam.o
  CC      hw/pci-host/versatile.o
  CC      hw/pci-host/piix.o
  CC      hw/pci-host/q35.o
  CC      hw/pci-host/gpex.o
  CC      hw/pci-host/designware.o
  CC      hw/pci/pci.o
  CC      hw/pci/pci_bridge.o
  CC      hw/pci/msix.o
  CC      hw/pci/msi.o
  CC      hw/pci/shpc.o
  CC      hw/pci/slotid_cap.o
  CC      hw/pci/pci_host.o
  CC      hw/pci/pcie_host.o
  CC      hw/pci/pcie.o
  CC      hw/pci/pcie_aer.o
  CC      hw/pci/pcie_port.o
  CC      hw/pci/pci-stub.o
  CC      hw/pcmcia/pcmcia.o
  CC      hw/scsi/scsi-disk.o
  CC      hw/scsi/emulation.o
  CC      hw/scsi/scsi-generic.o
  CC      hw/scsi/scsi-bus.o
  CC      hw/scsi/lsi53c895a.o
  CC      hw/scsi/mptsas.o
  CC      hw/scsi/mptconfig.o
  CC      hw/scsi/mptendian.o
  CC      hw/scsi/megasas.o
  CC      hw/scsi/vmw_pvscsi.o
  CC      hw/scsi/esp.o
  CC      hw/scsi/esp-pci.o
  CC      hw/sd/pl181.o
  CC      hw/sd/ssi-sd.o
  CC      hw/sd/sd.o
  CC      hw/sd/core.o
  CC      hw/sd/sdmmc-internal.o
  CC      hw/sd/sdhci.o
  CC      hw/smbios/smbios.o
  CC      hw/smbios/smbios_type_38.o
  CC      hw/smbios/smbios-stub.o
  CC      hw/smbios/smbios_type_38-stub.o
  CC      hw/ssi/pl022.o
  CC      hw/ssi/ssi.o
  CC      hw/ssi/xilinx_spips.o
  CC      hw/ssi/aspeed_smc.o
  CC      hw/ssi/stm32f2xx_spi.o
  CC      hw/ssi/mss-spi.o
  CC      hw/timer/arm_timer.o
  CC      hw/timer/arm_mptimer.o
  CC      hw/timer/armv7m_systick.o
  CC      hw/timer/a9gtimer.o
  CC      hw/timer/cadence_ttc.o
  CC      hw/timer/ds1338.o
  CC      hw/timer/hpet.o
  CC      hw/timer/i8254_common.o
  CC      hw/timer/i8254.o
  CC      hw/timer/pl031.o
  CC      hw/timer/twl92230.o
  CC      hw/timer/imx_epit.o
  CC      hw/timer/imx_gpt.o
  CC      hw/timer/xlnx-zynqmp-rtc.o
  CC      hw/timer/stm32f2xx_timer.o
  CC      hw/timer/aspeed_timer.o
  CC      hw/timer/cmsdk-apb-timer.o
  CC      hw/timer/cmsdk-apb-dualtimer.o
  CC      hw/timer/mss-timer.o
  CC      hw/tpm/tpm_util.o
  CC      hw/tpm/tpm_tis.o
  CC      hw/tpm/tpm_crb.o
  CC      hw/usb/core.o
  CC      hw/usb/combined-packet.o
  CC      hw/usb/bus.o
  CC      hw/usb/libhw.o
  CC      hw/usb/desc.o
  CC      hw/usb/desc-msos.o
  CC      hw/usb/hcd-uhci.o
  CC      hw/usb/hcd-ohci.o
  CC      hw/usb/hcd-ehci.o
  CC      hw/usb/hcd-ehci-pci.o
  CC      hw/usb/hcd-ehci-sysbus.o
  CC      hw/usb/hcd-xhci.o
  CC      hw/usb/hcd-xhci-nec.o
  CC      hw/usb/hcd-musb.o
  CC      hw/usb/dev-hub.o
  CC      hw/usb/dev-hid.o
  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
  CC      hw/usb/dev-uas.o
  CC      hw/usb/dev-audio.o
  CC      hw/usb/dev-serial.o
  CC      hw/usb/dev-network.o
  CC      hw/usb/dev-bluetooth.o
  CC      hw/usb/dev-smartcard-reader.o
  CC      hw/usb/host-stub.o
  CC      hw/virtio/virtio-bus.o
  CC      hw/virtio/virtio-rng.o
  CC      hw/virtio/virtio-pci.o
  CC      hw/virtio/virtio-mmio.o
  CC      hw/virtio/vhost-stub.o
  CC      hw/watchdog/watchdog.o
  CC      hw/watchdog/cmsdk-apb-watchdog.o
  CC      hw/watchdog/wdt_i6300esb.o
  CC      hw/watchdog/wdt_ib700.o
  CC      hw/watchdog/wdt_aspeed.o
  CC      migration/migration.o
  CC      migration/socket.o
  CC      migration/fd.o
  CC      migration/exec.o
  CC      migration/tls.o
  CC      migration/channel.o
  CC      migration/savevm.o
  CC      migration/colo.o
  CC      migration/colo-failover.o
  CC      migration/vmstate.o
  CC      migration/vmstate-types.o
  CC      migration/page_cache.o
  CC      migration/qemu-file.o
  CC      migration/global_state.o
  CC      migration/qemu-file-channel.o
  CC      migration/xbzrle.o
  CC      migration/postcopy-ram.o
  CC      migration/qjson.o
  CC      migration/block-dirty-bitmap.o
  CC      migration/block.o
  CC      net/net.o
  CC      net/queue.o
  CC      net/checksum.o
  CC      net/util.o
  CC      net/hub.o
  CC      net/socket.o
  CC      net/dump.o
  CC      net/eth.o
  CC      net/slirp.o
  CC      net/filter.o
  CC      net/filter-buffer.o
  CC      net/filter-mirror.o
  CC      net/colo-compare.o
  CC      net/colo.o
  CC      net/filter-rewriter.o
  CC      net/filter-replay.o
  CC      net/tap-win32.o
  CC      net/can/can_core.o
  CC      net/can/can_host.o
  CC      qom/cpu.o
  CC      replay/replay.o
  CC      replay/replay-internal.o
  CC      replay/replay-events.o
  CC      replay/replay-time.o
  CC      replay/replay-input.o
  CC      replay/replay-char.o
  CC      replay/replay-snapshot.o
  CC      replay/replay-net.o
  CC      replay/replay-audio.o
  CC      slirp/cksum.o
  CC      slirp/if.o
  CC      slirp/ip_icmp.o
  CC      slirp/ip6_icmp.o
  CC      slirp/ip6_input.o
  CC      slirp/ip6_output.o
  CC      slirp/ip_input.o
  CC      slirp/ip_output.o
  CC      slirp/dnssearch.o
  CC      slirp/dhcpv6.o
  CC      slirp/slirp.o
  CC      slirp/mbuf.o
  CC      slirp/misc.o
  CC      slirp/sbuf.o
  CC      slirp/socket.o
  CC      slirp/tcp_input.o
  CC      slirp/tcp_output.o
  CC      slirp/tcp_subr.o
  CC      slirp/tcp_timer.o
  CC      slirp/udp.o
  CC      slirp/udp6.o
  CC      slirp/bootp.o
  CC      slirp/tftp.o
  CC      slirp/arp_table.o
  CC      slirp/ncsi.o
  CC      slirp/ndp_table.o
  CC      ui/keymaps.o
  CC      ui/console.o
  CC      ui/cursor.o
  CC      ui/qemu-pixman.o
  CC      ui/input.o
  CC      ui/input-keymap.o
  CC      ui/input-legacy.o
  CC      ui/vnc.o
  CC      ui/vnc-enc-zlib.o
  CC      ui/vnc-enc-hextile.o
  CC      ui/vnc-enc-tight.o
  CC      ui/vnc-palette.o
  CC      ui/vnc-enc-zrle.o
  CC      ui/vnc-auth-vencrypt.o
  CC      ui/vnc-ws.o
  CC      ui/vnc-jobs.o
  CC      ui/sdl2.o
  CC      ui/sdl2-input.o
  CC      ui/sdl2-2d.o
  CC      ui/gtk.o
  CC      chardev/char.o
  CC      chardev/char-console.o
  CC      chardev/char-fe.o
  CC      chardev/char-file.o
  CC      chardev/char-io.o
  CC      chardev/char-mux.o
  CC      chardev/char-null.o
  CC      chardev/char-pipe.o
  CC      chardev/char-ringbuf.o
  CC      chardev/char-serial.o
  CC      chardev/char-socket.o
  CC      chardev/char-stdio.o
  CC      chardev/char-udp.o
  CC      chardev/char-win.o
  CC      chardev/char-win-stdio.o
  CC      qga/commands.o
  CC      qga/guest-agent-command-state.o
  CC      qga/main.o
  AS      optionrom/multiboot.o
  CC      qga/commands-win32.o
  AS      optionrom/linuxboot.o
  CC      optionrom/linuxboot_dma.o
  CC      qga/channel-win32.o
  AS      optionrom/kvmvapic.o
  CC      qga/service-win32.o
  BUILD   optionrom/multiboot.img
  BUILD   optionrom/linuxboot.img
  BUILD   optionrom/linuxboot_dma.img
  CC      qga/vss-win32.o
  BUILD   optionrom/kvmvapic.img
  CC      qga/qapi-generated/qga-qapi-types.o
  BUILD   optionrom/multiboot.raw
  BUILD   optionrom/linuxboot.raw
  CC      qga/qapi-generated/qga-qapi-commands.o
  CC      qga/qapi-generated/qga-qapi-visit.o
  BUILD   optionrom/linuxboot_dma.raw
  BUILD   optionrom/kvmvapic.raw
  SIGN    optionrom/multiboot.bin
  SIGN    optionrom/linuxboot.bin
  SIGN    optionrom/linuxboot_dma.bin
  SIGN    optionrom/kvmvapic.bin
  CC      qemu-img.o
  AR      libqemuutil.a
  LINK    qemu-ga.exe
  LINK    qemu-io.exe
  LINK    qemu-edid.exe
  GEN     aarch64-softmmu/hmp-commands.h
  GEN     aarch64-softmmu/hmp-commands-info.h
  GEN     aarch64-softmmu/config-target.h
  GEN     x86_64-softmmu/hmp-commands.h
  GEN     x86_64-softmmu/hmp-commands-info.h
  GEN     x86_64-softmmu/config-target.h
  CC      aarch64-softmmu/exec.o
  CC      aarch64-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/tcg/tcg-op-vec.o
  CC      aarch64-softmmu/tcg/tcg-op-gvec.o
  CC      aarch64-softmmu/tcg/tcg-common.o
  CC      x86_64-softmmu/exec.o
  CC      x86_64-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/tcg/optimize.o
  CC      x86_64-softmmu/tcg/tcg-op.o
  LINK    qemu-img.exe
  CC      aarch64-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/disas.o
  GEN     aarch64-softmmu/gdbstub-xml.c
  CC      aarch64-softmmu/arch_init.o
  CC      x86_64-softmmu/tcg/tcg-op-vec.o
  CC      aarch64-softmmu/cpus.o
  CC      aarch64-softmmu/monitor.o
  CC      aarch64-softmmu/gdbstub.o
  CC      x86_64-softmmu/tcg/tcg-op-gvec.o
  CC      aarch64-softmmu/balloon.o
  CC      x86_64-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/ioport.o
  CC      aarch64-softmmu/numa.o
  CC      x86_64-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/qtest.o
  CC      x86_64-softmmu/fpu/softfloat.o
  CC      x86_64-softmmu/disas.o
  CC      aarch64-softmmu/memory.o
  GEN     x86_64-softmmu/gdbstub-xml.c
  CC      x86_64-softmmu/arch_init.o
  CC      aarch64-softmmu/memory_mapping.o
  CC      x86_64-softmmu/cpus.o
  CC      aarch64-softmmu/dump.o
  CC      aarch64-softmmu/migration/ram.o
  CC      aarch64-softmmu/accel/accel.o
  CC      x86_64-softmmu/monitor.o
  CC      x86_64-softmmu/gdbstub.o
  CC      x86_64-softmmu/balloon.o
  CC      aarch64-softmmu/accel/stubs/hax-stub.o
  CC      x86_64-softmmu/ioport.o
  CC      x86_64-softmmu/numa.o
  CC      aarch64-softmmu/accel/stubs/hvf-stub.o
  CC      aarch64-softmmu/accel/stubs/whpx-stub.o
  CC      aarch64-softmmu/accel/stubs/kvm-stub.o
  CC      x86_64-softmmu/qtest.o
  CC      aarch64-softmmu/accel/tcg/tcg-all.o
  CC      x86_64-softmmu/memory_mapping.o
  CC      x86_64-softmmu/memory.o
  CC      aarch64-softmmu/accel/tcg/cputlb.o
  CC      aarch64-softmmu/accel/tcg/tcg-runtime.o
  CC      aarch64-softmmu/accel/tcg/tcg-runtime-gvec.o
  CC      x86_64-softmmu/dump.o
  CC      x86_64-softmmu/win_dump.o
  CC      x86_64-softmmu/migration/ram.o
  CC      x86_64-softmmu/accel/accel.o
  CC      x86_64-softmmu/accel/stubs/hvf-stub.o
  CC      x86_64-softmmu/accel/stubs/whpx-stub.o
  CC      x86_64-softmmu/accel/stubs/kvm-stub.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec.o
  CC      x86_64-softmmu/accel/tcg/tcg-all.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec-common.o
  CC      x86_64-softmmu/accel/tcg/cputlb.o
  CC      x86_64-softmmu/accel/tcg/tcg-runtime.o
  CC      aarch64-softmmu/accel/tcg/translate-all.o
  CC      aarch64-softmmu/accel/tcg/translator.o
  CC      x86_64-softmmu/accel/tcg/tcg-runtime-gvec.o
  CC      aarch64-softmmu/hw/adc/stm32f2xx_adc.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/hw/block/virtio-blk.o
  CC      aarch64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      x86_64-softmmu/accel/tcg/translate-all.o
  CC      x86_64-softmmu/accel/tcg/translator.o
  CC      x86_64-softmmu/hw/block/virtio-blk.o
  CC      aarch64-softmmu/hw/char/exynos4210_uart.o
  CC      x86_64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      aarch64-softmmu/hw/char/omap_uart.o
  CC      x86_64-softmmu/hw/char/virtio-serial-bus.o
  CC      aarch64-softmmu/hw/char/digic-uart.o
  CC      x86_64-softmmu/hw/display/vga.o
  CC      x86_64-softmmu/hw/display/virtio-gpu.o
  CC      aarch64-softmmu/hw/char/stm32f2xx_usart.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-3d.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/char/bcm2835_aux.o
  CC      aarch64-softmmu/hw/char/virtio-serial-bus.o
  CC      x86_64-softmmu/hw/display/virtio-vga.o
  CC      aarch64-softmmu/hw/cpu/arm11mpcore.o
  CC      aarch64-softmmu/hw/cpu/realview_mpcore.o
  CC      x86_64-softmmu/hw/intc/apic.o
  CC      x86_64-softmmu/hw/intc/apic_common.o
  CC      x86_64-softmmu/hw/intc/ioapic.o
  CC      aarch64-softmmu/hw/cpu/a9mpcore.o
  CC      x86_64-softmmu/hw/isa/lpc_ich9.o
  CC      x86_64-softmmu/hw/misc/pvpanic.o
  CC      aarch64-softmmu/hw/cpu/a15mpcore.o
  CC      x86_64-softmmu/hw/net/virtio-net.o
  CC      x86_64-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/display/omap_dss.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi.o
  CC      aarch64-softmmu/hw/display/omap_lcdc.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/display/pxa2xx_lcd.o
  CC      x86_64-softmmu/hw/timer/mc146818rtc.o
  CC      x86_64-softmmu/hw/virtio/virtio.o
  CC      aarch64-softmmu/hw/display/bcm2835_fb.o
  CC      aarch64-softmmu/hw/display/vga.o
  CC      x86_64-softmmu/hw/virtio/virtio-balloon.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/display/virtio-gpu.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-3d.o
  CC      x86_64-softmmu/hw/i386/multiboot.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-pci.o
  CC      x86_64-softmmu/hw/i386/pc.o
  CC      x86_64-softmmu/hw/i386/pc_piix.o
  CC      aarch64-softmmu/hw/display/dpcd.o
  CC      aarch64-softmmu/hw/display/xlnx_dp.o
  CC      x86_64-softmmu/hw/i386/pc_q35.o
  CC      aarch64-softmmu/hw/dma/xlnx_dpdma.o
  CC      aarch64-softmmu/hw/dma/omap_dma.o
  CC      x86_64-softmmu/hw/i386/pc_sysfw.o
  CC      aarch64-softmmu/hw/dma/soc_dma.o
  CC      aarch64-softmmu/hw/dma/pxa2xx_dma.o
  CC      x86_64-softmmu/hw/i386/x86-iommu.o
  CC      x86_64-softmmu/hw/i386/intel_iommu.o
  CC      aarch64-softmmu/hw/dma/bcm2835_dma.o
  CC      aarch64-softmmu/hw/gpio/omap_gpio.o
  CC      x86_64-softmmu/hw/i386/amd_iommu.o
  CC      aarch64-softmmu/hw/gpio/imx_gpio.o
  CC      x86_64-softmmu/hw/i386/vmport.o
  CC      aarch64-softmmu/hw/gpio/bcm2835_gpio.o
  CC      x86_64-softmmu/hw/i386/vmmouse.o
  CC      aarch64-softmmu/hw/i2c/omap_i2c.o
  CC      aarch64-softmmu/hw/input/pxa2xx_keypad.o
  CC      x86_64-softmmu/hw/i386/kvmvapic.o
  CC      aarch64-softmmu/hw/input/tsc210x.o
  CC      x86_64-softmmu/hw/i386/acpi-build.o
  CC      aarch64-softmmu/hw/intc/armv7m_nvic.o
  CC      x86_64-softmmu/target/i386/helper.o
  CC      aarch64-softmmu/hw/intc/exynos4210_gic.o
  CC      aarch64-softmmu/hw/intc/exynos4210_combiner.o
  CC      x86_64-softmmu/target/i386/cpu.o
  CC      aarch64-softmmu/hw/intc/omap_intc.o
  CC      x86_64-softmmu/target/i386/gdbstub.o
  CC      aarch64-softmmu/hw/intc/bcm2836_control.o
  CC      aarch64-softmmu/hw/intc/bcm2835_ic.o
  CC      x86_64-softmmu/target/i386/xsave_helper.o
  CC      aarch64-softmmu/hw/intc/allwinner-a10-pic.o
  CC      x86_64-softmmu/target/i386/translate.o
  CC      aarch64-softmmu/hw/intc/aspeed_vic.o
  CC      x86_64-softmmu/target/i386/bpt_helper.o
  CC      x86_64-softmmu/target/i386/cc_helper.o
  CC      aarch64-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      x86_64-softmmu/target/i386/excp_helper.o
  CC      aarch64-softmmu/hw/misc/arm_sysctl.o
  CC      x86_64-softmmu/target/i386/fpu_helper.o
  CC      x86_64-softmmu/target/i386/int_helper.o
  CC      aarch64-softmmu/hw/misc/cbus.o
  CC      x86_64-softmmu/target/i386/mem_helper.o
  CC      aarch64-softmmu/hw/misc/exynos4210_pmu.o
  CC      x86_64-softmmu/target/i386/misc_helper.o
  CC      aarch64-softmmu/hw/misc/exynos4210_clk.o
  CC      aarch64-softmmu/hw/misc/exynos4210_rng.o
  CC      aarch64-softmmu/hw/misc/imx_ccm.o
  CC      x86_64-softmmu/target/i386/mpx_helper.o
  CC      x86_64-softmmu/target/i386/seg_helper.o
  CC      x86_64-softmmu/target/i386/smm_helper.o
  CC      aarch64-softmmu/hw/misc/imx31_ccm.o
  CC      x86_64-softmmu/target/i386/svm_helper.o
  CC      x86_64-softmmu/target/i386/machine.o
  CC      aarch64-softmmu/hw/misc/imx25_ccm.o
  CC      x86_64-softmmu/target/i386/arch_memory_mapping.o
  CC      x86_64-softmmu/target/i386/arch_dump.o
  CC      x86_64-softmmu/target/i386/monitor.o
  CC      aarch64-softmmu/hw/misc/imx6_ccm.o
  CC      aarch64-softmmu/hw/misc/imx6ul_ccm.o
  CC      x86_64-softmmu/target/i386/kvm-stub.o
  CC      aarch64-softmmu/hw/misc/imx6_src.o
  CC      x86_64-softmmu/target/i386/hyperv-stub.o
  CC      aarch64-softmmu/hw/misc/imx7_ccm.o
  CC      x86_64-softmmu/target/i386/hax-all.o
  CC      aarch64-softmmu/hw/misc/imx2_wdt.o
  CC      x86_64-softmmu/target/i386/hax-mem.o
  CC      x86_64-softmmu/target/i386/hax-windows.o
  CC      aarch64-softmmu/hw/misc/imx7_snvs.o
  CC      x86_64-softmmu/target/i386/sev-stub.o
  CC      aarch64-softmmu/hw/misc/imx7_gpr.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/hw/misc/mst_fpga.o
  CC      x86_64-softmmu/trace/control-target.o
  CC      aarch64-softmmu/hw/misc/omap_clk.o
  CC      x86_64-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/hw/misc/omap_gpmc.o
  CC      aarch64-softmmu/hw/misc/omap_l4.o
  CC      x86_64-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/misc/omap_sdrc.o
  CC      aarch64-softmmu/hw/misc/omap_tap.o
  CC      aarch64-softmmu/hw/misc/bcm2835_mbox.o
  CC      aarch64-softmmu/hw/misc/bcm2835_property.o
  CC      aarch64-softmmu/hw/misc/bcm2835_rng.o
  CC      aarch64-softmmu/hw/misc/zynq_slcr.o
  CC      aarch64-softmmu/hw/misc/zynq-xadc.o
  LINK    x86_64-softmmu/qemu-system-x86_64w.exe
  CC      aarch64-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      aarch64-softmmu/hw/misc/mps2-fpgaio.o
  CC      aarch64-softmmu/hw/misc/mps2-scc.o
  CC      aarch64-softmmu/hw/misc/tz-mpc.o
  CC      aarch64-softmmu/hw/misc/tz-msc.o
  CC      aarch64-softmmu/hw/misc/tz-ppc.o
  CC      aarch64-softmmu/hw/misc/iotkit-secctl.o
  CC      aarch64-softmmu/hw/misc/iotkit-sysctl.o
  CC      aarch64-softmmu/hw/misc/iotkit-sysinfo.o
  CC      aarch64-softmmu/hw/misc/auxbus.o
  CC      aarch64-softmmu/hw/misc/aspeed_scu.o
  CC      aarch64-softmmu/hw/misc/aspeed_sdmc.o
  CC      aarch64-softmmu/hw/misc/msf2-sysreg.o
  GEN     x86_64-softmmu/qemu-system-x86_64.exe
  CC      aarch64-softmmu/hw/net/virtio-net.o
  CC      aarch64-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/pcmcia/pxa2xx.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/sd/omap_mmc.o
  CC      aarch64-softmmu/hw/sd/pxa2xx_mmci.o
  CC      aarch64-softmmu/hw/sd/bcm2835_sdhost.o
  CC      aarch64-softmmu/hw/ssi/omap_spi.o
  CC      aarch64-softmmu/hw/ssi/imx_spi.o
  CC      aarch64-softmmu/hw/timer/exynos4210_mct.o
  CC      aarch64-softmmu/hw/timer/exynos4210_pwm.o
  CC      aarch64-softmmu/hw/timer/exynos4210_rtc.o
  CC      aarch64-softmmu/hw/timer/omap_gptimer.o
  CC      aarch64-softmmu/hw/timer/omap_synctimer.o
  CC      aarch64-softmmu/hw/timer/pxa2xx_timer.o
  CC      aarch64-softmmu/hw/timer/digic-timer.o
  CC      aarch64-softmmu/hw/timer/allwinner-a10-pit.o
  CC      aarch64-softmmu/hw/usb/tusb6010.o
  CC      aarch64-softmmu/hw/usb/chipidea.o
  CC      aarch64-softmmu/hw/virtio/virtio.o
  CC      aarch64-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/arm/boot.o
  CC      aarch64-softmmu/hw/arm/virt.o
  CC      aarch64-softmmu/hw/arm/sysbus-fdt.o
  CC      aarch64-softmmu/hw/arm/virt-acpi-build.o
  CC      aarch64-softmmu/hw/arm/digic_boards.o
  CC      aarch64-softmmu/hw/arm/exynos4_boards.o
  CC      aarch64-softmmu/hw/arm/highbank.o
  CC      aarch64-softmmu/hw/arm/integratorcp.o
  CC      aarch64-softmmu/hw/arm/mainstone.o
  CC      aarch64-softmmu/hw/arm/musicpal.o
  CC      aarch64-softmmu/hw/arm/netduino2.o
  CC      aarch64-softmmu/hw/arm/nseries.o
  CC      aarch64-softmmu/hw/arm/omap_sx1.o
  CC      aarch64-softmmu/hw/arm/palm.o
  CC      aarch64-softmmu/hw/arm/gumstix.o
  CC      aarch64-softmmu/hw/arm/spitz.o
  CC      aarch64-softmmu/hw/arm/tosa.o
  CC      aarch64-softmmu/hw/arm/z2.o
  CC      aarch64-softmmu/hw/arm/realview.o
  CC      aarch64-softmmu/hw/arm/stellaris.o
  CC      aarch64-softmmu/hw/arm/collie.o
  CC      aarch64-softmmu/hw/arm/vexpress.o
  CC      aarch64-softmmu/hw/arm/versatilepb.o
  CC      aarch64-softmmu/hw/arm/xilinx_zynq.o
  CC      aarch64-softmmu/hw/arm/armv7m.o
  CC      aarch64-softmmu/hw/arm/exynos4210.o
  CC      aarch64-softmmu/hw/arm/pxa2xx.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_gpio.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_pic.o
  CC      aarch64-softmmu/hw/arm/digic.o
  CC      aarch64-softmmu/hw/arm/omap1.o
  CC      aarch64-softmmu/hw/arm/omap2.o
  CC      aarch64-softmmu/hw/arm/strongarm.o
  CC      aarch64-softmmu/hw/arm/allwinner-a10.o
  CC      aarch64-softmmu/hw/arm/cubieboard.o
  CC      aarch64-softmmu/hw/arm/bcm2835_peripherals.o
  CC      aarch64-softmmu/hw/arm/bcm2836.o
  CC      aarch64-softmmu/hw/arm/raspi.o
  CC      aarch64-softmmu/hw/arm/stm32f205_soc.o
  CC      aarch64-softmmu/hw/arm/xlnx-zynqmp.o
  CC      aarch64-softmmu/hw/arm/xlnx-zcu102.o
  CC      aarch64-softmmu/hw/arm/xlnx-versal.o
  CC      aarch64-softmmu/hw/arm/xlnx-versal-virt.o
  CC      aarch64-softmmu/hw/arm/fsl-imx25.o
  CC      aarch64-softmmu/hw/arm/imx25_pdk.o
  CC      aarch64-softmmu/hw/arm/fsl-imx31.o
  CC      aarch64-softmmu/hw/arm/kzm.o
  CC      aarch64-softmmu/hw/arm/fsl-imx6.o
  CC      aarch64-softmmu/hw/arm/sabrelite.o
  CC      aarch64-softmmu/hw/arm/aspeed_soc.o
  CC      aarch64-softmmu/hw/arm/aspeed.o
  CC      aarch64-softmmu/hw/arm/mps2.o
  CC      aarch64-softmmu/hw/arm/mps2-tz.o
  CC      aarch64-softmmu/hw/arm/msf2-soc.o
  CC      aarch64-softmmu/hw/arm/msf2-som.o
  CC      aarch64-softmmu/hw/arm/iotkit.o
  CC      aarch64-softmmu/hw/arm/fsl-imx7.o
  CC      aarch64-softmmu/hw/arm/mcimx7d-sabre.o
  CC      aarch64-softmmu/hw/arm/smmu-common.o
  CC      aarch64-softmmu/hw/arm/smmuv3.o
  CC      aarch64-softmmu/hw/arm/fsl-imx6ul.o
  CC      aarch64-softmmu/hw/arm/mcimx6ul-evk.o
  CC      aarch64-softmmu/hw/arm/nrf51_soc.o
  CC      aarch64-softmmu/hw/arm/microbit.o
  CC      aarch64-softmmu/target/arm/arm-semi.o
  CC      aarch64-softmmu/target/arm/machine.o
  CC      aarch64-softmmu/target/arm/psci.o
  CC      aarch64-softmmu/target/arm/arch_dump.o
  CC      aarch64-softmmu/target/arm/monitor.o
  CC      aarch64-softmmu/target/arm/kvm-stub.o
  CC      aarch64-softmmu/target/arm/translate.o
  CC      aarch64-softmmu/target/arm/op_helper.o
  CC      aarch64-softmmu/target/arm/helper.o
  CC      aarch64-softmmu/target/arm/cpu.o
  CC      aarch64-softmmu/target/arm/neon_helper.o
  CC      aarch64-softmmu/target/arm/iwmmxt_helper.o
  CC      aarch64-softmmu/target/arm/vec_helper.o
  CC      aarch64-softmmu/target/arm/gdbstub.o
  CC      aarch64-softmmu/target/arm/cpu64.o
  CC      aarch64-softmmu/target/arm/translate-a64.o
  CC      aarch64-softmmu/target/arm/helper-a64.o
  CC      aarch64-softmmu/target/arm/gdbstub64.o
  CC      aarch64-softmmu/target/arm/crypto_helper.o
  CC      aarch64-softmmu/target/arm/arm-powerctl.o
  GEN     aarch64-softmmu/target/arm/decode-sve.inc.c
  CC      aarch64-softmmu/target/arm/sve_helper.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/trace/control-target.o
  CC      aarch64-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/target/arm/translate-sve.o
  CC      aarch64-softmmu/trace/generated-helpers.o
  LINK    aarch64-softmmu/qemu-system-aarch64w.exe
  GEN     aarch64-softmmu/qemu-system-aarch64.exe
install -d -m 0755 "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install"
install -d -m 0755 "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install"
install -c -m 0755 qemu-ga.exe qemu-img.exe qemu-io.exe qemu-edid.exe  "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install"
x86_64-w64-mingw32-strip "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install/qemu-ga.exe" "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install/qemu-img.exe" "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install/qemu-io.exe" "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install/qemu-edid.exe"
set -e; for x in bios.bin bios-256k.bin sgabios.bin vgabios.bin vgabios-cirrus.bin vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin vgabios-virtio.bin vgabios-ramfb.bin vgabios-bochs-display.bin ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin QEMU,cgthree.bin pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom efi-e1000e.rom efi-vmxnet3.rom qemu-icon.bmp qemu_logo_no_text.svg bamboo.dtb canyonlands.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin s390-ccw.img s390-netboot.img spapr-rtas.bin slof.bin skiboot.lid palcode-clipper u-boot.e500 u-boot-sam460-20100605.bin qemu_vga.ndrv hppa-firmware.img; do \
	install -c -m 0644 /tmp/qemu-test/src/pc-bios/$x "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install"; \
done
make -C po install
make[1]: Entering directory '/tmp/qemu-test/build/po'
  GEN     /tmp/qemu-test/src/po/messages.po
  GEN     /tmp/qemu-test/src/po/hu.po
  GEN     /tmp/qemu-test/src/po/tr.po
  GEN     /tmp/qemu-test/src/po/it.po
  GEN     /tmp/qemu-test/src/po/bg.po
  GEN     /tmp/qemu-test/src/po/fr_FR.po
  GEN     /tmp/qemu-test/src/po/zh_CN.po
  GEN     /tmp/qemu-test/src/po/de_DE.po
  GEN     bg.mo
  GEN     fr_FR.mo
  GEN     tr.mo
  GEN     it.mo
  GEN     hu.mo
  GEN     zh_CN.mo
  GEN     de_DE.mo
for obj in hu.mo tr.mo it.mo bg.mo fr_FR.mo zh_CN.mo de_DE.mo; do \
    base=$(basename $obj .mo); \
    install -d /tmp/qemu-test/build/=destdir/tmp/qemu-test/install/share/locale/$base/LC_MESSAGES; \
    install -m644 $obj /tmp/qemu-test/build/=destdir/tmp/qemu-test/install/share/locale/$base/LC_MESSAGES/qemu.mo; \
done
make[1]: Leaving directory '/tmp/qemu-test/build/po'
install -d -m 0755 "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install/keymaps"
set -e; for x in da     en-gb  et  fr     fr-ch  is  lt  modifiers  no  pt-br  sv ar      de     en-us  fi  fr-be  hr     it  lv  nl         pl  ru     th common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr bepo    cz; do \
	install -c -m 0644 /tmp/qemu-test/src/pc-bios/keymaps/$x "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install/keymaps"; \
done
install -c -m 0644 /tmp/qemu-test/build/trace-events-all "/tmp/qemu-test/build/=destdir/tmp/qemu-test/install/trace-events-all"
for d in x86_64-softmmu aarch64-softmmu; do \
make --no-print-directory --quiet BUILD_DIR=/tmp/qemu-test/build TARGET_DIR=$d/ -C $d install || exit 1 ; \
        done
rm -f *.timestamp
rm -rf tests/check-qdict.exe tests/check-block-qdict.exe tests/test-char.exe tests/check-qnum.exe tests/check-qstring.exe tests/check-qlist.exe tests/check-qnull.exe tests/check-qobject.exe tests/check-qjson.exe tests/check-qlit.exe tests/test-qobject-output-visitor.exe tests/test-clone-visitor.exe tests/test-qobject-input-visitor.exe tests/test-qmp-cmds.exe tests/test-string-input-visitor.exe tests/test-string-output-visitor.exe tests/test-qmp-event.exe tests/test-opts-visitor.exe tests/test-coroutine.exe tests/test-visitor-serialization.exe tests/test-iov.exe tests/test-aio.exe tests/test-aio-multithread.exe tests/test-throttle.exe tests/test-thread-pool.exe tests/test-hbitmap.exe tests/test-bdrv-drain.exe tests/test-blockjob.exe tests/test-blockjob-txn.exe tests/test-block-backend.exe tests/test-image-locking.exe tests/test-x86-cpuid.exe tests/test-xbzrle.exe tests/test-cutils.exe tests/test-shift128.exe tests/test-mul64.exe tests/test-int128.exe tests/rcutorture.exe tests/test-rcu-list.exe tests/test-rcu-simpleq.exe tests/test-rcu-tailq.exe tests/test-qdist.exe tests/test-qht.exe tests/test-qht-par.exe tests/test-bitops.exe tests/test-bitcnt.exe tests/test-qdev-global-props.exe tests/check-qom-interface.exe tests/check-qom-proplist.exe tests/test-qemu-opts.exe tests/test-keyval.exe tests/test-write-threshold.exe tests/test-crypto-hash.exe tests/test-crypto-hmac.exe tests/test-crypto-cipher.exe tests/test-crypto-secret.exe tests/test-crypto-tlscredsx509.exe tests/test-crypto-tlssession.exe tests/test-timed-average.exe tests/test-util-sockets.exe tests/test-io-task.exe tests/test-io-channel-socket.exe tests/test-io-channel-file.exe tests/test-io-channel-tls.exe tests/test-io-channel-command.exe tests/test-io-channel-buffer.exe tests/test-base64.exe tests/test-crypto-pbkdf.exe tests/test-crypto-ivgen.exe tests/test-crypto-afsplit.exe tests/test-crypto-xts.exe tests/test-crypto-block.exe tests/test-logging.exe tests/test-replication.exe tests/test-bufferiszero.exe tests/test-uuid.exe tests/ptimer-test.exe tests/test-qapi-util.exe tests/*.o 
rm -rf tests/ac97-test.exe tests/ahci-test.exe tests/bios-tables-test.exe tests/boot-order-test.exe tests/boot-serial-test.exe tests/cdrom-test.exe tests/cpu-plug-test.exe tests/device-introspect-test.exe tests/display-vga-test.exe tests/drive_del-test.exe tests/ds1338-test.exe tests/e1000-test.exe tests/e1000e-test.exe tests/eepro100-test.exe tests/endianness-test.exe tests/es1370-test.exe tests/fdc-test.exe tests/fw_cfg-test.exe tests/hd-geo-test.exe tests/hexloader-test.exe tests/i440fx-test.exe tests/i82801b11-test.exe tests/ide-test.exe tests/intel-hda-test.exe tests/ioh3420-test.exe tests/ipmi-bt-test.exe tests/ipmi-kcs-test.exe tests/ipoctal232-test.exe tests/m25p80-test.exe tests/m48t59-test.exe tests/machine-none-test.exe tests/megasas-test.exe tests/migration-test.exe tests/ne2000-test.exe tests/numa-test.exe tests/nvme-test.exe tests/pca9552-test.exe tests/pcnet-test.exe tests/pnv-xscom-test.exe tests/prom-env-test.exe tests/pvpanic-test.exe tests/pxe-test.exe tests/q35-test.exe tests/qmp-cmd-test.exe tests/qmp-test.exe tests/qom-test.exe tests/rtas-test.exe tests/rtc-test.exe tests/rtl8139-test.exe tests/sdhci-test.exe tests/spapr-phb-test.exe tests/tco-test.exe tests/test-arm-mptimer.exe tests/test-filter-redirector.exe tests/test-hmp.exe tests/test-netfilter.exe tests/test-x86-cpuid-compat.exe tests/tmp105-test.exe tests/tpci200-test.exe tests/tpm-crb-swtpm-test.exe tests/tpm-crb-test.exe tests/tpm-tis-swtpm-test.exe tests/tpm-tis-test.exe tests/usb-hcd-ohci-test.exe tests/usb-hcd-uhci-test.exe tests/usb-hcd-xhci-test.exe tests/virtio-balloon-test.exe tests/virtio-blk-test.exe tests/virtio-ccw-test.exe tests/virtio-console-test.exe tests/virtio-net-test.exe tests/virtio-rng-test.exe tests/virtio-scsi-test.exe tests/virtio-serial-test.exe tests/vmgenid-test.exe tests/vmxnet3-test.exe tests/wdt_ib700-test.exe
rm -f tests/test-qapi-gen-timestamp
rm -rf /tmp/qemu-test/build/tests/venv /tmp/qemu-test/build/tests/results
rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
rm -f qemu-options.def
rm -f *.msi
find . \( -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f -exec rm {} +
rm -f qemu-ga qemu-img.exe qemu-io.exe qemu-edid.exe  qemu-ga TAGS cscope.* *.pod *~ */*~
rm -f fsdev/*.pod scsi/*.pod
rm -f qemu-img-cmds.h
rm -f ui/shader/*-vert.h ui/shader/*-frag.h
rm -f trace/generated-tracers-dtrace.dtrace*
rm -f trace/generated-tracers-dtrace.h*
rm -f qemu-version.h qemu-version.h-timestamp config-host.h config-host.h-timestamp qemu-options.def qemu-options.def-timestamp qapi/qapi-builtin-types.h qapi/qapi-builtin-types.h-timestamp qapi/qapi-builtin-types.c qapi/qapi-builtin-types.c-timestamp qapi/qapi-types.h qapi/qapi-types.h-timestamp qapi/qapi-types.c qapi/qapi-types.c-timestamp qapi/qapi-types-block-core.h qapi/qapi-types-block-core.h-timestamp qapi/qapi-types-block-core.c qapi/qapi-types-block-core.c-timestamp qapi/qapi-types-block.h qapi/qapi-types-block.h-timestamp qapi/qapi-types-block.c qapi/qapi-types-block.c-timestamp qapi/qapi-types-char.h qapi/qapi-types-char.h-timestamp qapi/qapi-types-char.c qapi/qapi-types-char.c-timestamp qapi/qapi-types-common.h qapi/qapi-types-common.h-timestamp qapi/qapi-types-common.c qapi/qapi-types-common.c-timestamp qapi/qapi-types-crypto.h qapi/qapi-types-crypto.h-timestamp qapi/qapi-types-crypto.c qapi/qapi-types-crypto.c-timestamp qapi/qapi-types-introspect.h qapi/qapi-types-introspect.h-timestamp qapi/qapi-types-introspect.c qapi/qapi-types-introspect.c-timestamp qapi/qapi-types-job.h qapi/qapi-types-job.h-timestamp qapi/qapi-types-job.c qapi/qapi-types-job.c-timestamp qapi/qapi-types-migration.h qapi/qapi-types-migration.h-timestamp qapi/qapi-types-migration.c qapi/qapi-types-migration.c-timestamp qapi/qapi-types-misc.h qapi/qapi-types-misc.h-timestamp qapi/qapi-types-misc.c qapi/qapi-types-misc.c-timestamp qapi/qapi-types-net.h qapi/qapi-types-net.h-timestamp qapi/qapi-types-net.c qapi/qapi-types-net.c-timestamp qapi/qapi-types-rocker.h qapi/qapi-types-rocker.h-timestamp qapi/qapi-types-rocker.c qapi/qapi-types-rocker.c-timestamp qapi/qapi-types-run-state.h qapi/qapi-types-run-state.h-timestamp qapi/qapi-types-run-state.c qapi/qapi-types-run-state.c-timestamp qapi/qapi-types-sockets.h qapi/qapi-types-sockets.h-timestamp qapi/qapi-types-sockets.c qapi/qapi-types-sockets.c-timestamp qapi/qapi-types-tpm.h qapi/qapi-types-tpm.h-timestamp qapi/qapi-types-tpm.c qapi/qapi-types-tpm.c-timestamp qapi/qapi-types-trace.h qapi/qapi-types-trace.h-timestamp qapi/qapi-types-trace.c qapi/qapi-types-trace.c-timestamp qapi/qapi-types-transaction.h qapi/qapi-types-transaction.h-timestamp qapi/qapi-types-transaction.c qapi/qapi-types-transaction.c-timestamp qapi/qapi-types-ui.h qapi/qapi-types-ui.h-timestamp qapi/qapi-types-ui.c qapi/qapi-types-ui.c-timestamp qapi/qapi-builtin-visit.h qapi/qapi-builtin-visit.h-timestamp qapi/qapi-builtin-visit.c qapi/qapi-builtin-visit.c-timestamp qapi/qapi-visit.h qapi/qapi-visit.h-timestamp qapi/qapi-visit.c qapi/qapi-visit.c-timestamp qapi/qapi-visit-block-core.h qapi/qapi-visit-block-core.h-timestamp qapi/qapi-visit-block-core.c qapi/qapi-visit-block-core.c-timestamp qapi/qapi-visit-block.h qapi/qapi-visit-block.h-timestamp qapi/qapi-visit-block.c qapi/qapi-visit-block.c-timestamp qapi/qapi-visit-char.h qapi/qapi-visit-char.h-timestamp qapi/qapi-visit-char.c qapi/qapi-visit-char.c-timestamp qapi/qapi-visit-common.h qapi/qapi-visit-common.h-timestamp qapi/qapi-visit-common.c qapi/qapi-visit-common.c-timestamp qapi/qapi-visit-crypto.h qapi/qapi-visit-crypto.h-timestamp qapi/qapi-visit-crypto.c qapi/qapi-visit-crypto.c-timestamp qapi/qapi-visit-introspect.h qapi/qapi-visit-introspect.h-timestamp qapi/qapi-visit-introspect.c qapi/qapi-visit-introspect.c-timestamp qapi/qapi-visit-job.h qapi/qapi-visit-job.h-timestamp qapi/qapi-visit-job.c qapi/qapi-visit-job.c-timestamp qapi/qapi-visit-migration.h qapi/qapi-visit-migration.h-timestamp qapi/qapi-visit-migration.c qapi/qapi-visit-migration.c-timestamp qapi/qapi-visit-misc.h qapi/qapi-visit-misc.h-timestamp qapi/qapi-visit-misc.c qapi/qapi-visit-misc.c-timestamp qapi/qapi-visit-net.h qapi/qapi-visit-net.h-timestamp qapi/qapi-visit-net.c qapi/qapi-visit-net.c-timestamp qapi/qapi-visit-rocker.h qapi/qapi-visit-rocker.h-timestamp qapi/qapi-visit-rocker.c qapi/qapi-visit-rocker.c-timestamp qapi/qapi-visit-run-state.h qapi/qapi-visit-run-state.h-timestamp qapi/qapi-visit-run-state.c qapi/qapi-visit-run-state.c-timestamp qapi/qapi-visit-sockets.h qapi/qapi-visit-sockets.h-timestamp qapi/qapi-visit-sockets.c qapi/qapi-visit-sockets.c-timestamp qapi/qapi-visit-tpm.h qapi/qapi-visit-tpm.h-timestamp qapi/qapi-visit-tpm.c qapi/qapi-visit-tpm.c-timestamp qapi/qapi-visit-trace.h qapi/qapi-visit-trace.h-timestamp qapi/qapi-visit-trace.c qapi/qapi-visit-trace.c-timestamp qapi/qapi-visit-transaction.h qapi/qapi-visit-transaction.h-timestamp qapi/qapi-visit-transaction.c qapi/qapi-visit-transaction.c-timestamp qapi/qapi-visit-ui.h qapi/qapi-visit-ui.h-timestamp qapi/qapi-visit-ui.c qapi/qapi-visit-ui.c-timestamp qapi/qapi-commands.h qapi/qapi-commands.h-timestamp qapi/qapi-commands.c qapi/qapi-commands.c-timestamp qapi/qapi-commands-block-core.h qapi/qapi-commands-block-core.h-timestamp qapi/qapi-commands-block-core.c qapi/qapi-commands-block-core.c-timestamp qapi/qapi-commands-block.h qapi/qapi-commands-block.h-timestamp qapi/qapi-commands-block.c qapi/qapi-commands-block.c-timestamp qapi/qapi-commands-char.h qapi/qapi-commands-char.h-timestamp qapi/qapi-commands-char.c qapi/qapi-commands-char.c-timestamp qapi/qapi-commands-common.h qapi/qapi-commands-common.h-timestamp qapi/qapi-commands-common.c qapi/qapi-commands-common.c-timestamp qapi/qapi-commands-crypto.h qapi/qapi-commands-crypto.h-timestamp qapi/qapi-commands-crypto.c qapi/qapi-commands-crypto.c-timestamp qapi/qapi-commands-introspect.h qapi/qapi-commands-introspect.h-timestamp qapi/qapi-commands-introspect.c qapi/qapi-commands-introspect.c-timestamp qapi/qapi-commands-job.h qapi/qapi-commands-job.h-timestamp qapi/qapi-commands-job.c qapi/qapi-commands-job.c-timestamp qapi/qapi-commands-migration.h qapi/qapi-commands-migration.h-timestamp qapi/qapi-commands-migration.c qapi/qapi-commands-migration.c-timestamp qapi/qapi-commands-misc.h qapi/qapi-commands-misc.h-timestamp qapi/qapi-commands-misc.c qapi/qapi-commands-misc.c-timestamp qapi/qapi-commands-net.h qapi/qapi-commands-net.h-timestamp qapi/qapi-commands-net.c qapi/qapi-commands-net.c-timestamp qapi/qapi-commands-rocker.h qapi/qapi-commands-rocker.h-timestamp qapi/qapi-commands-rocker.c qapi/qapi-commands-rocker.c-timestamp qapi/qapi-commands-run-state.h qapi/qapi-commands-run-state.h-timestamp qapi/qapi-commands-run-state.c qapi/qapi-commands-run-state.c-timestamp qapi/qapi-commands-sockets.h qapi/qapi-commands-sockets.h-timestamp qapi/qapi-commands-sockets.c qapi/qapi-commands-sockets.c-timestamp qapi/qapi-commands-tpm.h qapi/qapi-commands-tpm.h-timestamp qapi/qapi-commands-tpm.c qapi/qapi-commands-tpm.c-timestamp qapi/qapi-commands-trace.h qapi/qapi-commands-trace.h-timestamp qapi/qapi-commands-trace.c qapi/qapi-commands-trace.c-timestamp qapi/qapi-commands-transaction.h qapi/qapi-commands-transaction.h-timestamp qapi/qapi-commands-transaction.c qapi/qapi-commands-transaction.c-timestamp qapi/qapi-commands-ui.h qapi/qapi-commands-ui.h-timestamp qapi/qapi-commands-ui.c qapi/qapi-commands-ui.c-timestamp qapi/qapi-events.h qapi/qapi-events.h-timestamp qapi/qapi-events.c qapi/qapi-events.c-timestamp qapi/qapi-events-block-core.h qapi/qapi-events-block-core.h-timestamp qapi/qapi-events-block-core.c qapi/qapi-events-block-core.c-timestamp qapi/qapi-events-block.h qapi/qapi-events-block.h-timestamp qapi/qapi-events-block.c qapi/qapi-events-block.c-timestamp qapi/qapi-events-char.h qapi/qapi-events-char.h-timestamp qapi/qapi-events-char.c qapi/qapi-events-char.c-timestamp qapi/qapi-events-common.h qapi/qapi-events-common.h-timestamp qapi/qapi-events-common.c qapi/qapi-events-common.c-timestamp qapi/qapi-events-crypto.h qapi/qapi-events-crypto.h-timestamp qapi/qapi-events-crypto.c qapi/qapi-events-crypto.c-timestamp qapi/qapi-events-introspect.h qapi/qapi-events-introspect.h-timestamp qapi/qapi-events-introspect.c qapi/qapi-events-introspect.c-timestamp qapi/qapi-events-job.h qapi/qapi-events-job.h-timestamp qapi/qapi-events-job.c qapi/qapi-events-job.c-timestamp qapi/qapi-events-migration.h qapi/qapi-events-migration.h-timestamp qapi/qapi-events-migration.c qapi/qapi-events-migration.c-timestamp qapi/qapi-events-misc.h qapi/qapi-events-misc.h-timestamp qapi/qapi-events-misc.c qapi/qapi-events-misc.c-timestamp qapi/qapi-events-net.h qapi/qapi-events-net.h-timestamp qapi/qapi-events-net.c qapi/qapi-events-net.c-timestamp qapi/qapi-events-rocker.h qapi/qapi-events-rocker.h-timestamp qapi/qapi-events-rocker.c qapi/qapi-events-rocker.c-timestamp qapi/qapi-events-run-state.h qapi/qapi-events-run-state.h-timestamp qapi/qapi-events-run-state.c qapi/qapi-events-run-state.c-timestamp qapi/qapi-events-sockets.h qapi/qapi-events-sockets.h-timestamp qapi/qapi-events-sockets.c qapi/qapi-events-sockets.c-timestamp qapi/qapi-events-tpm.h qapi/qapi-events-tpm.h-timestamp qapi/qapi-events-tpm.c qapi/qapi-events-tpm.c-timestamp qapi/qapi-events-trace.h qapi/qapi-events-trace.h-timestamp qapi/qapi-events-trace.c qapi/qapi-events-trace.c-timestamp qapi/qapi-events-transaction.h qapi/qapi-events-transaction.h-timestamp qapi/qapi-events-transaction.c qapi/qapi-events-transaction.c-timestamp qapi/qapi-events-ui.h qapi/qapi-events-ui.h-timestamp qapi/qapi-events-ui.c qapi/qapi-events-ui.c-timestamp qapi/qapi-introspect.c qapi/qapi-introspect.c-timestamp qapi/qapi-introspect.h qapi/qapi-introspect.h-timestamp qapi/qapi-doc.texi qapi/qapi-doc.texi-timestamp trace/generated-tcg-tracers.h trace/generated-tcg-tracers.h-timestamp trace/generated-helpers-wrappers.h trace/generated-helpers-wrappers.h-timestamp trace/generated-helpers.h trace/generated-helpers.h-timestamp trace/generated-helpers.c trace/generated-helpers.c-timestamp module_block.h module_block.h-timestamp trace-root.h trace-root.h-timestamp accel/kvm/trace.h accel/kvm/trace.h-timestamp accel/tcg/trace.h accel/tcg/trace.h-timestamp audio/trace.h audio/trace.h-timestamp block/trace.h block/trace.h-timestamp chardev/trace.h chardev/trace.h-timestamp crypto/trace.h crypto/trace.h-timestamp hw/9pfs/trace.h hw/9pfs/trace.h-timestamp hw/acpi/trace.h hw/acpi/trace.h-timestamp hw/alpha/trace.h hw/alpha/trace.h-timestamp hw/arm/trace.h hw/arm/trace.h-timestamp hw/audio/trace.h hw/audio/trace.h-timestamp hw/block/trace.h hw/block/trace.h-timestamp hw/block/dataplane/trace.h hw/block/dataplane/trace.h-timestamp hw/char/trace.h hw/char/trace.h-timestamp hw/display/trace.h hw/display/trace.h-timestamp hw/dma/trace.h hw/dma/trace.h-timestamp hw/hppa/trace.h hw/hppa/trace.h-timestamp hw/i2c/trace.h hw/i2c/trace.h-timestamp hw/i386/trace.h hw/i386/trace.h-timestamp hw/i386/xen/trace.h hw/i386/xen/trace.h-timestamp hw/ide/trace.h hw/ide/trace.h-timestamp hw/input/trace.h hw/input/trace.h-timestamp hw/intc/trace.h hw/intc/trace.h-timestamp hw/isa/trace.h hw/isa/trace.h-timestamp hw/mem/trace.h hw/mem/trace.h-timestamp hw/misc/trace.h hw/misc/trace.h-timestamp hw/misc/macio/trace.h hw/misc/macio/trace.h-timestamp hw/net/trace.h hw/net/trace.h-timestamp hw/nvram/trace.h hw/nvram/trace.h-timestamp hw/pci/trace.h hw/pci/trace.h-timestamp hw/pci-host/trace.h hw/pci-host/trace.h-timestamp hw/ppc/trace.h hw/ppc/trace.h-timestamp hw/rdma/trace.h hw/rdma/trace.h-timestamp hw/rdma/vmw/trace.h hw/rdma/vmw/trace.h-timestamp hw/s390x/trace.h hw/s390x/trace.h-timestamp hw/scsi/trace.h hw/scsi/trace.h-timestamp hw/sd/trace.h hw/sd/trace.h-timestamp hw/sparc/trace.h hw/sparc/trace.h-timestamp hw/sparc64/trace.h hw/sparc64/trace.h-timestamp hw/timer/trace.h hw/timer/trace.h-timestamp hw/tpm/trace.h hw/tpm/trace.h-timestamp hw/usb/trace.h hw/usb/trace.h-timestamp hw/vfio/trace.h hw/vfio/trace.h-timestamp hw/virtio/trace.h hw/virtio/trace.h-timestamp hw/watchdog/trace.h hw/watchdog/trace.h-timestamp hw/xen/trace.h hw/xen/trace.h-timestamp io/trace.h io/trace.h-timestamp linux-user/trace.h linux-user/trace.h-timestamp migration/trace.h migration/trace.h-timestamp nbd/trace.h nbd/trace.h-timestamp net/trace.h net/trace.h-timestamp qapi/trace.h qapi/trace.h-timestamp qom/trace.h qom/trace.h-timestamp scsi/trace.h scsi/trace.h-timestamp target/arm/trace.h target/arm/trace.h-timestamp target/i386/trace.h target/i386/trace.h-timestamp target/mips/trace.h target/mips/trace.h-timestamp target/ppc/trace.h target/ppc/trace.h-timestamp target/s390x/trace.h target/s390x/trace.h-timestamp target/sparc/trace.h target/sparc/trace.h-timestamp ui/trace.h ui/trace.h-timestamp util/trace.h util/trace.h-timestamp trace-root.c trace-root.c-timestamp accel/kvm/trace.c accel/kvm/trace.c-timestamp accel/tcg/trace.c accel/tcg/trace.c-timestamp audio/trace.c audio/trace.c-timestamp block/trace.c block/trace.c-timestamp chardev/trace.c chardev/trace.c-timestamp crypto/trace.c crypto/trace.c-timestamp hw/9pfs/trace.c hw/9pfs/trace.c-timestamp hw/acpi/trace.c hw/acpi/trace.c-timestamp hw/alpha/trace.c hw/alpha/trace.c-timestamp hw/arm/trace.c hw/arm/trace.c-timestamp hw/audio/trace.c hw/audio/trace.c-timestamp hw/block/trace.c hw/block/trace.c-timestamp hw/block/dataplane/trace.c hw/block/dataplane/trace.c-timestamp hw/char/trace.c hw/char/trace.c-timestamp hw/display/trace.c hw/display/trace.c-timestamp hw/dma/trace.c hw/dma/trace.c-timestamp hw/hppa/trace.c hw/hppa/trace.c-timestamp hw/i2c/trace.c hw/i2c/trace.c-timestamp hw/i386/trace.c hw/i386/trace.c-timestamp hw/i386/xen/trace.c hw/i386/xen/trace.c-timestamp hw/ide/trace.c hw/ide/trace.c-timestamp hw/input/trace.c hw/input/trace.c-timestamp hw/intc/trace.c hw/intc/trace.c-timestamp hw/isa/trace.c hw/isa/trace.c-timestamp hw/mem/trace.c hw/mem/trace.c-timestamp hw/misc/trace.c hw/misc/trace.c-timestamp hw/misc/macio/trace.c hw/misc/macio/trace.c-timestamp hw/net/trace.c hw/net/trace.c-timestamp hw/nvram/trace.c hw/nvram/trace.c-timestamp hw/pci/trace.c hw/pci/trace.c-timestamp hw/pci-host/trace.c hw/pci-host/trace.c-timestamp hw/ppc/trace.c hw/ppc/trace.c-timestamp hw/rdma/trace.c hw/rdma/trace.c-timestamp hw/rdma/vmw/trace.c hw/rdma/vmw/trace.c-timestamp hw/s390x/trace.c hw/s390x/trace.c-timestamp hw/scsi/trace.c hw/scsi/trace.c-timestamp hw/sd/trace.c hw/sd/trace.c-timestamp hw/sparc/trace.c hw/sparc/trace.c-timestamp hw/sparc64/trace.c hw/sparc64/trace.c-timestamp hw/timer/trace.c hw/timer/trace.c-timestamp hw/tpm/trace.c hw/tpm/trace.c-timestamp hw/usb/trace.c hw/usb/trace.c-timestamp hw/vfio/trace.c hw/vfio/trace.c-timestamp hw/virtio/trace.c hw/virtio/trace.c-timestamp hw/watchdog/trace.c hw/watchdog/trace.c-timestamp hw/xen/trace.c hw/xen/trace.c-timestamp io/trace.c io/trace.c-timestamp linux-user/trace.c linux-user/trace.c-timestamp migration/trace.c migration/trace.c-timestamp nbd/trace.c nbd/trace.c-timestamp net/trace.c net/trace.c-timestamp qapi/trace.c qapi/trace.c-timestamp qom/trace.c qom/trace.c-timestamp scsi/trace.c scsi/trace.c-timestamp target/arm/trace.c target/arm/trace.c-timestamp target/i386/trace.c target/i386/trace.c-timestamp target/mips/trace.c target/mips/trace.c-timestamp target/ppc/trace.c target/ppc/trace.c-timestamp target/s390x/trace.c target/s390x/trace.c-timestamp target/sparc/trace.c target/sparc/trace.c-timestamp ui/trace.c ui/trace.c-timestamp util/trace.c util/trace.c-timestamp /tmp/qemu-test/build/trace-events-all /tmp/qemu-test/build/trace-events-all-timestamp .git-submodule-status .git-submodule-status-timestamp ui/input-keymap-atset1-to-qcode.c ui/input-keymap-atset1-to-qcode.c-timestamp ui/input-keymap-linux-to-qcode.c ui/input-keymap-linux-to-qcode.c-timestamp ui/input-keymap-qcode-to-atset1.c ui/input-keymap-qcode-to-atset1.c-timestamp ui/input-keymap-qcode-to-atset2.c ui/input-keymap-qcode-to-atset2.c-timestamp ui/input-keymap-qcode-to-atset3.c ui/input-keymap-qcode-to-atset3.c-timestamp ui/input-keymap-qcode-to-linux.c ui/input-keymap-qcode-to-linux.c-timestamp ui/input-keymap-qcode-to-qnum.c ui/input-keymap-qcode-to-qnum.c-timestamp ui/input-keymap-qcode-to-sun.c ui/input-keymap-qcode-to-sun.c-timestamp ui/input-keymap-qnum-to-qcode.c ui/input-keymap-qnum-to-qcode.c-timestamp ui/input-keymap-usb-to-qcode.c ui/input-keymap-usb-to-qcode.c-timestamp ui/input-keymap-win32-to-qcode.c ui/input-keymap-win32-to-qcode.c-timestamp ui/input-keymap-x11-to-qcode.c ui/input-keymap-x11-to-qcode.c-timestamp ui/input-keymap-xorgevdev-to-qcode.c ui/input-keymap-xorgevdev-to-qcode.c-timestamp ui/input-keymap-xorgkbd-to-qcode.c ui/input-keymap-xorgkbd-to-qcode.c-timestamp ui/input-keymap-xorgxquartz-to-qcode.c ui/input-keymap-xorgxquartz-to-qcode.c-timestamp ui/input-keymap-xorgxwin-to-qcode.c ui/input-keymap-xorgxwin-to-qcode.c-timestamp ui/input-keymap-osx-to-qcode.c ui/input-keymap-osx-to-qcode.c-timestamp tests/test-qapi-types.h tests/test-qapi-types.h-timestamp tests/test-qapi-visit.h tests/test-qapi-visit.h-timestamp tests/test-qapi-commands.h tests/test-qapi-commands.h-timestamp tests/test-qapi-events.h tests/test-qapi-events.h-timestamp tests/test-qapi-introspect.h tests/test-qapi-introspect.h-timestamp
rm -f qapi-gen-timestamp
rm -rf qga/qapi-generated
for d in x86_64-softmmu aarch64-softmmu pc-bios/optionrom; do \
if test -d $d; then make -C $d clean || exit 1; fi; \
rm -f $d/qemu-options.def; \
        done
make[1]: Entering directory '/tmp/qemu-test/build/x86_64-softmmu'
rm -f *.timestamp
rm -f *.a *~ qemu-system-x86_64.exe qemu-system-x86_64w.exe
rm -f 
rm -f hmp-commands.h gdbstub-xml.c
make[1]: Leaving directory '/tmp/qemu-test/build/x86_64-softmmu'
make[1]: Entering directory '/tmp/qemu-test/build/aarch64-softmmu'
rm -f *.timestamp
rm -f *.a *~ qemu-system-aarch64.exe qemu-system-aarch64w.exe
rm -f 
rm -f hmp-commands.h gdbstub-xml.c
make[1]: Leaving directory '/tmp/qemu-test/build/aarch64-softmmu'
make[1]: Entering directory '/tmp/qemu-test/build/pc-bios/optionrom'
rm -f *.timestamp
rm -f *.o *.d *.raw *.img *.bin *~
make[1]: Leaving directory '/tmp/qemu-test/build/pc-bios/optionrom'
rm -f config-all-devices.mak
Configure options:
--enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/tmp/qemu-test/install --python=/usr/bin/python3 --cross-prefix=i686-w64-mingw32- --enable-trace-backends=simple --enable-gnutls --enable-nettle --enable-curl --enable-vnc --enable-bzip2 --enable-guest-agent --with-sdlabi=2.0
Install prefix    /tmp/qemu-test/install
BIOS directory    /tmp/qemu-test/install
firmware path     /tmp/qemu-test/install/share/qemu-firmware
binary directory  /tmp/qemu-test/install
library directory /tmp/qemu-test/install/lib
module directory  /tmp/qemu-test/install/lib
libexec directory /tmp/qemu-test/install/libexec
include directory /tmp/qemu-test/install/include
config directory  /tmp/qemu-test/install
local state directory   queried at runtime
Windows SDK       no
Source path       /tmp/qemu-test/src
GIT binary        git
GIT submodules    
C compiler        i686-w64-mingw32-gcc
Host C compiler   cc
C++ compiler      i686-w64-mingw32-g++
Objective-C compiler clang
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/i686-w64-mingw32/sys-root/mingw/include/pixman-1  -I$(SRC_PATH)/dtc/libfdt -Werror -DHAS_LIBSSH2_SFTP_FSYNC -I/usr/i686-w64-mingw32/sys-root/mingw/include  -mms-bitfields -I/usr/i686-w64-mingw32/sys-root/mingw/include/glib-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/lib/glib-2.0/include -I/usr/i686-w64-mingw32/sys-root/mingw/include  -m32 -mthreads -D__USE_MINGW_ANSI_STDIO=1 -DWIN32_LEAN_AND_MEAN -DWINVER=0x501 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wexpansion-to-defined -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/i686-w64-mingw32/sys-root/mingw/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/p11-kit-1  -I/usr/i686-w64-mingw32/sys-root/mingw/include   -I/usr/i686-w64-mingw32/sys-root/mingw/include/libpng16 
LDFLAGS           -Wl,--nxcompat -Wl,--no-seh -Wl,--dynamicbase -Wl,--warn-common -m32 -g 
QEMU_LDFLAGS      -L$(BUILD_DIR)/dtc/libfdt 
make              make
install           install
python            /usr/bin/python3 -B
smbd              /usr/sbin/smbd
module support    no
host CPU          i386
host big endian   no
target list       x86_64-softmmu aarch64-softmmu
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
SDL support       yes (2.0.9)
GTK support       yes (3.22.30)
GTK GL support    no
VTE support       no 
TLS priority      NORMAL
GNUTLS support    yes
libgcrypt         no
nettle            yes (3.4)
libtasn1          yes
curses support    no
virgl support     no 
curl support      yes
mingw32 support   yes
Audio drivers     dsound
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    no
Multipath support no
VNC support       yes
VNC SASL support  no
VNC JPEG support  yes
VNC PNG support   yes
xen support       no
brlapi support    no
bluez  support    no
Documentation     no
PIE               no
vde support       no
netmap support    no
Linux AIO support no
ATTR/XATTR support no
Install blobs     yes
KVM support       no
HAX support       yes
HVF support       no
WHPX support      no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
malloc trim support no
RDMA support      no
PVRDMA support    no
fdt support       git
membarrier        no
preadv support    no
fdatasync         no
madvise           no
posix_madvise     no
posix_memalign    no
libcap-ng support no
vhost-net support no
vhost-crypto support no
vhost-scsi support no
vhost-vsock support no
vhost-user support no
Trace backends    simple
Trace output file trace-<pid>
spice support     no 
rbd support       no
xfsctl support    no
smartcard support no
libusb            no
usb net redir     no
OpenGL support    no
OpenGL dmabufs    no
libiscsi support  no
libnfs support    no
build guest agent yes
QGA VSS support   no
QGA w32 disk info yes
QGA MSI support   no
seccomp support   no
coroutine backend win32
coroutine pool    yes
debug stack usage no
mutex debugging   no
crypto afalg      no
GlusterFS support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   yes
TPM passthrough   no
TPM emulator      no
QOM debugging     yes
Live block migration yes
lzo support       no
snappy support    no
bzip2 support     yes
NUMA host support no
libxml2           no
tcmalloc support  no
jemalloc support  no
avx2 optimization yes
replication support yes
VxHS block device no
bochs support     yes
cloop support     yes
dmg support       yes
qcow v1 support   yes
vdi support       yes
vvfat support     yes
qed support       yes
parallels support yes
sheepdog support  yes
capstone          no
docker            no
libpmem support   no
libudev           no
  GEN     config-all-devices.mak
  GEN     config-host.h
  GEN     qapi-gen
  GEN     qemu-options.def
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-tcg-tracers.h
  GEN     trace/generated-helpers.h
  GEN     trace/generated-helpers.c
  GEN     module_block.h
  GEN     ui/input-keymap-atset1-to-qcode.c
  GEN     ui/input-keymap-linux-to-qcode.c
  GEN     ui/input-keymap-qcode-to-atset1.c
  GEN     ui/input-keymap-qcode-to-atset2.c
  GEN     ui/input-keymap-qcode-to-atset3.c
  GEN     ui/input-keymap-qcode-to-linux.c
  GEN     ui/input-keymap-qcode-to-qnum.c
  GEN     ui/input-keymap-qcode-to-sun.c
  GEN     ui/input-keymap-qnum-to-qcode.c
  GEN     ui/input-keymap-usb-to-qcode.c
  GEN     ui/input-keymap-win32-to-qcode.c
  GEN     ui/input-keymap-x11-to-qcode.c
  GEN     ui/input-keymap-xorgevdev-to-qcode.c
  GEN     ui/input-keymap-xorgkbd-to-qcode.c
  GEN     ui/input-keymap-xorgxquartz-to-qcode.c
  GEN     ui/input-keymap-xorgxwin-to-qcode.c
  GEN     ui/input-keymap-osx-to-qcode.c
  GEN     tests/test-qapi-gen
  GEN     trace-root.h
  GEN     accel/kvm/trace.h
  GEN     accel/tcg/trace.h
  GEN     audio/trace.h
  GEN     block/trace.h
  GEN     chardev/trace.h
  GEN     crypto/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/display/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/hppa/trace.h
  GEN     hw/i2c/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/ide/trace.h
  GEN     hw/input/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/misc/macio/trace.h
  GEN     hw/net/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/pci-host/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/rdma/trace.h
  GEN     hw/rdma/vmw/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sparc64/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/tpm/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/watchdog/trace.h
  GEN     hw/xen/trace.h
  GEN     io/trace.h
  GEN     linux-user/trace.h
  GEN     migration/trace.h
  GEN     nbd/trace.h
  GEN     net/trace.h
  GEN     qapi/trace.h
  GEN     qom/trace.h
  GEN     scsi/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/mips/trace.h
  GEN     target/ppc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/sparc/trace.h
  GEN     ui/trace.h
  GEN     util/trace.h
  GEN     trace-root.c
  GEN     accel/kvm/trace.c
  GEN     accel/tcg/trace.c
  GEN     audio/trace.c
  GEN     block/trace.c
  GEN     chardev/trace.c
  GEN     crypto/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/display/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/hppa/trace.c
  GEN     hw/i2c/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/ide/trace.c
  GEN     hw/input/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/misc/macio/trace.c
  GEN     hw/net/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/pci-host/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/rdma/trace.c
  GEN     hw/rdma/vmw/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/sparc64/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/tpm/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/watchdog/trace.c
  GEN     hw/xen/trace.c
  GEN     io/trace.c
  GEN     linux-user/trace.c
  GEN     migration/trace.c
  GEN     nbd/trace.c
  GEN     net/trace.c
  GEN     qapi/trace.c
  GEN     qom/trace.c
  GEN     scsi/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/mips/trace.c
  GEN     target/ppc/trace.c
  GEN     target/s390x/trace.c
  GEN     target/sparc/trace.c
  GEN     ui/trace.c
  GEN     util/trace.c
	 DEP /tmp/qemu-test/src/dtc/tests/dumptrees.c
	 DEP /tmp/qemu-test/src/dtc/tests/trees.S
	 DEP /tmp/qemu-test/src/dtc/tests/testutils.c
	 DEP /tmp/qemu-test/src/dtc/tests/value-labels.c
	 DEP /tmp/qemu-test/src/dtc/tests/asm_tree_dump.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_memrsv.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_string.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_full.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_header.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_path.c
	 DEP /tmp/qemu-test/src/dtc/tests/overlay_bad_fixup.c
	 DEP /tmp/qemu-test/src/dtc/tests/overlay.c
	 DEP /tmp/qemu-test/src/dtc/tests/subnode_iterate.c
	 DEP /tmp/qemu-test/src/dtc/tests/property_iterate.c
	 DEP /tmp/qemu-test/src/dtc/tests/integer-expressions.c
	 DEP /tmp/qemu-test/src/dtc/tests/utilfdt_test.c
	 DEP /tmp/qemu-test/src/dtc/tests/path_offset_aliases.c
	 DEP /tmp/qemu-test/src/dtc/tests/add_subnode_with_nops.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_unordered.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtb_reverse.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_ordered.c
	 DEP /tmp/qemu-test/src/dtc/tests/extra-terminating-null.c
	 DEP /tmp/qemu-test/src/dtc/tests/boot-cpuid.c
	 DEP /tmp/qemu-test/src/dtc/tests/incbin.c
	 DEP /tmp/qemu-test/src/dtc/tests/phandle_format.c
	 DEP /tmp/qemu-test/src/dtc/tests/path-references.c
	 DEP /tmp/qemu-test/src/dtc/tests/references.c
	 DEP /tmp/qemu-test/src/dtc/tests/string_escapes.c
	 DEP /tmp/qemu-test/src/dtc/tests/propname_escapes.c
	 DEP /tmp/qemu-test/src/dtc/tests/appendprop2.c
	 DEP /tmp/qemu-test/src/dtc/tests/appendprop1.c
	 DEP /tmp/qemu-test/src/dtc/tests/del_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/del_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/setprop.c
	 DEP /tmp/qemu-test/src/dtc/tests/set_name.c
	 DEP /tmp/qemu-test/src/dtc/tests/rw_tree1.c
	 DEP /tmp/qemu-test/src/dtc/tests/open_pack.c
	 DEP /tmp/qemu-test/src/dtc/tests/nopulate.c
	 DEP /tmp/qemu-test/src/dtc/tests/mangle-layout.c
	 DEP /tmp/qemu-test/src/dtc/tests/move_and_save.c
	 DEP /tmp/qemu-test/src/dtc/tests/sw_states.c
	 DEP /tmp/qemu-test/src/dtc/tests/sw_tree1.c
	 DEP /tmp/qemu-test/src/dtc/tests/nop_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/nop_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/setprop_inplace.c
	 DEP /tmp/qemu-test/src/dtc/tests/stringlist.c
	 DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells2.c
	 DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells.c
	 DEP /tmp/qemu-test/src/dtc/tests/notfound.c
	 DEP /tmp/qemu-test/src/dtc/tests/sized_cells.c
	 DEP /tmp/qemu-test/src/dtc/tests/char_literal.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_alias.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_compatible.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_check_compatible.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_phandle.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_prop_value.c
	 DEP /tmp/qemu-test/src/dtc/tests/parent_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/supernode_atdepth_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_path.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_phandle.c
	 DEP /tmp/qemu-test/src/dtc/tests/getprop.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_name.c
	 DEP /tmp/qemu-test/src/dtc/tests/path_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/subnode_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/find_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/root_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_mem_rsv.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_overlay.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_addresses.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_empty_tree.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_strerror.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_rw.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_sw.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_wip.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_ro.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt.c
	 DEP /tmp/qemu-test/src/dtc/util.c
	 DEP /tmp/qemu-test/src/dtc/fdtoverlay.c
	 DEP /tmp/qemu-test/src/dtc/fdtput.c
	 DEP /tmp/qemu-test/src/dtc/fdtget.c
	 DEP /tmp/qemu-test/src/dtc/fdtdump.c
	 DEP convert-dtsv0-lexer.lex.c
	 DEP /tmp/qemu-test/src/dtc/srcpos.c
	 DEP dtc-parser.tab.c
	 DEP dtc-lexer.lex.c
	 DEP /tmp/qemu-test/src/dtc/treesource.c
	 DEP /tmp/qemu-test/src/dtc/livetree.c
	 DEP /tmp/qemu-test/src/dtc/fstree.c
	 DEP /tmp/qemu-test/src/dtc/flattree.c
	 DEP /tmp/qemu-test/src/dtc/dtc.c
	 DEP /tmp/qemu-test/src/dtc/data.c
	 DEP /tmp/qemu-test/src/dtc/checks.c
	 CC libfdt/fdt.o
	 CC libfdt/fdt_ro.o
	 CC libfdt/fdt_wip.o
	 CC libfdt/fdt_sw.o
	 CC libfdt/fdt_rw.o
	 CC libfdt/fdt_strerror.o
	 CC libfdt/fdt_empty_tree.o
	 CC libfdt/fdt_addresses.o
	 CC libfdt/fdt_overlay.o
	 AR libfdt/libfdt.a
i686-w64-mingw32-ar: creating libfdt/libfdt.a
a - libfdt/fdt.o
a - libfdt/fdt_ro.o
a - libfdt/fdt_wip.o
a - libfdt/fdt_sw.o
a - libfdt/fdt_rw.o
a - libfdt/fdt_strerror.o
a - libfdt/fdt_empty_tree.o
a - libfdt/fdt_addresses.o
a - libfdt/fdt_overlay.o
  RC      version.o
  GEN     qga/qapi-generated/qapi-gen
  CC      qapi/qapi-builtin-types.o
  CC      qapi/qapi-types.o
  CC      qapi/qapi-types-block-core.o
  CC      qapi/qapi-types-block.o
  CC      qapi/qapi-types-char.o
  CC      qapi/qapi-types-common.o
  CC      qapi/qapi-types-crypto.o
  CC      qapi/qapi-types-introspect.o
  CC      qapi/qapi-types-job.o
  CC      qapi/qapi-types-migration.o
  CC      qapi/qapi-types-misc.o
  CC      qapi/qapi-types-net.o
  CC      qapi/qapi-types-rocker.o
  CC      qapi/qapi-types-run-state.o
  CC      qapi/qapi-types-sockets.o
  CC      qapi/qapi-types-tpm.o
  CC      qapi/qapi-types-trace.o
  CC      qapi/qapi-types-transaction.o
  CC      qapi/qapi-types-ui.o
  CC      qapi/qapi-builtin-visit.o
  CC      qapi/qapi-visit.o
  CC      qapi/qapi-visit-block-core.o
  CC      qapi/qapi-visit-block.o
  CC      qapi/qapi-visit-char.o
  CC      qapi/qapi-visit-common.o
  CC      qapi/qapi-visit-crypto.o
  CC      qapi/qapi-visit-introspect.o
  CC      qapi/qapi-visit-job.o
  CC      qapi/qapi-visit-migration.o
  CC      qapi/qapi-visit-misc.o
  CC      qapi/qapi-visit-net.o
  CC      qapi/qapi-visit-rocker.o
  CC      qapi/qapi-visit-run-state.o
  CC      qapi/qapi-visit-sockets.o
  CC      qapi/qapi-visit-tpm.o
  CC      qapi/qapi-visit-trace.o
  CC      qapi/qapi-visit-transaction.o
  CC      qapi/qapi-visit-ui.o
  CC      qapi/qapi-events.o
  CC      qapi/qapi-events-block-core.o
  CC      qapi/qapi-events-block.o
  CC      qapi/qapi-events-char.o
  CC      qapi/qapi-events-common.o
  CC      qapi/qapi-events-crypto.o
  CC      qapi/qapi-events-introspect.o
  CC      qapi/qapi-events-job.o
  CC      qapi/qapi-events-migration.o
  CC      qapi/qapi-events-misc.o
  CC      qapi/qapi-events-net.o
  CC      qapi/qapi-events-rocker.o
  CC      qapi/qapi-events-run-state.o
  CC      qapi/qapi-events-sockets.o
  CC      qapi/qapi-events-tpm.o
  CC      qapi/qapi-events-trace.o
  CC      qapi/qapi-events-transaction.o
  CC      qapi/qapi-events-ui.o
  CC      qapi/qapi-introspect.o
  CC      qapi/qapi-visit-core.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnull.o
  CC      qobject/qnum.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qlist.o
  CC      qobject/qbool.o
  CC      qobject/qlit.o
  CC      qobject/qjson.o
  CC      qobject/qobject.o
  CC      qobject/json-lexer.o
  CC      qobject/json-streamer.o
  CC      qobject/json-parser.o
  CC      qobject/block-qdict.o
  CC      trace/simple.o
  CC      trace/control.o
  CC      trace/qmp.o
  CC      util/osdep.o
  CC      util/cutils.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/aio-wait.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/iohandler.o
  CC      util/aio-win32.o
  CC      util/event_notifier-win32.o
  CC      util/oslib-win32.o
  CC      util/qemu-thread-win32.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/module.o
  CC      util/host-utils.o
  CC      util/bitmap.o
  CC      util/bitops.o
  CC      util/hbitmap.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/cacheinfo.o
  CC      util/error.o
  CC      util/qemu-error.o
  CC      util/id.o
  CC      util/iov.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/notify.o
  CC      util/qemu-option.o
  CC      util/qemu-progress.o
  CC      util/keyval.o
  CC      util/hexdump.o
  CC      util/crc32c.o
  CC      util/uuid.o
  CC      util/throttle.o
  CC      util/getauxval.o
  CC      util/readline.o
  CC      util/rcu.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine-io.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/coroutine-win32.o
  CC      util/buffer.o
  CC      util/timed-average.o
  CC      util/base64.o
  CC      util/log.o
  CC      util/pagesize.o
  CC      util/qdist.o
  CC      util/qht.o
  CC      util/qsp.o
  CC      util/range.o
  CC      util/stats64.o
  CC      util/systemd.o
  CC      util/iova-tree.o
  CC      trace-root.o
  CC      accel/kvm/trace.o
  CC      accel/tcg/trace.o
  CC      audio/trace.o
  CC      block/trace.o
  CC      chardev/trace.o
  CC      crypto/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/acpi/trace.o
  CC      hw/alpha/trace.o
  CC      hw/arm/trace.o
  CC      hw/audio/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/display/trace.o
  CC      hw/dma/trace.o
  CC      hw/hppa/trace.o
  CC      hw/i2c/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/ide/trace.o
  CC      hw/input/trace.o
  CC      hw/intc/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/misc/trace.o
  CC      hw/misc/macio/trace.o
  CC      hw/net/trace.o
  CC      hw/nvram/trace.o
  CC      hw/pci/trace.o
  CC      hw/pci-host/trace.o
  CC      hw/ppc/trace.o
  CC      hw/rdma/trace.o
  CC      hw/rdma/vmw/trace.o
  CC      hw/s390x/trace.o
  CC      hw/scsi/trace.o
  CC      hw/sd/trace.o
  CC      hw/sparc/trace.o
  CC      hw/sparc64/trace.o
  CC      hw/timer/trace.o
  CC      hw/tpm/trace.o
  CC      hw/usb/trace.o
  CC      hw/vfio/trace.o
  CC      hw/virtio/trace.o
  CC      hw/watchdog/trace.o
  CC      hw/xen/trace.o
  CC      io/trace.o
  CC      linux-user/trace.o
  CC      migration/trace.o
  CC      nbd/trace.o
  CC      net/trace.o
  CC      qapi/trace.o
  CC      qom/trace.o
  CC      scsi/trace.o
  CC      target/arm/trace.o
  CC      target/i386/trace.o
  CC      target/mips/trace.o
  CC      target/ppc/trace.o
  CC      target/s390x/trace.o
  CC      target/sparc/trace.o
  CC      ui/trace.o
  CC      util/trace.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/blk-commit-all.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/clock-warp.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/dump.o
  CC      stubs/error-printf.o
  CC      stubs/fdset.o
  CC      stubs/gdbstub.o
  CC      stubs/get-vm-name.o
  CC      stubs/iothread.o
  CC      stubs/iothread-lock.o
  CC      stubs/is-daemonized.o
  CC      stubs/machine-init-done.o
  CC      stubs/migr-blocker.o
  CC      stubs/change-state-handler.o
  CC      stubs/monitor.o
  CC      stubs/notify-event.o
  CC      stubs/qtest.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/slirp.o
  CC      stubs/set-fd-handler.o
  CC      stubs/sysbus.o
  CC      stubs/tpm.o
  CC      stubs/trace-control.o
  CC      stubs/uuid.o
  CC      stubs/vm-stop.o
  CC      stubs/vmstate.o
  CC      stubs/fd-register.o
  CC      stubs/qmp_memory_device.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      stubs/vmgenid.o
  CC      stubs/xen-common.o
  CC      stubs/xen-hvm.o
  CC      stubs/pci-host-piix.o
  CC      stubs/ram-block.o
  CC      stubs/ramfb.o
  GEN     qemu-img-cmds.h
  CC      block.o
  CC      blockjob.o
  CC      job.o
  CC      qemu-io-cmds.o
  CC      replication.o
  CC      block/raw-format.o
  CC      block/vmdk.o
  CC      block/vpc.o
  CC      block/qcow.o
  CC      block/vdi.o
  CC      block/cloop.o
  CC      block/bochs.o
  CC      block/vvfat.o
  CC      block/dmg.o
  CC      block/qcow2.o
  CC      block/qcow2-refcount.o
  CC      block/qcow2-cluster.o
  CC      block/qcow2-snapshot.o
  CC      block/qcow2-cache.o
  CC      block/qcow2-bitmap.o
  CC      block/qed.o
  CC      block/qed-l2-cache.o
  CC      block/qed-table.o
  CC      block/qed-cluster.o
  CC      block/qed-check.o
  CC      block/vhdx.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/quorum.o
  CC      block/blkdebug.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/parallels.o
  CC      block/blklogwrites.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/qapi.o
  CC      block/file-win32.o
  CC      block/win32-aio.o
  CC      block/null.o
  CC      block/mirror.o
  CC      block/commit.o
  CC      block/io.o
  CC      block/create.o
  CC      block/throttle-groups.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/accounting.o
  CC      block/dirty-bitmap.o
  CC      block/write-threshold.o
  CC      block/backup.o
  CC      block/replication.o
  CC      block/throttle.o
  CC      block/copy-on-read.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      scsi/utils.o
  CC      scsi/pr-manager-stub.o
  CC      block/curl.o
  CC      block/ssh.o
  CC      block/dmg-bz2.o
  CC      crypto/init.o
  CC      crypto/hash.o
  CC      crypto/hash-nettle.o
  CC      crypto/hmac.o
  CC      crypto/hmac-nettle.o
  CC      crypto/aes.o
  CC      crypto/desrfb.o
  CC      crypto/cipher.o
  CC      crypto/tlscreds.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredspsk.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/random-gnutls.o
  CC      crypto/pbkdf.o
  CC      crypto/pbkdf-nettle.o
  CC      crypto/ivgen.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/afsplit.o
  CC      crypto/xts.o
  CC      crypto/block.o
  CC      crypto/block-qcow.o
  CC      crypto/block-luks.o
  CC      io/channel.o
  CC      io/channel-buffer.o
  CC      io/channel-command.o
  CC      io/channel-file.o
  CC      io/channel-socket.o
  CC      io/channel-tls.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/dns-resolver.o
  CC      io/net-listener.o
  CC      io/task.o
  CC      qom/object.o
  CC      qom/container.o
  CC      qom/qom-qobject.o
  CC      qom/object_interfaces.o
  CC      qemu-io.o
  CC      qemu-edid.o
  CC      hw/display/edid-generate.o
  CC      blockdev.o
  CC      blockdev-nbd.o
  CC      bootdevice.o
  CC      iothread.o
  CC      job-qmp.o
  CC      qdev-monitor.o
  CC      device-hotplug.o
  CC      os-win32.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      device_tree.o
  CC      qapi/qapi-commands.o
  CC      qapi/qapi-commands-block.o
  CC      qapi/qapi-commands-block-core.o
  CC      qapi/qapi-commands-char.o
  CC      qapi/qapi-commands-common.o
  CC      qapi/qapi-commands-introspect.o
  CC      qapi/qapi-commands-crypto.o
  CC      qapi/qapi-commands-job.o
  CC      qapi/qapi-commands-migration.o
  CC      qapi/qapi-commands-misc.o
  CC      qapi/qapi-commands-net.o
  CC      qapi/qapi-commands-rocker.o
  CC      qapi/qapi-commands-run-state.o
  CC      qapi/qapi-commands-sockets.o
  CC      qapi/qapi-commands-trace.o
  CC      qapi/qapi-commands-tpm.o
  CC      qapi/qapi-commands-transaction.o
  CC      qapi/qapi-commands-ui.o
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/audio.o
  CC      audio/noaudio.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/dsoundaudio.o
  CC      audio/audio_win_int.o
  CC      audio/wavcapture.o
  CC      backends/rng.o
  CC      backends/rng-egd.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-ram.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      backends/cryptodev-vhost.o
  CC      block/stream.o
  CC      chardev/msmouse.o
  CC      chardev/wctablet.o
  CC      chardev/testdev.o
  CC      disas/arm.o
  CXX     disas/arm-a64.o
  CC      disas/i386.o
  CXX     disas/libvixl/vixl/utils.o
  CXX     disas/libvixl/vixl/compiler-intrinsics.o
  CXX     disas/libvixl/vixl/a64/instructions-a64.o
  CXX     disas/libvixl/vixl/a64/decoder-a64.o
  CXX     disas/libvixl/vixl/a64/disasm-a64.o
  CC      hw/acpi/core.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/nvdimm.o
  CC      hw/acpi/vmgenid.o
  CC      hw/acpi/acpi_interface.o
  CC      hw/acpi/bios-linker-loader.o
  CC      hw/acpi/aml-build.o
  CC      hw/acpi/ipmi.o
  CC      hw/acpi/acpi-stub.o
  CC      hw/acpi/ipmi-stub.o
  CC      hw/audio/sb16.o
  CC      hw/audio/es1370.o
  CC      hw/audio/ac97.o
  CC      hw/audio/fmopl.o
  CC      hw/audio/adlib.o
  CC      hw/audio/gus.o
  CC      hw/audio/gusemu_hal.o
  CC      hw/audio/gusemu_mixer.o
  CC      hw/audio/cs4231a.o
  CC      hw/audio/intel-hda.o
  CC      hw/audio/hda-codec.o
  CC      hw/audio/pcspk.o
  CC      hw/audio/wm8750.o
  CC      hw/audio/pl041.o
  CC      hw/audio/lm4549.o
  CC      hw/audio/marvell_88w8618.o
  CC      hw/audio/soundhw.o
  CC      hw/block/block.o
  CC      hw/block/cdrom.o
  CC      hw/block/hd-geometry.o
  CC      hw/block/fdc.o
  CC      hw/block/m25p80.o
  CC      hw/block/nand.o
  CC      hw/block/pflash_cfi01.o
  CC      hw/block/pflash_cfi02.o
  CC      hw/block/ecc.o
  CC      hw/block/onenand.o
  CC      hw/block/nvme.o
  CC      hw/bt/core.o
  CC      hw/bt/l2cap.o
  CC      hw/bt/sdp.o
  CC      hw/bt/hci.o
  CC      hw/bt/hid.o
  CC      hw/bt/hci-csr.o
  CC      hw/char/ipoctal232.o
  CC      hw/char/nrf51_uart.o
  CC      hw/char/parallel.o
  CC      hw/char/parallel-isa.o
  CC      hw/char/pl011.o
  CC      hw/char/serial.o
  CC      hw/char/serial-isa.o
  CC      hw/char/serial-pci.o
  CC      hw/char/virtio-console.o
  CC      hw/char/cadence_uart.o
  CC      hw/char/cmsdk-apb-uart.o
  CC      hw/char/debugcon.o
  CC      hw/char/imx_serial.o
  CC      hw/core/qdev.o
  CC      hw/core/qdev-properties.o
  CC      hw/core/compat-props.o
  CC      hw/core/bus.o
  CC      hw/core/reset.o
  CC      hw/core/qdev-fw.o
  CC      hw/core/fw-path-provider.o
  CC      hw/core/irq.o
  CC      hw/core/hotplug.o
  CC      hw/core/nmi.o
  CC      hw/core/stream.o
  CC      hw/core/ptimer.o
  CC      hw/core/sysbus.o
  CC      hw/core/machine.o
  CC      hw/core/loader.o
  CC      hw/core/qdev-properties-system.o
  CC      hw/core/register.o
  CC      hw/core/or-irq.o
  CC      hw/core/split-irq.o
  CC      hw/core/platform-bus.o
  CC      hw/core/generic-loader.o
  CC      hw/core/null-machine.o
  CC      hw/cpu/core.o
  CC      hw/display/ramfb.o
  CC      hw/display/ramfb-standalone.o
  CC      hw/display/ads7846.o
  CC      hw/display/cirrus_vga.o
  CC      hw/display/cirrus_vga_isa.o
  CC      hw/display/pl110.o
  CC      hw/display/sii9022.o
  CC      hw/display/ssd0303.o
  CC      hw/display/ssd0323.o
  CC      hw/display/vga-pci.o
  CC      hw/display/edid-region.o
  CC      hw/display/vga-isa.o
  CC      hw/display/vmware_vga.o
  CC      hw/display/bochs-display.o
  CC      hw/display/blizzard.o
  CC      hw/display/exynos4210_fimd.o
  CC      hw/display/framebuffer.o
  CC      hw/display/tc6393xb.o
  CC      hw/dma/pl080.o
  CC      hw/dma/pl330.o
  CC      hw/dma/i8257.o
  CC      hw/dma/xilinx_axidma.o
  CC      hw/dma/xlnx-zynq-devcfg.o
  CC      hw/dma/xlnx-zdma.o
  CC      hw/gpio/max7310.o
  CC      hw/gpio/pl061.o
  CC      hw/gpio/gpio_key.o
  CC      hw/gpio/zaurus.o
  CC      hw/i2c/core.o
  CC      hw/i2c/smbus.o
  CC      hw/i2c/smbus_eeprom.o
  CC      hw/i2c/i2c-ddc.o
  CC      hw/i2c/versatile_i2c.o
  CC      hw/i2c/smbus_ich9.o
  CC      hw/i2c/pm_smbus.o
  CC      hw/i2c/bitbang_i2c.o
  CC      hw/i2c/exynos4210_i2c.o
  CC      hw/i2c/imx_i2c.o
  CC      hw/i2c/aspeed_i2c.o
  CC      hw/ide/core.o
  CC      hw/ide/atapi.o
  CC      hw/ide/qdev.o
  CC      hw/ide/pci.o
  CC      hw/ide/isa.o
  CC      hw/ide/piix.o
  CC      hw/ide/microdrive.o
  CC      hw/ide/ahci.o
  CC      hw/ide/ich.o
  CC      hw/ide/ahci-allwinner.o
  CC      hw/input/hid.o
  CC      hw/input/lm832x.o
  CC      hw/input/pckbd.o
  CC      hw/input/pl050.o
  CC      hw/input/ps2.o
  CC      hw/input/stellaris_input.o
  CC      hw/input/tsc2005.o
  CC      hw/input/virtio-input.o
  CC      hw/input/virtio-input-hid.o
  CC      hw/intc/i8259_common.o
  CC      hw/intc/i8259.o
  CC      hw/intc/pl190.o
  CC      hw/intc/xlnx-pmu-iomod-intc.o
  CC      hw/intc/xlnx-zynqmp-ipi.o
  CC      hw/intc/imx_avic.o
  CC      hw/intc/imx_gpcv2.o
  CC      hw/intc/realview_gic.o
  CC      hw/intc/ioapic_common.o
  CC      hw/intc/arm_gic_common.o
  CC      hw/intc/arm_gic.o
  CC      hw/intc/arm_gicv2m.o
  CC      hw/intc/arm_gicv3_common.o
  CC      hw/intc/arm_gicv3.o
  CC      hw/intc/arm_gicv3_dist.o
  CC      hw/intc/arm_gicv3_redist.o
  CC      hw/intc/arm_gicv3_its_common.o
  CC      hw/intc/intc.o
  CC      hw/ipack/ipack.o
  CC      hw/ipack/tpci200.o
  CC      hw/ipmi/ipmi.o
  CC      hw/ipmi/ipmi_bmc_sim.o
  CC      hw/ipmi/ipmi_bmc_extern.o
  CC      hw/ipmi/isa_ipmi_kcs.o
  CC      hw/ipmi/isa_ipmi_bt.o
  CC      hw/isa/isa-bus.o
  CC      hw/isa/isa-superio.o
  CC      hw/isa/apm.o
  CC      hw/mem/pc-dimm.o
  CC      hw/mem/memory-device.o
  CC      hw/mem/nvdimm.o
  CC      hw/misc/applesmc.o
  CC      hw/misc/max111x.o
  CC      hw/misc/tmp105.o
  CC      hw/misc/tmp421.o
  CC      hw/misc/debugexit.o
  CC      hw/misc/sga.o
  CC      hw/misc/pc-testdev.o
  CC      hw/misc/pci-testdev.o
  CC      hw/misc/edu.o
  CC      hw/misc/pca9552.o
  CC      hw/misc/unimp.o
  CC      hw/misc/vmcoreinfo.o
  CC      hw/misc/arm_l2x0.o
  CC      hw/misc/arm_integrator_debug.o
  CC      hw/misc/a9scu.o
  CC      hw/misc/arm11scu.o
  CC      hw/net/ne2000.o
  CC      hw/net/eepro100.o
  CC      hw/net/pcnet-pci.o
  CC      hw/net/pcnet.o
  CC      hw/net/e1000.o
  CC      hw/net/e1000x_common.o
  CC      hw/net/net_tx_pkt.o
  CC      hw/net/net_rx_pkt.o
  CC      hw/net/e1000e.o
  CC      hw/net/e1000e_core.o
  CC      hw/net/rtl8139.o
  CC      hw/net/smc91c111.o
  CC      hw/net/vmxnet3.o
  CC      hw/net/lan9118.o
  CC      hw/net/ne2000-isa.o
  CC      hw/net/xgmac.o
  CC      hw/net/xilinx_axienet.o
  CC      hw/net/allwinner_emac.o
  CC      hw/net/imx_fec.o
  CC      hw/net/cadence_gem.o
  CC      hw/net/stellaris_enet.o
  CC      hw/net/ftgmac100.o
  CC      hw/net/rocker/rocker.o
  CC      hw/net/rocker/rocker_fp.o
  CC      hw/net/rocker/rocker_desc.o
  CC      hw/net/rocker/rocker_world.o
  CC      hw/net/rocker/rocker_of_dpa.o
  CC      hw/net/can/can_sja1000.o
  CC      hw/net/can/can_kvaser_pci.o
  CC      hw/net/can/can_pcm3680_pci.o
  CC      hw/net/can/can_mioe3680_pci.o
  CC      hw/nvram/eeprom93xx.o
  CC      hw/nvram/fw_cfg.o
  CC      hw/nvram/chrp_nvram.o
  CC      hw/pci-bridge/pci_bridge_dev.o
  CC      hw/pci-bridge/pcie_root_port.o
  CC      hw/pci-bridge/gen_pcie_root_port.o
  CC      hw/pci-bridge/pcie_pci_bridge.o
  CC      hw/pci-bridge/pci_expander_bridge.o
  CC      hw/pci-bridge/xio3130_upstream.o
  CC      hw/pci-bridge/xio3130_downstream.o
  CC      hw/pci-bridge/ioh3420.o
  CC      hw/pci-bridge/i82801b11.o
  CC      hw/pci-host/pam.o
  CC      hw/pci-host/versatile.o
  CC      hw/pci-host/piix.o
  CC      hw/pci-host/q35.o
  CC      hw/pci-host/gpex.o
  CC      hw/pci-host/designware.o
  CC      hw/pci/pci.o
  CC      hw/pci/pci_bridge.o
  CC      hw/pci/msix.o
  CC      hw/pci/msi.o
  CC      hw/pci/shpc.o
  CC      hw/pci/slotid_cap.o
  CC      hw/pci/pci_host.o
  CC      hw/pci/pcie_host.o
  CC      hw/pci/pcie.o
  CC      hw/pci/pcie_aer.o
  CC      hw/pci/pcie_port.o
  CC      hw/pci/pci-stub.o
  CC      hw/scsi/scsi-disk.o
  CC      hw/pcmcia/pcmcia.o
  CC      hw/scsi/emulation.o
  CC      hw/scsi/scsi-generic.o
  CC      hw/scsi/scsi-bus.o
  CC      hw/scsi/lsi53c895a.o
  CC      hw/scsi/mptsas.o
  CC      hw/scsi/mptconfig.o
  CC      hw/scsi/mptendian.o
  CC      hw/scsi/megasas.o
  CC      hw/scsi/vmw_pvscsi.o
  CC      hw/scsi/esp.o
  CC      hw/scsi/esp-pci.o
  CC      hw/sd/pl181.o
  CC      hw/sd/ssi-sd.o
  CC      hw/sd/sd.o
  CC      hw/sd/core.o
  CC      hw/sd/sdmmc-internal.o
  CC      hw/sd/sdhci.o
  CC      hw/smbios/smbios.o
  CC      hw/smbios/smbios_type_38.o
  CC      hw/smbios/smbios-stub.o
  CC      hw/smbios/smbios_type_38-stub.o
  CC      hw/ssi/pl022.o
  CC      hw/ssi/ssi.o
  CC      hw/ssi/xilinx_spips.o
  CC      hw/ssi/aspeed_smc.o
  CC      hw/ssi/stm32f2xx_spi.o
  CC      hw/ssi/mss-spi.o
  CC      hw/timer/arm_timer.o
  CC      hw/timer/arm_mptimer.o
  CC      hw/timer/armv7m_systick.o
  CC      hw/timer/a9gtimer.o
  CC      hw/timer/cadence_ttc.o
  CC      hw/timer/ds1338.o
  CC      hw/timer/hpet.o
  CC      hw/timer/i8254_common.o
  CC      hw/timer/i8254.o
  CC      hw/timer/pl031.o
  CC      hw/timer/twl92230.o
  CC      hw/timer/imx_epit.o
  CC      hw/timer/imx_gpt.o
  CC      hw/timer/xlnx-zynqmp-rtc.o
  CC      hw/timer/stm32f2xx_timer.o
  CC      hw/timer/aspeed_timer.o
  CC      hw/timer/cmsdk-apb-timer.o
  CC      hw/timer/cmsdk-apb-dualtimer.o
  CC      hw/timer/mss-timer.o
  CC      hw/tpm/tpm_util.o
  CC      hw/tpm/tpm_tis.o
  CC      hw/tpm/tpm_crb.o
  CC      hw/usb/core.o
  CC      hw/usb/combined-packet.o
  CC      hw/usb/bus.o
  CC      hw/usb/libhw.o
  CC      hw/usb/desc.o
  CC      hw/usb/desc-msos.o
  CC      hw/usb/hcd-uhci.o
  CC      hw/usb/hcd-ohci.o
  CC      hw/usb/hcd-ehci.o
  CC      hw/usb/hcd-ehci-pci.o
  CC      hw/usb/hcd-ehci-sysbus.o
  CC      hw/usb/hcd-xhci.o
  CC      hw/usb/hcd-xhci-nec.o
  CC      hw/usb/hcd-musb.o
  CC      hw/usb/dev-hub.o
  CC      hw/usb/dev-hid.o
  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
  CC      hw/usb/dev-uas.o
  CC      hw/usb/dev-audio.o
  CC      hw/usb/dev-serial.o
  CC      hw/usb/dev-network.o
  CC      hw/usb/dev-bluetooth.o
  CC      hw/usb/dev-smartcard-reader.o
  CC      hw/usb/host-stub.o
  CC      hw/virtio/virtio-bus.o
  CC      hw/virtio/virtio-rng.o
  CC      hw/virtio/virtio-pci.o
  CC      hw/virtio/virtio-mmio.o
  CC      hw/virtio/vhost-stub.o
  CC      hw/watchdog/watchdog.o
  CC      hw/watchdog/cmsdk-apb-watchdog.o
  CC      hw/watchdog/wdt_i6300esb.o
  CC      hw/watchdog/wdt_ib700.o
  CC      hw/watchdog/wdt_aspeed.o
  CC      migration/migration.o
  CC      migration/socket.o
  CC      migration/fd.o
  CC      migration/exec.o
  CC      migration/tls.o
  CC      migration/channel.o
  CC      migration/savevm.o
  CC      migration/colo.o
  CC      migration/vmstate.o
  CC      migration/colo-failover.o
  CC      migration/vmstate-types.o
  CC      migration/page_cache.o
  CC      migration/qemu-file.o
  CC      migration/global_state.o
  CC      migration/qemu-file-channel.o
  CC      migration/xbzrle.o
  CC      migration/postcopy-ram.o
  CC      migration/qjson.o
  CC      migration/block-dirty-bitmap.o
  CC      net/net.o
  CC      migration/block.o
  CC      net/queue.o
  CC      net/checksum.o
  CC      net/util.o
  CC      net/hub.o
  CC      net/socket.o
  CC      net/dump.o
  CC      net/eth.o
  CC      net/slirp.o
  CC      net/filter.o
  CC      net/filter-buffer.o
  CC      net/filter-mirror.o
  CC      net/colo-compare.o
  CC      net/colo.o
  CC      net/filter-rewriter.o
  CC      net/filter-replay.o
  CC      net/tap-win32.o
  CC      net/can/can_core.o
  CC      net/can/can_host.o
  CC      qom/cpu.o
  CC      replay/replay.o
  CC      replay/replay-internal.o
  CC      replay/replay-events.o
  CC      replay/replay-time.o
  CC      replay/replay-input.o
  CC      replay/replay-char.o
  CC      replay/replay-snapshot.o
  CC      replay/replay-net.o
  CC      replay/replay-audio.o
  CC      slirp/cksum.o
  CC      slirp/if.o
  CC      slirp/ip_icmp.o
  CC      slirp/ip6_icmp.o
  CC      slirp/ip6_input.o
  CC      slirp/ip6_output.o
  CC      slirp/ip_input.o
  CC      slirp/ip_output.o
  CC      slirp/dnssearch.o
  CC      slirp/dhcpv6.o
  CC      slirp/slirp.o
  CC      slirp/mbuf.o
  CC      slirp/misc.o
  CC      slirp/sbuf.o
  CC      slirp/socket.o
  CC      slirp/tcp_input.o
  CC      slirp/tcp_output.o
  CC      slirp/tcp_subr.o
  CC      slirp/tcp_timer.o
  CC      slirp/udp.o
  CC      slirp/udp6.o
  CC      slirp/bootp.o
  CC      slirp/tftp.o
  CC      slirp/arp_table.o
  CC      slirp/ndp_table.o
  CC      slirp/ncsi.o
  CC      ui/console.o
  CC      ui/keymaps.o
  CC      ui/cursor.o
  CC      ui/qemu-pixman.o
  CC      ui/input.o
  CC      ui/input-keymap.o
  CC      ui/input-legacy.o
  CC      ui/vnc.o
  CC      ui/vnc-enc-zlib.o
  CC      ui/vnc-enc-hextile.o
  CC      ui/vnc-enc-tight.o
  CC      ui/vnc-palette.o
  CC      ui/vnc-enc-zrle.o
  CC      ui/vnc-auth-vencrypt.o
  CC      ui/vnc-ws.o
  CC      ui/vnc-jobs.o
  CC      ui/sdl2.o
  CC      ui/sdl2-input.o
  CC      ui/sdl2-2d.o
  CC      ui/gtk.o
  CC      chardev/char.o
  CC      chardev/char-console.o
  CC      chardev/char-fe.o
  CC      chardev/char-file.o
  CC      chardev/char-io.o
  CC      chardev/char-mux.o
  CC      chardev/char-null.o
  CC      chardev/char-pipe.o
  CC      chardev/char-ringbuf.o
  CC      chardev/char-serial.o
  CC      chardev/char-socket.o
  CC      chardev/char-stdio.o
  CC      chardev/char-udp.o
  CC      chardev/char-win.o
  CC      chardev/char-win-stdio.o
  AS      optionrom/multiboot.o
  AS      optionrom/linuxboot.o
  CC      optionrom/linuxboot_dma.o
  AS      optionrom/kvmvapic.o
  BUILD   optionrom/multiboot.img
  BUILD   optionrom/linuxboot.img
  BUILD   optionrom/linuxboot_dma.img
  CC      qga/commands.o
  BUILD   optionrom/multiboot.raw
  BUILD   optionrom/linuxboot.raw
  BUILD   optionrom/linuxboot_dma.raw
  BUILD   optionrom/kvmvapic.img
  SIGN    optionrom/multiboot.bin
  SIGN    optionrom/linuxboot.bin
  SIGN    optionrom/linuxboot_dma.bin
  BUILD   optionrom/kvmvapic.raw
  CC      qga/guest-agent-command-state.o
  CC      qga/main.o
  CC      qga/commands-win32.o
  CC      qga/channel-win32.o
  CC      qga/service-win32.o
  CC      qga/vss-win32.o
  CC      qga/qapi-generated/qga-qapi-types.o
  SIGN    optionrom/kvmvapic.bin
  CC      qga/qapi-generated/qga-qapi-visit.o
  CC      qga/qapi-generated/qga-qapi-commands.o
  AR      libqemuutil.a
  CC      qemu-img.o
  LINK    qemu-ga.exe
  LINK    qemu-io.exe
  LINK    qemu-edid.exe
  GEN     x86_64-softmmu/hmp-commands.h
  GEN     x86_64-softmmu/config-target.h
  CC      x86_64-softmmu/exec.o
  CC      x86_64-softmmu/tcg/tcg.o
  CC      x86_64-softmmu/tcg/tcg-op-vec.o
  CC      x86_64-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/tcg/tcg-op-gvec.o
  CC      x86_64-softmmu/tcg/tcg-common.o
  GEN     aarch64-softmmu/hmp-commands.h
  GEN     aarch64-softmmu/config-target.h
  CC      aarch64-softmmu/exec.o
  CC      x86_64-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/tcg/tcg-op-vec.o
  CC      x86_64-softmmu/disas.o
  GEN     x86_64-softmmu/gdbstub-xml.c
  CC      aarch64-softmmu/tcg/tcg-op-gvec.o
  LINK    qemu-img.exe
  CC      x86_64-softmmu/arch_init.o
  CC      x86_64-softmmu/cpus.o
  CC      x86_64-softmmu/monitor.o
  CC      aarch64-softmmu/tcg/tcg-common.o
  CC      x86_64-softmmu/gdbstub.o
  CC      aarch64-softmmu/tcg/optimize.o
  CC      x86_64-softmmu/balloon.o
  CC      aarch64-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/disas.o
  GEN     aarch64-softmmu/gdbstub-xml.c
  CC      aarch64-softmmu/arch_init.o
  CC      x86_64-softmmu/numa.o
  CC      x86_64-softmmu/ioport.o
  CC      aarch64-softmmu/cpus.o
  CC      aarch64-softmmu/monitor.o
  CC      aarch64-softmmu/gdbstub.o
  CC      aarch64-softmmu/balloon.o
  CC      aarch64-softmmu/ioport.o
  CC      aarch64-softmmu/numa.o
  CC      aarch64-softmmu/qtest.o
  CC      aarch64-softmmu/memory.o
  CC      aarch64-softmmu/memory_mapping.o
  CC      aarch64-softmmu/dump.o
  CC      aarch64-softmmu/migration/ram.o
  CC      aarch64-softmmu/accel/accel.o
  CC      aarch64-softmmu/accel/stubs/hax-stub.o
  CC      aarch64-softmmu/accel/stubs/hvf-stub.o
  CC      aarch64-softmmu/accel/stubs/whpx-stub.o
  CC      aarch64-softmmu/accel/stubs/kvm-stub.o
  CC      aarch64-softmmu/accel/tcg/tcg-all.o
  CC      aarch64-softmmu/accel/tcg/cputlb.o
  CC      aarch64-softmmu/accel/tcg/tcg-runtime.o
  CC      x86_64-softmmu/qtest.o
  CC      x86_64-softmmu/memory.o
  CC      aarch64-softmmu/accel/tcg/tcg-runtime-gvec.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/accel/tcg/translate-all.o
  CC      aarch64-softmmu/accel/tcg/translator.o
  CC      x86_64-softmmu/memory_mapping.o
  CC      aarch64-softmmu/hw/adc/stm32f2xx_adc.o
  CC      aarch64-softmmu/hw/block/virtio-blk.o
  CC      aarch64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      x86_64-softmmu/dump.o
  CC      aarch64-softmmu/hw/char/exynos4210_uart.o
  CC      aarch64-softmmu/hw/char/omap_uart.o
  CC      aarch64-softmmu/hw/char/digic-uart.o
  CC      aarch64-softmmu/hw/char/stm32f2xx_usart.o
  CC      aarch64-softmmu/hw/char/bcm2835_aux.o
  CC      aarch64-softmmu/hw/char/virtio-serial-bus.o
  CC      aarch64-softmmu/hw/cpu/arm11mpcore.o
  CC      aarch64-softmmu/hw/cpu/realview_mpcore.o
  CC      aarch64-softmmu/hw/cpu/a9mpcore.o
  CC      aarch64-softmmu/hw/cpu/a15mpcore.o
  CC      aarch64-softmmu/hw/display/omap_dss.o
  CC      aarch64-softmmu/hw/display/omap_lcdc.o
  CC      aarch64-softmmu/hw/display/pxa2xx_lcd.o
  CC      aarch64-softmmu/hw/display/bcm2835_fb.o
  CC      aarch64-softmmu/hw/display/vga.o
  CC      aarch64-softmmu/hw/display/virtio-gpu.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-3d.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/display/dpcd.o
  CC      aarch64-softmmu/hw/display/xlnx_dp.o
  CC      aarch64-softmmu/hw/dma/xlnx_dpdma.o
  CC      aarch64-softmmu/hw/dma/omap_dma.o
  CC      aarch64-softmmu/hw/dma/soc_dma.o
  CC      aarch64-softmmu/hw/dma/pxa2xx_dma.o
  CC      aarch64-softmmu/hw/dma/bcm2835_dma.o
  CC      aarch64-softmmu/hw/gpio/omap_gpio.o
  CC      aarch64-softmmu/hw/gpio/imx_gpio.o
  CC      aarch64-softmmu/hw/gpio/bcm2835_gpio.o
  CC      x86_64-softmmu/win_dump.o
  CC      x86_64-softmmu/migration/ram.o
  CC      aarch64-softmmu/hw/i2c/omap_i2c.o
  CC      aarch64-softmmu/hw/input/pxa2xx_keypad.o
  CC      aarch64-softmmu/hw/input/tsc210x.o
  CC      aarch64-softmmu/hw/intc/armv7m_nvic.o
  CC      aarch64-softmmu/hw/intc/exynos4210_gic.o
  CC      aarch64-softmmu/hw/intc/exynos4210_combiner.o
  CC      aarch64-softmmu/hw/intc/omap_intc.o
  CC      aarch64-softmmu/hw/intc/bcm2835_ic.o
  CC      x86_64-softmmu/accel/accel.o
  CC      aarch64-softmmu/hw/intc/bcm2836_control.o
  CC      aarch64-softmmu/hw/intc/allwinner-a10-pic.o
  CC      aarch64-softmmu/hw/intc/aspeed_vic.o
  CC      aarch64-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      x86_64-softmmu/accel/stubs/hvf-stub.o
  CC      aarch64-softmmu/hw/misc/arm_sysctl.o
  CC      aarch64-softmmu/hw/misc/cbus.o
  CC      x86_64-softmmu/accel/stubs/whpx-stub.o
  CC      aarch64-softmmu/hw/misc/exynos4210_pmu.o
  CC      aarch64-softmmu/hw/misc/exynos4210_clk.o
  CC      x86_64-softmmu/accel/stubs/kvm-stub.o
  CC      aarch64-softmmu/hw/misc/exynos4210_rng.o
  CC      x86_64-softmmu/accel/tcg/tcg-all.o
  CC      aarch64-softmmu/hw/misc/imx_ccm.o
  CC      x86_64-softmmu/accel/tcg/cputlb.o
  CC      aarch64-softmmu/hw/misc/imx31_ccm.o
  CC      x86_64-softmmu/accel/tcg/tcg-runtime.o
  CC      aarch64-softmmu/hw/misc/imx25_ccm.o
  CC      aarch64-softmmu/hw/misc/imx6_ccm.o
  CC      aarch64-softmmu/hw/misc/imx6ul_ccm.o
  CC      x86_64-softmmu/accel/tcg/tcg-runtime-gvec.o
  CC      aarch64-softmmu/hw/misc/imx6_src.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec.o
  CC      aarch64-softmmu/hw/misc/imx7_ccm.o
  CC      aarch64-softmmu/hw/misc/imx7_snvs.o
  CC      aarch64-softmmu/hw/misc/imx2_wdt.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/hw/misc/imx7_gpr.o
  CC      x86_64-softmmu/accel/tcg/translate-all.o
  CC      x86_64-softmmu/accel/tcg/translator.o
  CC      aarch64-softmmu/hw/misc/mst_fpga.o
  CC      x86_64-softmmu/hw/block/virtio-blk.o
  CC      aarch64-softmmu/hw/misc/omap_clk.o
  CC      x86_64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      aarch64-softmmu/hw/misc/omap_gpmc.o
  CC      x86_64-softmmu/hw/char/virtio-serial-bus.o
  CC      aarch64-softmmu/hw/misc/omap_l4.o
  CC      aarch64-softmmu/hw/misc/omap_sdrc.o
  CC      x86_64-softmmu/hw/display/vga.o
  CC      x86_64-softmmu/hw/display/virtio-gpu.o
  CC      aarch64-softmmu/hw/misc/omap_tap.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-3d.o
  CC      aarch64-softmmu/hw/misc/bcm2835_mbox.o
  CC      aarch64-softmmu/hw/misc/bcm2835_property.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/misc/bcm2835_rng.o
  CC      x86_64-softmmu/hw/display/virtio-vga.o
  CC      aarch64-softmmu/hw/misc/zynq_slcr.o
  CC      aarch64-softmmu/hw/misc/zynq-xadc.o
  CC      x86_64-softmmu/hw/intc/apic.o
  CC      aarch64-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      x86_64-softmmu/hw/intc/apic_common.o
  CC      aarch64-softmmu/hw/misc/mps2-fpgaio.o
  CC      aarch64-softmmu/hw/misc/mps2-scc.o
  CC      x86_64-softmmu/hw/intc/ioapic.o
  CC      aarch64-softmmu/hw/misc/tz-mpc.o
  CC      aarch64-softmmu/hw/misc/tz-msc.o
  CC      aarch64-softmmu/hw/misc/tz-ppc.o
  CC      aarch64-softmmu/hw/misc/iotkit-secctl.o
  CC      aarch64-softmmu/hw/misc/iotkit-sysctl.o
  CC      x86_64-softmmu/hw/isa/lpc_ich9.o
  CC      x86_64-softmmu/hw/misc/pvpanic.o
  CC      aarch64-softmmu/hw/misc/iotkit-sysinfo.o
  CC      aarch64-softmmu/hw/misc/auxbus.o
  CC      aarch64-softmmu/hw/misc/aspeed_scu.o
  CC      x86_64-softmmu/hw/net/virtio-net.o
  CC      aarch64-softmmu/hw/misc/msf2-sysreg.o
  CC      aarch64-softmmu/hw/misc/aspeed_sdmc.o
  CC      x86_64-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/net/virtio-net.o
  CC      aarch64-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/pcmcia/pxa2xx.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      x86_64-softmmu/hw/timer/mc146818rtc.o
  CC      aarch64-softmmu/hw/sd/omap_mmc.o
  CC      x86_64-softmmu/hw/virtio/virtio.o
  CC      x86_64-softmmu/hw/virtio/virtio-balloon.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/sd/pxa2xx_mmci.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/sd/bcm2835_sdhost.o
  CC      aarch64-softmmu/hw/ssi/omap_spi.o
  CC      x86_64-softmmu/hw/i386/multiboot.o
  CC      aarch64-softmmu/hw/ssi/imx_spi.o
  CC      x86_64-softmmu/hw/i386/pc.o
  CC      aarch64-softmmu/hw/timer/exynos4210_mct.o
  CC      aarch64-softmmu/hw/timer/exynos4210_pwm.o
  CC      aarch64-softmmu/hw/timer/exynos4210_rtc.o
  CC      x86_64-softmmu/hw/i386/pc_q35.o
  CC      x86_64-softmmu/hw/i386/pc_piix.o
  CC      aarch64-softmmu/hw/timer/omap_gptimer.o
  CC      aarch64-softmmu/hw/timer/omap_synctimer.o
  CC      aarch64-softmmu/hw/timer/pxa2xx_timer.o
  CC      aarch64-softmmu/hw/timer/digic-timer.o
  CC      x86_64-softmmu/hw/i386/pc_sysfw.o
  CC      aarch64-softmmu/hw/timer/allwinner-a10-pit.o
  CC      x86_64-softmmu/hw/i386/x86-iommu.o
  CC      aarch64-softmmu/hw/usb/tusb6010.o
  CC      x86_64-softmmu/hw/i386/intel_iommu.o
  CC      aarch64-softmmu/hw/usb/chipidea.o
  CC      x86_64-softmmu/hw/i386/amd_iommu.o
  CC      aarch64-softmmu/hw/virtio/virtio.o
  CC      x86_64-softmmu/hw/i386/vmport.o
  CC      x86_64-softmmu/hw/i386/vmmouse.o
  CC      x86_64-softmmu/hw/i386/kvmvapic.o
  CC      aarch64-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      x86_64-softmmu/hw/i386/acpi-build.o
  CC      aarch64-softmmu/hw/arm/boot.o
  CC      aarch64-softmmu/hw/arm/virt.o
  CC      x86_64-softmmu/target/i386/helper.o
  CC      aarch64-softmmu/hw/arm/sysbus-fdt.o
  CC      aarch64-softmmu/hw/arm/virt-acpi-build.o
  CC      aarch64-softmmu/hw/arm/digic_boards.o
  CC      aarch64-softmmu/hw/arm/exynos4_boards.o
  CC      x86_64-softmmu/target/i386/cpu.o
  CC      aarch64-softmmu/hw/arm/highbank.o
  CC      x86_64-softmmu/target/i386/gdbstub.o
  CC      aarch64-softmmu/hw/arm/integratorcp.o
  CC      aarch64-softmmu/hw/arm/mainstone.o
In file included from /tmp/qemu-test/src/include/exec/memory.h:28:0,
                 from /tmp/qemu-test/src/include/hw/hw.h:11,
                 from /tmp/qemu-test/src/include/hw/qdev.h:4,
                 from /tmp/qemu-test/src/include/hw/sysbus.h:6,
                 from /tmp/qemu-test/src/hw/arm/virt.c:33:
/tmp/qemu-test/src/hw/arm/virt.c: In function 'virt_machine_3_0_options':
/tmp/qemu-test/src/include/hw/qdev-core.h:267:23: error: comparison of unsigned expression < 0 is always false [-Werror=type-limits]
         for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
                       ^
/tmp/qemu-test/src/hw/arm/virt.c:1901:5: note: in expansion of macro 'SET_COMPAT'
     SET_COMPAT(mc, VIRT_COMPAT_3_0);
     ^~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [/tmp/qemu-test/src/rules.mak:69: hw/arm/virt.o] Error 1
make[1]: *** Waiting for unfinished jobs....
  CC      x86_64-softmmu/target/i386/xsave_helper.o
  CC      x86_64-softmmu/target/i386/translate.o
  CC      x86_64-softmmu/target/i386/bpt_helper.o
  CC      x86_64-softmmu/target/i386/cc_helper.o
  CC      x86_64-softmmu/target/i386/excp_helper.o
  CC      x86_64-softmmu/target/i386/fpu_helper.o
  CC      x86_64-softmmu/target/i386/int_helper.o
make: *** [Makefile:483: subdir-aarch64-softmmu] Error 2
make: *** Waiting for unfinished jobs....
  CC      x86_64-softmmu/target/i386/mem_helper.o
  CC      x86_64-softmmu/target/i386/misc_helper.o
  CC      x86_64-softmmu/target/i386/mpx_helper.o
  CC      x86_64-softmmu/target/i386/seg_helper.o
  CC      x86_64-softmmu/target/i386/smm_helper.o
  CC      x86_64-softmmu/target/i386/svm_helper.o
  CC      x86_64-softmmu/target/i386/machine.o
  CC      x86_64-softmmu/target/i386/arch_memory_mapping.o
  CC      x86_64-softmmu/target/i386/arch_dump.o
  CC      x86_64-softmmu/target/i386/monitor.o
  CC      x86_64-softmmu/target/i386/kvm-stub.o
  CC      x86_64-softmmu/target/i386/hyperv-stub.o
  CC      x86_64-softmmu/target/i386/hax-all.o
  CC      x86_64-softmmu/target/i386/hax-mem.o
  CC      x86_64-softmmu/target/i386/hax-windows.o
  CC      x86_64-softmmu/target/i386/sev-stub.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/trace/control-target.o
  CC      x86_64-softmmu/gdbstub-xml.o
  CC      x86_64-softmmu/trace/generated-helpers.o
  LINK    x86_64-softmmu/qemu-system-x86_64w.exe
  GEN     x86_64-softmmu/qemu-system-x86_64.exe
Traceback (most recent call last):
  File "./tests/docker/docker.py", line 563, in <module>
    sys.exit(main())
  File "./tests/docker/docker.py", line 560, in main
    return args.cmdobj.run(args, argv)
  File "./tests/docker/docker.py", line 306, in run
    return Docker().run(argv, args.keep, quiet=args.quiet)
  File "./tests/docker/docker.py", line 274, in run
    quiet=quiet)
  File "./tests/docker/docker.py", line 181, in _do_check
    return subprocess.check_call(self._command + cmd, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 542, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['sudo', '-n', 'docker', 'run', '--label', 'com.qemu.instance.uuid=ba1e68acf37511e88cd368b59973b7d0', '-u', '1001', '--security-opt', 'seccomp=unconfined', '--rm', '--net=none', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=8', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/home/patchew/.cache/qemu-docker-ccache:/var/tmp/ccache:z', '-v', '/var/tmp/patchew-tester-tmp-ifcyq5e1/src/docker-src.2018-11-28-20.25.35.29416:/var/tmp/qemu:z,ro', 'qemu:fedora', '/var/tmp/qemu/run', 'test-mingw']' returned non-zero exit status 2
make[1]: *** [docker-run] Error 1
make[1]: Leaving directory `/var/tmp/patchew-tester-tmp-ifcyq5e1/src'
make: *** [docker-run-test-mingw@fedora] Error 2

real	9m46.903s
user	0m17.966s
sys	0m4.189s
=== OUTPUT END ===

Test command exited with code: 2


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties
  2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
                   ` (29 preceding siblings ...)
  2018-11-29  1:35 ` no-reply
@ 2018-11-29  1:45 ` no-reply
  30 siblings, 0 replies; 70+ messages in thread
From: no-reply @ 2018-11-29  1:45 UTC (permalink / raw)
  To: marcandre.lureau; +Cc: famz, qemu-devel, imammedo

Hi,

This series seems to have some coding style problems. See output below for
more information:

Type: series
Subject: [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties
Message-id: 20181127092801.21777-1-marcandre.lureau@redhat.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash

BASE=base
n=1
total=$(git log --oneline $BASE.. | wc -l)
failed=0

git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram

commits="$(git log --format=%H --reverse $BASE..)"
for c in $commits; do
    echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..."
    if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then
        failed=1
        echo
    fi
    n=$((n+1))
done

exit $failed
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
dc9253d hostmem: use object id for memory region name with >= 3.1
fe3bf67 hw/arm/virt: add virt-3.2 machine type
31f5bd6 hw/i386: add pc-i440fx-3.2 & pc-q35-3.2
3b0b8e6 machine: add compat-props interface
4a14ed5 arm: replace instance_post_init()
f3d5327 qom: add object_class_get_class_data()
c29b239 qom: teach interfaces to implement post-init
9cc5ad4 qdev-props: call object_apply_global_props()
70e9d46 qdev-props: remove errp from GlobalProperty
0e3d981 qdev-props: convert global_props to GPtrArray
2a2ec6a qdev: all globals are now user-provided
0bc5b7b hw: remove SET_MACHINE_COMPAT
851e70b hw: apply machine compat properties without touching globals
acd5576 hw: apply accel compat properties without touching globals
c4af6bd qom: remove unimplemented class_finalize
db6199f qdev: move qdev_prop_register_global_list() to tests
fae3261 accel: register global_props like machine globals
e86b095 qom: make user_creatable_complete() specific to UserCreatable
758abb5 qom: make interface types abstract
f2b0f9b tests: qdev_prop_check_globals() doesn't return "all_used"
65d13a9 Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20181126' into staging
134e216 net: cadence_gem: Remove incorrect assert()
421842e MAINTAINERS: Add an ARM SMMU section
cda0d1d MAINTAINERS: Assign some more files in the hw/arm/ directory

=== OUTPUT BEGIN ===
Checking PATCH 1/24: MAINTAINERS: Assign some more files in the hw/arm/ directory...
Checking PATCH 2/24: MAINTAINERS: Add an ARM SMMU section...
Checking PATCH 3/24: net: cadence_gem: Remove incorrect assert()...
Checking PATCH 4/24: Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20181126' into staging...
Checking PATCH 5/24: tests: qdev_prop_check_globals() doesn't return "all_used"...
Checking PATCH 6/24: qom: make interface types abstract...
Checking PATCH 7/24: qom: make user_creatable_complete() specific to UserCreatable...
Checking PATCH 8/24: accel: register global_props like machine globals...
Checking PATCH 9/24: qdev: move qdev_prop_register_global_list() to tests...
Checking PATCH 10/24: qom: remove unimplemented class_finalize...
Checking PATCH 11/24: hw: apply accel compat properties without touching globals...
ERROR: Macros with multiple statements should be enclosed in a do - while loop
#95: FILE: hw/xen/xen-common.c:162:
+#define XEN_COMPAT                              \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "store-global-state",       \
+        .value = "off",                         \
+    },                                          \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "send-configuration",       \
+        .value = "off",                         \
+    },                                          \
+    {                                           \
+        .driver = "migration",                  \
+        .property = "send-section-footer",      \
+        .value = "off",                         \
+    }

WARNING: line over 80 characters
#193: FILE: qom/object.c:373:
+void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)

total: 1 errors, 1 warnings, 170 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 12/24: hw: apply machine compat properties without touching globals...
Checking PATCH 13/24: hw: remove SET_MACHINE_COMPAT...
Checking PATCH 14/24: qdev: all globals are now user-provided...
Checking PATCH 15/24: qdev-props: convert global_props to GPtrArray...
Checking PATCH 16/24: qdev-props: remove errp from GlobalProperty...
Checking PATCH 17/24: qdev-props: call object_apply_global_props()...
Checking PATCH 18/24: qom: teach interfaces to implement post-init...
Checking PATCH 19/24: qom: add object_class_get_class_data()...
Checking PATCH 20/24: arm: replace instance_post_init()...
Checking PATCH 21/24: machine: add compat-props interface...
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#39: 
new file mode 100644

total: 0 errors, 1 warnings, 121 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
Checking PATCH 22/24: hw/i386: add pc-i440fx-3.2 & pc-q35-3.2...
Checking PATCH 23/24: hw/arm/virt: add virt-3.2 machine type...
Checking PATCH 24/24: hostmem: use object id for memory region name with >= 3.1...
=== OUTPUT END ===

Test command exited with code: 1


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-28 17:40         ` Igor Mammedov
  2018-11-28 17:53           ` Eduardo Habkost
@ 2018-11-29 10:32           ` Marc-André Lureau
  2018-11-29 17:50             ` Eduardo Habkost
  2018-11-30 11:37             ` Igor Mammedov
  1 sibling, 2 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-29 10:32 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Eduardo Habkost, Peter Maydell, Michael S. Tsirkin,
	Cornelia Huck, David Hildenbrand, QEMU, Christian Borntraeger,
	Qemu-s390x list, open list:ARM, open list:sPAPR pseries,
	Paolo Bonzini, David Gibson, Richard Henderson

Hi
On Wed, Nov 28, 2018 at 9:53 PM Igor Mammedov <imammedo@redhat.com> wrote:
>
> On Tue, 27 Nov 2018 11:35:27 -0200
> Eduardo Habkost <ehabkost@redhat.com> wrote:
>
> > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:
> > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
> > > >
> > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:
> > > > > Similarly to accel properties, move compat properties out of globals
> > > > > registration, and apply the machine compat properties during
> > > > > device_post_init().
> > > > >
> > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > > > [...]
> > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > index 7066d28271..3b31b2c025 100644
> > > > > --- a/hw/core/qdev.c
> > > > > +++ b/hw/core/qdev.c
> > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > >  }
> > > > >
> > > > >  static const GPtrArray *ac_compat_props;
> > > > > +static const GPtrArray *mc_compat_props;
> why you didn't use just 'compat_props' for both?
> (it would be cleaner have single registry for compat
> properties, and the place that takes care of registration
> will take care of necessary ordering)

There are two arrays, one from the accelerator class, the other from
the machine class. We can't make it a singleton (all compats props for
the various machines would be mixed).

We could create a third array that would be the set of both, but that
would require more copy/allocation.

>
> > > > >
> > > > >  void accel_register_compat_props(const GPtrArray *props)
> > > > >  {
> > > > >      ac_compat_props = props;
> > > > >  }
> > > > >
> > > > > +void machine_register_compat_props(const GPtrArray *props)
> > > > > +{
> > > > > +    mc_compat_props = props;
> > > > > +}
> > > > > +
> > > > >  static void device_post_init(Object *obj)
> > > > >  {
> > > > >      if (ac_compat_props) {
> > > > >          object_apply_global_props(obj, ac_compat_props, &error_abort);
> > > > >      }
> > > >
> > > > Why not just use MACHINE(qdev_get_machine())->accel->compat_props
> > > > directly?
> > > >
> > > > > +    if (mc_compat_props) {
> > > > > +        object_apply_global_props(obj, mc_compat_props, &error_abort);
> > > > > +    }
> > > >
> > > > Why not just use MACHINE(qdev_get_machine())->compat_props
> > > > directly?
> > >
> > > This was the approach in v3, but Igor didn't quite like referencing
> > > machine in qdev:
> > > https://lists.nongnu.org/archive/html/qemu-devel/2018-11/msg04774.html
> >
> > I disagree with Igor, here.  Core qdev code already have multiple
> > references to machine, I don't see any problem with that.
> (There are only 3 calls to qdev_get_machine() in core qdev.c
> blame me for adding one there. Which were hacks so we won't
> have to re-factor core qdev code. But that doesn't justify adding more.)
>
> This patch is an interim one and later in 25/28
> device_post_init() content is moved to a more generic compat interface
> implementation. That intended for use with types derived from Object
> (i.e. not only qdev stuff). Hence I'd like to decouple it from
> machine as a standalone feature as much as possible. So that
> machine (or whatever else) will opt in in using facility.
>
> > The previous code was clearer and easier to follow, and wasn't
> > sensitive to subtle changes in initialization ordering (e.g. what
> > happens if we create a device before *_register_compat_props() is
> > called?).
> Indeed It seems clearer to follow (that was my first impression as well),
> until I went through whole series and thought it's basically the same,
> So my choice was to use cleaner approach that we won't have to rewrite
> in near future.
>
> Thanks for bringing up ordering issue, we probably have one in this series.
>
> But beside possible issue here, even with v3 variant we would still have
> issues if objects are created before machine and accelerator instances are
> created.
> More correct way could be to register compat properties right away at
> select_machine() time, we don't really need an instance for that, just access
> to machine_class and do the same for 'accel' option. (that's probably doable
> within this series) + some time later (on top of this series) a check that
> no TYPE_COMPAT_PROPS were created at the moment compat properties are registered
> so we would notice when we write something wrong.

ok, I can look at that

>
> If it's too much of refactoring (series is already big as it is), I would
> compromise on qdev_get_machine() and adding TODO comments (or a series on top)
> to make it correct and "race-resistant".
>
> Marc are you sure it actually will work as expected with Object derived types?
>    register_global_properties()
> is being called after
>    qemu_opts_foreach(... user_creatable_add_opts_foreach, object_create_initial ...)
> so there is no compat properties registered when objects are created.

Good point, but in the case of hostmem, it works because
object_create_initial delays its creation.

> > >
> > > >
> > > > >
> > > > >      qdev_prop_set_globals(DEVICE(obj));
> > > > >  }
> > > > [...]
> > > >
> > > > --
> > > > Eduardo
> >
>
>


-- 
Marc-André Lureau

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
  2018-11-27 20:02       ` Marc-André Lureau
  (?)
@ 2018-11-29 16:02       ` Eduardo Habkost
  -1 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-29 16:02 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, sstabellini, xen-devel, Bonzini, Paolo,
	Anthony PERARD, Igor Mammedov, Andreas Färber

On Wed, Nov 28, 2018 at 12:02:21AM +0400, Marc-André Lureau wrote:
> Hi
> 
> On Tue, Nov 27, 2018 at 11:40 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > On Tue, Nov 27, 2018 at 01:27:48PM +0400, Marc-André Lureau wrote:
> > > Introduce object_apply_global_props() function, to apply compatibility
> > > properties from a GPtrArray.
> > >
> > > For accel compatibility properties, apply them during
> > > device_post_init(), after accel_register_compat_props() has set them.
> > >
> > > To populate the compatibility properties, introduce SET_COMPAT(), a
> > > more generic version of SET_MACHINE_COMPAT() that can set compat
> > > properties on other objects than Machine, and using GPtrArray.
> > >
> > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > > ---
> > >  include/hw/qdev-core.h | 13 +++++++++++++
> > >  include/qom/object.h   |  3 +++
> > >  include/sysemu/accel.h |  4 +---
> > >  accel/accel.c          | 12 ------------
> > >  hw/core/qdev.c         | 11 +++++++++++
> > >  hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
> > >  qom/object.c           | 25 +++++++++++++++++++++++++
> > >  vl.c                   |  2 +-
> > >  8 files changed, 73 insertions(+), 35 deletions(-)
> > >
> > > diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> > > index a24d0dd566..82afd3c50d 100644
> > > --- a/include/hw/qdev-core.h
> > > +++ b/include/hw/qdev-core.h
> > > @@ -267,6 +267,19 @@ typedef struct GlobalProperty {
> > >      Error **errp;
> > >  } GlobalProperty;
> > >
> > > +#define SET_COMPAT(S, COMPAT)                                       \
> > > +    do {                                                            \
> > > +        int i;                                                      \
> > > +        static GlobalProperty props[] = {                           \
> > > +            COMPAT                                                  \
> > > +        };                                                          \
> > > +        for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
> > > +            g_ptr_array_add((S)->compat_props, (void *)&props[i]);  \
> > > +        }                                                           \
> > > +    } while (0)
> >
> > I think this macro would be an acceptable alternative to the
> > existing SET_MACHINE_COMPAT macro trickery, but:
> >
> > > +
> > > +void accel_register_compat_props(const GPtrArray *props);
> > [...]
> > > @@ -185,7 +183,9 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
> > >      ac->init_machine = xen_init;
> > >      ac->setup_post = xen_setup_post;
> > >      ac->allowed = &xen_allowed;
> > > -    ac->global_props = xen_compat_props;
> > > +    ac->compat_props = g_ptr_array_new();
> > > +
> > > +    SET_COMPAT(ac, XEN_COMPAT);
> >
> > I think this is a step backwards.  I like us to be able to
> > register compat properties without macro magic.  The existence of
> > SET_MACHINE_COMPAT is a bug and not a feature.
> >
> > If you really want to use GPtrArray instead of a simple
> > GlobalProperty* field (I'm not sure I understand the reasoning
> > behind the choice to use GPtrArray), what about:
> 
> Except in the Xen case, It needs to register multiple GlobalProperty*,
> not necessarily from contiguous in memory. That's why we have an array
> of ptr.

If you also need to register multiple properties not from a
contiguous array, would a simple wrapper that does a single
g_ptr_array_add() call be enough?


> 
> >
> > static GPtrArray *build_compat_props_array(GlobalProperty *props)
> > {
> >     GlobalProperty *p = props;
> >     GPtrArray *array = g_ptr_array_new();
> >     while (p->driver) {
> >         g_ptr_array_add(array, (void *)p);
> >     }
> >     return array;
> > }
> >
> >
> > static void xen_accel_class_init(ObjectClass *oc, void *data)
> > {
> >     ...
> >     ac->compat_props = build_compat_props_array(xen_compat_props);
> 
> If we would register from one place, that would be fine.
> 
> We could replace the macro by a function, then we would have to
> declare the GlobalProperty arrays manually basically.

I would prefer to replace the macro with a function, if possible.
What do you mean by declaring the GlobalProperty arrays manually?


> 
> > }
> >
> >
> >
> > >  }
> > >
> > >  #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
> > > diff --git a/qom/object.c b/qom/object.c
> > > index 17921c0a71..dbdab0aead 100644
> > > --- a/qom/object.c
> > > +++ b/qom/object.c
> > > @@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
> > >      }
> > >  }
> > >
> > > +void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
> > > +{
> > > +    Error *err = NULL;
> > > +    int i;
> > > +
> > > +    if (!props) {
> > > +        return;
> > > +    }
> > > +
> > > +    for (i = 0; i < props->len; i++) {
> > > +        GlobalProperty *p = g_ptr_array_index(props, i);
> > > +
> > > +        if (object_dynamic_cast(obj, p->driver) == NULL) {
> > > +            continue;
> > > +        }
> > > +        p->used = true;
> > > +        object_property_parse(obj, p->value, p->property, &err);
> > > +        if (err != NULL) {
> > > +            error_prepend(&err, "can't apply global %s.%s=%s: ",
> > > +                          p->driver, p->property, p->value);
> > > +            error_propagate(errp, err);
> > > +        }
> > > +    }
> > > +}
> > > +
> > >  static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
> > >  {
> > >      Object *obj = data;
> > > diff --git a/vl.c b/vl.c
> > > index fa25d1ae2d..c06e94271c 100644
> > > --- a/vl.c
> > > +++ b/vl.c
> > > @@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
> > >   */
> > >  static void register_global_properties(MachineState *ms)
> > >  {
> > > -    accel_register_compat_props(ms->accelerator);
> > > +    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
> > >      machine_register_compat_props(ms);
> > >      user_register_global_props();
> > >  }
> > > --
> > > 2.20.0.rc1
> > >
> > >
> >
> > --
> > Eduardo

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals
  2018-11-27 20:02       ` Marc-André Lureau
  (?)
  (?)
@ 2018-11-29 16:02       ` Eduardo Habkost
  -1 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-29 16:02 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: sstabellini, qemu-devel, Bonzini, Paolo, Igor Mammedov,
	Anthony PERARD, xen-devel, Andreas Färber

On Wed, Nov 28, 2018 at 12:02:21AM +0400, Marc-André Lureau wrote:
> Hi
> 
> On Tue, Nov 27, 2018 at 11:40 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > On Tue, Nov 27, 2018 at 01:27:48PM +0400, Marc-André Lureau wrote:
> > > Introduce object_apply_global_props() function, to apply compatibility
> > > properties from a GPtrArray.
> > >
> > > For accel compatibility properties, apply them during
> > > device_post_init(), after accel_register_compat_props() has set them.
> > >
> > > To populate the compatibility properties, introduce SET_COMPAT(), a
> > > more generic version of SET_MACHINE_COMPAT() that can set compat
> > > properties on other objects than Machine, and using GPtrArray.
> > >
> > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > > ---
> > >  include/hw/qdev-core.h | 13 +++++++++++++
> > >  include/qom/object.h   |  3 +++
> > >  include/sysemu/accel.h |  4 +---
> > >  accel/accel.c          | 12 ------------
> > >  hw/core/qdev.c         | 11 +++++++++++
> > >  hw/xen/xen-common.c    | 38 +++++++++++++++++++-------------------
> > >  qom/object.c           | 25 +++++++++++++++++++++++++
> > >  vl.c                   |  2 +-
> > >  8 files changed, 73 insertions(+), 35 deletions(-)
> > >
> > > diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> > > index a24d0dd566..82afd3c50d 100644
> > > --- a/include/hw/qdev-core.h
> > > +++ b/include/hw/qdev-core.h
> > > @@ -267,6 +267,19 @@ typedef struct GlobalProperty {
> > >      Error **errp;
> > >  } GlobalProperty;
> > >
> > > +#define SET_COMPAT(S, COMPAT)                                       \
> > > +    do {                                                            \
> > > +        int i;                                                      \
> > > +        static GlobalProperty props[] = {                           \
> > > +            COMPAT                                                  \
> > > +        };                                                          \
> > > +        for (i = 0; i < G_N_ELEMENTS(props); i++) {                 \
> > > +            g_ptr_array_add((S)->compat_props, (void *)&props[i]);  \
> > > +        }                                                           \
> > > +    } while (0)
> >
> > I think this macro would be an acceptable alternative to the
> > existing SET_MACHINE_COMPAT macro trickery, but:
> >
> > > +
> > > +void accel_register_compat_props(const GPtrArray *props);
> > [...]
> > > @@ -185,7 +183,9 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
> > >      ac->init_machine = xen_init;
> > >      ac->setup_post = xen_setup_post;
> > >      ac->allowed = &xen_allowed;
> > > -    ac->global_props = xen_compat_props;
> > > +    ac->compat_props = g_ptr_array_new();
> > > +
> > > +    SET_COMPAT(ac, XEN_COMPAT);
> >
> > I think this is a step backwards.  I like us to be able to
> > register compat properties without macro magic.  The existence of
> > SET_MACHINE_COMPAT is a bug and not a feature.
> >
> > If you really want to use GPtrArray instead of a simple
> > GlobalProperty* field (I'm not sure I understand the reasoning
> > behind the choice to use GPtrArray), what about:
> 
> Except in the Xen case, It needs to register multiple GlobalProperty*,
> not necessarily from contiguous in memory. That's why we have an array
> of ptr.

If you also need to register multiple properties not from a
contiguous array, would a simple wrapper that does a single
g_ptr_array_add() call be enough?


> 
> >
> > static GPtrArray *build_compat_props_array(GlobalProperty *props)
> > {
> >     GlobalProperty *p = props;
> >     GPtrArray *array = g_ptr_array_new();
> >     while (p->driver) {
> >         g_ptr_array_add(array, (void *)p);
> >     }
> >     return array;
> > }
> >
> >
> > static void xen_accel_class_init(ObjectClass *oc, void *data)
> > {
> >     ...
> >     ac->compat_props = build_compat_props_array(xen_compat_props);
> 
> If we would register from one place, that would be fine.
> 
> We could replace the macro by a function, then we would have to
> declare the GlobalProperty arrays manually basically.

I would prefer to replace the macro with a function, if possible.
What do you mean by declaring the GlobalProperty arrays manually?


> 
> > }
> >
> >
> >
> > >  }
> > >
> > >  #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
> > > diff --git a/qom/object.c b/qom/object.c
> > > index 17921c0a71..dbdab0aead 100644
> > > --- a/qom/object.c
> > > +++ b/qom/object.c
> > > @@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
> > >      }
> > >  }
> > >
> > > +void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
> > > +{
> > > +    Error *err = NULL;
> > > +    int i;
> > > +
> > > +    if (!props) {
> > > +        return;
> > > +    }
> > > +
> > > +    for (i = 0; i < props->len; i++) {
> > > +        GlobalProperty *p = g_ptr_array_index(props, i);
> > > +
> > > +        if (object_dynamic_cast(obj, p->driver) == NULL) {
> > > +            continue;
> > > +        }
> > > +        p->used = true;
> > > +        object_property_parse(obj, p->value, p->property, &err);
> > > +        if (err != NULL) {
> > > +            error_prepend(&err, "can't apply global %s.%s=%s: ",
> > > +                          p->driver, p->property, p->value);
> > > +            error_propagate(errp, err);
> > > +        }
> > > +    }
> > > +}
> > > +
> > >  static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
> > >  {
> > >      Object *obj = data;
> > > diff --git a/vl.c b/vl.c
> > > index fa25d1ae2d..c06e94271c 100644
> > > --- a/vl.c
> > > +++ b/vl.c
> > > @@ -2963,7 +2963,7 @@ static void user_register_global_props(void)
> > >   */
> > >  static void register_global_properties(MachineState *ms)
> > >  {
> > > -    accel_register_compat_props(ms->accelerator);
> > > +    accel_register_compat_props(ACCEL_GET_CLASS(ms->accelerator)->compat_props);
> > >      machine_register_compat_props(ms);
> > >      user_register_global_props();
> > >  }
> > > --
> > > 2.20.0.rc1
> > >
> > >
> >
> > --
> > Eduardo

-- 
Eduardo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine " Marc-André Lureau
  2018-11-27 12:56   ` Eduardo Habkost
@ 2018-11-29 16:09   ` Eduardo Habkost
  2018-11-29 21:32     ` Marc-André Lureau
  1 sibling, 1 reply; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-29 16:09 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel, imammedo, Peter Maydell, Marcel Apfelbaum,
	Paolo Bonzini, Richard Henderson, Michael S. Tsirkin,
	David Gibson, Cornelia Huck, David Hildenbrand,
	Christian Borntraeger, open list:Virt, open list:sPAPR,
	open list:S390

On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:
> Similarly to accel properties, move compat properties out of globals
> registration, and apply the machine compat properties during
> device_post_init().
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
[...]
> @@ -191,7 +190,7 @@ struct MachineClass {
>      const char *default_machine_opts;
>      const char *default_boot_order;
>      const char *default_display;
> -    GArray *compat_props;
> +    GPtrArray *compat_props;

What are the advantages/disadvantages of GArray vs GPtrArray vs
GList here?  Why did you decide to change this from GArray to
GPtrArray in v4?

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface Marc-André Lureau
@ 2018-11-29 17:49   ` Eduardo Habkost
  2018-11-30 12:34     ` Igor Mammedov
  2018-11-30 12:39   ` Igor Mammedov
  1 sibling, 1 reply; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-29 17:49 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, imammedo

On Tue, Nov 27, 2018 at 01:27:58PM +0400, Marc-André Lureau wrote:
> Let's make compatiblity properties an interface, so that objects other
> than QDev can benefit from having machine compatiblity properties.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
[...]
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 3b31b2c025..b0ee05f837 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -970,28 +970,8 @@ static void device_initfn(Object *obj)
>      QLIST_INIT(&dev->gpios);
>  }
>  
> -static const GPtrArray *ac_compat_props;
> -static const GPtrArray *mc_compat_props;
> -
> -void accel_register_compat_props(const GPtrArray *props)
> -{
> -    ac_compat_props = props;
> -}
> -
> -void machine_register_compat_props(const GPtrArray *props)
> -{
> -    mc_compat_props = props;
> -}
> -
>  static void device_post_init(Object *obj)
>  {
> -    if (ac_compat_props) {
> -        object_apply_global_props(obj, ac_compat_props, &error_abort);
> -    }
> -    if (mc_compat_props) {
> -        object_apply_global_props(obj, mc_compat_props, &error_abort);
> -    }
> -
>      qdev_prop_set_globals(DEVICE(obj));
>  }
>  
> @@ -1124,6 +1104,10 @@ static const TypeInfo device_type_info = {
>      .class_init = device_class_init,
>      .abstract = true,
>      .class_size = sizeof(DeviceClass),
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_COMPAT_PROPS },
> +        { }
> +    }

At first I thought TYPE_COMPAT_PROPS was a practical way to
implement this feature, but now I'm worried: the ordering between
compat_props_post_init() qdev_prop_set_globals() is very
important (user-provided globals must always be set after compat
props), and here the ordering is implicit and easy to break
accidentally.

What if instead of a QOM interface we just provide a simple
object_apply_compat_props() function?  e.g.:

qdev.c:

  static void device_post_init(Object *obj)
  {
      object_apply_compat_props(obj);
      apply_user_provided_globals(obj);
  }

object_interface.c:

  void user_creatable_complete(Object *obj, Error **errp)
  {
      object_apply_compat_props(obj);
      ...
      ucc->complete(...)
  }

Most people don't understand QOM interfaces and their
initialization ordering rules.  Everybody understands C function
calls.

> [...]

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-29 10:32           ` Marc-André Lureau
@ 2018-11-29 17:50             ` Eduardo Habkost
  2018-11-29 21:36               ` Marc-André Lureau
  2018-11-30 11:37             ` Igor Mammedov
  1 sibling, 1 reply; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-29 17:50 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Igor Mammedov, Peter Maydell, Michael S. Tsirkin, Cornelia Huck,
	David Hildenbrand, QEMU, Christian Borntraeger, Qemu-s390x list,
	open list:ARM, open list:sPAPR pseries, Paolo Bonzini,
	David Gibson, Richard Henderson

On Thu, Nov 29, 2018 at 02:32:18PM +0400, Marc-André Lureau wrote:
> Hi
> On Wed, Nov 28, 2018 at 9:53 PM Igor Mammedov <imammedo@redhat.com> wrote:
> >
> > On Tue, 27 Nov 2018 11:35:27 -0200
> > Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:
> > > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
> > > > >
> > > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:
> > > > > > Similarly to accel properties, move compat properties out of globals
> > > > > > registration, and apply the machine compat properties during
> > > > > > device_post_init().
> > > > > >
> > > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > > > > [...]
> > > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > > index 7066d28271..3b31b2c025 100644
> > > > > > --- a/hw/core/qdev.c
> > > > > > +++ b/hw/core/qdev.c
> > > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > > >  }
> > > > > >
> > > > > >  static const GPtrArray *ac_compat_props;
> > > > > > +static const GPtrArray *mc_compat_props;
> > why you didn't use just 'compat_props' for both?
> > (it would be cleaner have single registry for compat
> > properties, and the place that takes care of registration
> > will take care of necessary ordering)
> 
> There are two arrays, one from the accelerator class, the other from
> the machine class. We can't make it a singleton (all compats props for
> the various machines would be mixed).
> 
> We could create a third array that would be the set of both, but that
> would require more copy/allocation.

I am failing to see the advantage of replacing the `global_props`
static variable from qdev-properties.c with a collection of
separate static variables scattered around the code.  I thought
the main point of the changes was to reduce the amount of
duplicate data stored in static variables.

I was expecting something like this:

accel.c:

  void accel_apply_compat_props(AccelState *accel, Object *obj)
  {
      object_apply_global_props(obj, ACCEL_GET_CLASS(accel)->compat_props, &error_abort);
  }

machine.c:

  /* Apply compat properties and global properties to an object */
  void machine_apply_compat_props(MachineState *ms, Object *obj)
  {
      accel_apply_compat_props(ms->accel, obj);
      object_apply_global_props(obj, MACHINE_GET_CLASS(ms)->compat_props, &error_abort);
  }

compat-props.c:

  static void object_apply_compat_props(Object *obj)
  {
      MachineState *machine = MACHINE(qdev_get_machine());
      machine_apply_compat_props(machine, obj);
  }

qdev.c:

  static void device_post_init(Object *obj)
  {
      object_apply_compat_props(obj);
      apply_user_provided_globals(obj);
  }

object_interface.c:

  void user_creatable_complete(Object *obj, Error **errp)
  {
      object_apply_compat_props(obj);
      ...
      ucc->complete(...)
  }

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-29 16:09   ` Eduardo Habkost
@ 2018-11-29 21:32     ` Marc-André Lureau
  0 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-29 21:32 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Peter Maydell, Michael S. Tsirkin, Cornelia Huck,
	David Hildenbrand, QEMU, Christian Borntraeger, Qemu-s390x list,
	open list:ARM, open list:sPAPR pseries, Paolo Bonzini,
	Igor Mammedov, David Gibson, Richard Henderson

Hi

On Thu, Nov 29, 2018 at 8:11 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
>
> On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:
> > Similarly to accel properties, move compat properties out of globals
> > registration, and apply the machine compat properties during
> > device_post_init().
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> [...]
> > @@ -191,7 +190,7 @@ struct MachineClass {
> >      const char *default_machine_opts;
> >      const char *default_boot_order;
> >      const char *default_display;
> > -    GArray *compat_props;
> > +    GPtrArray *compat_props;
>
> What are the advantages/disadvantages of GArray vs GPtrArray vs
> GList here?  Why did you decide to change this from GArray to
> GPtrArray in v4?

GList would be less efficient than an array (extra pointer, memory
allocations/fragmentation/cache etc).

GPtrArray is similar to GArray, it is just specialized for storing void*.



-- 
Marc-André Lureau

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-29 17:50             ` Eduardo Habkost
@ 2018-11-29 21:36               ` Marc-André Lureau
  2018-11-30 10:55                 ` Igor Mammedov
  0 siblings, 1 reply; 70+ messages in thread
From: Marc-André Lureau @ 2018-11-29 21:36 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Igor Mammedov, Peter Maydell, Michael S. Tsirkin, Cornelia Huck,
	David Hildenbrand, QEMU, Christian Borntraeger, Qemu-s390x list,
	open list:ARM, open list:sPAPR pseries, Paolo Bonzini,
	David Gibson, Richard Henderson

Hi

On Thu, Nov 29, 2018 at 9:51 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
>
> On Thu, Nov 29, 2018 at 02:32:18PM +0400, Marc-André Lureau wrote:
> > Hi
> > On Wed, Nov 28, 2018 at 9:53 PM Igor Mammedov <imammedo@redhat.com> wrote:
> > >
> > > On Tue, 27 Nov 2018 11:35:27 -0200
> > > Eduardo Habkost <ehabkost@redhat.com> wrote:
> > >
> > > > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:
> > > > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
> > > > > >
> > > > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:
> > > > > > > Similarly to accel properties, move compat properties out of globals
> > > > > > > registration, and apply the machine compat properties during
> > > > > > > device_post_init().
> > > > > > >
> > > > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > > > > > [...]
> > > > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > > > index 7066d28271..3b31b2c025 100644
> > > > > > > --- a/hw/core/qdev.c
> > > > > > > +++ b/hw/core/qdev.c
> > > > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > > > >  }
> > > > > > >
> > > > > > >  static const GPtrArray *ac_compat_props;
> > > > > > > +static const GPtrArray *mc_compat_props;
> > > why you didn't use just 'compat_props' for both?
> > > (it would be cleaner have single registry for compat
> > > properties, and the place that takes care of registration
> > > will take care of necessary ordering)
> >
> > There are two arrays, one from the accelerator class, the other from
> > the machine class. We can't make it a singleton (all compats props for
> > the various machines would be mixed).
> >
> > We could create a third array that would be the set of both, but that
> > would require more copy/allocation.
>
> I am failing to see the advantage of replacing the `global_props`
> static variable from qdev-properties.c with a collection of
> separate static variables scattered around the code.  I thought
> the main point of the changes was to reduce the amount of
> duplicate data stored in static variables.
>
> I was expecting something like this:
>
> accel.c:
>
>   void accel_apply_compat_props(AccelState *accel, Object *obj)
>   {
>       object_apply_global_props(obj, ACCEL_GET_CLASS(accel)->compat_props, &error_abort);
>   }
>
> machine.c:
>
>   /* Apply compat properties and global properties to an object */
>   void machine_apply_compat_props(MachineState *ms, Object *obj)
>   {
>       accel_apply_compat_props(ms->accel, obj);
>       object_apply_global_props(obj, MACHINE_GET_CLASS(ms)->compat_props, &error_abort);
>   }
>
> compat-props.c:
>
>   static void object_apply_compat_props(Object *obj)
>   {
>       MachineState *machine = MACHINE(qdev_get_machine());
>       machine_apply_compat_props(machine, obj);
>   }
>
> qdev.c:
>
>   static void device_post_init(Object *obj)
>   {
>       object_apply_compat_props(obj);
>       apply_user_provided_globals(obj);
>   }
>
> object_interface.c:
>
>   void user_creatable_complete(Object *obj, Error **errp)
>   {
>       object_apply_compat_props(obj);
>       ...
>       ucc->complete(...)
>   }
>

I like that solution too (which you also proposed in the other
thread). But we have to decide whether it's acceptable to reference
MachineState, or if the compat properties should be registered.


--
Marc-André Lureau

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-29 21:36               ` Marc-André Lureau
@ 2018-11-30 10:55                 ` Igor Mammedov
  2018-11-30 11:41                   ` Eduardo Habkost
  0 siblings, 1 reply; 70+ messages in thread
From: Igor Mammedov @ 2018-11-30 10:55 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Eduardo Habkost, Peter Maydell, Michael S. Tsirkin,
	Cornelia Huck, David Hildenbrand, QEMU, Christian Borntraeger,
	Qemu-s390x list, open list:ARM, open list:sPAPR pseries,
	Paolo Bonzini, Richard Henderson, David Gibson

On Fri, 30 Nov 2018 01:36:03 +0400
Marc-André Lureau <marcandre.lureau@gmail.com> wrote:

> Hi
> 
> On Thu, Nov 29, 2018 at 9:51 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > On Thu, Nov 29, 2018 at 02:32:18PM +0400, Marc-André Lureau wrote:  
> > > Hi
> > > On Wed, Nov 28, 2018 at 9:53 PM Igor Mammedov <imammedo@redhat.com> wrote:  
> > > >
> > > > On Tue, 27 Nov 2018 11:35:27 -0200
> > > > Eduardo Habkost <ehabkost@redhat.com> wrote:
> > > >  
> > > > > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:  
> > > > > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:  
> > > > > > >
> > > > > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:  
> > > > > > > > Similarly to accel properties, move compat properties out of globals
> > > > > > > > registration, and apply the machine compat properties during
> > > > > > > > device_post_init().
> > > > > > > >
> > > > > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>  
> > > > > > > [...]  
> > > > > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > > > > index 7066d28271..3b31b2c025 100644
> > > > > > > > --- a/hw/core/qdev.c
> > > > > > > > +++ b/hw/core/qdev.c
> > > > > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > > > > >  }
> > > > > > > >
> > > > > > > >  static const GPtrArray *ac_compat_props;
> > > > > > > > +static const GPtrArray *mc_compat_props;  
> > > > why you didn't use just 'compat_props' for both?
> > > > (it would be cleaner have single registry for compat
> > > > properties, and the place that takes care of registration
> > > > will take care of necessary ordering)  
> > >
> > > There are two arrays, one from the accelerator class, the other from
> > > the machine class. We can't make it a singleton (all compats props for
> > > the various machines would be mixed).
> > >
> > > We could create a third array that would be the set of both, but that
> > > would require more copy/allocation.  
> >
> > I am failing to see the advantage of replacing the `global_props`
> > static variable from qdev-properties.c with a collection of
> > separate static variables scattered around the code.  I thought
> > the main point of the changes was to reduce the amount of
> > duplicate data stored in static variables.
Main point was to use compats for backends then on top of that 
we added split global from compat properties goal.

> > I was expecting something like this:
> >
> > accel.c:
> >
> >   void accel_apply_compat_props(AccelState *accel, Object *obj)
> >   {
> >       object_apply_global_props(obj, ACCEL_GET_CLASS(accel)->compat_props, &error_abort);
> >   }
> >
> > machine.c:
> >
> >   /* Apply compat properties and global properties to an object */
> >   void machine_apply_compat_props(MachineState *ms, Object *obj)
> >   {
> >       accel_apply_compat_props(ms->accel, obj);
> >       object_apply_global_props(obj, MACHINE_GET_CLASS(ms)->compat_props, &error_abort);
> >   }
> >
> > compat-props.c:
> >
> >   static void object_apply_compat_props(Object *obj)
> >   {
> >       MachineState *machine = MACHINE(qdev_get_machine());
> >       machine_apply_compat_props(machine, obj);
> >   }
> >
> > qdev.c:
> >
> >   static void device_post_init(Object *obj)
> >   {
> >       object_apply_compat_props(obj);
> >       apply_user_provided_globals(obj);
> >   }
> >
> > object_interface.c:
> >
> >   void user_creatable_complete(Object *obj, Error **errp)
> >   {
> >       object_apply_compat_props(obj);
> >       ...
> >       ucc->complete(...)
> >   }
> >  
> 
> I like that solution too (which you also proposed in the other
> thread). But we have to decide whether it's acceptable to reference
> MachineState, or if the compat properties should be registered.
I dislike pulling in machine into basic object code and
I think a separate compats would be cleaner interface without
layer violation. But to unstuck, lets go with qdev_get_machine()
for now.

 
> --
> Marc-André Lureau
> 

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-29 10:32           ` Marc-André Lureau
  2018-11-29 17:50             ` Eduardo Habkost
@ 2018-11-30 11:37             ` Igor Mammedov
  1 sibling, 0 replies; 70+ messages in thread
From: Igor Mammedov @ 2018-11-30 11:37 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Eduardo Habkost, Peter Maydell, Michael S. Tsirkin,
	Cornelia Huck, David Hildenbrand, QEMU, Christian Borntraeger,
	Qemu-s390x list, open list:ARM, open list:sPAPR pseries,
	Paolo Bonzini, David Gibson, Richard Henderson

On Thu, 29 Nov 2018 14:32:18 +0400
Marc-André Lureau <marcandre.lureau@gmail.com> wrote:

> Hi
> On Wed, Nov 28, 2018 at 9:53 PM Igor Mammedov <imammedo@redhat.com> wrote:
> >
> > On Tue, 27 Nov 2018 11:35:27 -0200
> > Eduardo Habkost <ehabkost@redhat.com> wrote:
> >  
> > > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:  
> > > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:  
> > > > >
> > > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:  
> > > > > > Similarly to accel properties, move compat properties out of globals
> > > > > > registration, and apply the machine compat properties during
> > > > > > device_post_init().
> > > > > >
> > > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>  
> > > > > [...]  
> > > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > > index 7066d28271..3b31b2c025 100644
> > > > > > --- a/hw/core/qdev.c
> > > > > > +++ b/hw/core/qdev.c
> > > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > > >  }
> > > > > >
> > > > > >  static const GPtrArray *ac_compat_props;
> > > > > > +static const GPtrArray *mc_compat_props;  
> > why you didn't use just 'compat_props' for both?
> > (it would be cleaner have single registry for compat
> > properties, and the place that takes care of registration
> > will take care of necessary ordering)  
> 
> There are two arrays, one from the accelerator class, the other from
> the machine class. We can't make it a singleton (all compats props for
> the various machines would be mixed).
My impression was that we register properties explicitly here,
so only registered ones endup here and in the order they were added.
Hence machine and accel compats could be merged here.
 
> We could create a third array that would be the set of both, but that
> would require more copy/allocation.
[...]

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-30 10:55                 ` Igor Mammedov
@ 2018-11-30 11:41                   ` Eduardo Habkost
  2018-12-04 13:17                     ` Igor Mammedov
  0 siblings, 1 reply; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-30 11:41 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Marc-André Lureau, Peter Maydell, Michael S. Tsirkin,
	Cornelia Huck, David Hildenbrand, QEMU, Christian Borntraeger,
	Qemu-s390x list, open list:ARM, open list:sPAPR pseries,
	Paolo Bonzini, Richard Henderson, David Gibson

On Fri, Nov 30, 2018 at 11:55:26AM +0100, Igor Mammedov wrote:
> On Fri, 30 Nov 2018 01:36:03 +0400
> Marc-André Lureau <marcandre.lureau@gmail.com> wrote:
> 
> > Hi
> > 
> > On Thu, Nov 29, 2018 at 9:51 PM Eduardo Habkost <ehabkost@redhat.com> wrote:
> > >
> > > On Thu, Nov 29, 2018 at 02:32:18PM +0400, Marc-André Lureau wrote:  
> > > > Hi
> > > > On Wed, Nov 28, 2018 at 9:53 PM Igor Mammedov <imammedo@redhat.com> wrote:  
> > > > >
> > > > > On Tue, 27 Nov 2018 11:35:27 -0200
> > > > > Eduardo Habkost <ehabkost@redhat.com> wrote:
> > > > >  
> > > > > > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:  
> > > > > > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:  
> > > > > > > >
> > > > > > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:  
> > > > > > > > > Similarly to accel properties, move compat properties out of globals
> > > > > > > > > registration, and apply the machine compat properties during
> > > > > > > > > device_post_init().
> > > > > > > > >
> > > > > > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>  
> > > > > > > > [...]  
> > > > > > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > > > > > index 7066d28271..3b31b2c025 100644
> > > > > > > > > --- a/hw/core/qdev.c
> > > > > > > > > +++ b/hw/core/qdev.c
> > > > > > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > > > > > >  }
> > > > > > > > >
> > > > > > > > >  static const GPtrArray *ac_compat_props;
> > > > > > > > > +static const GPtrArray *mc_compat_props;  
> > > > > why you didn't use just 'compat_props' for both?
> > > > > (it would be cleaner have single registry for compat
> > > > > properties, and the place that takes care of registration
> > > > > will take care of necessary ordering)  
> > > >
> > > > There are two arrays, one from the accelerator class, the other from
> > > > the machine class. We can't make it a singleton (all compats props for
> > > > the various machines would be mixed).
> > > >
> > > > We could create a third array that would be the set of both, but that
> > > > would require more copy/allocation.  
> > >
> > > I am failing to see the advantage of replacing the `global_props`
> > > static variable from qdev-properties.c with a collection of
> > > separate static variables scattered around the code.  I thought
> > > the main point of the changes was to reduce the amount of
> > > duplicate data stored in static variables.
> Main point was to use compats for backends then on top of that 
> we added split global from compat properties goal.
> 
> > > I was expecting something like this:
> > >
> > > accel.c:
> > >
> > >   void accel_apply_compat_props(AccelState *accel, Object *obj)
> > >   {
> > >       object_apply_global_props(obj, ACCEL_GET_CLASS(accel)->compat_props, &error_abort);
> > >   }
> > >
> > > machine.c:
> > >
> > >   /* Apply compat properties and global properties to an object */
> > >   void machine_apply_compat_props(MachineState *ms, Object *obj)
> > >   {
> > >       accel_apply_compat_props(ms->accel, obj);
> > >       object_apply_global_props(obj, MACHINE_GET_CLASS(ms)->compat_props, &error_abort);
> > >   }
> > >
> > > compat-props.c:
> > >
> > >   static void object_apply_compat_props(Object *obj)
> > >   {
> > >       MachineState *machine = MACHINE(qdev_get_machine());
> > >       machine_apply_compat_props(machine, obj);
> > >   }
> > >
> > > qdev.c:
> > >
> > >   static void device_post_init(Object *obj)
> > >   {
> > >       object_apply_compat_props(obj);
> > >       apply_user_provided_globals(obj);
> > >   }
> > >
> > > object_interface.c:
> > >
> > >   void user_creatable_complete(Object *obj, Error **errp)
> > >   {
> > >       object_apply_compat_props(obj);
> > >       ...
> > >       ucc->complete(...)
> > >   }
> > >  
> > 
> > I like that solution too (which you also proposed in the other
> > thread). But we have to decide whether it's acceptable to reference
> > MachineState, or if the compat properties should be registered.
> I dislike pulling in machine into basic object code and
> I think a separate compats would be cleaner interface without
> layer violation. But to unstuck, lets go with qdev_get_machine()
> for now.

Which basic object code?  The only reference to machine above is
at compat-props.c.  I don't see any layering violation here.

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 24/28] arm: replace instance_post_init()
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 24/28] arm: replace instance_post_init() Marc-André Lureau
@ 2018-11-30 11:48   ` Igor Mammedov
  2018-12-01 20:55     ` Marc-André Lureau
  0 siblings, 1 reply; 70+ messages in thread
From: Igor Mammedov @ 2018-11-30 11:48 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Peter Maydell, open list:ARM

On Tue, 27 Nov 2018 13:27:57 +0400
Marc-André Lureau <marcandre.lureau@redhat.com> wrote:

> Replace arm_cpu_post_init() instance callback by calling it from leaf
> classes, to avoid potential the ordering issue with interfaces
> post-init.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Suggested-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  target/arm/cpu.h   |  2 ++
>  target/arm/cpu.c   | 15 ++++++++++++---
>  target/arm/cpu64.c | 11 ++++++++++-
>  3 files changed, 24 insertions(+), 4 deletions(-)
> 
> diff --git a/target/arm/cpu.h b/target/arm/cpu.h
> index 2a73fed9a0..84fba2b24b 100644
> --- a/target/arm/cpu.h
> +++ b/target/arm/cpu.h
> @@ -884,6 +884,8 @@ static inline ARMCPU *arm_env_get_cpu(CPUARMState *env)
>      return container_of(env, ARMCPU, env);
>  }
>  
> +void arm_cpu_post_init(Object *obj);
> +
>  uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz);
>  
>  #define ENV_GET_CPU(e) CPU(arm_env_get_cpu(e))
> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
> index 60411f6bfe..8a4aae7438 100644
> --- a/target/arm/cpu.c
> +++ b/target/arm/cpu.c
> @@ -734,7 +734,7 @@ static Property arm_cpu_pmsav7_dregion_property =
>  static Property arm_cpu_initsvtor_property =
>              DEFINE_PROP_UINT32("init-svtor", ARMCPU, init_svtor, 0);
>  
> -static void arm_cpu_post_init(Object *obj)
> +void arm_cpu_post_init(Object *obj)
>  {
>      ARMCPU *cpu = ARM_CPU(obj);
>  
> @@ -2094,6 +2094,7 @@ static void arm_host_initfn(Object *obj)
>      ARMCPU *cpu = ARM_CPU(obj);
>  
>      kvm_arm_set_cpu_features_from_host(cpu);
> +    arm_cpu_post_init(ARM_CPU(obj));
>  }
>  
>  static const TypeInfo host_arm_cpu_type_info = {
> @@ -2108,14 +2109,23 @@ static const TypeInfo host_arm_cpu_type_info = {
>  
>  #endif
>  
> +static void arm_cpu_instance_init(Object *obj)
> +{
> +    const ARMCPUInfo *info = object_class_get_class_data(object_get_class(obj));
> +
> +    info->initfn(obj);
> +    arm_cpu_post_init(obj);
> +}
now imagine leaf cpu class call chain:
before patch:
   arm-cpu::initfn()
   cortex-a8::initfn()
      set feature AAA
   device_post_init()
     -> arm_cpu_post_init()
          if (AAA)
             do something   

after patch:
   arm-cpu::initfn()
      -> arm_cpu_post_init()
            if (AAA)
               do something  <--- won't happen anymore
   cortex-a8::initfn()

arm_cpu_post_init() helper has to go to leaf classes only

> +
>  static void cpu_register(const ARMCPUInfo *info)
>  {
>      TypeInfo type_info = {
>          .parent = TYPE_ARM_CPU,
>          .instance_size = sizeof(ARMCPU),
> -        .instance_init = info->initfn,
> +        .instance_init = arm_cpu_instance_init,
>          .class_size = sizeof(ARMCPUClass),
>          .class_init = info->class_init,
> +        .class_data = (void *)info,
>      };
>  
>      type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name);
> @@ -2128,7 +2138,6 @@ static const TypeInfo arm_cpu_type_info = {
>      .parent = TYPE_CPU,
>      .instance_size = sizeof(ARMCPU),
>      .instance_init = arm_cpu_initfn,
> -    .instance_post_init = arm_cpu_post_init,
>      .instance_finalize = arm_cpu_finalizefn,
>      .abstract = true,
>      .class_size = sizeof(ARMCPUClass),
> diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
> index 873f059bf2..dbfc3ee490 100644
> --- a/target/arm/cpu64.c
> +++ b/target/arm/cpu64.c
> @@ -447,14 +447,23 @@ static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
>      cc->gdb_arch_name = aarch64_gdb_arch_name;
>  }
>  
> +static void aarch64_cpu_instance_init(Object *obj)
> +{
> +    const ARMCPUInfo *info = object_class_get_class_data(object_get_class(obj));
> +
> +    info->initfn(obj);
> +    arm_cpu_post_init(obj);
> +}
> +
>  static void aarch64_cpu_register(const ARMCPUInfo *info)
>  {
>      TypeInfo type_info = {
>          .parent = TYPE_AARCH64_CPU,
>          .instance_size = sizeof(ARMCPU),
> -        .instance_init = info->initfn,
> +        .instance_init = aarch64_cpu_instance_init,
>          .class_size = sizeof(ARMCPUClass),
>          .class_init = info->class_init,
> +        .class_data = (void *)info,
>      };
>  
>      type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name);

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface
  2018-11-29 17:49   ` Eduardo Habkost
@ 2018-11-30 12:34     ` Igor Mammedov
  2018-11-30 12:57       ` Eduardo Habkost
  0 siblings, 1 reply; 70+ messages in thread
From: Igor Mammedov @ 2018-11-30 12:34 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: Marc-André Lureau, qemu-devel

On Thu, 29 Nov 2018 15:49:00 -0200
Eduardo Habkost <ehabkost@redhat.com> wrote:

> On Tue, Nov 27, 2018 at 01:27:58PM +0400, Marc-André Lureau wrote:
> > Let's make compatiblity properties an interface, so that objects other
> > than QDev can benefit from having machine compatiblity properties.
> > 
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>  
> [...]
> > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > index 3b31b2c025..b0ee05f837 100644
> > --- a/hw/core/qdev.c
> > +++ b/hw/core/qdev.c
> > @@ -970,28 +970,8 @@ static void device_initfn(Object *obj)
> >      QLIST_INIT(&dev->gpios);
> >  }
> >  
> > -static const GPtrArray *ac_compat_props;
> > -static const GPtrArray *mc_compat_props;
> > -
> > -void accel_register_compat_props(const GPtrArray *props)
> > -{
> > -    ac_compat_props = props;
> > -}
> > -
> > -void machine_register_compat_props(const GPtrArray *props)
> > -{
> > -    mc_compat_props = props;
> > -}
> > -
> >  static void device_post_init(Object *obj)
> >  {
> > -    if (ac_compat_props) {
> > -        object_apply_global_props(obj, ac_compat_props, &error_abort);
> > -    }
> > -    if (mc_compat_props) {
> > -        object_apply_global_props(obj, mc_compat_props, &error_abort);
> > -    }
> > -
> >      qdev_prop_set_globals(DEVICE(obj));
> >  }
> >  
> > @@ -1124,6 +1104,10 @@ static const TypeInfo device_type_info = {
> >      .class_init = device_class_init,
> >      .abstract = true,
> >      .class_size = sizeof(DeviceClass),
> > +    .interfaces = (InterfaceInfo[]) {
> > +        { TYPE_COMPAT_PROPS },
> > +        { }
> > +    }  
> 
> At first I thought TYPE_COMPAT_PROPS was a practical way to
> implement this feature, but now I'm worried: the ordering between
> compat_props_post_init() qdev_prop_set_globals() is very
> important (user-provided globals must always be set after compat
> props), and here the ordering is implicit and easy to break
> accidentally.
> 
> What if instead of a QOM interface we just provide a simple
> object_apply_compat_props() function?  e.g.:
> 
> qdev.c:
> 
>   static void device_post_init(Object *obj)
>   {
>       object_apply_compat_props(obj);
>       apply_user_provided_globals(obj);
>   }
> 
> object_interface.c:
> 
>   void user_creatable_complete(Object *obj, Error **errp)
>   {
>       object_apply_compat_props(obj);
>       ...
>       ucc->complete(...)
>   }
this would work as long as nothing is happening between
object_new() ... user_creatable_complete() but look at
current users of user_creatable_complete() so it's
fragile too.

Reasons for compat props interface are the same as for
instance_post_init/device_post_init.

the thing we can do here is getting rid of device_post_init
and making device override TYPE_COMPAT_PROPS::instance_post_init
to make explicit ordering like we do everywhere else:

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 6b3cc55..46ad6f5 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -1033,11 +1033,19 @@ static void device_unparent(Object *obj)
     }
 }
 
+device_compat_props()
+{
+    dc->parent_compat_props()
+    apply_global_props()
+}
+
 static void device_class_init(ObjectClass *class, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(class);
 
     class->unparent = device_unparent;
+    dc->parent_compat_props = COMPAT_PROPS_GET_CLASS(class)->instance_post_init
+    COMPAT_PROPS_GET_CLASS(class)->instance_post_init = device_compat_props()
 
     /* by default all devices were considered as hotpluggable,
      * so with intent to check it in generic qdev_unplug() /

> Most people don't understand QOM interfaces and their
> initialization ordering rules.  Everybody understands C function
> calls.
> 
> > [...]  
> 

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface
  2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface Marc-André Lureau
  2018-11-29 17:49   ` Eduardo Habkost
@ 2018-11-30 12:39   ` Igor Mammedov
  1 sibling, 0 replies; 70+ messages in thread
From: Igor Mammedov @ 2018-11-30 12:39 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Eduardo Habkost, Marcel Apfelbaum

On Tue, 27 Nov 2018 13:27:58 +0400
Marc-André Lureau <marcandre.lureau@redhat.com> wrote:

> Let's make compatiblity properties an interface, so that objects other
> than QDev can benefit from having machine compatiblity properties.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/hw/boards.h    |  2 ++
>  hw/core/compat-props.c | 55 ++++++++++++++++++++++++++++++++++++++++++
>  hw/core/qdev.c         | 24 +++---------------
>  MAINTAINERS            |  1 +
>  hw/core/Makefile.objs  |  1 +
>  tests/Makefile.include |  1 +
>  6 files changed, 64 insertions(+), 20 deletions(-)
>  create mode 100644 hw/core/compat-props.c
> 
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index f743d9d4a4..77d1fc1bef 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -9,6 +9,8 @@
>  #include "qom/object.h"
>  #include "qom/cpu.h"
>  
> +#define TYPE_COMPAT_PROPS "compat-props"
> +
>  /**
>   * memory_region_allocate_system_memory - Allocate a board's main memory
>   * @mr: the #MemoryRegion to be initialized
> diff --git a/hw/core/compat-props.c b/hw/core/compat-props.c
> new file mode 100644
> index 0000000000..538378e71f
> --- /dev/null
> +++ b/hw/core/compat-props.c
> @@ -0,0 +1,55 @@
> +/*
> + * QEMU Machine compat properties
> + *
> + * Copyright (C) 2018 Red Hat Inc
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "hw/boards.h"
> +#include "qapi/error.h"
> +
> +typedef struct CompatProps CompatProps;
> +
> +typedef struct CompatPropsClass {
> +    InterfaceClass parent_class;
> +} CompatPropsClass;
> +
> +static const GPtrArray *ac_compat_props;
> +static const GPtrArray *mc_compat_props;
> +
> +void accel_register_compat_props(const GPtrArray *props)
> +{
> +    ac_compat_props = props;
> +}
> +
> +void machine_register_compat_props(const GPtrArray *props)
> +{
> +    mc_compat_props = props;
> +}
> +
> +static void compat_props_post_init(Object *obj)
> +{
> +    if (ac_compat_props) {
> +        object_apply_global_props(obj, ac_compat_props, &error_abort);
> +    }
> +    if (mc_compat_props) {
> +        object_apply_global_props(obj, mc_compat_props, &error_abort);
> +    }
> +}
> +
> +static void compat_props_register_types(void)
> +{
> +    static const TypeInfo cp_interface_info = {
> +        .name          = TYPE_COMPAT_PROPS,
> +        .parent        = TYPE_INTERFACE,
> +        .class_size = sizeof(CompatPropsClass),
> +        .instance_post_init = compat_props_post_init,
you went here for implict way to set compat props compared to v3
could elaborate in what order .instance_post_init() hooks
will be called in this case for a Device?
(I mean compat_props_post_init vs device_post_init)

> +    };
> +
> +    type_register_static(&cp_interface_info);
> +}
> +
> +type_init(compat_props_register_types)
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 3b31b2c025..b0ee05f837 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -970,28 +970,8 @@ static void device_initfn(Object *obj)
>      QLIST_INIT(&dev->gpios);
>  }
>  
> -static const GPtrArray *ac_compat_props;
> -static const GPtrArray *mc_compat_props;
> -
> -void accel_register_compat_props(const GPtrArray *props)
> -{
> -    ac_compat_props = props;
> -}
> -
> -void machine_register_compat_props(const GPtrArray *props)
> -{
> -    mc_compat_props = props;
> -}
> -
>  static void device_post_init(Object *obj)
>  {
> -    if (ac_compat_props) {
> -        object_apply_global_props(obj, ac_compat_props, &error_abort);
> -    }
> -    if (mc_compat_props) {
> -        object_apply_global_props(obj, mc_compat_props, &error_abort);
> -    }
> -
>      qdev_prop_set_globals(DEVICE(obj));
>  }
>  
> @@ -1124,6 +1104,10 @@ static const TypeInfo device_type_info = {
>      .class_init = device_class_init,
>      .abstract = true,
>      .class_size = sizeof(DeviceClass),
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_COMPAT_PROPS },
> +        { }
> +    }
>  };
>  
>  static void qdev_register_types(void)
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 9410bbb7cf..adff09627f 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1145,6 +1145,7 @@ Machine core
>  M: Eduardo Habkost <ehabkost@redhat.com>
>  M: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
>  S: Supported
> +F: hw/core/compat-props.c
>  F: hw/core/machine.c
>  F: hw/core/null-machine.c
>  F: include/hw/boards.h
> diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
> index a799c83815..f15b3c970a 100644
> --- a/hw/core/Makefile.objs
> +++ b/hw/core/Makefile.objs
> @@ -1,5 +1,6 @@
>  # core qdev-related obj files, also used by *-user:
>  common-obj-y += qdev.o qdev-properties.o
> +common-obj-y += compat-props.o
>  common-obj-y += bus.o reset.o
>  common-obj-$(CONFIG_SOFTMMU) += qdev-fw.o
>  common-obj-$(CONFIG_SOFTMMU) += fw-path-provider.o
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index fb0b449c02..fc74358c0a 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -567,6 +567,7 @@ tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
>  	hw/core/irq.o \
>  	hw/core/fw-path-provider.o \
>  	hw/core/reset.o \
> +	hw/core/compat-props.o \
>  	$(test-qapi-obj-y)
>  tests/test-vmstate$(EXESUF): tests/test-vmstate.o \
>  	migration/vmstate.o migration/vmstate-types.o migration/qemu-file.o \

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface
  2018-11-30 12:34     ` Igor Mammedov
@ 2018-11-30 12:57       ` Eduardo Habkost
  0 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-11-30 12:57 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Marc-André Lureau, qemu-devel

On Fri, Nov 30, 2018 at 01:34:56PM +0100, Igor Mammedov wrote:
> On Thu, 29 Nov 2018 15:49:00 -0200
> Eduardo Habkost <ehabkost@redhat.com> wrote:
> 
> > On Tue, Nov 27, 2018 at 01:27:58PM +0400, Marc-André Lureau wrote:
> > > Let's make compatiblity properties an interface, so that objects other
> > > than QDev can benefit from having machine compatiblity properties.
> > > 
> > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>  
> > [...]
> > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > index 3b31b2c025..b0ee05f837 100644
> > > --- a/hw/core/qdev.c
> > > +++ b/hw/core/qdev.c
> > > @@ -970,28 +970,8 @@ static void device_initfn(Object *obj)
> > >      QLIST_INIT(&dev->gpios);
> > >  }
> > >  
> > > -static const GPtrArray *ac_compat_props;
> > > -static const GPtrArray *mc_compat_props;
> > > -
> > > -void accel_register_compat_props(const GPtrArray *props)
> > > -{
> > > -    ac_compat_props = props;
> > > -}
> > > -
> > > -void machine_register_compat_props(const GPtrArray *props)
> > > -{
> > > -    mc_compat_props = props;
> > > -}
> > > -
> > >  static void device_post_init(Object *obj)
> > >  {
> > > -    if (ac_compat_props) {
> > > -        object_apply_global_props(obj, ac_compat_props, &error_abort);
> > > -    }
> > > -    if (mc_compat_props) {
> > > -        object_apply_global_props(obj, mc_compat_props, &error_abort);
> > > -    }
> > > -
> > >      qdev_prop_set_globals(DEVICE(obj));
> > >  }
> > >  
> > > @@ -1124,6 +1104,10 @@ static const TypeInfo device_type_info = {
> > >      .class_init = device_class_init,
> > >      .abstract = true,
> > >      .class_size = sizeof(DeviceClass),
> > > +    .interfaces = (InterfaceInfo[]) {
> > > +        { TYPE_COMPAT_PROPS },
> > > +        { }
> > > +    }  
> > 
> > At first I thought TYPE_COMPAT_PROPS was a practical way to
> > implement this feature, but now I'm worried: the ordering between
> > compat_props_post_init() qdev_prop_set_globals() is very
> > important (user-provided globals must always be set after compat
> > props), and here the ordering is implicit and easy to break
> > accidentally.
> > 
> > What if instead of a QOM interface we just provide a simple
> > object_apply_compat_props() function?  e.g.:
> > 
> > qdev.c:
> > 
> >   static void device_post_init(Object *obj)
> >   {
> >       object_apply_compat_props(obj);
> >       apply_user_provided_globals(obj);
> >   }
> > 
> > object_interface.c:
> > 
> >   void user_creatable_complete(Object *obj, Error **errp)
> >   {
> >       object_apply_compat_props(obj);
> >       ...
> >       ucc->complete(...)
> >   }
> this would work as long as nothing is happening between
> object_new() ... user_creatable_complete() but look at
> current users of user_creatable_complete() so it's
> fragile too.

You are right.  This could be solved by:

  void user_creatable_post_init(Object *obj)
  {
      object_apply_compat_props(obj);
  }


> 
> Reasons for compat props interface are the same as for
> instance_post_init/device_post_init.
> 
> the thing we can do here is getting rid of device_post_init
> and making device override TYPE_COMPAT_PROPS::instance_post_init
> to make explicit ordering like we do everywhere else:
> 
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 6b3cc55..46ad6f5 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -1033,11 +1033,19 @@ static void device_unparent(Object *obj)
>      }
>  }
>  
> +device_compat_props()
> +{
> +    dc->parent_compat_props()
> +    apply_global_props()
> +}
> +
>  static void device_class_init(ObjectClass *class, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(class);
>  
>      class->unparent = device_unparent;
> +    dc->parent_compat_props = COMPAT_PROPS_GET_CLASS(class)->instance_post_init
> +    COMPAT_PROPS_GET_CLASS(class)->instance_post_init = device_compat_props()
>  
>      /* by default all devices were considered as hotpluggable,
>       * so with intent to check it in generic qdev_unplug() /

The only advantage I saw in TYPE_COMPAT_PROPS interface was to
easily allow objects to implement behavior without manually
implementing post_init.  Now we can't use the interface without
an even more complex way of overriding post_init, so what's the
point?

Why not just call object_apply_compat_props() at
device_post_init()?

> 
> > Most people don't understand QOM interfaces and their
> > initialization ordering rules.  Everybody understands C function
> > calls.
> > 
> > > [...]  
> > 
> 

-- 
Eduardo

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 24/28] arm: replace instance_post_init()
  2018-11-30 11:48   ` Igor Mammedov
@ 2018-12-01 20:55     ` Marc-André Lureau
  0 siblings, 0 replies; 70+ messages in thread
From: Marc-André Lureau @ 2018-12-01 20:55 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Peter Maydell, open list:ARM, QEMU

Hi
On Fri, Nov 30, 2018 at 3:48 PM Igor Mammedov <imammedo@redhat.com> wrote:
>
> On Tue, 27 Nov 2018 13:27:57 +0400
> Marc-André Lureau <marcandre.lureau@redhat.com> wrote:
>
> > Replace arm_cpu_post_init() instance callback by calling it from leaf
> > classes, to avoid potential the ordering issue with interfaces
> > post-init.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > Suggested-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> >  target/arm/cpu.h   |  2 ++
> >  target/arm/cpu.c   | 15 ++++++++++++---
> >  target/arm/cpu64.c | 11 ++++++++++-
> >  3 files changed, 24 insertions(+), 4 deletions(-)
> >
> > diff --git a/target/arm/cpu.h b/target/arm/cpu.h
> > index 2a73fed9a0..84fba2b24b 100644
> > --- a/target/arm/cpu.h
> > +++ b/target/arm/cpu.h
> > @@ -884,6 +884,8 @@ static inline ARMCPU *arm_env_get_cpu(CPUARMState *env)
> >      return container_of(env, ARMCPU, env);
> >  }
> >
> > +void arm_cpu_post_init(Object *obj);
> > +
> >  uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz);
> >
> >  #define ENV_GET_CPU(e) CPU(arm_env_get_cpu(e))
> > diff --git a/target/arm/cpu.c b/target/arm/cpu.c
> > index 60411f6bfe..8a4aae7438 100644
> > --- a/target/arm/cpu.c
> > +++ b/target/arm/cpu.c
> > @@ -734,7 +734,7 @@ static Property arm_cpu_pmsav7_dregion_property =
> >  static Property arm_cpu_initsvtor_property =
> >              DEFINE_PROP_UINT32("init-svtor", ARMCPU, init_svtor, 0);
> >
> > -static void arm_cpu_post_init(Object *obj)
> > +void arm_cpu_post_init(Object *obj)
> >  {
> >      ARMCPU *cpu = ARM_CPU(obj);
> >
> > @@ -2094,6 +2094,7 @@ static void arm_host_initfn(Object *obj)
> >      ARMCPU *cpu = ARM_CPU(obj);
> >
> >      kvm_arm_set_cpu_features_from_host(cpu);
> > +    arm_cpu_post_init(ARM_CPU(obj));
> >  }
> >
> >  static const TypeInfo host_arm_cpu_type_info = {
> > @@ -2108,14 +2109,23 @@ static const TypeInfo host_arm_cpu_type_info = {
> >
> >  #endif
> >
> > +static void arm_cpu_instance_init(Object *obj)
> > +{
> > +    const ARMCPUInfo *info = object_class_get_class_data(object_get_class(obj));
> > +
> > +    info->initfn(obj);
> > +    arm_cpu_post_init(obj);
> > +}
> now imagine leaf cpu class call chain:
> before patch:
>    arm-cpu::initfn()
>    cortex-a8::initfn()
>       set feature AAA
>    device_post_init()
>      -> arm_cpu_post_init()
>           if (AAA)
>              do something
>
> after patch:
>    arm-cpu::initfn()
>       -> arm_cpu_post_init()
>             if (AAA)
>                do something  <--- won't happen anymore
>    cortex-a8::initfn()
>

Hmm? No, after the patch cortex-a8::initfn() is called before
arm_cpu_post_init().

> arm_cpu_post_init() helper has to go to leaf classes only

That's what the patch does, unless I am missing something.
arm_cpu_instance_init() is called on the leaf class, calling the
leaf-cpu init (cortex-8a::initfn() etc) before calling
arm_cpu_post_init()

>
> > +
> >  static void cpu_register(const ARMCPUInfo *info)
> >  {
> >      TypeInfo type_info = {
> >          .parent = TYPE_ARM_CPU,
> >          .instance_size = sizeof(ARMCPU),
> > -        .instance_init = info->initfn,
> > +        .instance_init = arm_cpu_instance_init,
> >          .class_size = sizeof(ARMCPUClass),
> >          .class_init = info->class_init,
> > +        .class_data = (void *)info,
> >      };
> >
> >      type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name);
> > @@ -2128,7 +2138,6 @@ static const TypeInfo arm_cpu_type_info = {
> >      .parent = TYPE_CPU,
> >      .instance_size = sizeof(ARMCPU),
> >      .instance_init = arm_cpu_initfn,
> > -    .instance_post_init = arm_cpu_post_init,
> >      .instance_finalize = arm_cpu_finalizefn,
> >      .abstract = true,
> >      .class_size = sizeof(ARMCPUClass),
> > diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
> > index 873f059bf2..dbfc3ee490 100644
> > --- a/target/arm/cpu64.c
> > +++ b/target/arm/cpu64.c
> > @@ -447,14 +447,23 @@ static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
> >      cc->gdb_arch_name = aarch64_gdb_arch_name;
> >  }
> >
> > +static void aarch64_cpu_instance_init(Object *obj)
> > +{
> > +    const ARMCPUInfo *info = object_class_get_class_data(object_get_class(obj));
> > +
> > +    info->initfn(obj);
> > +    arm_cpu_post_init(obj);
> > +}
> > +
> >  static void aarch64_cpu_register(const ARMCPUInfo *info)
> >  {
> >      TypeInfo type_info = {
> >          .parent = TYPE_AARCH64_CPU,
> >          .instance_size = sizeof(ARMCPU),
> > -        .instance_init = info->initfn,
> > +        .instance_init = aarch64_cpu_instance_init,
> >          .class_size = sizeof(ARMCPUClass),
> >          .class_init = info->class_init,
> > +        .class_data = (void *)info,
> >      };
> >
> >      type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name);
>
>


-- 
Marc-André Lureau

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-11-30 11:41                   ` Eduardo Habkost
@ 2018-12-04 13:17                     ` Igor Mammedov
  2018-12-04 18:43                       ` Eduardo Habkost
  0 siblings, 1 reply; 70+ messages in thread
From: Igor Mammedov @ 2018-12-04 13:17 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Marc-André Lureau, Peter Maydell, Michael S. Tsirkin,
	Cornelia Huck, David Hildenbrand, QEMU, Christian Borntraeger,
	Qemu-s390x list, open list:ARM, open list:sPAPR pseries,
	Paolo Bonzini, Richard Henderson, David Gibson

On Fri, 30 Nov 2018 09:41:42 -0200
Eduardo Habkost <ehabkost@redhat.com> wrote:

> On Fri, Nov 30, 2018 at 11:55:26AM +0100, Igor Mammedov wrote:
> > On Fri, 30 Nov 2018 01:36:03 +0400
> > Marc-André Lureau <marcandre.lureau@gmail.com> wrote:
> >   
> > > Hi
> > > 
> > > On Thu, Nov 29, 2018 at 9:51 PM Eduardo Habkost <ehabkost@redhat.com> wrote:  
> > > >
> > > > On Thu, Nov 29, 2018 at 02:32:18PM +0400, Marc-André Lureau wrote:    
> > > > > Hi
> > > > > On Wed, Nov 28, 2018 at 9:53 PM Igor Mammedov <imammedo@redhat.com> wrote:    
> > > > > >
> > > > > > On Tue, 27 Nov 2018 11:35:27 -0200
> > > > > > Eduardo Habkost <ehabkost@redhat.com> wrote:
> > > > > >    
> > > > > > > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:    
> > > > > > > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:    
> > > > > > > > >
> > > > > > > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:    
> > > > > > > > > > Similarly to accel properties, move compat properties out of globals
> > > > > > > > > > registration, and apply the machine compat properties during
> > > > > > > > > > device_post_init().
> > > > > > > > > >
> > > > > > > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>    
> > > > > > > > > [...]    
> > > > > > > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > > > > > > index 7066d28271..3b31b2c025 100644
> > > > > > > > > > --- a/hw/core/qdev.c
> > > > > > > > > > +++ b/hw/core/qdev.c
> > > > > > > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > > > > > > >  }
> > > > > > > > > >
> > > > > > > > > >  static const GPtrArray *ac_compat_props;
> > > > > > > > > > +static const GPtrArray *mc_compat_props;    
> > > > > > why you didn't use just 'compat_props' for both?
> > > > > > (it would be cleaner have single registry for compat
> > > > > > properties, and the place that takes care of registration
> > > > > > will take care of necessary ordering)    
> > > > >
> > > > > There are two arrays, one from the accelerator class, the other from
> > > > > the machine class. We can't make it a singleton (all compats props for
> > > > > the various machines would be mixed).
> > > > >
> > > > > We could create a third array that would be the set of both, but that
> > > > > would require more copy/allocation.    
> > > >
> > > > I am failing to see the advantage of replacing the `global_props`
> > > > static variable from qdev-properties.c with a collection of
> > > > separate static variables scattered around the code.  I thought
> > > > the main point of the changes was to reduce the amount of
> > > > duplicate data stored in static variables.  
> > Main point was to use compats for backends then on top of that 
> > we added split global from compat properties goal.
> >   
> > > > I was expecting something like this:
> > > >
> > > > accel.c:
> > > >
> > > >   void accel_apply_compat_props(AccelState *accel, Object *obj)
> > > >   {
> > > >       object_apply_global_props(obj, ACCEL_GET_CLASS(accel)->compat_props, &error_abort);
> > > >   }
> > > >
> > > > machine.c:
> > > >
> > > >   /* Apply compat properties and global properties to an object */
> > > >   void machine_apply_compat_props(MachineState *ms, Object *obj)
> > > >   {
> > > >       accel_apply_compat_props(ms->accel, obj);
> > > >       object_apply_global_props(obj, MACHINE_GET_CLASS(ms)->compat_props, &error_abort);
> > > >   }
> > > >
> > > > compat-props.c:
> > > >
> > > >   static void object_apply_compat_props(Object *obj)
> > > >   {
> > > >       MachineState *machine = MACHINE(qdev_get_machine());
> > > >       machine_apply_compat_props(machine, obj);
> > > >   }
> > > >
> > > > qdev.c:
> > > >
> > > >   static void device_post_init(Object *obj)
> > > >   {
> > > >       object_apply_compat_props(obj);
> > > >       apply_user_provided_globals(obj);
> > > >   }
> > > >
> > > > object_interface.c:
> > > >
> > > >   void user_creatable_complete(Object *obj, Error **errp)
> > > >   {
> > > >       object_apply_compat_props(obj);
> > > >       ...
> > > >       ucc->complete(...)
> > > >   }
> > > >    
> > > 
> > > I like that solution too (which you also proposed in the other
> > > thread). But we have to decide whether it's acceptable to reference
> > > MachineState, or if the compat properties should be registered.  
> > I dislike pulling in machine into basic object code and
> > I think a separate compats would be cleaner interface without
> > layer violation. But to unstuck, lets go with qdev_get_machine()
> > for now.  
> 
> Which basic object code?  The only reference to machine above is
> at compat-props.c.  I don't see any layering violation here.
I see compat properties as just a set of arbitrary properties
that's applied to objects depending on configuration.
Which currently includes machine version and accel type
but in no way inherently tied to them.

As for layering violation, we do it in device model cases
as it's machine related (ugly 'acceptable' but helps to cut corners)
and with new interface it will be used wit backends which are not
machine related at all.

Doing like you suggest would make it usable with current machine
initialization order (with some fixes) but if one would consider
a bit earlier time (preconfig time) and creating machine step by
step from there it might be less usable (as it needs machine instance,
it still would be possible but probably more tricky (pure speculation)).

So I'd vote for abstracted from machine compat props that could be
called from any object that implements interface and explicit
compats registration (like we do now) and explicit registration failure
if compats happend to be applied to any object. But in case of this
series I'm fine with any approach just to get compat properties work
with backends for now.

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

* Re: [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine compat properties without touching globals
  2018-12-04 13:17                     ` Igor Mammedov
@ 2018-12-04 18:43                       ` Eduardo Habkost
  0 siblings, 0 replies; 70+ messages in thread
From: Eduardo Habkost @ 2018-12-04 18:43 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Marc-André Lureau, Peter Maydell, Michael S. Tsirkin,
	Cornelia Huck, David Hildenbrand, QEMU, Christian Borntraeger,
	Qemu-s390x list, open list:ARM, open list:sPAPR pseries,
	Paolo Bonzini, Richard Henderson, David Gibson

On Tue, Dec 04, 2018 at 02:17:24PM +0100, Igor Mammedov wrote:
> On Fri, 30 Nov 2018 09:41:42 -0200
> Eduardo Habkost <ehabkost@redhat.com> wrote:
> 
> > On Fri, Nov 30, 2018 at 11:55:26AM +0100, Igor Mammedov wrote:
> > > On Fri, 30 Nov 2018 01:36:03 +0400
> > > Marc-André Lureau <marcandre.lureau@gmail.com> wrote:
> > >   
> > > > Hi
> > > > 
> > > > On Thu, Nov 29, 2018 at 9:51 PM Eduardo Habkost <ehabkost@redhat.com> wrote:  
> > > > >
> > > > > On Thu, Nov 29, 2018 at 02:32:18PM +0400, Marc-André Lureau wrote:    
> > > > > > Hi
> > > > > > On Wed, Nov 28, 2018 at 9:53 PM Igor Mammedov <imammedo@redhat.com> wrote:    
> > > > > > >
> > > > > > > On Tue, 27 Nov 2018 11:35:27 -0200
> > > > > > > Eduardo Habkost <ehabkost@redhat.com> wrote:
> > > > > > >    
> > > > > > > > On Tue, Nov 27, 2018 at 05:10:05PM +0400, Marc-André Lureau wrote:    
> > > > > > > > > On Tue, Nov 27, 2018 at 4:57 PM Eduardo Habkost <ehabkost@redhat.com> wrote:    
> > > > > > > > > >
> > > > > > > > > > On Tue, Nov 27, 2018 at 01:27:49PM +0400, Marc-André Lureau wrote:    
> > > > > > > > > > > Similarly to accel properties, move compat properties out of globals
> > > > > > > > > > > registration, and apply the machine compat properties during
> > > > > > > > > > > device_post_init().
> > > > > > > > > > >
> > > > > > > > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>    
> > > > > > > > > > [...]    
> > > > > > > > > > > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > > > > > > > > > > index 7066d28271..3b31b2c025 100644
> > > > > > > > > > > --- a/hw/core/qdev.c
> > > > > > > > > > > +++ b/hw/core/qdev.c
> > > > > > > > > > > @@ -971,17 +971,26 @@ static void device_initfn(Object *obj)
> > > > > > > > > > >  }
> > > > > > > > > > >
> > > > > > > > > > >  static const GPtrArray *ac_compat_props;
> > > > > > > > > > > +static const GPtrArray *mc_compat_props;    
> > > > > > > why you didn't use just 'compat_props' for both?
> > > > > > > (it would be cleaner have single registry for compat
> > > > > > > properties, and the place that takes care of registration
> > > > > > > will take care of necessary ordering)    
> > > > > >
> > > > > > There are two arrays, one from the accelerator class, the other from
> > > > > > the machine class. We can't make it a singleton (all compats props for
> > > > > > the various machines would be mixed).
> > > > > >
> > > > > > We could create a third array that would be the set of both, but that
> > > > > > would require more copy/allocation.    
> > > > >
> > > > > I am failing to see the advantage of replacing the `global_props`
> > > > > static variable from qdev-properties.c with a collection of
> > > > > separate static variables scattered around the code.  I thought
> > > > > the main point of the changes was to reduce the amount of
> > > > > duplicate data stored in static variables.  
> > > Main point was to use compats for backends then on top of that 
> > > we added split global from compat properties goal.
> > >   
> > > > > I was expecting something like this:
> > > > >
> > > > > accel.c:
> > > > >
> > > > >   void accel_apply_compat_props(AccelState *accel, Object *obj)
> > > > >   {
> > > > >       object_apply_global_props(obj, ACCEL_GET_CLASS(accel)->compat_props, &error_abort);
> > > > >   }
> > > > >
> > > > > machine.c:
> > > > >
> > > > >   /* Apply compat properties and global properties to an object */
> > > > >   void machine_apply_compat_props(MachineState *ms, Object *obj)
> > > > >   {
> > > > >       accel_apply_compat_props(ms->accel, obj);
> > > > >       object_apply_global_props(obj, MACHINE_GET_CLASS(ms)->compat_props, &error_abort);
> > > > >   }
> > > > >
> > > > > compat-props.c:
> > > > >
> > > > >   static void object_apply_compat_props(Object *obj)
> > > > >   {
> > > > >       MachineState *machine = MACHINE(qdev_get_machine());
> > > > >       machine_apply_compat_props(machine, obj);
> > > > >   }
> > > > >
> > > > > qdev.c:
> > > > >
> > > > >   static void device_post_init(Object *obj)
> > > > >   {
> > > > >       object_apply_compat_props(obj);
> > > > >       apply_user_provided_globals(obj);
> > > > >   }
> > > > >
> > > > > object_interface.c:
> > > > >
> > > > >   void user_creatable_complete(Object *obj, Error **errp)
> > > > >   {
> > > > >       object_apply_compat_props(obj);
> > > > >       ...
> > > > >       ucc->complete(...)
> > > > >   }
> > > > >    
> > > > 
> > > > I like that solution too (which you also proposed in the other
> > > > thread). But we have to decide whether it's acceptable to reference
> > > > MachineState, or if the compat properties should be registered.  
> > > I dislike pulling in machine into basic object code and
> > > I think a separate compats would be cleaner interface without
> > > layer violation. But to unstuck, lets go with qdev_get_machine()
> > > for now.  
> > 
> > Which basic object code?  The only reference to machine above is
> > at compat-props.c.  I don't see any layering violation here.
> I see compat properties as just a set of arbitrary properties
> that's applied to objects depending on configuration.
> Which currently includes machine version and accel type
> but in no way inherently tied to them.

I understand you want to have a more generic abstraction layer,
but my question is: why do we need it?  I still don't see which
problems it would solve.

> 
> As for layering violation, we do it in device model cases
> as it's machine related (ugly 'acceptable' but helps to cut corners)
> and with new interface it will be used wit backends which are not
> machine related at all.

I don't see why it's ugly to have QEMU backend object code use
machine core code.  What problems does it cause?


> 
> Doing like you suggest would make it usable with current machine
> initialization order (with some fixes) but if one would consider
> a bit earlier time (preconfig time) and creating machine step by
> step from there it might be less usable (as it needs machine instance,
> it still would be possible but probably more tricky (pure speculation)).

I agree that this is a problem: we really have a
backend -> compat_props -> current_machine dependency chain here.

Using a registration mechanism that copies data, the dependency
would still exists, but be implicit in the initialization
ordering.  Then the system would silently break as soon as we
reorder the code.

> 
> So I'd vote for abstracted from machine compat props that could be
> called from any object that implements interface and explicit
> compats registration (like we do now) and explicit registration failure
> if compats happend to be applied to any object. But in case of this
> series I'm fine with any approach just to get compat properties work
> with backends for now.

Thanks.  I agree we'll want to refactor this later.  We may want
to be able to apply compat properties to backend objects before
creating machine and accel instances.

Or maybe we will want to apply only MachineClass::compat_props to
backend objects, and not AccelClass::compat_props?  This is not
clear to me yet.

-- 
Eduardo

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

end of thread, other threads:[~2018-12-04 18:43 UTC | newest]

Thread overview: 70+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-27  9:27 [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 01/28] target/xtensa: gdbstub fix register counting Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 02/28] target/xtensa: drop num_[core_]regs from dc232b/dc233c configs Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 03/28] target/xtensa: xtfpga: provide default memory sizes Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 04/28] MAINTAINERS: add missing xtensa patterns Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 05/28] 9p: fix QEMU crash when renaming files Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 06/28] MAINTAINERS: Assign some more files in the hw/arm/ directory Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 07/28] MAINTAINERS: Add an ARM SMMU section Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 08/28] net: cadence_gem: Remove incorrect assert() Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 09/28] tests: qdev_prop_check_globals() doesn't return "all_used" Marc-André Lureau
2018-11-27 13:40   ` Eduardo Habkost
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 10/28] qom: make interface types abstract Marc-André Lureau
2018-11-27 13:41   ` Eduardo Habkost
2018-11-27 13:55     ` Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 11/28] qom: make user_creatable_complete() specific to UserCreatable Marc-André Lureau
2018-11-27 13:45   ` Eduardo Habkost
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 12/28] accel: register global_props like machine globals Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 13/28] qdev: move qdev_prop_register_global_list() to tests Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 14/28] qom: remove unimplemented class_finalize Marc-André Lureau
2018-11-27 12:52   ` Eduardo Habkost
2018-11-28 17:44   ` Igor Mammedov
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 15/28] hw: apply accel compat properties without touching globals Marc-André Lureau
2018-11-27  9:27   ` Marc-André Lureau
2018-11-27 19:40   ` [Qemu-devel] " Eduardo Habkost
2018-11-27 19:40     ` Eduardo Habkost
2018-11-27 20:02     ` Marc-André Lureau
2018-11-27 20:02       ` Marc-André Lureau
2018-11-29 16:02       ` Eduardo Habkost
2018-11-29 16:02       ` Eduardo Habkost
2018-11-28 17:49   ` Igor Mammedov
2018-11-28 17:49     ` Igor Mammedov
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 16/28] hw: apply machine " Marc-André Lureau
2018-11-27 12:56   ` Eduardo Habkost
2018-11-27 13:10     ` Marc-André Lureau
2018-11-27 13:35       ` Eduardo Habkost
2018-11-28 17:40         ` Igor Mammedov
2018-11-28 17:53           ` Eduardo Habkost
2018-11-29 10:32           ` Marc-André Lureau
2018-11-29 17:50             ` Eduardo Habkost
2018-11-29 21:36               ` Marc-André Lureau
2018-11-30 10:55                 ` Igor Mammedov
2018-11-30 11:41                   ` Eduardo Habkost
2018-12-04 13:17                     ` Igor Mammedov
2018-12-04 18:43                       ` Eduardo Habkost
2018-11-30 11:37             ` Igor Mammedov
2018-11-29 16:09   ` Eduardo Habkost
2018-11-29 21:32     ` Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 17/28] hw: remove SET_MACHINE_COMPAT Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 18/28] qdev: all globals are now user-provided Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 19/28] qdev-props: convert global_props to GPtrArray Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 20/28] qdev-props: remove errp from GlobalProperty Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 21/28] qdev-props: call object_apply_global_props() Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 22/28] qom: teach interfaces to implement post-init Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 23/28] qom: add object_class_get_class_data() Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 24/28] arm: replace instance_post_init() Marc-André Lureau
2018-11-30 11:48   ` Igor Mammedov
2018-12-01 20:55     ` Marc-André Lureau
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 25/28] machine: add compat-props interface Marc-André Lureau
2018-11-29 17:49   ` Eduardo Habkost
2018-11-30 12:34     ` Igor Mammedov
2018-11-30 12:57       ` Eduardo Habkost
2018-11-30 12:39   ` Igor Mammedov
2018-11-27  9:27 ` [Qemu-devel] [PATCH for-3.2 v4 26/28] hw/i386: add pc-i440fx-3.2 & pc-q35-3.2 Marc-André Lureau
2018-11-27 13:01   ` Eduardo Habkost
2018-11-27  9:28 ` [Qemu-devel] [PATCH for-3.2 v4 27/28] hw/arm/virt: add virt-3.2 machine type Marc-André Lureau
2018-11-27  9:28 ` [Qemu-devel] [PATCH for-3.2 v4 28/28] hostmem: use object id for memory region name with >= 3.1 Marc-André Lureau
2018-11-27  9:53 ` [Qemu-devel] [PATCH for-3.2 v4 00/28] Generalize machine compatibility properties Greg Kurz
2018-11-27  9:58   ` Marc-André Lureau
2018-11-29  1:35 ` no-reply
2018-11-29  1:45 ` no-reply

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.