mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-25 06:51:49 +00:00
doc: add watchdog high-level design
Review, transcode, and publish watchdog high-level design doc. Signed-off-by: David B. Kinder <david.b.kinder@intel.com>
This commit is contained in:
parent
31285a9fdd
commit
55a71e402d
BIN
doc/developer-guides/images/watchdog-image1.png
Normal file
BIN
doc/developer-guides/images/watchdog-image1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 250 KiB |
BIN
doc/developer-guides/images/watchdog-image2.png
Normal file
BIN
doc/developer-guides/images/watchdog-image2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 135 KiB |
@ -28,6 +28,7 @@ specific areas within the ACRN hypervisor system.
|
|||||||
APL_GVT-g-hld.rst
|
APL_GVT-g-hld.rst
|
||||||
GVT-g-porting.rst
|
GVT-g-porting.rst
|
||||||
security-hld.rst
|
security-hld.rst
|
||||||
|
watchdog-hld.rst
|
||||||
|
|
||||||
Contributing to the project
|
Contributing to the project
|
||||||
***************************
|
***************************
|
||||||
|
98
doc/developer-guides/watchdog-hld.rst
Normal file
98
doc/developer-guides/watchdog-hld.rst
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
.. _watchdog-hld:
|
||||||
|
|
||||||
|
Watchdog Virtualization in Device Model
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
This document describes the watchdog virtualization implementation in
|
||||||
|
ACRN device model.
|
||||||
|
|
||||||
|
Overview
|
||||||
|
********
|
||||||
|
|
||||||
|
A watchdog is an important hardware component in embedded systems, used
|
||||||
|
to monitor the system's running status, and resets the processor if the
|
||||||
|
software crashes. In general, hardware watchdogs rely on a piece of
|
||||||
|
software running on the machine which must "kick" the watchdog device
|
||||||
|
regularly, say every 10 seconds. If the watchdog doesn't get "kicked"
|
||||||
|
after 60 seconds, for example, then the watchdog device asserts the
|
||||||
|
RESET line which results in a hard reboot.
|
||||||
|
|
||||||
|
For ACRN we emulate the watchdog hardware in the Intel 6300ESB chipset
|
||||||
|
as a PCI device called 6300ESB watchdog and is added into the Device
|
||||||
|
Model following the PCI device framework. The following
|
||||||
|
:numref:`watchdog-device` shows the watchdog device workflow:
|
||||||
|
|
||||||
|
.. figure:: images/watchdog-image2.png
|
||||||
|
:align: center
|
||||||
|
:width: 900px
|
||||||
|
:name: watchdog-device
|
||||||
|
|
||||||
|
Watchdog device flow
|
||||||
|
|
||||||
|
The DM in the Service OS (SOS) treats the watchdog as a passive device.
|
||||||
|
It receives read/write commands from the watchdog driver, does the
|
||||||
|
actions, and returns. In ACRN, the commands are from User OS (UOS)
|
||||||
|
watchdog driver.
|
||||||
|
|
||||||
|
UOS watchdog work flow
|
||||||
|
**********************
|
||||||
|
|
||||||
|
When the UOS does a read or write operation on the watchdog device's
|
||||||
|
registers or memory space (Port IO or Memory map I/O), it will trap into
|
||||||
|
the hypervisor. The hypervisor delivers the operation to the SOS/DM
|
||||||
|
through IPI (inter-process interrupt) or shared memory, and the DM
|
||||||
|
dispatches the operation to the watchdog emulation code.
|
||||||
|
|
||||||
|
After the DM watchdog finishes emulating the read or write operation, it
|
||||||
|
then calls ``ioctl`` to the SOS/kernel (``/dev/acrn_vhm``). VHM will call a
|
||||||
|
hypercall to trap into the hypervisor to tell it the operation is done, and
|
||||||
|
the hypervisor will set UOS-related VCPU registers and resume UOS so the
|
||||||
|
UOS watchdog driver will get the return values (or return status). The
|
||||||
|
:numref:`watchdog-workflow` below is a typical operation flow:
|
||||||
|
from UOS to SOS and return back:
|
||||||
|
|
||||||
|
.. figure:: images/watchdog-image1.png
|
||||||
|
:align: center
|
||||||
|
:width: 900px
|
||||||
|
:name: watchdog-workflow
|
||||||
|
|
||||||
|
Watchdog operation workflow
|
||||||
|
|
||||||
|
Implementation in ACRN and how to use it
|
||||||
|
****************************************
|
||||||
|
|
||||||
|
In ACRN, the Intel 6300ESB watchdog device emulation is added into the
|
||||||
|
DM PCI device tree. Its interface structure is (see
|
||||||
|
``devicemodel/include/pci_core.h``):
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
struct pci_vdev_ops pci_ops_wdt = {
|
||||||
|
.class_name = "wdt-i6300esb",
|
||||||
|
.vdev_init = pci_wdt_init,
|
||||||
|
.vdev_deinit = pci_wdt_deinit,
|
||||||
|
.vdev_cfgwrite = pci_wdt_cfg_write,
|
||||||
|
.vdev_cfgread = pci_wdt_cfg_read,
|
||||||
|
.vdev_barwrite = pci_wdt_bar_write,
|
||||||
|
.vdev_barread = pci_wdt_bar_read
|
||||||
|
};
|
||||||
|
|
||||||
|
All functions follow the ``pci_vdev_ops`` definitions for PCI device
|
||||||
|
emulation.
|
||||||
|
|
||||||
|
The main part in the watchdog emulation is the timer thread. It emulates
|
||||||
|
the watchdog device timeout management. When it gets the kick action
|
||||||
|
from the UOS, it resets the timer. If the timer expires before getting a
|
||||||
|
timely kick action, it will call DM API to reboot that UOS.
|
||||||
|
|
||||||
|
In the UOS launch script, add: ``-s xx,wdt-i6300esb`` into DM parameters.
|
||||||
|
(xx is the virtual PCI BDF number as with other PCI devices)
|
||||||
|
|
||||||
|
Make sure the UOS kernel has the I6300ESB driver enabled: ``CONFIG_I6300ESB_WDT=y``. After the UOS
|
||||||
|
boots up, the watchdog device will be created as node ``/dev/watchdog``,
|
||||||
|
and can be used as a normal device file.
|
||||||
|
|
||||||
|
Usually the UOS needs a watchdog service (daemon) to run in userland and
|
||||||
|
kick the watchdog periodically. If something prevents the daemon from
|
||||||
|
kicking the watchdog, for example the UOS system is hung, the watchdog
|
||||||
|
will timeout and the DM will reboot the UOS.
|
Loading…
Reference in New Issue
Block a user