forked from rpms/qemu-kvm
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.6 KiB
68 lines
2.6 KiB
3 months ago
|
From 4c93bec108f7e3918a2ef91b51cec477ade38cc3 Mon Sep 17 00:00:00 2001
|
||
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
Date: Mon, 18 Mar 2024 17:45:56 -0400
|
||
|
Subject: [PATCH 018/100] runstate: skip initial CPU reset if reset is not
|
||
|
actually possible
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
RH-MergeRequest: 245: SEV-SNP support
|
||
|
RH-Jira: RHEL-39544
|
||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||
|
RH-Acked-by: Bandan Das <bdas@redhat.com>
|
||
|
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||
|
RH-Commit: [18/91] ced267fdaadbf2072c1897223522457a006e6c81 (bonzini/rhel-qemu-kvm)
|
||
|
|
||
|
Right now, the system reset is concluded by a call to
|
||
|
cpu_synchronize_all_post_reset() in order to sync any changes
|
||
|
that the machine reset callback applied to the CPU state.
|
||
|
|
||
|
However, for VMs with encrypted state such as SEV-ES guests (currently
|
||
|
the only case of guests with non-resettable CPUs) this cannot be done,
|
||
|
because guest state has already been finalized by machine-init-done notifiers.
|
||
|
cpu_synchronize_all_post_reset() does nothing on these guests, and actually
|
||
|
we would like to make it fail if called once guest has been encrypted.
|
||
|
So, assume that boards that support non-resettable CPUs do not touch
|
||
|
CPU state and that all such setup is done before, at the time of
|
||
|
cpu_synchronize_all_post_init().
|
||
|
|
||
|
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
(cherry picked from commit 08b2d15cdd0d3fbbe37ce23bf192b770db3a7539)
|
||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
---
|
||
|
system/runstate.c | 15 ++++++++++++++-
|
||
|
1 file changed, 14 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/system/runstate.c b/system/runstate.c
|
||
|
index d6ab860eca..cb4905a40f 100644
|
||
|
--- a/system/runstate.c
|
||
|
+++ b/system/runstate.c
|
||
|
@@ -501,7 +501,20 @@ void qemu_system_reset(ShutdownCause reason)
|
||
|
default:
|
||
|
qapi_event_send_reset(shutdown_caused_by_guest(reason), reason);
|
||
|
}
|
||
|
- cpu_synchronize_all_post_reset();
|
||
|
+
|
||
|
+ /*
|
||
|
+ * Some boards use the machine reset callback to point CPUs to the firmware
|
||
|
+ * entry point. Assume that this is not the case for boards that support
|
||
|
+ * non-resettable CPUs (currently used only for confidential guests), in
|
||
|
+ * which case cpu_synchronize_all_post_init() is enough because
|
||
|
+ * it does _more_ than cpu_synchronize_all_post_reset().
|
||
|
+ */
|
||
|
+ if (cpus_are_resettable()) {
|
||
|
+ cpu_synchronize_all_post_reset();
|
||
|
+ } else {
|
||
|
+ assert(runstate_check(RUN_STATE_PRELAUNCH));
|
||
|
+ }
|
||
|
+
|
||
|
vm_set_suspended(false);
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.39.3
|
||
|
|