qdev: Implement qdev_create_fake_machine() for user emulation
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> Acked-by: Peter Xu <peterx@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20250102211800.79235-2-philmd@linaro.org>
This commit is contained in:
parent
ad1ea5ffa1
commit
558ee1ede6
@ -35,7 +35,9 @@
|
|||||||
#include "qemu/atomic.h"
|
#include "qemu/atomic.h"
|
||||||
#include "qapi/qapi-builtin-visit.h"
|
#include "qapi/qapi-builtin-visit.h"
|
||||||
#include "qemu/units.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"
|
#include "hw/boards.h"
|
||||||
#endif
|
#endif
|
||||||
#include "internal-common.h"
|
#include "internal-common.h"
|
||||||
@ -124,6 +126,10 @@ static int tcg_init_machine(MachineState *ms)
|
|||||||
tcg_prologue_init();
|
tcg_prologue_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
qdev_create_fake_machine();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,3 +46,4 @@ system_ss.add(files(
|
|||||||
'vm-change-state-handler.c',
|
'vm-change-state-handler.c',
|
||||||
'clock-vmstate.c',
|
'clock-vmstate.c',
|
||||||
))
|
))
|
||||||
|
user_ss.add(files('qdev-user.c'))
|
||||||
|
19
hw/core/qdev-user.c
Normal file
19
hw/core/qdev-user.c
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* QDev helpers specific to user emulation.
|
||||||
|
*
|
||||||
|
* Copyright 2025 Linaro, Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "qom/object.h"
|
||||||
|
#include "hw/qdev-core.h"
|
||||||
|
|
||||||
|
void qdev_create_fake_machine(void)
|
||||||
|
{
|
||||||
|
Object *fake_machine_obj;
|
||||||
|
|
||||||
|
fake_machine_obj = object_property_add_new_container(object_get_root(),
|
||||||
|
"machine");
|
||||||
|
object_property_add_new_container(fake_machine_obj, "unattached");
|
||||||
|
}
|
@ -1023,6 +1023,16 @@ const char *qdev_fw_name(DeviceState *dev);
|
|||||||
void qdev_assert_realized_properly(void);
|
void qdev_assert_realized_properly(void);
|
||||||
Object *qdev_get_machine(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.
|
||||||
|
*/
|
||||||
|
void qdev_create_fake_machine(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qdev_get_human_name() - Return a human-readable name for a device
|
* qdev_get_human_name() - Return a human-readable name for a device
|
||||||
* @dev: The device. Must be a valid and non-NULL pointer.
|
* @dev: The device. Must be a valid and non-NULL pointer.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user