From 80a9fe5b37f9ecaf2e0d56b309abaecc4bc8b61b Mon Sep 17 00:00:00 2001 From: Yin Fengwei Date: Fri, 30 Mar 2018 15:06:27 +0800 Subject: [PATCH] DM: add deinit function to virtual keyboard device old code has no deinit functionality for virtual keyboard device. Which will trigger resource leak when system is reboot. deinit function is added to: 1. deinit low ps2 based keyboard and mouse 2. release memory/io resource of virtual keyboard device NOTE: IRQ resource will be handed in pci irq module Signed-off-by: Yin Fengwei Acked-by: Eddie Dong --- devicemodel/core/main.c | 1 + devicemodel/hw/platform/atkbdc.c | 28 ++++++++++++++++++++++++++++ devicemodel/include/atkbdc.h | 1 + devicemodel/include/vmmapi.h | 5 +++++ 4 files changed, 35 insertions(+) diff --git a/devicemodel/core/main.c b/devicemodel/core/main.c index 8e54c6947..f205a7a8c 100644 --- a/devicemodel/core/main.c +++ b/devicemodel/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/devicemodel/hw/platform/atkbdc.c b/devicemodel/hw/platform/atkbdc.c index 0ced38759..ebf564d9e 100644 --- a/devicemodel/hw/platform/atkbdc.c +++ b/devicemodel/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/devicemodel/include/atkbdc.h b/devicemodel/include/atkbdc.h index 0fe62e235..0910469bc 100644 --- a/devicemodel/include/atkbdc.h +++ b/devicemodel/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/devicemodel/include/vmmapi.h b/devicemodel/include/vmmapi.h index 0c8491d66..75fec85c6 100644 --- a/devicemodel/include/vmmapi.h +++ b/devicemodel/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; }; /*