From: Kevin Pedretti Date: Tue, 21 Oct 2008 22:07:41 +0000 (-0500) Subject: Merge branch 'kitten' of ssh://sharedev@newskysaw.cs.northwestern.edu/home/sharedev... X-Git-Tag: 1.0^2~30^2~2 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=31f3a09733e4399173dafbed02b7dad6f18bbbb2;hp=f96c8f76db88b8a91066736959869cdb7df02253;p=palacios.git Merge branch 'kitten' of ssh://sharedev@newskysaw.cs.northwestern.edu/home/sharedev/palacios into kitten --- diff --git a/geekos/src/geekos/vm.c b/geekos/src/geekos/vm.c index 003d97e..c391c63 100644 --- a/geekos/src/geekos/vm.c +++ b/geekos/src/geekos/vm.c @@ -30,6 +30,21 @@ #include +#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]; +}; + + extern void * g_ramdiskImage; extern ulong_t s_ramdiskSize; @@ -40,6 +55,7 @@ int RunVMM(struct Boot_Info * bootInfo) { struct v3_ctrl_ops v3_ops; struct guest_info * vm_info = 0; struct v3_vm_config vm_config; + void * region_start; memset(&os_hooks, 0, sizeof(struct v3_os_hooks)); memset(&v3_ops, 0, sizeof(struct v3_ctrl_ops)); @@ -66,10 +82,38 @@ int RunVMM(struct Boot_Info * bootInfo) { extern char _binary___palacios_vm_kernel_start; PrintBoth(" Guest Load Addr: 0x%x\n", &_binary___palacios_vm_kernel_start); + + struct guest_mem_layout * layout = (struct guest_mem_layout *)&_binary___palacios_vm_kernel_start; + + if (layout->magic != MAGIC_CODE) { + + PrintBoth("Layout Magic Mismatch (0x%x)\n", layout->magic); + return -1; + } - vm_config.vm_kernel = &_binary___palacios_vm_kernel_start; + PrintBoth("%d layout regions\n", layout->num_regions); + region_start = (void *)&(layout->regions[layout->num_regions]); + PrintBoth("region start = 0x%x\n", region_start); + + + { + struct layout_region * rombios = &(layout->regions[0]); + struct layout_region * vgabios = &(layout->regions[1]); + + vm_config.rombios = region_start; + vm_config.rombios_size = rombios->length; + + region_start += rombios->length; + + vm_config.vgabios = region_start; + vm_config.vgabios_size = vgabios->length; + } + + + + if (g_ramdiskImage != NULL) { vm_config.use_ramdisk = 1; vm_config.ramdisk = g_ramdiskImage; diff --git a/kitten/arch/x86_64/boot/Makefile b/kitten/arch/x86_64/boot/Makefile index 28dcf2f..7f3f363 100644 --- a/kitten/arch/x86_64/boot/Makefile +++ b/kitten/arch/x86_64/boot/Makefile @@ -57,7 +57,11 @@ $(obj)/compressed/vmlwk: FORCE # Set this if you want to pass append arguments to the isoimage kernel FDARGS = console=vga,serial debug_mptable=1 init_argv="one two three" init_envp="one=1 two=2 three=3" # Set this if you want an initrd included with the isoimage kernel +ifdef CONFIG_V3VEE +FDINITRD = /opt/vmm-tools/isos/puppy.iso +else FDINITRD = init_task +endif image_cmdline = default lwk $(FDARGS) $(if $(FDINITRD),initrd=initrd.img,) diff --git a/kitten/arch/x86_64/kernel/e820.c b/kitten/arch/x86_64/kernel/e820.c index b007356..2799607 100644 --- a/kitten/arch/x86_64/kernel/e820.c +++ b/kitten/arch/x86_64/kernel/e820.c @@ -319,10 +319,13 @@ void __init e820_print_map(char *who) { int i; char type[16]; + size_t total_size = 0; for (i = 0; i < e820.nr_map; i++) { - switch (e820.map[i].type) { + const struct e820entry * entry = &e820.map[i]; + switch (entry->type) { case E820_RAM: sprintf(type, "(usable)\n"); + total_size += entry->size; break; case E820_RESERVED: sprintf(type, "(reserved)\n"); @@ -333,16 +336,19 @@ void __init e820_print_map(char *who) case E820_NVS: sprintf(type, "(ACPI NVS)\n"); break; - default: sprintf(type, "type %u\n", e820.map[i].type); + default: sprintf(type, "type %u\n", entry->type); break; } printk(KERN_DEBUG - " %s: %016Lx - %016Lx %s", who, - (unsigned long long) e820.map[i].addr, - (unsigned long long) (e820.map[i].addr + e820.map[i].size), + " %s: %016Lx - %016Lx %s", + who, + (unsigned long long) entry->addr, + (unsigned long long) (entry->addr + entry->size), type); } + + printk( KERN_DEBUG "Total usable memory %ld bytes\n", total_size ); } /* diff --git a/kitten/boot-kitten b/kitten/boot-kitten new file mode 100755 index 0000000..dc5b9f7 --- /dev/null +++ b/kitten/boot-kitten @@ -0,0 +1,8 @@ +#!/bin/sh + +exec /usr/local/qemu/bin/qemu-system-x86_64 \ + -m 1024 \ + -nographic \ + -cdrom ./arch/x86_64/boot/image.iso \ + < /dev/null + diff --git a/kitten/include/lwk/palacios.h b/kitten/include/lwk/palacios.h index fb3fa5b..599b6c6 100644 --- a/kitten/include/lwk/palacios.h +++ b/kitten/include/lwk/palacios.h @@ -10,6 +10,80 @@ extern uint8_t rombios_start, rombios_end; extern uint8_t vgabios_start, vgabios_end; + +/* + * OS Hooks required to interface with the V3VEE library + */ +extern void +v3vee_print_config( + const char * fmt, + ... +) __attribute__((format(printf,1,2))); + + +extern void +v3vee_print_debug( + const char * fmt, + ... +) __attribute__((format(printf,1,2))); + + +extern void +v3vee_print_trace( + const char * fmt, + ... +) __attribute__((format(printf,1,2))); + + +extern void * +v3vee_allocate_pages( int num_pages ); + + +extern void +v3vee_free_page( void * page ); + + +extern void * +v3vee_malloc( unsigned int size ); + + +extern void +v3vee_free( void * addr ); + + +extern void * +v3vee_paddr_to_vaddr( void * addr ); + + +extern void * +v3vee_vaddr_to_paddr( void * addr ); + + +extern int +v3vee_hook_interrupt( + struct guest_info * vm, + unsigned int irq +); + + +extern int +v3vee_ack_irq( + int irq +); + + +unsigned int +v3vee_get_cpu_khz( void ); + + +void +v3vee_start_kernel_thread( void ); + + +void +v3vee_yield_cpu( void ); + + #endif // CONFIG_V3VEE #endif diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 4708cc1..5fcfeb3 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -223,7 +223,12 @@ struct v3_os_hooks { struct v3_vm_config { - void * vm_kernel; + void * rombios; + int rombios_size; + + void * vgabios; + int vgabios_size; + int use_ramdisk; void * ramdisk; int ramdisk_size; diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index b80c0eb..10742f7 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -37,20 +37,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 @@ -78,11 +67,8 @@ static int passthrough_mem_write(addr_t guest_addr, void * src, uint_t length, v int v3_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; 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; @@ -112,37 +98,40 @@ int v3_config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) 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(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%x-0x%x) -> 0x%x\n", + ROMBIOS_START, + ROMBIOS_START + (num_pages * PAGE_SIZE), + 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(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%x-0x%x) -> 0x%x\n", + VGABIOS_START, + VGABIOS_START + (num_pages * PAGE_SIZE), + guest_mem); } - + // add_shadow_region_passthrough(info, 0x0, 0xa0000, (addr_t)V3_AllocPages(160));