diff --git a/devicemodel/core/main.c b/devicemodel/core/main.c index 559d4b882..cfb0c0e16 100644 --- a/devicemodel/core/main.c +++ b/devicemodel/core/main.c @@ -322,6 +322,13 @@ delete_cpu(struct vmctx *ctx, int vcpu) return CPU_EMPTY(&cpumask); } +void +notify_vmloop_thread(void) +{ + pthread_kill(mt_vmm_info[0].mt_thr, SIGCONT); + return; +} + static void vmexit_inout(struct vmctx *ctx, struct vhm_request *vhm_req, int *pvcpu) { diff --git a/devicemodel/hw/pci/wdt_i6300esb.c b/devicemodel/hw/pci/wdt_i6300esb.c index 7a428a9d1..5397d5764 100644 --- a/devicemodel/hw/pci/wdt_i6300esb.c +++ b/devicemodel/hw/pci/wdt_i6300esb.c @@ -136,7 +136,9 @@ wdt_expired_handler(void *arg, uint64_t nexp) wdt_timeout = 1; /* watchdog timer out, set the uos to reboot */ - vm_set_suspend_mode(VM_SUSPEND_FULL_RESET); + vm_set_suspend_mode(VM_SUSPEND_SYSTEM_RESET); + /* Notify vm thread to handle VM_SUSPEND_SYSTEM_RESET request */ + notify_vmloop_thread(); mevent_notify(); } else { /* if not need reboot, just loop timer */ diff --git a/devicemodel/include/vmmapi.h b/devicemodel/include/vmmapi.h index ac2453159..dcc90f87a 100644 --- a/devicemodel/include/vmmapi.h +++ b/devicemodel/include/vmmapi.h @@ -101,6 +101,7 @@ int vm_attach_ioreq_client(struct vmctx *ctx); int vm_notify_request_done(struct vmctx *ctx, int vcpu); void vm_clear_ioreq(struct vmctx *ctx); void vm_set_suspend_mode(enum vm_suspend_how how); +void notify_vmloop_thread(void); int vm_get_suspend_mode(void); void vm_destroy(struct vmctx *ctx); int vm_parse_memsize(const char *optarg, size_t *memsize);