X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=geekos%2Fsrc%2Fgeekos%2Fvm.c;h=32ee335a20b3c58417b69e0be6a8301e2217f88b;hb=fb91fde04192e1d9a32f13ec2b7642495101ffb1;hp=7b440118fe4537fea87c87c831000d54e19ad280;hpb=1c46db5ec8d086d76f7120a638199564947694d3;p=palacios.git diff --git a/geekos/src/geekos/vm.c b/geekos/src/geekos/vm.c index 7b44011..32ee335 100644 --- a/geekos/src/geekos/vm.c +++ b/geekos/src/geekos/vm.c @@ -30,20 +30,35 @@ #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; int RunVMM(struct Boot_Info * bootInfo) { - struct vmm_os_hooks os_hooks; - struct vmm_ctrl_ops vmm_ops; + 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 vmm_os_hooks)); - memset(&vmm_ops, 0, sizeof(struct vmm_ctrl_ops)); + 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)); @@ -62,38 +77,76 @@ int RunVMM(struct Boot_Info * bootInfo) { - Init_V3(&os_hooks, &vmm_ops); + Init_V3(&os_hooks, &v3_ops); 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; + } + + PrintBoth("%d layout regions\n", layout->num_regions); - vm_config.vm_kernel = &_binary___palacios_vm_kernel_start; + 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; + + vm_config.mem_size = 128 * 1024 * 1024; + + region_start += rombios->length; + +#ifdef PROFILE_VMM + vm_config.enable_profiling = 1; +#else + vm_config.enable_profiling = 0; +#endif + vm_config.enable_pci = 1; + + vm_config.vgabios = region_start; + vm_config.vgabios_size = vgabios->length; + } + + + + if (g_ramdiskImage != NULL) { - vm_config.use_ramdisk = 1; + vm_config.use_ram_cd = 1; vm_config.ramdisk = g_ramdiskImage; vm_config.ramdisk_size = s_ramdiskSize; } - vm_info = (vmm_ops).allocate_guest(); + vm_info = (v3_ops).allocate_guest(); Init_Stubs(vm_info); PrintBoth("Allocated Guest\n"); - (vmm_ops).config_guest(vm_info, &vm_config); - PrintBoth("Configured guest\n"); - (vmm_ops).init_guest(vm_info); + + PrintBoth("Initializing guest\n"); + (v3_ops).init_guest(vm_info, &vm_config); + PrintBoth("Starting Guest\n"); //Clear_Screen(); - (vmm_ops).start_guest(vm_info); + (v3_ops).start_guest(vm_info); return 0; }