X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_dev_mgr.c;h=47834926cedfaf0cc5578e0dddc434653582fead;hb=a0d3be5212e7a5053ba213ce7bd26c7124cf01e3;hp=cd6857de1be75d18b5914818843c2c43adcea369;hpb=bc5ee3e07affac4810227d61c407011c05298518;p=palacios.releases.git diff --git a/palacios/src/palacios/vmm_dev_mgr.c b/palacios/src/palacios/vmm_dev_mgr.c index cd6857d..4783492 100644 --- a/palacios/src/palacios/vmm_dev_mgr.c +++ b/palacios/src/palacios/vmm_dev_mgr.c @@ -127,29 +127,6 @@ int v3_dev_mgr_deinit(struct v3_vm_info * vm) { return 0; } -/* -int v3_init_core_dev_mgr(struct v3_vm_info * vm) { - struct v3_core_dev_mgr * mgr = &(vm->core_dev_mgr); - - INIT_LIST_HEAD(&(mgr->dev_list)); - mgr->dev_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn); - - return 0; -} - -int v3_core_dev_mgr_deinit(struct v3_vm_info * vm) { - struct vm_device * dev; - struct v3_core_dev_mgr * mgr = &(vm->core_dev_mgr); - struct vm_device * tmp; - - list_for_each_entry_safe(dev, tmp, &(mgr->dev_list), dev_link) { - v3_detach_device(dev); - } - - // TODO: Clear hash tables - -} -*/ int v3_create_device(struct v3_vm_info * vm, const char * dev_name, v3_cfg_tree_t * cfg) { @@ -193,19 +170,58 @@ struct vm_device * v3_find_dev(struct v3_vm_info * vm, const char * dev_name) { /* The remaining functions are called by the devices themselves */ /****************************************************************/ +struct dev_io_hook { + uint16_t port; + + struct list_head node; + +}; + /* IO HOOKS */ int v3_dev_hook_io(struct vm_device * dev, uint16_t port, - int (*read)(struct guest_info * core, uint16_t port, void * dst, uint_t length, struct vm_device * dev), - int (*write)(struct guest_info * core, uint16_t port, void * src, uint_t length, struct vm_device * dev)) { - return v3_hook_io_port(dev->vm, port, - (int (*)(struct guest_info * core, ushort_t, void *, uint_t, void *))read, - (int (*)(struct guest_info * core, ushort_t, void *, uint_t, void *))write, - (void *)dev); + int (*read)(struct guest_info * core, uint16_t port, void * dst, uint_t length, void * priv_data), + int (*write)(struct guest_info * core, uint16_t port, void * src, uint_t length, void * priv_data)) { + struct dev_io_hook * io_hook = NULL; + int ret = 0; + + ret = v3_hook_io_port(dev->vm, port, + (int (*)(struct guest_info * core, ushort_t, void *, uint_t, void *))read, + (int (*)(struct guest_info * core, ushort_t, void *, uint_t, void *))write, + (void *)dev->private_data); + + if (ret == -1) { + return -1; + } + + io_hook = V3_Malloc(sizeof(struct dev_io_hook)); + + if (io_hook == NULL) { + PrintError("Could not allocate io hook dev state\n"); + return -1; + } + + io_hook->port = port; + list_add(&(io_hook->node), &(dev->io_hooks)); + + return 0; } int v3_dev_unhook_io(struct vm_device * dev, uint16_t port) { - return v3_unhook_io_port(dev->vm, port); + struct dev_io_hook * io_hook = NULL; + struct dev_io_hook * tmp; + + list_for_each_entry_safe(io_hook, tmp, &(dev->io_hooks), node) { + if (io_hook->port == port) { + + list_del(&(io_hook->node)); + V3_Free(io_hook); + + return v3_unhook_io_port(dev->vm, port); + } + } + + return -1; } @@ -236,6 +252,8 @@ struct vm_device * v3_allocate_device(char * name, dev = (struct vm_device*)V3_Malloc(sizeof(struct vm_device)); + INIT_LIST_HEAD(&(dev->io_hooks)); + strncpy(dev->name, name, 32); dev->ops = ops; dev->private_data = private_data;