X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=geekos%2Fsrc%2Fgeekos%2Fvm.c;h=fe7b44c68d7c1f4b521e43633754d582ecf07ca7;hb=335cd2faf2d617edccfbf561d03ae4cf3b178a93;hp=a951501614469d41b42c0b07fd10fbd74df9e986;hpb=d38e1d6edeee83bfb1e3e3c6e2367faa5055bdfe;p=palacios.git diff --git a/geekos/src/geekos/vm.c b/geekos/src/geekos/vm.c index a951501..fe7b44c 100644 --- a/geekos/src/geekos/vm.c +++ b/geekos/src/geekos/vm.c @@ -30,237 +30,123 @@ #include +#define MAGIC_CODE 0xf1e2d3c4 -#define SPEAKER_PORT 0x61 -static inline void VM_Out_Byte(ushort_t port, uchar_t value) -{ - __asm__ __volatile__ ( - "outb %b0, %w1" - : - : "a" (value), "Nd" (port) - ); -} - -/* - * Read a byte from an I/O port. - */ -static inline uchar_t VM_In_Byte(ushort_t port) -{ - uchar_t value; - - __asm__ __volatile__ ( - "inb %w1, %b0" - : "=a" (value) - : "Nd" (port) - ); - - return value; -} +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]; +}; -int IO_Read(ushort_t port, void * dst, uint_t length, void * priv_data) { - - if (length != 1) { - return 0; - } - - *(uchar_t*)dst = VM_In_Byte(port); - return 1; -} - +extern void * g_ramdiskImage; +extern ulong_t s_ramdiskSize; -int IO_Write(ushort_t port, void * src, uint_t length, void * priv_data) { - - if (length != 1) { - return 0; - } - - VM_Out_Byte(port, *(uchar_t *)src); - - return 1; -} +int RunVMM(struct Boot_Info * bootInfo) { + struct v3_os_hooks os_hooks; + 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)); + memset(&vm_config, 0, sizeof(struct v3_vm_config)); -int IO_Read_to_Serial(ushort_t port, void * dst, uint_t length, void * priv_data) { - PrintBoth("Input from Guest on port %d (0x%x) Length=%d\n", port, port, length); - return 0; -} - - -char * bochs_debug_buf = NULL; -int bochs_debug_offset = 0; - -char * bochs_info_buf = NULL; -int bochs_info_offset = 0; + os_hooks.print_debug = &SerialPrint; + os_hooks.print_info = &Print; + os_hooks.print_trace = &SerialPrint; + os_hooks.allocate_pages = &Allocate_VMM_Pages; + os_hooks.free_page = &Free_VMM_Page; + os_hooks.malloc = &VMM_Malloc; + os_hooks.free = &VMM_Free; + os_hooks.vaddr_to_paddr = &Identity; + os_hooks.paddr_to_vaddr = &Identity; + os_hooks.hook_interrupt = &geekos_hook_interrupt; + os_hooks.ack_irq = &ack_irq; + os_hooks.get_cpu_khz = &get_cpu_khz; -int IO_BOCHS_debug(ushort_t port, void * src, uint_t length, void * priv_data) { - if (!bochs_debug_buf) { - bochs_debug_buf = (char*)Malloc(1024); - } + + Init_V3(&os_hooks, &v3_ops); - bochs_debug_buf[bochs_debug_offset++] = *(char*)src; - if ((*(char*)src == 0xa) || (bochs_debug_offset == 1023)) { - SerialPrint("BOCHSDEBUG>%s", bochs_debug_buf); - memset(bochs_debug_buf, 0, 1024); - bochs_debug_offset = 0; - } + extern char _binary___palacios_vm_kernel_start; + PrintBoth(" Guest Load Addr: 0x%x\n", &_binary___palacios_vm_kernel_start); - return length; -} + struct guest_mem_layout * layout = (struct guest_mem_layout *)&_binary___palacios_vm_kernel_start; -int IO_BOCHS_info(ushort_t port, void * src, uint_t length, void * priv_data) { - if (!bochs_info_buf) { - bochs_info_buf = (char*)Malloc(1024); + if (layout->magic != MAGIC_CODE) { + + PrintBoth("Layout Magic Mismatch (0x%x)\n", layout->magic); + return -1; } + + PrintBoth("%d layout regions\n", layout->num_regions); + + region_start = (void *)&(layout->regions[layout->num_regions]); + + PrintBoth("region start = 0x%x\n", region_start); + - bochs_info_buf[bochs_info_offset++] = *(char*)src; + { + 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; - if ((*(char*)src == 0xa) || (bochs_info_offset == 1023)) { - SerialPrint("BOCHSINFO>%s", bochs_info_buf); - memset(bochs_info_buf, 0, 1024); - bochs_info_offset = 0; - } + vm_config.mem_size = 128 * 1024 * 1024; + + vm_config.mem_size = 128 * 1024 * 1024; - return length; -} + region_start += rombios->length; +#ifdef PROFILE_VMM + vm_config.enable_profiling = 1; +#else + vm_config.enable_profiling = 0; +#endif -int IO_Write_to_Serial(ushort_t port, void * src, uint_t length, void * priv_data) { - SerialPrint("Output from Guest on port %d (0x%x) Length=%d\n", port, port, length); - switch (length) { - - case 1: - SerialPrint(">0x%.2x\n", *(char*)src); - break; - case 2: - SerialPrint(">0x%.4x\n", *(ushort_t*)src); - break; - case 4: - SerialPrint(">0x%.8x\n", *(uint_t*)src); - break; - default: - break; + vm_config.vgabios = region_start; + vm_config.vgabios_size = vgabios->length; } - // SerialMemDump(src, length); - return length; -} - -void BuzzVM() -{ - int x; - int j; - unsigned char init; -#if 0 - __asm__ __volatile__ ( - "popf" - ); - -#endif - - PrintBoth("Starting To Buzz\n"); - - init=VM_In_Byte(SPEAKER_PORT); - - while (1) { - VM_Out_Byte(SPEAKER_PORT, init|0x2); - for (j=0;j<1000000;j++) { - x+=j; - } - VM_Out_Byte(SPEAKER_PORT, init); - for (j=0;j<1000000;j++) { - x+=j; - } + if (g_ramdiskImage != NULL) { + vm_config.use_ramdisk = 1; + vm_config.ramdisk = g_ramdiskImage; + vm_config.ramdisk_size = s_ramdiskSize; } -} - - -/* -int passthrough_mem_read(void * guest_addr, void * dst, uint_t length, void * priv_data) { - memcpy(dst, (void*)guest_addr, length); - return length; -} - -int passthrough_mem_write(void * guest_addr, void * src, uint_t length, void * priv_data) { - memcpy((void*)guest_addr, src, length); - return length; -} -*/ - - -/* We need a configuration mechanism, so we can wrap this completely inside the VMM code, - * with no pollution into the HOST OS - */ - -int RunVMM(struct Boot_Info * bootInfo) { - void * config_data; - - struct vmm_os_hooks os_hooks; - struct vmm_ctrl_ops vmm_ops; - struct guest_info * vm_info = 0; - - - - - memset(&os_hooks, 0, sizeof(struct vmm_os_hooks)); - memset(&vmm_ops, 0, sizeof(struct vmm_ctrl_ops)); - - - os_hooks.print_debug = &SerialPrint; - os_hooks.print_info = &Print; - os_hooks.print_trace = &SerialPrint; - os_hooks.allocate_pages = &Allocate_VMM_Pages; - os_hooks.free_page = &Free_VMM_Page; - os_hooks.malloc = &VMM_Malloc; - os_hooks.free = &VMM_Free; - os_hooks.vaddr_to_paddr = &Identity; - os_hooks.paddr_to_vaddr = &Identity; - os_hooks.hook_interrupt = &geekos_hook_interrupt_new; - os_hooks.ack_irq = &ack_irq; - os_hooks.get_cpu_khz = &get_cpu_khz; - - Init_V3(&os_hooks, &vmm_ops); + vm_info = (v3_ops).allocate_guest(); - extern char _binary___palacios_vm_kernel_start; - PrintBoth(" Guest Load Addr: 0x%x\n", &_binary___palacios_vm_kernel_start); - - config_data = &_binary___palacios_vm_kernel_start; - - vm_info = (vmm_ops).allocate_guest(); + Init_Stubs(vm_info); PrintBoth("Allocated Guest\n"); - (vmm_ops).config_guest(vm_info, config_data); + (v3_ops).config_guest(vm_info, &vm_config); PrintBoth("Configured guest\n"); - - //v3_hook_io_port(&vm_info, 0x05, &IO_Read, &IO_Write_to_Serial, NULL); - - //v3_hook_io_port(vm_info, 0x61, &IO_Read, &IO_Write, NULL); - //v3_hook_io_port(vm_info, 0x400, &IO_Read, &IO_Write_to_Serial, NULL); - //v3_hook_io_port(vm_info, 0x401, &IO_Read, &IO_Write_to_Serial, NULL); - //v3_hook_io_port(vm_info, 0x402, &IO_Read, &IO_BOCHS_info, NULL); - //v3_hook_io_port(vm_info, 0x403, &IO_Read, &IO_BOCHS_debug, NULL); - - - (vmm_ops).init_guest(vm_info); + (v3_ops).init_guest(vm_info); PrintBoth("Starting Guest\n"); //Clear_Screen(); - (vmm_ops).start_guest(vm_info); + + (v3_ops).start_guest(vm_info); return 0; }