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 <fengwei.yin@intel.com>
Acked-by: Eddie Dong <Eddie.dong@intel.com>
This commit is contained in:
Yin Fengwei 2018-03-30 15:06:27 +08:00 committed by Jack Ren
parent f6db755c7f
commit 80a9fe5b37
4 changed files with 35 additions and 0 deletions

View File

@ -542,6 +542,7 @@ do_close_post(struct vmctx *ctx)
{ {
pci_irq_deinit(ctx); pci_irq_deinit(ctx);
deinit_pci(ctx); deinit_pci(ctx);
atkbdc_deinit(ctx);
vm_destroy(ctx); vm_destroy(ctx);
vm_close(ctx); vm_close(ctx);
} }

View File

@ -422,6 +422,7 @@ atkbdc_init(struct vmctx *ctx)
assert(base != NULL); assert(base != NULL);
base->ctx = ctx; base->ctx = ctx;
ctx->atkbdc_base = base;
pthread_mutex_init(&base->mtx, NULL); pthread_mutex_init(&base->mtx, NULL);
@ -457,6 +458,33 @@ atkbdc_init(struct vmctx *ctx)
base->ps2mouse = ps2mouse_init(base); 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 static void
atkbdc_dsdt(void) atkbdc_dsdt(void)
{ {

View File

@ -114,6 +114,7 @@ struct atkbdc_base {
}; };
void atkbdc_init(struct vmctx *ctx); void atkbdc_init(struct vmctx *ctx);
void atkbdc_deinit(struct vmctx *ctx);
void atkbdc_event(struct atkbdc_base *base, int iskbd); void atkbdc_event(struct atkbdc_base *base, int iskbd);
#endif /* _ATKBDC_H_ */ #endif /* _ATKBDC_H_ */

View File

@ -34,6 +34,8 @@
#include "types.h" #include "types.h"
#include "vmm.h" #include "vmm.h"
#include "atkbdc.h"
/* /*
* API version for out-of-tree consumers for making compile time decisions. * API version for out-of-tree consumers for making compile time decisions.
*/ */
@ -54,6 +56,9 @@ struct vmctx {
char *baseaddr; char *baseaddr;
char *name; char *name;
uuid_t vm_uuid; uuid_t vm_uuid;
/* fields to track virtual devices */
struct atkbdc_base *atkbdc_base;
}; };
/* /*