Message ID | 80ac3e382a248bac13662d4052d17c41f1c21e3a.1625704980.git.isaku.yamahata@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | TDX support | expand |
On 7/7/21 7:54 PM, isaku.yamahata@gmail.com wrote: > From: Isaku Yamahata <isaku.yamahata@intel.com> > > 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 code > registers memory by machine_init_done(). > > Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com> > --- > hw/core/machine.c | 26 ++++++++++++++++++++++++++ > include/sysemu/sysemu.h | 2 ++ > 2 files changed, 28 insertions(+) > > diff --git a/hw/core/machine.c b/hw/core/machine.c > index ffc076ae84..66c39cf72a 100644 > --- a/hw/core/machine.c > +++ b/hw/core/machine.c > @@ -1278,6 +1278,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); I think a comment here describing the difference between machine_init_done and machine_init_done_late would go a long way for other developers so they don't have to hunt through the git log. Connor
On Wed, Jul 07, 2021 at 05:54:34PM -0700, isaku.yamahata@gmail.com wrote: > From: Isaku Yamahata <isaku.yamahata@intel.com> > > 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 code > registers memory by machine_init_done(). Can you be more specific than "some code"? I see only pc_memory_init() adding guest ram (and the corresponding e820 entries), and that should run early enough ... thanks, Gerd
diff --git a/hw/core/machine.c b/hw/core/machine.c index ffc076ae84..66c39cf72a 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -1278,6 +1278,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(); @@ -1311,6 +1336,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(); diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 8fae667172..d44f8cf778 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -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);