X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_dev_mgr.c;h=65d01f47586b96c0755d168c4dadb23da2f4ab58;hp=fcbd93c7d56b75d67778c838beca9777334ad336;hb=5f0b4f8c5f9f53cea37dde072b37d09ba316487d;hpb=37c18b2c2335a41c68c2f0b779fd2b7d51ab216d diff --git a/palacios/src/palacios/vmm_dev_mgr.c b/palacios/src/palacios/vmm_dev_mgr.c index fcbd93c..65d01f4 100644 --- a/palacios/src/palacios/vmm_dev_mgr.c +++ b/palacios/src/palacios/vmm_dev_mgr.c @@ -23,7 +23,7 @@ #include -#ifndef DEBUG_DEV_MGR +#ifndef CONFIG_DEBUG_DEV_MGR #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -48,11 +48,15 @@ int v3_init_devices() { extern struct v3_device_info __start__v3_devices[]; extern struct v3_device_info __stop__v3_devices[]; struct v3_device_info * tmp_dev = __start__v3_devices; - int num_devices = (__stop__v3_devices - __start__v3_devices) / sizeof(struct v3_device_info); int i = 0; +#ifdef CONFIG_DEBUG_DEV_MGR + { + int num_devices = (__stop__v3_devices - __start__v3_devices) / sizeof(struct v3_device_info); + PrintDebug("%d Virtual devices registered with Palacios\n", num_devices); + } +#endif - PrintDebug("%d Virtual devices registered with Palacios\n", num_devices); PrintDebug("Start addres=%p, Stop address=%p\n", __start__v3_devices, __stop__v3_devices); master_dev_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn); @@ -90,6 +94,14 @@ int v3_init_dev_mgr(struct guest_info * info) { mgr->dev_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn); + INIT_LIST_HEAD(&(mgr->blk_list)); + INIT_LIST_HEAD(&(mgr->net_list)); + INIT_LIST_HEAD(&(mgr->console_list)); + + mgr->blk_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn); + mgr->net_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn); + mgr->console_table = v3_create_htable(0, dev_hash_fn, dev_eq_fn); + return 0; } @@ -109,7 +121,7 @@ int v3_dev_mgr_deinit(struct guest_info * info) { -int v3_create_device(struct guest_info * info, const char * dev_name, void * cfg_data) { +int v3_create_device(struct guest_info * info, const char * dev_name, v3_cfg_tree_t * cfg) { int (*dev_init)(struct guest_info * info, void * cfg_data); dev_init = (void *)v3_htable_search(master_dev_table, (addr_t)dev_name); @@ -120,7 +132,7 @@ int v3_create_device(struct guest_info * info, const char * dev_name, void * cfg } - if (dev_init(info, cfg_data) == -1) { + if (dev_init(info, cfg) == -1) { PrintError("Could not initialize Device %s\n", dev_name); return -1; } @@ -138,6 +150,10 @@ void v3_free_device(struct vm_device * dev) { struct vm_device * v3_find_dev(struct guest_info * info, const char * dev_name) { struct vmm_dev_mgr * mgr = &(info->dev_mgr); + if (!dev_name) { + return NULL; + } + return (struct vm_device *)v3_htable_search(mgr->dev_table, (addr_t)dev_name); } @@ -209,31 +225,146 @@ int v3_attach_device(struct guest_info * vm, struct vm_device * dev ) { } -#ifdef DEBUG_DEV_MGR -void PrintDebugDevMgr(struct guest_info * info) { +void v3_print_dev_mgr(struct guest_info * info) { struct vmm_dev_mgr * mgr = &(info->dev_mgr); struct vm_device * dev; - PrintDebug("%d devices registered with manager\n", mgr->num_devs); + V3_Print("%d devices registered with manager\n", mgr->num_devs); list_for_each_entry(dev, &(mgr->dev_list), dev_link) { - PrintDebugDev(dev); - PrintDebug("next..\n"); + V3_Print("Device: %s\n", dev->name); } return; } -void PrintDebugDev(struct vm_device * dev) { - PrintDebug("Device: %s\n", dev->name); + + +struct blk_frontend { + int (*connect)(struct guest_info * info, + void * frontend_data, + struct v3_dev_blk_ops * ops, + v3_cfg_tree_t * cfg, + void * priv_data); + + + struct list_head blk_node; + + void * priv_data; +}; + + + +int v3_dev_add_blk_frontend(struct guest_info * info, + char * name, + int (*connect)(struct guest_info * info, + void * frontend_data, + struct v3_dev_blk_ops * ops, + v3_cfg_tree_t * cfg, + void * priv_data), + void * priv_data) { + + struct blk_frontend * frontend = NULL; + + frontend = (struct blk_frontend *)V3_Malloc(sizeof(struct blk_frontend)); + memset(frontend, 0, sizeof(struct blk_frontend)); + + frontend->connect = connect; + frontend->priv_data = priv_data; + + list_add(&(frontend->blk_node), &(info->dev_mgr.blk_list)); + v3_htable_insert(info->dev_mgr.blk_table, (addr_t)(name), (addr_t)frontend); + + return 0; } +int v3_dev_connect_blk(struct guest_info * info, + char * frontend_name, + struct v3_dev_blk_ops * ops, + v3_cfg_tree_t * cfg, + void * private_data) { + + struct blk_frontend * frontend = NULL; + frontend = (struct blk_frontend *)v3_htable_search(info->dev_mgr.blk_table, + (addr_t)frontend_name); + + if (frontend == NULL) { + PrintError("Could not find frontend blk device %s\n", frontend_name); + return 0; + } + if (frontend->connect(info, frontend->priv_data, ops, cfg, private_data) == -1) { + PrintError("Error connecting to block frontend %s\n", frontend_name); + return -1; + } + + return 0; +} + + + +struct net_frontend { + int (*connect)(struct guest_info * info, + void * frontend_data, + struct v3_dev_net_ops * ops, + v3_cfg_tree_t * cfg, + void * priv_data); + + + struct list_head net_node; + + void * priv_data; +}; + + +int v3_dev_add_net_frontend(struct guest_info * info, + char * name, + int (*connect)(struct guest_info * info, + void * frontend_data, + struct v3_dev_net_ops * ops, + v3_cfg_tree_t * cfg, + void * private_data), + void * priv_data) +{ + struct net_frontend * frontend = NULL; + + frontend = (struct net_frontend *)V3_Malloc(sizeof(struct net_frontend)); + memset(frontend, 0, sizeof(struct net_frontend)); + + frontend->connect = connect; + frontend->priv_data = priv_data; + + list_add(&(frontend->net_node), &(info->dev_mgr.net_list)); + v3_htable_insert(info->dev_mgr.net_table, (addr_t)(name), (addr_t)frontend); + + return 0; +} + + +int v3_dev_connect_net(struct guest_info * info, + char * frontend_name, + struct v3_dev_net_ops * ops, + v3_cfg_tree_t * cfg, + void * private_data) +{ + struct net_frontend * frontend = NULL; + + frontend = (struct net_frontend *)v3_htable_search(info->dev_mgr.net_table, + (addr_t)frontend_name); + + if (frontend == NULL) { + PrintError("Could not find frontend net device %s\n", frontend_name); + return 0; + } + + if (frontend->connect(info, frontend->priv_data, ops, cfg, private_data) == -1) { + PrintError("Error connecting to net frontend %s\n", frontend_name); + return -1; + } + + return 0; +} -#else -void PrintDebugDevMgr(struct guest_info * info) {} -void PrintDebugDev(struct vm_device * dev) {} -#endif