diff --git a/core/main.c b/core/main.c index f205a7a8c..c68558439 100644 --- a/core/main.c +++ b/core/main.c @@ -543,6 +543,7 @@ do_close_post(struct vmctx *ctx) pci_irq_deinit(ctx); deinit_pci(ctx); atkbdc_deinit(ctx); + vrtc_deinit(ctx); vm_destroy(ctx); vm_close(ctx); } diff --git a/hw/platform/rtc.c b/hw/platform/rtc.c index 26e8fd38a..52650ea80 100644 --- a/hw/platform/rtc.c +++ b/hw/platform/rtc.c @@ -593,6 +593,12 @@ vrtc_create_timer(struct vrtc *vrtc, time_t sec, time_t nsec, void (*cb)()) return timerid; } +static void +vrtc_delete_timer(timer_t timerid) +{ + timer_delete(timerid); +} + static int vrtc_time_update(struct vrtc *vrtc, time_t newtime, time_t newbase) { @@ -1103,6 +1109,7 @@ vrtc_init(struct vmctx *ctx, int local_time) assert(vrtc != NULL); memset(vrtc, 0, sizeof(struct vrtc)); vrtc->vm = ctx; + ctx->vrtc = vrtc; pthread_mutex_init(&vrtc->mtx, NULL); @@ -1157,7 +1164,24 @@ vrtc_init(struct vmctx *ctx, int local_time) } void -vrtc_cleanup(struct vrtc *vrtc) +vrtc_deinit(struct vmctx *ctx) { + struct vrtc *vrtc = ctx->vrtc; + struct inout_port iop; + + memset(&iop, 0, sizeof(struct inout_port)); + iop.name = "rtc"; + iop.port = IO_RTC; + iop.size = 1; + unregister_inout(&iop); + + memset(&iop, 0, sizeof(struct inout_port)); + iop.name = "rtc"; + iop.port = IO_RTC + 1; + iop.size = 1; + unregister_inout(&iop); + + vrtc_delete_timer(vrtc->update_timer_id); free(vrtc); + ctx->vrtc = NULL; } diff --git a/include/rtc.h b/include/rtc.h index 18d993c1e..fedb0975c 100644 --- a/include/rtc.h +++ b/include/rtc.h @@ -37,7 +37,7 @@ struct vrtc; struct vmctx; struct vrtc *vrtc_init(struct vmctx *ctx, int local_time); -void vrtc_cleanup(struct vrtc *vrtc); +void vrtc_deinit(struct vmctx *ctx); void vrtc_reset(struct vrtc *vrtc); time_t vrtc_get_time(struct vrtc *vrtc); int vrtc_set_time(struct vrtc *vrtc, time_t secs); diff --git a/include/vmmapi.h b/include/vmmapi.h index 75fec85c6..06aef07c2 100644 --- a/include/vmmapi.h +++ b/include/vmmapi.h @@ -59,6 +59,7 @@ struct vmctx { /* fields to track virtual devices */ struct atkbdc_base *atkbdc_base; + struct vrtc *vrtc; }; /*