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
> >   
> 


Reply via email to