* [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns
@ 2024-03-23 9:39 Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 1/7] hw/misc/pvpanic: centralize definition of supported events Thomas Weißschuh
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-03-23 9:39 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, which seem useful even without this
proposal being implemented.
They should also be ready to be picked up from the series on their own.
Patch 4 adds a qemu-internal definition PVPANIC_SHUTDOWN.
It should be removed as soon as the kernel exposes the define and the
the new kernel header has been reimported into qemu.
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 v7:
- Keep standard-header/pvpanic.h
- Predefine PVPANIC_SHUTDOWN in include/hw/misc/pvpanic.h
- Fix alignment in QAPI to comply with newly enforced layout
- Update Since: tag in QAPI to 9.0
- Drop note from pvpanic spec about missing implementation
- Link to v6: https://lore.kernel.org/r/20240208-pvpanic-shutdown-v6-0-965580ac057b@t-8ch.de
Changes in v6:
- Replace magic constant "4" in tests with PVPANIC_SHUTDOWN
- Link to v5: https://lore.kernel.org/r/20240129-pvpanic-shutdown-v5-0-f5a060b87c74@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 (6):
hw/misc/pvpanic: centralize definition of supported events
tests/qtest/pvpanic: use centralized definition of supported events
hw/misc/pvpanic: add local definition for PVPANIC_SHUTDOWN
hw/misc/pvpanic: add support for normal shutdowns
tests/qtest/pvpanic: add tests for pvshutdown event
Revert "docs/specs/pvpanic: mark shutdown event as not implemented"
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 | 9 +++++++++
include/sysemu/runstate.h | 1 +
qapi/run-state.json | 14 ++++++++++++++
system/runstate.c | 6 ++++++
tests/qtest/pvpanic-pci-test.c | 44 ++++++++++++++++++++++++++++++++++++++++--
tests/qtest/pvpanic-test.c | 34 ++++++++++++++++++++++++++++++--
10 files changed, 113 insertions(+), 11 deletions(-)
---
base-commit: 853546f8128476eefb701d4a55b2781bb3a46faa
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 v7 1/7] hw/misc/pvpanic: centralize definition of supported events
2024-03-23 9:39 [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
@ 2024-03-23 9:39 ` Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 2/7] tests/qtest/pvpanic: use centralized " Thomas Weißschuh
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-03-23 9:39 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 | 3 +--
hw/misc/pvpanic-pci.c | 3 +--
hw/misc/pvpanic.c | 3 +--
include/hw/misc/pvpanic.h | 4 ++++
4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/hw/misc/pvpanic-isa.c b/hw/misc/pvpanic-isa.c
index ccec50f61bbd..9a923b786907 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)
@@ -102,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 83be95d0d249..603c5c7600da 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)
@@ -55,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 1540e9091a45..a4982cc5928e 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -21,13 +21,12 @@
#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)
{
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 fab94165d03d..947468b81b1a 100644
--- a/include/hw/misc/pvpanic.h
+++ b/include/hw/misc/pvpanic.h
@@ -18,6 +18,10 @@
#include "exec/memory.h"
#include "qom/object.h"
+#include "standard-headers/linux/pvpanic.h"
+
+#define PVPANIC_EVENTS (PVPANIC_PANICKED | PVPANIC_CRASH_LOADED)
+
#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
#define TYPE_PVPANIC_PCI_DEVICE "pvpanic-pci"
--
2.44.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v7 2/7] tests/qtest/pvpanic: use centralized definition of supported events
2024-03-23 9:39 [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 1/7] hw/misc/pvpanic: centralize definition of supported events Thomas Weißschuh
@ 2024-03-23 9:39 ` Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 3/7] hw/misc/pvpanic: add local definition for PVPANIC_SHUTDOWN Thomas Weißschuh
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-03-23 9:39 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.44.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v7 3/7] hw/misc/pvpanic: add local definition for PVPANIC_SHUTDOWN
2024-03-23 9:39 [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 1/7] hw/misc/pvpanic: centralize definition of supported events Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 2/7] tests/qtest/pvpanic: use centralized " Thomas Weißschuh
@ 2024-03-23 9:39 ` Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 4/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-03-23 9:39 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
PVPANIC_* defines are imported from the kernel via
standard-header/pvpanic.h.
For that the kernel needs to pick up the changes from
qemu docs/specs/pvpanic.rst which takes time.
The actual value of the define is known as the authoritative source
comes from the qemu tree in docs/specs/pvpanic.rst, where it was added
in commit 73279cecca03 ("docs/specs/pvpanic: document shutdown event").
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
include/hw/misc/pvpanic.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
index 947468b81b1a..926aa64838f9 100644
--- a/include/hw/misc/pvpanic.h
+++ b/include/hw/misc/pvpanic.h
@@ -20,6 +20,11 @@
#include "standard-headers/linux/pvpanic.h"
+#ifdef PVPANIC_SHUTDOWN
+#error PVPANIC_SHUTDOWN is already defined
+#endif
+#define PVPANIC_SHUTDOWN (1 << 2)
+
#define PVPANIC_EVENTS (PVPANIC_PANICKED | PVPANIC_CRASH_LOADED)
#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
--
2.44.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v7 4/7] hw/misc/pvpanic: add support for normal shutdowns
2024-03-23 9:39 [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (2 preceding siblings ...)
2024-03-23 9:39 ` [PATCH v7 3/7] hw/misc/pvpanic: add local definition for PVPANIC_SHUTDOWN Thomas Weißschuh
@ 2024-03-23 9:39 ` Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 5/7] pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal Thomas Weißschuh
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-03-23 9:39 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>
---
hw/misc/pvpanic.c | 5 +++++
include/hw/misc/pvpanic.h | 2 +-
include/sysemu/runstate.h | 1 +
system/runstate.c | 5 +++++
4 files changed, 12 insertions(+), 1 deletion(-)
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 926aa64838f9..9ffb08bf08bf 100644
--- a/include/hw/misc/pvpanic.h
+++ b/include/hw/misc/pvpanic.h
@@ -25,7 +25,7 @@
#endif
#define PVPANIC_SHUTDOWN (1 << 2)
-#define PVPANIC_EVENTS (PVPANIC_PANICKED | PVPANIC_CRASH_LOADED)
+#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.44.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v7 5/7] pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal
2024-03-23 9:39 [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (3 preceding siblings ...)
2024-03-23 9:39 ` [PATCH v7 4/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
@ 2024-03-23 9:39 ` Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 6/7] tests/qtest/pvpanic: add tests for pvshutdown event Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 7/7] Revert "docs/specs/pvpanic: mark shutdown event as not implemented" Thomas Weißschuh
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-03-23 9:39 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 789fc34559ad..888a11e62011 100644
--- a/qapi/run-state.json
+++ b/qapi/run-state.json
@@ -455,6 +455,20 @@
{ 'event': 'GUEST_CRASHLOADED',
'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }
+##
+# @GUEST_PVSHUTDOWN:
+#
+# Emitted when guest submits a shutdown request via pvpanic interface
+#
+# Since: 9.0
+#
+# 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.44.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v7 6/7] tests/qtest/pvpanic: add tests for pvshutdown event
2024-03-23 9:39 [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (4 preceding siblings ...)
2024-03-23 9:39 ` [PATCH v7 5/7] pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal Thomas Weißschuh
@ 2024-03-23 9:39 ` Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 7/7] Revert "docs/specs/pvpanic: mark shutdown event as not implemented" Thomas Weißschuh
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-03-23 9:39 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>
Reviewed-by: Thomas Huth <thuth@redhat.com>
---
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..dc021c2fdf77 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 = PVPANIC_SHUTDOWN;
+ 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..d49d2ba9313e 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, PVPANIC_SHUTDOWN);
+
+ 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.44.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v7 7/7] Revert "docs/specs/pvpanic: mark shutdown event as not implemented"
2024-03-23 9:39 [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
` (5 preceding siblings ...)
2024-03-23 9:39 ` [PATCH v7 6/7] tests/qtest/pvpanic: add tests for pvshutdown event Thomas Weißschuh
@ 2024-03-23 9:39 ` Thomas Weißschuh
6 siblings, 0 replies; 8+ messages in thread
From: Thomas Weißschuh @ 2024-03-23 9:39 UTC (permalink / raw)
To: Michael S. Tsirkin, Cornelia Huck, Paolo Bonzini, Thomas Huth,
Laurent Vivier
Cc: qemu-devel, Alejandro Jimenez, Thomas Weißschuh
The missing functionality has been implemented now.
This reverts commit e739d1935c461d0668057e9dbba9d06f728d29ec.
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
docs/specs/pvpanic.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/specs/pvpanic.rst b/docs/specs/pvpanic.rst
index b0f27860ec3b..61a80480edb8 100644
--- a/docs/specs/pvpanic.rst
+++ b/docs/specs/pvpanic.rst
@@ -29,7 +29,7 @@ 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 (to be implemented)
+bit 2
a regular guest shutdown has happened and should be processed by the host
PCI Interface
--
2.44.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-03-23 9:40 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-23 9:39 [PATCH v7 0/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 1/7] hw/misc/pvpanic: centralize definition of supported events Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 2/7] tests/qtest/pvpanic: use centralized " Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 3/7] hw/misc/pvpanic: add local definition for PVPANIC_SHUTDOWN Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 4/7] hw/misc/pvpanic: add support for normal shutdowns Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 5/7] pvpanic: Emit GUEST_PVSHUTDOWN QMP event on pvpanic shutdown signal Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 6/7] tests/qtest/pvpanic: add tests for pvshutdown event Thomas Weißschuh
2024-03-23 9:39 ` [PATCH v7 7/7] Revert "docs/specs/pvpanic: mark shutdown event as not implemented" Thomas Weißschuh
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).