diff --git a/core/main.c b/core/main.c index 8e54c6947..f205a7a8c 100644 --- a/core/main.c +++ b/core/main.c @@ -542,6 +542,7 @@ do_close_post(struct vmctx *ctx) { pci_irq_deinit(ctx); deinit_pci(ctx); + atkbdc_deinit(ctx); vm_destroy(ctx); vm_close(ctx); } diff --git a/hw/platform/atkbdc.c b/hw/platform/atkbdc.c index 0ced38759..ebf564d9e 100644 --- a/hw/platform/atkbdc.c +++ b/hw/platform/atkbdc.c @@ -422,6 +422,7 @@ atkbdc_init(struct vmctx *ctx) assert(base != NULL); base->ctx = ctx; + ctx->atkbdc_base = base; pthread_mutex_init(&base->mtx, NULL); @@ -457,6 +458,33 @@ atkbdc_init(struct vmctx *ctx) base->ps2mouse = ps2mouse_init(base); } +void +atkbdc_deinit(struct vmctx *ctx) +{ + struct inout_port iop; + struct atkbdc_base *base = ctx->atkbdc_base; + + ps2kbd_deinit(base); + base->ps2kbd = NULL; + ps2mouse_deinit(base); + base->ps2mouse = NULL; + + bzero(&iop, sizeof(struct inout_port)); + iop.name = "atkdbc"; + iop.port = KBD_DATA_PORT; + iop.size = 1; + unregister_inout(&iop); + + bzero(&iop, sizeof(struct inout_port)); + iop.name = "atkdbc"; + iop.port = KBD_STS_CTL_PORT; + iop.size = 1; + unregister_inout(&iop); + + free(base); + ctx->atkbdc_base = NULL; +} + static void atkbdc_dsdt(void) { diff --git a/include/atkbdc.h b/include/atkbdc.h index 0fe62e235..0910469bc 100644 --- a/include/atkbdc.h +++ b/include/atkbdc.h @@ -114,6 +114,7 @@ struct atkbdc_base { }; void atkbdc_init(struct vmctx *ctx); +void atkbdc_deinit(struct vmctx *ctx); void atkbdc_event(struct atkbdc_base *base, int iskbd); #endif /* _ATKBDC_H_ */ diff --git a/include/vmmapi.h b/include/vmmapi.h index 0c8491d66..75fec85c6 100644 --- a/include/vmmapi.h +++ b/include/vmmapi.h @@ -34,6 +34,8 @@ #include "types.h" #include "vmm.h" +#include "atkbdc.h" + /* * API version for out-of-tree consumers for making compile time decisions. */ @@ -54,6 +56,9 @@ struct vmctx { char *baseaddr; char *name; uuid_t vm_uuid; + + /* fields to track virtual devices */ + struct atkbdc_base *atkbdc_base; }; /*