From: Jack Lange Date: Wed, 8 Jul 2009 22:26:23 +0000 (-0500) Subject: changed configuration structure for block devices X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=ddd8ed1df60f75104096a8b6a9996ef5f462f594 changed configuration structure for block devices --- diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 92ba208..065021e 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -268,6 +268,23 @@ struct v3_os_hooks { }; + +typedef enum {NONE, HARDDRIVE, CDROM} v3_disk_type_t; +typedef enum {RAM, NETWORK} v3_disk_connection_t; + +union v3_disk_info { + struct { + void * data_ptr; + int size; + } ram; + + struct { + char * ip_str; + int port; + char * disk_name; + } net; +}; + struct v3_vm_config { void * rombios; int rombios_size; @@ -279,19 +296,18 @@ struct v3_vm_config { // so we can specify maximum physical address size // (We're screwed if we want to do 32 bit host/64 bit guest) - int enable_profiling; int enable_nested_paging; int enable_pci; - - int use_ram_cd; - int use_ram_hd; - int use_net_cd; - int use_net_hd; - - void * ramdisk; - int ramdisk_size; + + v3_disk_type_t pri_disk_type; + v3_disk_connection_t pri_disk_con; + union v3_disk_info pri_disk_info; + + v3_disk_type_t sec_disk_type; + v3_disk_connection_t sec_disk_con; + union v3_disk_info sec_disk_info; }; diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index a716c5c..f917f67 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -211,7 +212,8 @@ static int setup_memory_map(struct guest_info * info, struct v3_vm_config * conf static int setup_devices(struct guest_info * info, struct v3_vm_config * config_ptr) { struct vm_device * ide = NULL; - struct vm_device * ramdisk = NULL; + struct vm_device * primary_disk = NULL; + struct vm_device * secondary_disk = NULL; struct vm_device * pci = NULL; struct vm_device * northbridge = NULL; @@ -245,24 +247,70 @@ static int setup_devices(struct guest_info * info, struct v3_vm_config * config_ nvram = v3_create_nvram(ide); - if (config_ptr->use_ram_cd == 1) { - PrintDebug("Creating RAM CD\n"); - ramdisk = v3_create_ram_cd(ide, 0, 0, - (addr_t)(config_ptr->ramdisk), - config_ptr->ramdisk_size); - } else if (config_ptr->use_ram_hd == 1) { - PrintDebug("Creating Ram HD\n"); - ramdisk = v3_create_ram_hd(ide, 0, 0, - (addr_t)(config_ptr->ramdisk), - config_ptr->ramdisk_size); - } else if (config_ptr->use_net_cd == 1) { - PrintDebug("Creating NET CD\n"); - ramdisk = v3_create_net_cd(ide, 0, 0, - "172.22.0.1", 9502, - "puppy-iso"); + if (config_ptr->pri_disk_type != NONE) { + if (config_ptr->pri_disk_type == CDROM) { + if (config_ptr->pri_disk_con == RAM) { + PrintDebug("Creating RAM CD\n"); + primary_disk = v3_create_ram_cd(ide, 0, 0, + (addr_t)(config_ptr->pri_disk_info.ram.data_ptr), + config_ptr->pri_disk_info.ram.size); + } else if (config_ptr->pri_disk_con == NETWORK) { + PrintDebug("Creating NET CD\n"); + primary_disk = v3_create_net_cd(ide, 0, 0, + config_ptr->pri_disk_info.net.ip_str, + config_ptr->pri_disk_info.net.port, + config_ptr->pri_disk_info.net.disk_name); + } + } else if (config_ptr->pri_disk_type == HARDDRIVE) { + if (config_ptr->pri_disk_con == RAM) { + PrintDebug("Creating RAM HD\n"); + primary_disk = v3_create_ram_hd(ide, 0, 0, + (addr_t)(config_ptr->pri_disk_info.ram.data_ptr), + config_ptr->pri_disk_info.ram.size); + } else if (config_ptr->pri_disk_con == NETWORK) { + PrintDebug("Creating NET HD\n"); + primary_disk = v3_create_net_hd(ide, 0, 0, + config_ptr->pri_disk_info.net.ip_str, + config_ptr->pri_disk_info.net.port, + config_ptr->pri_disk_info.net.disk_name); + } + } } + + if (config_ptr->sec_disk_type != NONE) { + if (config_ptr->sec_disk_type == CDROM) { + if (config_ptr->sec_disk_con == RAM) { + PrintDebug("Creating RAM CD\n"); + secondary_disk = v3_create_ram_cd(ide, 0, 1, + (addr_t)(config_ptr->sec_disk_info.ram.data_ptr), + config_ptr->sec_disk_info.ram.size); + } else if (config_ptr->sec_disk_con == NETWORK) { + PrintDebug("Creating NET CD\n"); + secondary_disk = v3_create_net_cd(ide, 0, 1, + config_ptr->sec_disk_info.net.ip_str, + config_ptr->sec_disk_info.net.port, + config_ptr->sec_disk_info.net.disk_name); + } + } else if (config_ptr->sec_disk_type == HARDDRIVE) { + if (config_ptr->sec_disk_con == RAM) { + PrintDebug("Creating RAM HD\n"); + secondary_disk = v3_create_ram_hd(ide, 0, 1, + (addr_t)(config_ptr->sec_disk_info.ram.data_ptr), + config_ptr->sec_disk_info.ram.size); + } else if (config_ptr->sec_disk_con == NETWORK) { + PrintDebug("Creating NET HD\n"); + secondary_disk = v3_create_net_hd(ide, 0, 1, + config_ptr->sec_disk_info.net.ip_str, + config_ptr->sec_disk_info.net.port, + config_ptr->sec_disk_info.net.disk_name); + } + } + } + + + if (use_generic) { generic = configure_generic(info, config_ptr); } @@ -292,8 +340,12 @@ static int setup_devices(struct guest_info * info, struct v3_vm_config * config_ PrintDebug("Attaching IDE\n"); v3_attach_device(info, ide); - if (ramdisk != NULL) { - v3_attach_device(info, ramdisk); + if (primary_disk != NULL) { + v3_attach_device(info, primary_disk); + } + + if (secondary_disk != NULL) { + v3_attach_device(info, secondary_disk); } if (use_generic) {