#include "hw.h" #include "virtio-channel.h" typedef struct VirtConPortWatchdog { VirtConPort dev; QEMUTimer *timer; uint32_t timeout; } VirtConPortWatchdog; static void timer_expired(void *ptr) { VirtConPortWatchdog *s = ptr; watchdog_perform_action(); qemu_del_timer(s->timer); } static int watchdog_open(VirtConPort *dev) { VirtConPortWatchdog *s = DO_UPCAST(VirtConPortWatchdog, dev, dev); qemu_mod_timer(s->timer, qemu_get_clock (vm_clock) + s->timeout * get_ticks_per_sec()); } static int watchdog_data(VirtConPort *dev, uint8_t *buf, int len) { VirtConPortWatchdog *s = DO_UPCAST(VirtConPortWatchdog, dev, dev); qemu_mod_timer(s->timer, qemu_get_clock (vm_clock) + s->timeout * get_ticks_per_sec()); } static int watchdog_init(VirtConPort *dev) { VirtConPortWatchdog *s = DO_UPCAST(VirtConPortWatchdog, dev, dev); s->dev.name = "org.qemu.watchdog"; s->timer = qemu_new_timer(vm_clock, timer_expired, s); } VirtConPortInfo watchdog_info = { .qdev.name = "vmch-watchdog", .qdev.size = sizeof(VirtConPortWatchdog), .qdev.vmsd = /* todo */, .qdev.reset = /* todo */, .init = watchdog_init, .guest_open = watchdog_open, .data_for_you = watchdog_data, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("timeout", VirtConPortWatchdog, timeout, 120), DEFINE_PROP_END_OF_LIST }, }; void watchdog_register(void) { virtcon_port_qdev_register(&watchdog_info); } device_init(watchdog_register)