qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 1/8] qdev: Implement qdev_create_fake_machine() for user e


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH v4 1/8] qdev: Implement qdev_create_fake_machine() for user emulation
Date: Fri, 3 Jan 2025 15:37:07 +0100
User-agent: Mozilla Thunderbird

On 3/1/25 15:24, Richard Henderson wrote:
On 1/2/25 13:17, Philippe Mathieu-Daudé wrote:
When a QDev instance is realized, qdev_get_machine() ends up called.
In the next commit, qdev_get_machine() will require a "machine"
container to be always present. To satisfy this QOM containers design,
Implement qdev_create_fake_machine() which creates a fake "machine"
container for user emulation.

On system emulation, qemu_create_machine() is called from qemu_init().
For user emulation, since the TCG accelerator always calls
tcg_init_machine(), we use it to hook our fake machine creation.

Suggested-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
  include/hw/qdev-core.h | 10 ++++++++++
  accel/tcg/tcg-all.c    |  8 +++++++-
  hw/core/qdev-user.c    | 21 +++++++++++++++++++++
  hw/core/meson.build    |  1 +
  4 files changed, 39 insertions(+), 1 deletion(-)
  create mode 100644 hw/core/qdev-user.c

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index e6ef80b7fd0..b83b1439968 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -1027,6 +1027,16 @@ const char *qdev_fw_name(DeviceState *dev);
  void qdev_assert_realized_properly(void);
  Object *qdev_get_machine(void);
+/**
+ * qdev_create_fake_machine(): Create a fake machine container.
+ *
+ * .. note::
+ *    This function is a kludge for user emulation (USER_ONLY)
+ *    because when thread (TYPE_CPU) are realized, qdev_realize()
+ *    access a machine container.
+ */
+Object *qdev_create_fake_machine(void);
+
  /**
   * qdev_get_human_name() - Return a human-readable name for a device
   * @dev: The device. Must be a valid and non-NULL pointer.
diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
index c2565758876..95adaacee82 100644
--- a/accel/tcg/tcg-all.c
+++ b/accel/tcg/tcg-all.c
@@ -35,7 +35,9 @@
  #include "qemu/atomic.h"
  #include "qapi/qapi-builtin-visit.h"
  #include "qemu/units.h"
-#if !defined(CONFIG_USER_ONLY)
+#if defined(CONFIG_USER_ONLY)
+#include "hw/qdev-core.h"
+#else
  #include "hw/boards.h"
  #endif
  #include "internal-common.h"
@@ -124,6 +126,10 @@ static int tcg_init_machine(MachineState *ms)
      tcg_prologue_init();
  #endif
+#ifdef CONFIG_USER_ONLY
+    qdev_create_fake_machine();
+#endif

No need to return the fake machine, it seems.

My first reasoning was about avoiding ASan leak warnings, planning
to release that container on exit(), but I'm clearly over-engineering
what is meant to be a kludge.

  With that,

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

I'll remove and merge directly, thanks!




reply via email to

[Prev in Thread] Current Thread [Next in Thread]