[PATCH v3 00/17] Add watchdog support to arm/virt board

Igor Mammedov posted 17 patches 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260624102830.1355552-1-imammedo@redhat.com
Maintainers: "Michael S. Tsirkin" <mst@redhat.com>, Igor Mammedov <imammedo@redhat.com>, Ani Sinha <anisinha@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Peter Maydell <peter.maydell@linaro.org>, Leif Lindholm <leif.lindholm@oss.qualcomm.com>
There is a newer version of this series
include/hw/acpi/wdat-gwdt.h            |  19 +++++
include/hw/arm/virt.h                  |   3 +
include/hw/watchdog/sbsa_gwdt.h        |   3 +-
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                          |  39 ++++++++++
hw/core/sysbus-fdt.c                   |   2 +
hw/watchdog/sbsa_gwdt.c                |  66 +++++++++++------
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 ++++++++++
15 files changed, 325 insertions(+), 26 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
[PATCH v3 00/17] Add watchdog support to arm/virt board
Posted by Igor Mammedov 1 month ago
This series adds SBSA GWDT to the arm/virt machine with a WDAT table
tailored 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 (works on Linux, broken on Windows
without patches 16-17).

Patches 14-17 fix GWDT handling of direct WCV register writes
to match the SBSA spec. This fixes Windows 11 reboots when GWDT
is present without WDAT.
This is making GTDT watchdog sort of 'work' with Windows, modulo
that Windows sets timeout too far in the future, so in practice
watchdog would never trigger. (WDAT variant doesn't have this
issue).

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_v3

1) http://msdn.microsoft.com/en-us/windows/hardware/gg463320.aspx

Changelog:
  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:
    v2: https://patchew.org/QEMU/20260303092532.2410177-1-imammedo@redhat.com/
    v1: https://patchew.org/QEMU/20260206131438.1857182-1-imammedo@redhat.com/

Igor Mammedov (17):
  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
  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/arm/virt.h                  |   3 +
 include/hw/watchdog/sbsa_gwdt.h        |   3 +-
 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                          |  39 ++++++++++
 hw/core/sysbus-fdt.c                   |   2 +
 hw/watchdog/sbsa_gwdt.c                |  66 +++++++++++------
 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 ++++++++++
 15 files changed, 325 insertions(+), 26 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