X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_config.c;h=f7ae6e310d99f57087c4b70dace55583c3aa70e6;hb=66a1a4c7a9edcd7d8bc207aca093d694a6e6b5b2;hp=d368eb4a9865204026a4cc3bd52a218be5dec132;hpb=1c46db5ec8d086d76f7120a638199564947694d3;p=palacios.git diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index d368eb4..f7ae6e3 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -17,6 +17,7 @@ * redistribute, and modify it as specified in the file "V3VEE_LICENSE". */ + #include #include #include @@ -37,20 +38,9 @@ #define USE_GENERIC 1 -#define MAGIC_CODE 0xf1e2d3c4 - - - -struct layout_region { - ulong_t length; - ulong_t final_addr; -}; -struct guest_mem_layout { - ulong_t magic; - ulong_t num_regions; - struct layout_region regions[0]; -}; +#define ROMBIOS_START 0x000f0000 +#define VGABIOS_START 0x000c0000 @@ -61,7 +51,7 @@ static int mem_test_read(addr_t guest_addr, void * dst, uint_t length, void * pr memcpy(dst, &foo, length); - PrintDebug("Passthrough mem read returning: %d (length=%d)\n", foo + (guest_addr & 0xfff), length); + PrintDebug("Passthrough mem read returning: %p (length=%d)\n", (void *)(foo + (guest_addr & 0xfff)), length); return length; } @@ -77,12 +67,9 @@ static int passthrough_mem_write(addr_t guest_addr, void * src, uint_t length, v -int config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) { - - struct guest_mem_layout * layout = (struct guest_mem_layout *)config_ptr->vm_kernel; +int v3_config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) { extern v3_cpu_arch_t v3_cpu_type; - void * region_start; - uint_t i; + int use_ramdisk = config_ptr->use_ramdisk; int use_generic = USE_GENERIC; @@ -94,7 +81,7 @@ int config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) { if (v3_cpu_type == V3_SVM_REV3_CPU) { info->shdw_pg_mode = NESTED_PAGING; } else { - init_shadow_page_state(info); + v3_init_shadow_page_state(info); info->shdw_pg_mode = SHADOW_PAGING; } @@ -102,47 +89,50 @@ int config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) { info->mem_mode = PHYSICAL_MEM; - init_vmm_io_map(info); - init_interrupt_state(info); + v3_init_vmm_io_map(info); + v3_init_interrupt_state(info); - dev_mgr_init(info); + v3_init_dev_mgr(info); - init_emulator(info); + v3_init_emulator(info); v3_init_host_events(info); - // SerialPrint("Guest Mem Dump at 0x%x\n", 0x100000); - //PrintDebugMemDump((unsigned char *)(0x100000), 261 * 1024); - if (layout->magic != MAGIC_CODE) { + + /* layout rombios */ + { + uint_t num_pages = (config_ptr->rombios_size + PAGE_SIZE - 1) / PAGE_SIZE; + void * guest_mem = V3_AllocPages(num_pages); + + PrintDebug("Layout Region %d bytes\n", config_ptr->rombios_size); + memcpy(V3_VAddr(guest_mem), config_ptr->rombios, config_ptr->rombios_size); + + add_shadow_region_passthrough(info, ROMBIOS_START, ROMBIOS_START + (num_pages * PAGE_SIZE), (addr_t)guest_mem); - PrintDebug("Layout Magic Mismatch (0x%x)\n", layout->magic); - return -1; + PrintDebug("Adding Shadow Region (0x%p-0x%p) -> 0x%p\n", + (void *)ROMBIOS_START, + (void *)ROMBIOS_START + (num_pages * PAGE_SIZE), + (void *)guest_mem); } - - PrintDebug("%d layout regions\n", layout->num_regions); - - region_start = (void *)&(layout->regions[layout->num_regions]); - - PrintDebug("region start = 0x%x\n", region_start); - - for (i = 0; i < layout->num_regions; i++) { - struct layout_region * reg = &(layout->regions[i]); - uint_t num_pages = (reg->length / PAGE_SIZE) + ((reg->length % PAGE_SIZE) ? 1 : 0); - void * guest_mem = V3_AllocPages(num_pages); - - PrintDebug("Layout Region %d bytes\n", reg->length); - memcpy(guest_mem, region_start, reg->length); - - PrintDebugMemDump((unsigned char *)(guest_mem), 16); - - add_shadow_region_passthrough(info, reg->final_addr, reg->final_addr + (num_pages * PAGE_SIZE), (addr_t)guest_mem); - - PrintDebug("Adding Shadow Region (0x%x-0x%x) -> 0x%x\n", reg->final_addr, reg->final_addr + (num_pages * PAGE_SIZE), guest_mem); + + + /* layout vgabios */ + { + uint_t num_pages = (config_ptr->vgabios_size + PAGE_SIZE - 1) / PAGE_SIZE; + void * guest_mem = V3_AllocPages(num_pages); + + PrintDebug("Layout Region %d bytes\n", config_ptr->vgabios_size); + memcpy(V3_VAddr(guest_mem), config_ptr->vgabios, config_ptr->vgabios_size); + + add_shadow_region_passthrough(info, VGABIOS_START, VGABIOS_START + (num_pages * PAGE_SIZE), (addr_t)guest_mem); - region_start += reg->length; + PrintDebug("Adding Shadow Region (0x%p-0x%p) -> 0x%p\n", + (void *)VGABIOS_START, + (void *)VGABIOS_START + (num_pages * PAGE_SIZE), + (void *)guest_mem); } - + // add_shadow_region_passthrough(info, 0x0, 0xa0000, (addr_t)V3_AllocPages(160)); @@ -186,14 +176,14 @@ int config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) { { struct vm_device * ramdisk = NULL; struct vm_device * cdrom = NULL; - struct vm_device * nvram = create_nvram(); - //struct vm_device * timer = create_timer(); - struct vm_device * pic = create_pic(); - struct vm_device * keyboard = create_keyboard(); - struct vm_device * pit = create_pit(); - struct vm_device * bochs_debug = create_bochs_debug(); - - //struct vm_device * serial = create_serial(); + struct vm_device * nvram = v3_create_nvram(); + //struct vm_device * timer = v3_create_timer(); + struct vm_device * pic = v3_create_pic(); + struct vm_device * keyboard = v3_create_keyboard(); + struct vm_device * pit = v3_create_pit(); + struct vm_device * bochs_debug = v3_create_bochs_debug(); + + //struct vm_device * serial = v3_create_serial(); struct vm_device * generic = NULL; @@ -201,14 +191,14 @@ int config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) { if (use_ramdisk) { PrintDebug("Creating Ramdisk\n"); - ramdisk = create_ramdisk(); + ramdisk = v3_create_ramdisk(); cdrom = v3_create_cdrom(ramdisk, config_ptr->ramdisk, config_ptr->ramdisk_size); } if (use_generic) { PrintDebug("Creating Generic Device\n"); - generic = create_generic(); + generic = v3_create_generic(); // Make the DMA controller invisible v3_generic_add_port_range(generic, 0x00, 0x07, GENERIC_PRINT_AND_IGNORE); // DMA 1 channels 0,1,2,3 (address, counter)