This series adds SBSA GWDT to the arm/virt machine with a WDAT table
designed for it and necessary tweaks to make it usable with the
WDAT driver.
In addition to WDAT, it also adds a native variant with GWDT
described in FDT and GTDT.
One can test it launching VM with:
-device sbsa-gwdt,wdat=on
to trace access to GWDT registers add:
-trace "sbsa_gwdt*"
To verify the guest uses watchdog use following steps to trigger
watchdog reboot:
* on Linux: enable watchdog service, check with wdctl, then:
echo c > /proc/sysrq-trigger
* on Windows: kill svchost in admin mode 'cmd' shell:
taskkill /f /im svchost.exe
Tested with Fedora 43 & Windows 11 (aarch64, KVM on Jetson)
git tree: https://gitlab.com/imammedo/qemu/-/commits/gwdt_v4
1) http://msdn.microsoft.com/en-us/windows/hardware/gg463320.aspx
Changelog:
v4:
* drop independed patches 14-17 for a separate spin-off
(sbsa-gwdt fixes for WCV register writes)
* arm: sbsa_gwdt: rename device type to sbsa-gwdt (patch 3):
- collect Reviewed-by from Eric
* arm: virt: create sbsa-gwdt watchdog (patch 4):
(Eric)
- reorder [VIRT_GWDT_WS0] in irqmap after [VIRT_ACPI_GED]
- add missing blank line in pre_plug handler
- extract FDT node creation into create_gwdt_dt_bindings() helper
- add watchdog documentation to docs/system/arm/virt.rst
- add comment above dc->user_creatable about requiring
machine-specific wiring
* acpi: introduce WDAT table for GWDT (patch 6):
(Eric)
- fix comment alignment
- collect Reviewed-by
* arm: virt: add support for WDAT based watchdog (patch 7):
(Eric)
- remove unused 'wdt' parameter from build_gtdt()
- add Native/WDAT modes documentation to docs/system/arm/virt.rst
- collect Reviewed-by
* tests: acpi: arm/virt: update expected WDAT blob (patch 10):
- collect Reviewed-by from Eric
* tests: acpi: arm/virt: add GTDT watchdog table test case (patch 12):
(Eric) fix whitespace in test command string (moved from patch 17)
v3:
* drop x86 patches (already merged)
* (Eric) rename device type from sbsa_gwdt to sbsa-gwdt (new patch 3)
* arm: virt: create sbsa-gwdt watchdog (patch 4):
- (Eric) assign MMIO/IRQ statically, drop dynamic sysbus machinery
- (Peter) set watchdog freq to system counter clock explicitly
* arm: sbsa-gwdt: add 'wdat' option (patch 5):
- split out from v2's monolithic patch 11
* acpi: introduce WDAT table for GWDT (patch 6):
- (Eric) split out from v2's patch 11
- add/improve comments
- use 'freq' argument passed down by caller
- simplify magic val on WRR write and add comment
- group table records by used register
* arm: virt: add support for WDAT based watchdog (patch 7):
- (Eric) split out from v2's patch 11
- skip FDT watchdog node creation in wdat mode
- skip setting cntfrq clock-frequency in wdat mode
* sbsa-gwdt: reschedule timer on direct WCV load (patch 16):
- improved commit message with spec references and
description of Windows GTDT-mode behavior
* sbsa-gwdt: limit compare_value to INT64_MAX (patch 17):
- rewritten commit message: document QEMU timer API
limitation vs spec, Windows write sequence, and
vCPU preemption fragility under virtualization
v2:
* ditch generic '-machine acpi-watchdog' option in favor of
board specific: arm/virt: -device sbsa_gwdt,wdat={on|off}
* arm/virt: add FDT and GTDT ACPI entries for GWDT
* arm/virt: add test case for GTDT
* optional GWDT cleanup/fixes for WCV register update
previous revisions:
v3: https://patchew.org/QEMU/20260624102830.1355552-1-imammedo@redhat.com/
v2: https://patchew.org/QEMU/20260303092532.2410177-1-imammedo@redhat.com/
v1: https://patchew.org/QEMU/20260206131438.1857182-1-imammedo@redhat.com/
Igor Mammedov (13):
arm: sbsa_gwdt: fixup default "clock-frequency"
arm: add tracing events to sbsa_gwdt
arm: sbsa_gwdt: rename device type to sbsa-gwdt
arm: virt: create sbsa-gwdt watchdog
arm: sbsa-gwdt: add 'wdat' option
acpi: introduce WDAT table for GWDT
arm: virt: add support for WDAT based watchdog
tests: acpi: arm/virt: whitelist new WDAT table
tests: acpi: arm/virt: add WDAT table test case
tests: acpi: arm/virt: update expected WDAT blob
tests: acpi: arm/virt: whitelist GTDT table
tests: acpi: arm/virt: add GTDT watchdog table test case
tests: acpi: arm/virt: update expected GTDT blob
include/hw/acpi/wdat-gwdt.h | 19 +++++
include/hw/arm/virt.h | 3 +
include/hw/watchdog/sbsa_gwdt.h | 3 +-
docs/system/arm/virt.rst | 24 ++++++
hw/acpi/meson.build | 2 +
hw/acpi/wdat-gwdt-stub.c | 16 ++++
hw/acpi/wdat-gwdt.c | 99 +++++++++++++++++++++++++
hw/arm/Kconfig | 1 +
hw/arm/virt-acpi-build.c | 51 ++++++++++++-
hw/arm/virt.c | 48 ++++++++++++
hw/core/sysbus-fdt.c | 2 +
hw/watchdog/sbsa_gwdt.c | 24 +++++-
hw/watchdog/trace-events | 9 +++
tests/data/acpi/aarch64/virt/GTDT.gwdt | Bin 0 -> 132 bytes
tests/data/acpi/aarch64/virt/WDAT.wdat | Bin 0 -> 260 bytes
tests/qtest/bios-tables-test.c | 41 ++++++++++
16 files changed, 334 insertions(+), 8 deletions(-)
create mode 100644 include/hw/acpi/wdat-gwdt.h
create mode 100644 hw/acpi/wdat-gwdt-stub.c
create mode 100644 hw/acpi/wdat-gwdt.c
create mode 100644 tests/data/acpi/aarch64/virt/GTDT.gwdt
create mode 100644 tests/data/acpi/aarch64/virt/WDAT.wdat
--
2.47.3