@@ -1231,6 +1231,31 @@ void qemu_remove_machine_init_done_notifier(Notifier *notify)
notifier_remove(notify);
}
+static NotifierList machine_init_done_late_notifiers =
+ NOTIFIER_LIST_INITIALIZER(machine_init_done_late_notifiers);
+
+static bool machine_init_done_late;
+
+void qemu_add_machine_init_done_late_notifier(Notifier *notify)
+{
+ notifier_list_add(&machine_init_done_late_notifiers, notify);
+ if (machine_init_done_late) {
+ notify->notify(notify, NULL);
+ }
+}
+
+void qemu_remove_machine_init_done_late_notifier(Notifier *notify)
+{
+ notifier_remove(notify);
+}
+
+
+static void qemu_run_machine_init_done_late_notifiers(void)
+{
+ machine_init_done_late = true;
+ notifier_list_notify(&machine_init_done_late_notifiers, NULL);
+}
+
void qdev_machine_creation_done(void)
{
cpu_synchronize_all_post_init();
@@ -1264,6 +1289,7 @@ void qdev_machine_creation_done(void)
if (rom_check_and_register_reset() != 0) {
exit(1);
}
+ qemu_run_machine_init_done_late_notifiers();
replay_start();
@@ -19,6 +19,8 @@ void qemu_remove_exit_notifier(Notifier *notify);
void qemu_run_machine_init_done_notifiers(void);
void qemu_add_machine_init_done_notifier(Notifier *notify);
void qemu_remove_machine_init_done_notifier(Notifier *notify);
+void qemu_add_machine_init_done_late_notifier(Notifier *notify);
+void qemu_remove_machine_init_done_late_notifier(Notifier *notify);
void configure_rtc(QemuOpts *opts);
Introduce a new notifier, machine_init_done_late, that is notified after machine_init_done. This will be used by TDX to generate the HOB for its virtual firmware, which needs to be done after all guest memory has been added, i.e. after machine_init_done notifiers have run. some devices adds/updates memory region by machine_init_done notifier. Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com> --- hw/core/machine.c | 26 ++++++++++++++++++++++++++ include/sysemu/sysemu.h | 2 ++ 2 files changed, 28 insertions(+)