* [PATCH v5 0/6] hw/misc/pvpanic: add support for normal shutdowns
@ 2024-01-29 19:28 Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 1/6] linux-headers: drop pvpanic.h Thomas Weißschuh
` (5 more replies)
0 siblings, 6 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-01-29 19:28 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
Shutdown requests are normally hardware dependent.
By extending pvpanic to also handle shutdown requests, guests can
submit such requests with an easily implementable and cross-platform
mechanism.
The background is the usage of minimal Linux kernels with different
architectures for testing purposes.
Poweroff support varies highly per architecture and requires a bunch of
code to be compiled to work.
pvpanic on the other hand is very small and uniform.
Patch 1, 2 and 3 are general cleanups, that seems useful even without this
proposal being implemented.
They should also be ready to be picked up from the series on their own.
A corresponding patch has been submitted for Linux [0].
This is also where the request was voiced to drop move away from a
pvpanic uapi header in Linux.
[0] https://lore.kernel.org/lkml/20231104-pvpanic-shutdown-v1-1-5ee7c9b3e301@weissschuh.net/
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
Changes in v5:
- Add patch from Alejandro to emit a QMP event.
- Update cover letter.
- Add tests.
- Link to v4: https://lore.kernel.org/r/20240107-pvpanic-shutdown-v4-0-81500a7e4081@t-8ch.de
Changes in v4:
- Rebase on 8.2 master
- Resend after tree reopened and holidays
- Link to v3: https://lore.kernel.org/r/20231129-pvpanic-shutdown-v3-0-c9a2892fc523@t-8ch.de
Changes in v3:
- Drop from Linux imported pvpanic header as discussed with Cornelia and
requested by Greg
- Link to v2: https://lore.kernel.org/r/20231128-pvpanic-shutdown-v2-0-830393b45cb6@t-8ch.de
Changes in v2:
- Remove RFC status
- Add Ack from Thomas to 2nd patch
- Fix typo in title of 2nd patch
- Link to v1: https://lore.kernel.org/r/20231104-pvpanic-shutdown-v1-0-02353157891b@t-8ch.de
---
Alejandro Jimenez (1):
pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal
Thomas Weißschuh (5):
linux-headers: drop pvpanic.h
hw/misc/pvpanic: centralize definition of supported events
tests/qtest/pvpanic: use centralized definition of supported events
hw/misc/pvpanic: add support for normal shutdowns
tests/qtest/pvpanic: add tests for pvshutdown event
docs/specs/pvpanic.rst | 2 ++
hw/misc/pvpanic-isa.c | 3 +--
hw/misc/pvpanic-pci.c | 3 +--
hw/misc/pvpanic.c | 8 ++++--
include/hw/misc/pvpanic.h | 5 ++++
include/standard-headers/linux/pvpanic.h | 9 -------
include/sysemu/runstate.h | 1 +
qapi/run-state.json | 14 ++++++++++
scripts/update-linux-headers.sh | 3 +--
system/runstate.c | 6 +++++
tests/qtest/pvpanic-pci-test.c | 44 ++++++++++++++++++++++++++++++--
tests/qtest/pvpanic-test.c | 34 ++++++++++++++++++++++--
12 files changed, 111 insertions(+), 21 deletions(-)
---
base-commit: 11be70677c70fdccd452a3233653949b79e97908
change-id: 20231104-pvpanic-shutdown-02e4b4cb4949
Best regards,
--
Thomas Weißschuh <thomas@t-8ch.de>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v5 1/6] linux-headers: drop pvpanic.h
2024-01-29 19:28 [PATCH v5 0/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
@ 2024-01-29 19:28 ` Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 2/6] hw/misc/pvpanic: centralize definition of supported events Thomas Weißschuh
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-01-29 19:28 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
misc/pvpanic.h from the Linux UAPI does not define a Linux UAPI but a
qemu device API.
This leads to a weird process when updates to the interface are needed:
1) Change to the specification in the qemu tree
2) Change to the header in the Linux tree
3) Re-import of the header into Qemu.
The kernel prefers to drop the header anyways.
Prepare for the removal from the Linux UAPI headers by moving the
contents to the existing pvpanic.h header.
Link: https://lore.kernel.org/lkml/2023110431-pacemaker-pruning-0e4c@gregkh/
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
hw/misc/pvpanic-isa.c | 1 -
hw/misc/pvpanic-pci.c | 1 -
hw/misc/pvpanic.c | 1 -
include/hw/misc/pvpanic.h | 3 +++
include/standard-headers/linux/pvpanic.h | 9 ---------
| 3 +--
6 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/hw/misc/pvpanic-isa.c b/hw/misc/pvpanic-isa.c
index ccec50f61bbd..ef438a31fbe9 100644
--- a/hw/misc/pvpanic-isa.c
+++ b/hw/misc/pvpanic-isa.c
@@ -21,7 +21,6 @@
#include "hw/misc/pvpanic.h"
#include "qom/object.h"
#include "hw/isa/isa.h"
-#include "standard-headers/linux/pvpanic.h"
#include "hw/acpi/acpi_aml_interface.h"
OBJECT_DECLARE_SIMPLE_TYPE(PVPanicISAState, PVPANIC_ISA_DEVICE)
diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
index c01e4ce8646a..01e269b55284 100644
--- a/hw/misc/pvpanic-pci.c
+++ b/hw/misc/pvpanic-pci.c
@@ -21,7 +21,6 @@
#include "hw/misc/pvpanic.h"
#include "qom/object.h"
#include "hw/pci/pci_device.h"
-#include "standard-headers/linux/pvpanic.h"
OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index 1540e9091a45..4915ef256e74 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -21,7 +21,6 @@
#include "hw/qdev-properties.h"
#include "hw/misc/pvpanic.h"
#include "qom/object.h"
-#include "standard-headers/linux/pvpanic.h"
static void handle_event(int event)
{
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
index fab94165d03d..dffca827f77a 100644
--- a/include/hw/misc/pvpanic.h
+++ b/include/hw/misc/pvpanic.h
@@ -18,6 +18,9 @@
#include "exec/memory.h"
#include "qom/object.h"
+#define PVPANIC_PANICKED (1 << 0)
+#define PVPANIC_CRASH_LOADED (1 << 1)
+
#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
#define TYPE_PVPANIC_PCI_DEVICE "pvpanic-pci"
diff --git a/include/standard-headers/linux/pvpanic.h b/include/standard-headers/linux/pvpanic.h
deleted file mode 100644
index 54b7485390d3..000000000000
--- a/include/standard-headers/linux/pvpanic.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-
-#ifndef __PVPANIC_H__
-#define __PVPANIC_H__
-
-#define PVPANIC_PANICKED (1 << 0)
-#define PVPANIC_CRASH_LOADED (1 << 1)
-
-#endif /* __PVPANIC_H__ */
--git a/scripts/update-linux-headers.sh b/scripts/update-linux-headers.sh
index a0006eec6fd1..c4fea51c93fd 100755
--- a/scripts/update-linux-headers.sh
+++ b/scripts/update-linux-headers.sh
@@ -218,8 +218,7 @@ for i in "$tmpdir"/include/linux/*virtio*.h \
"$tmpdir/include/linux/const.h" \
"$tmpdir/include/linux/kernel.h" \
"$tmpdir/include/linux/vhost_types.h" \
- "$tmpdir/include/linux/sysinfo.h" \
- "$tmpdir/include/misc/pvpanic.h"; do
+ "$tmpdir/include/linux/sysinfo.h"; do
cp_portable "$i" "$output/include/standard-headers/linux"
done
mkdir -p "$output/include/standard-headers/drm"
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v5 2/6] hw/misc/pvpanic: centralize definition of supported events
2024-01-29 19:28 [PATCH v5 0/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 1/6] linux-headers: drop pvpanic.h Thomas Weißschuh
@ 2024-01-29 19:28 ` Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 3/6] tests/qtest/pvpanic: use centralized " Thomas Weißschuh
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-01-29 19:28 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
The different components of pvpanic duplicate the list of supported
events. Move it to the shared header file to minimize changes when new
events are added.
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
hw/misc/pvpanic-isa.c | 2 +-
hw/misc/pvpanic-pci.c | 2 +-
hw/misc/pvpanic.c | 2 +-
include/hw/misc/pvpanic.h | 1 +
4 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/hw/misc/pvpanic-isa.c b/hw/misc/pvpanic-isa.c
index ef438a31fbe9..9a923b786907 100644
--- a/hw/misc/pvpanic-isa.c
+++ b/hw/misc/pvpanic-isa.c
@@ -101,7 +101,7 @@ static void build_pvpanic_isa_aml(AcpiDevAmlIf *adev, Aml *scope)
static Property pvpanic_isa_properties[] = {
DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicISAState, ioport, 0x505),
DEFINE_PROP_UINT8("events", PVPanicISAState, pvpanic.events,
- PVPANIC_PANICKED | PVPANIC_CRASH_LOADED),
+ PVPANIC_EVENTS),
DEFINE_PROP_END_OF_LIST(),
};
diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
index 01e269b55284..be4063121e1d 100644
--- a/hw/misc/pvpanic-pci.c
+++ b/hw/misc/pvpanic-pci.c
@@ -54,7 +54,7 @@ static void pvpanic_pci_realizefn(PCIDevice *dev, Error **errp)
static Property pvpanic_pci_properties[] = {
DEFINE_PROP_UINT8("events", PVPanicPCIState, pvpanic.events,
- PVPANIC_PANICKED | PVPANIC_CRASH_LOADED),
+ PVPANIC_EVENTS),
DEFINE_PROP_END_OF_LIST(),
};
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index 4915ef256e74..a4982cc5928e 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -26,7 +26,7 @@ static void handle_event(int event)
{
static bool logged;
- if (event & ~(PVPANIC_PANICKED | PVPANIC_CRASH_LOADED) && !logged) {
+ if (event & ~PVPANIC_EVENTS && !logged) {
qemu_log_mask(LOG_GUEST_ERROR, "pvpanic: unknown event %#x.\n", event);
logged = true;
}
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
index dffca827f77a..48f2ec4c86a1 100644
--- a/include/hw/misc/pvpanic.h
+++ b/include/hw/misc/pvpanic.h
@@ -20,6 +20,7 @@
#define PVPANIC_PANICKED (1 << 0)
#define PVPANIC_CRASH_LOADED (1 << 1)
+#define PVPANIC_EVENTS (PVPANIC_PANICKED | PVPANIC_CRASH_LOADED)
#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
#define TYPE_PVPANIC_PCI_DEVICE "pvpanic-pci"
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v5 3/6] tests/qtest/pvpanic: use centralized definition of supported events
2024-01-29 19:28 [PATCH v5 0/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 1/6] linux-headers: drop pvpanic.h Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 2/6] hw/misc/pvpanic: centralize definition of supported events Thomas Weißschuh
@ 2024-01-29 19:28 ` Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 4/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-01-29 19:28 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
Avoid the necessity to update all tests when new events are added
to the device.
Acked-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
tests/qtest/pvpanic-pci-test.c | 5 +++--
tests/qtest/pvpanic-test.c | 5 +++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/tests/qtest/pvpanic-pci-test.c b/tests/qtest/pvpanic-pci-test.c
index 2c05b376ba72..b372caf41dc0 100644
--- a/tests/qtest/pvpanic-pci-test.c
+++ b/tests/qtest/pvpanic-pci-test.c
@@ -16,6 +16,7 @@
#include "qapi/qmp/qdict.h"
#include "libqos/pci.h"
#include "libqos/pci-pc.h"
+#include "hw/misc/pvpanic.h"
#include "hw/pci/pci_regs.h"
static void test_panic_nopause(void)
@@ -34,7 +35,7 @@ static void test_panic_nopause(void)
bar = qpci_iomap(dev, 0, NULL);
qpci_memread(dev, bar, 0, &val, sizeof(val));
- g_assert_cmpuint(val, ==, 3);
+ g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
val = 1;
qpci_memwrite(dev, bar, 0, &val, sizeof(val));
@@ -67,7 +68,7 @@ static void test_panic(void)
bar = qpci_iomap(dev, 0, NULL);
qpci_memread(dev, bar, 0, &val, sizeof(val));
- g_assert_cmpuint(val, ==, 3);
+ g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
val = 1;
qpci_memwrite(dev, bar, 0, &val, sizeof(val));
diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c
index 78f1cf8186b0..ccc603472f5d 100644
--- a/tests/qtest/pvpanic-test.c
+++ b/tests/qtest/pvpanic-test.c
@@ -10,6 +10,7 @@
#include "qemu/osdep.h"
#include "libqtest.h"
#include "qapi/qmp/qdict.h"
+#include "hw/misc/pvpanic.h"
static void test_panic_nopause(void)
{
@@ -20,7 +21,7 @@ static void test_panic_nopause(void)
qts = qtest_init("-device pvpanic -action panic=none");
val = qtest_inb(qts, 0x505);
- g_assert_cmpuint(val, ==, 3);
+ g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
qtest_outb(qts, 0x505, 0x1);
@@ -43,7 +44,7 @@ static void test_panic(void)
qts = qtest_init("-device pvpanic -action panic=pause");
val = qtest_inb(qts, 0x505);
- g_assert_cmpuint(val, ==, 3);
+ g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
qtest_outb(qts, 0x505, 0x1);
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v5 4/6] hw/misc/pvpanic: add support for normal shutdowns
2024-01-29 19:28 [PATCH v5 0/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (2 preceding siblings ...)
2024-01-29 19:28 ` [PATCH v5 3/6] tests/qtest/pvpanic: use centralized " Thomas Weißschuh
@ 2024-01-29 19:28 ` Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 5/6] pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 6/6] tests/qtest/pvpanic: add tests for pvshutdown event Thomas Weißschuh
5 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-01-29 19:28 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
Shutdown requests are normally hardware dependent.
By extending pvpanic to also handle shutdown requests, guests can
submit such requests with an easily implementable and cross-platform
mechanism.
Acked-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
docs/specs/pvpanic.rst | 2 ++
hw/misc/pvpanic.c | 5 +++++
include/hw/misc/pvpanic.h | 3 ++-
include/sysemu/runstate.h | 1 +
system/runstate.c | 5 +++++
5 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/docs/specs/pvpanic.rst b/docs/specs/pvpanic.rst
index f894bc19555f..796cc0348a38 100644
--- a/docs/specs/pvpanic.rst
+++ b/docs/specs/pvpanic.rst
@@ -29,6 +29,8 @@ bit 1
a guest panic has happened and will be handled by the guest;
the host should record it or report it, but should not affect
the execution of the guest.
+bit 2
+ a guest shutdown has happened and should be processed by the host
PCI Interface
-------------
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index a4982cc5928e..0e9505451a7a 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -40,6 +40,11 @@ static void handle_event(int event)
qemu_system_guest_crashloaded(NULL);
return;
}
+
+ if (event & PVPANIC_SHUTDOWN) {
+ qemu_system_guest_pvshutdown();
+ return;
+ }
}
/* return supported events on read */
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
index 48f2ec4c86a1..9e36a02d5a4f 100644
--- a/include/hw/misc/pvpanic.h
+++ b/include/hw/misc/pvpanic.h
@@ -20,7 +20,8 @@
#define PVPANIC_PANICKED (1 << 0)
#define PVPANIC_CRASH_LOADED (1 << 1)
-#define PVPANIC_EVENTS (PVPANIC_PANICKED | PVPANIC_CRASH_LOADED)
+#define PVPANIC_SHUTDOWN (1 << 2)
+#define PVPANIC_EVENTS (PVPANIC_PANICKED | PVPANIC_CRASH_LOADED | PVPANIC_SHUTDOWN)
#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
#define TYPE_PVPANIC_PCI_DEVICE "pvpanic-pci"
diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h
index 0117d243c4ed..e210a37abf0f 100644
--- a/include/sysemu/runstate.h
+++ b/include/sysemu/runstate.h
@@ -104,6 +104,7 @@ void qemu_system_killed(int signal, pid_t pid);
void qemu_system_reset(ShutdownCause reason);
void qemu_system_guest_panicked(GuestPanicInformation *info);
void qemu_system_guest_crashloaded(GuestPanicInformation *info);
+void qemu_system_guest_pvshutdown(void);
bool qemu_system_dump_in_progress(void);
#endif
diff --git a/system/runstate.c b/system/runstate.c
index d6ab860ecaa7..572499513034 100644
--- a/system/runstate.c
+++ b/system/runstate.c
@@ -572,6 +572,11 @@ void qemu_system_guest_crashloaded(GuestPanicInformation *info)
qapi_free_GuestPanicInformation(info);
}
+void qemu_system_guest_pvshutdown(void)
+{
+ qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
+}
+
void qemu_system_reset_request(ShutdownCause reason)
{
if (reboot_action == REBOOT_ACTION_SHUTDOWN &&
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v5 5/6] pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal
2024-01-29 19:28 [PATCH v5 0/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (3 preceding siblings ...)
2024-01-29 19:28 ` [PATCH v5 4/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
@ 2024-01-29 19:28 ` Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 6/6] tests/qtest/pvpanic: add tests for pvshutdown event Thomas Weißschuh
5 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-01-29 19:28 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
From: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
Emit a QMP event on receiving a PVPANIC_SHUTDOWN event. Even though a typical
SHUTDOWN event will be sent, it will be indistinguishable from a shutdown
originating from other cases (e.g. KVM exit due to KVM_SYSTEM_EVENT_SHUTDOWN)
that also issue the guest-shutdown cause.
A management layer application can detect the new GUEST_PVSHUTDOWN event to
determine if the guest is using the pvpanic interface to request shutdowns.
Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
---
qapi/run-state.json | 14 ++++++++++++++
system/runstate.c | 1 +
2 files changed, 15 insertions(+)
diff --git a/qapi/run-state.json b/qapi/run-state.json
index 08bc99cb8561..d5a63e14ba7e 100644
--- a/qapi/run-state.json
+++ b/qapi/run-state.json
@@ -460,6 +460,20 @@
{ 'event': 'GUEST_CRASHLOADED',
'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }
+##
+# @GUEST_PVSHUTDOWN:
+#
+# Emitted when guest submits a shutdown request via pvpanic interface
+#
+# Since: 8.3
+#
+# Example:
+#
+# <- { "event": "GUEST_PVSHUTDOWN",
+# "timestamp": { "seconds": 1648245259, "microseconds": 893771 } }
+##
+{ 'event': 'GUEST_PVSHUTDOWN' }
+
##
# @GuestPanicAction:
#
diff --git a/system/runstate.c b/system/runstate.c
index 572499513034..02b0a1f8b9d0 100644
--- a/system/runstate.c
+++ b/system/runstate.c
@@ -574,6 +574,7 @@ void qemu_system_guest_crashloaded(GuestPanicInformation *info)
void qemu_system_guest_pvshutdown(void)
{
+ qapi_event_send_guest_pvshutdown();
qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v5 6/6] tests/qtest/pvpanic: add tests for pvshutdown event
2024-01-29 19:28 [PATCH v5 0/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (4 preceding siblings ...)
2024-01-29 19:28 ` [PATCH v5 5/6] pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal Thomas Weißschuh
@ 2024-01-29 19:28 ` Thomas Weißschuh
2024-01-30 6:58 ` Thomas Huth
5 siblings, 1 reply; 8+ messages in thread
From: Thomas Weißschuh @ 2024-01-29 19:28 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
Validate that a shutdown via the pvpanic device emits the correct
QMP events.
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
tests/qtest/pvpanic-pci-test.c | 39 +++++++++++++++++++++++++++++++++++++++
tests/qtest/pvpanic-test.c | 29 +++++++++++++++++++++++++++++
2 files changed, 68 insertions(+)
diff --git a/tests/qtest/pvpanic-pci-test.c b/tests/qtest/pvpanic-pci-test.c
index b372caf41dc0..e1c05d383219 100644
--- a/tests/qtest/pvpanic-pci-test.c
+++ b/tests/qtest/pvpanic-pci-test.c
@@ -85,11 +85,50 @@ static void test_panic(void)
qtest_quit(qts);
}
+static void test_pvshutdown(void)
+{
+ uint8_t val;
+ QDict *response, *data;
+ QTestState *qts;
+ QPCIBus *pcibus;
+ QPCIDevice *dev;
+ QPCIBar bar;
+
+ qts = qtest_init("-device pvpanic-pci,addr=04.0");
+ pcibus = qpci_new_pc(qts, NULL);
+ dev = qpci_device_find(pcibus, QPCI_DEVFN(0x4, 0x0));
+ qpci_device_enable(dev);
+ bar = qpci_iomap(dev, 0, NULL);
+
+ qpci_memread(dev, bar, 0, &val, sizeof(val));
+ g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
+
+ val = 4;
+ qpci_memwrite(dev, bar, 0, &val, sizeof(val));
+
+ response = qtest_qmp_eventwait_ref(qts, "GUEST_PVSHUTDOWN");
+ qobject_unref(response);
+
+ response = qtest_qmp_eventwait_ref(qts, "SHUTDOWN");
+ g_assert(qdict_haskey(response, "data"));
+ data = qdict_get_qdict(response, "data");
+ g_assert(qdict_haskey(data, "guest"));
+ g_assert(qdict_get_bool(data, "guest"));
+ g_assert(qdict_haskey(data, "reason"));
+ g_assert_cmpstr(qdict_get_str(data, "reason"), ==, "guest-shutdown");
+ qobject_unref(response);
+
+ g_free(dev);
+ qpci_free_pc(pcibus);
+ qtest_quit(qts);
+}
+
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
qtest_add_func("/pvpanic-pci/panic", test_panic);
qtest_add_func("/pvpanic-pci/panic-nopause", test_panic_nopause);
+ qtest_add_func("/pvpanic-pci/pvshutdown", test_pvshutdown);
return g_test_run();
}
diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c
index ccc603472f5d..ff1f25f46586 100644
--- a/tests/qtest/pvpanic-test.c
+++ b/tests/qtest/pvpanic-test.c
@@ -58,11 +58,40 @@ static void test_panic(void)
qtest_quit(qts);
}
+static void test_pvshutdown(void)
+{
+ uint8_t val;
+ QDict *response, *data;
+ QTestState *qts;
+
+ qts = qtest_init("-device pvpanic");
+
+ val = qtest_inb(qts, 0x505);
+ g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
+
+ qtest_outb(qts, 0x505, 0x4);
+
+ response = qtest_qmp_eventwait_ref(qts, "GUEST_PVSHUTDOWN");
+ qobject_unref(response);
+
+ response = qtest_qmp_eventwait_ref(qts, "SHUTDOWN");
+ g_assert(qdict_haskey(response, "data"));
+ data = qdict_get_qdict(response, "data");
+ g_assert(qdict_haskey(data, "guest"));
+ g_assert(qdict_get_bool(data, "guest"));
+ g_assert(qdict_haskey(data, "reason"));
+ g_assert_cmpstr(qdict_get_str(data, "reason"), ==, "guest-shutdown");
+ qobject_unref(response);
+
+ qtest_quit(qts);
+}
+
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
qtest_add_func("/pvpanic/panic", test_panic);
qtest_add_func("/pvpanic/panic-nopause", test_panic_nopause);
+ qtest_add_func("/pvpanic/pvshutdown", test_pvshutdown);
return g_test_run();
}
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v5 6/6] tests/qtest/pvpanic: add tests for pvshutdown event
2024-01-29 19:28 ` [PATCH v5 6/6] tests/qtest/pvpanic: add tests for pvshutdown event Thomas Weißschuh
@ 2024-01-30 6:58 ` Thomas Huth
0 siblings, 0 replies; 8+ messages in thread
From: Thomas Huth @ 2024-01-30 6:58 UTC (permalink / raw)
To: Thomas Weißschuh, Michael S. Tsirkin, Cornelia Huck,
Paolo Bonzini, Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez
On 29/01/2024 20.28, Thomas Weißschuh wrote:
> Validate that a shutdown via the pvpanic device emits the correct
> QMP events.
>
> Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
> ---
> tests/qtest/pvpanic-pci-test.c | 39 +++++++++++++++++++++++++++++++++++++++
> tests/qtest/pvpanic-test.c | 29 +++++++++++++++++++++++++++++
> 2 files changed, 68 insertions(+)
>
> diff --git a/tests/qtest/pvpanic-pci-test.c b/tests/qtest/pvpanic-pci-test.c
> index b372caf41dc0..e1c05d383219 100644
> --- a/tests/qtest/pvpanic-pci-test.c
> +++ b/tests/qtest/pvpanic-pci-test.c
> @@ -85,11 +85,50 @@ static void test_panic(void)
> qtest_quit(qts);
> }
>
> +static void test_pvshutdown(void)
> +{
> + uint8_t val;
> + QDict *response, *data;
> + QTestState *qts;
> + QPCIBus *pcibus;
> + QPCIDevice *dev;
> + QPCIBar bar;
> +
> + qts = qtest_init("-device pvpanic-pci,addr=04.0");
> + pcibus = qpci_new_pc(qts, NULL);
> + dev = qpci_device_find(pcibus, QPCI_DEVFN(0x4, 0x0));
> + qpci_device_enable(dev);
> + bar = qpci_iomap(dev, 0, NULL);
> +
> + qpci_memread(dev, bar, 0, &val, sizeof(val));
> + g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
> +
> + val = 4;
Could you use PVPANIC_SHUTDOWN here instead of the magic value?
> + qpci_memwrite(dev, bar, 0, &val, sizeof(val));
> +
> + response = qtest_qmp_eventwait_ref(qts, "GUEST_PVSHUTDOWN");
> + qobject_unref(response);
> +
> + response = qtest_qmp_eventwait_ref(qts, "SHUTDOWN");
> + g_assert(qdict_haskey(response, "data"));
> + data = qdict_get_qdict(response, "data");
> + g_assert(qdict_haskey(data, "guest"));
> + g_assert(qdict_get_bool(data, "guest"));
> + g_assert(qdict_haskey(data, "reason"));
> + g_assert_cmpstr(qdict_get_str(data, "reason"), ==, "guest-shutdown");
> + qobject_unref(response);
> +
> + g_free(dev);
> + qpci_free_pc(pcibus);
> + qtest_quit(qts);
> +}
> +
> int main(int argc, char **argv)
> {
> g_test_init(&argc, &argv, NULL);
> qtest_add_func("/pvpanic-pci/panic", test_panic);
> qtest_add_func("/pvpanic-pci/panic-nopause", test_panic_nopause);
> + qtest_add_func("/pvpanic-pci/pvshutdown", test_pvshutdown);
>
> return g_test_run();
> }
> diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c
> index ccc603472f5d..ff1f25f46586 100644
> --- a/tests/qtest/pvpanic-test.c
> +++ b/tests/qtest/pvpanic-test.c
> @@ -58,11 +58,40 @@ static void test_panic(void)
> qtest_quit(qts);
> }
>
> +static void test_pvshutdown(void)
> +{
> + uint8_t val;
> + QDict *response, *data;
> + QTestState *qts;
> +
> + qts = qtest_init("-device pvpanic");
> +
> + val = qtest_inb(qts, 0x505);
> + g_assert_cmpuint(val, ==, PVPANIC_EVENTS);
> +
> + qtest_outb(qts, 0x505, 0x4);
dito, use PVPANIC_SHUTDOWN instead of 4 ?
(as a separate clean-up, we should maybe also introduce a #define for 0x505
one day, but that's something for another patch)
> + response = qtest_qmp_eventwait_ref(qts, "GUEST_PVSHUTDOWN");
> + qobject_unref(response);
> +
> + response = qtest_qmp_eventwait_ref(qts, "SHUTDOWN");
> + g_assert(qdict_haskey(response, "data"));
> + data = qdict_get_qdict(response, "data");
> + g_assert(qdict_haskey(data, "guest"));
> + g_assert(qdict_get_bool(data, "guest"));
> + g_assert(qdict_haskey(data, "reason"));
> + g_assert_cmpstr(qdict_get_str(data, "reason"), ==, "guest-shutdown");
> + qobject_unref(response);
> +
> + qtest_quit(qts);
> +}
> +
> int main(int argc, char **argv)
> {
> g_test_init(&argc, &argv, NULL);
> qtest_add_func("/pvpanic/panic", test_panic);
> qtest_add_func("/pvpanic/panic-nopause", test_panic_nopause);
> + qtest_add_func("/pvpanic/pvshutdown", test_pvshutdown);
>
> return g_test_run();
> }
>
With PVPANIC_SHUTDOWN instead of 4:
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-01-30 6:59 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-29 19:28 [PATCH v5 0/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 1/6] linux-headers: drop pvpanic.h Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 2/6] hw/misc/pvpanic: centralize definition of supported events Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 3/6] tests/qtest/pvpanic: use centralized " Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 4/6] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 5/6] pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal Thomas Weißschuh
2024-01-29 19:28 ` [PATCH v5 6/6] tests/qtest/pvpanic: add tests for pvshutdown event Thomas Weißschuh
2024-01-30 6:58 ` Thomas Huth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).