On Tue, 12 May 2026 15:30:57 +0200 Igor Mammedov <[email protected]> wrote:
Peter, could you take a look at ARM related patches, I hope that I have addressed you concerns from v1. > On Tue, 28 Apr 2026 16:12:15 +0200 > Igor Mammedov <[email protected]> wrote: > > > On Tue, 3 Mar 2026 10:25:11 +0100 > > Igor Mammedov <[email protected]> wrote: > > > > > Changelog: > > > v2: > > > * ditch generic '-machine acpi-watchdog' option in favor of > > > board specific variants: > > > x86/q35: -machine wdat={on|off} > > > arm/virt: -device sbsa_gwdt,wdat={on|off} > > > * arm/virt: add FDT and GTDT ACPI entries for GWDT when it's present > > > and hide GDTD one when WDAT is enabled. > > > * arm/virt: add test case for GTDT > > > * [18-21] optional GWDT cleanup/fixes in handling WCV register > > > update, > > > make QEMU behave according to spec (at least the way I read it and > > > it appears MS also read it that way). It fixes Windows 11 reboots > > > when > > > GWDT is present (without WDAT). With that fixed it's up to MS to > > > fix > > > their driver to set sane timeout as with the current one wdatchdog > > > will never trigger. > > > > given merge window should be open by now, > > gentle ping > > 2 weeks later, > yet another ping > > > > > > Windows doesn't ship built-in TCO watchdog driver, and users are > > > forced to install vendor specific driver(s) if such exists. > > > However the OS provides a generic watchdog driver that uses > > > ACPI WDAT table [1] to abstract actual hardware behind it. > > > The same applies to ARM version of Windows. > > > > > > This series adds > > > * WDAT table tailored for TCO watchdog that Q35 already > > > has as part of ICH9 chipset and a knob to enable it. > > > * SBSA GWDT to arm/virt machine with WDAT table tailored > > > for it and necessary tweaks to GWDT to make usable > > > with WDAT driver. > > > * in addition to WDAT, it also adds native variant > > > with GWDT described in FDT and DTDT > > > (broken on Windows/works on linux). > > > > > > Guest OS WDAT support is present since Windows Vista and Linux since > > > 2016[2]. > > > > > > One can test it launching VM with following options: > > > * x86: > > > -machine q35,wdat=on > > > * arm/virt: > > > -device sbsa_gwdt,wdat=on > > > > > > to trace access to TCO registers one can add to CLI: > > > -trace "tco_*" > > > to trace access to GWDT registers one can add to CLI: > > > -trace "sbsa_gwdt*" > > > > > > To verify that guest uses WDAT (both Windows and Linux would use it if > > > present), > > > * on linux make sure that watchdog service is configured/enabled > > > (use wdctl to check what watchdog device is in use) and then > > > trigger kernel panic with command: > > > echo c > /proc/sysrq-trigger > > > * on Windows kill svchost process, running cmd in admin mode: > > > taskkill /f /im svchost.exe > > > > > > Tested with WS2025 & RHEL9.6 & Fedora 43 (aarch64) > > > > > > git tree at: https://gitlab.com/imammedo/qemu/-/commits/gwdt_v2 > > > > > > 1) http://msdn.microsoft.com/en-us/windows/hardware/gg463320.aspx > > > 2) https://lwn.net/Articles/700524/ > > > > > > PS: > > > previous revision: > > > https://patchew.org/QEMU/[email protected]/ > > > > > > Igor Mammedov (21): > > > acpi: add API to build WDAT instructions > > > x86: q35: add 'wdat' property > > > x86: q35: generate WDAT ACPI table > > > tests: acpi: x86/q35: whitelist new WDAT table > > > tests: acpi: x86/q35: add WDAT table test case > > > tests: acpi: x86/q35: update expected WDAT blob > > > arm: sbsa_gwdt: fixup default "clock-frequency" > > > arm: add tracing events to sbsa_gwdt > > > arm: virt: create sbsa_gwdt watchdog > > > arm: sbsa_gwdt: add 'wdat' option > > > 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 > > > sbsa_gwdt: reduce code ident > > > sbsa_gwdt: move all foo_REFRESH logic under REFRESH condition > > > sbsa_gwdt: reschedule timer on direct WCV load > > > sbsa_gwdt: limit compare_value to INT64_MAX > > > > > > include/hw/acpi/wdat-gwdt.h | 19 ++++ > > > include/hw/acpi/wdat-ich9.h | 15 ++++ > > > include/hw/acpi/wdat.h | 118 +++++++++++++++++++++++++ > > > include/hw/i386/pc.h | 1 + > > > include/hw/watchdog/sbsa_gwdt.h | 1 + > > > hw/acpi/aml-build.c | 14 +++ > > > hw/acpi/meson.build | 5 +- > > > hw/acpi/wdat-gwdt-stub.c | 16 ++++ > > > hw/acpi/wdat-gwdt.c | 92 +++++++++++++++++++ > > > hw/acpi/wdat-ich9-stub.c | 15 ++++ > > > hw/acpi/wdat-ich9.c | 90 +++++++++++++++++++ > > > hw/arm/Kconfig | 1 + > > > hw/arm/virt-acpi-build.c | 65 +++++++++++++- > > > hw/arm/virt.c | 2 + > > > hw/core/sysbus-fdt.c | 32 +++++++ > > > hw/i386/acpi-build.c | 12 +++ > > > hw/i386/pc_q35.c | 18 ++++ > > > hw/watchdog/sbsa_gwdt.c | 65 +++++++++----- > > > 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/data/acpi/x86/q35/WDAT.wdat | Bin 0 -> 308 bytes > > > tests/qtest/bios-tables-test.c | 54 +++++++++++ > > > 23 files changed, 618 insertions(+), 26 deletions(-) > > > create mode 100644 include/hw/acpi/wdat-gwdt.h > > > create mode 100644 include/hw/acpi/wdat-ich9.h > > > create mode 100644 include/hw/acpi/wdat.h > > > create mode 100644 hw/acpi/wdat-gwdt-stub.c > > > create mode 100644 hw/acpi/wdat-gwdt.c > > > create mode 100644 hw/acpi/wdat-ich9-stub.c > > > create mode 100644 hw/acpi/wdat-ich9.c > > > create mode 100644 tests/data/acpi/aarch64/virt/GTDT.gwdt > > > create mode 100644 tests/data/acpi/aarch64/virt/WDAT.wdat > > > create mode 100644 tests/data/acpi/x86/q35/WDAT.wdat > > > > > >
