From: Peter Dinda Date: Mon, 29 Jun 2015 18:22:05 +0000 (-0500) Subject: VM Reset Bugfixes X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=1d750a8e86f4f32eca7d776556d8d96b09375f5c VM Reset Bugfixes - ROS reset does not clobber HRT - Missing keyboard reset command added - More debugging output --- diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index 3609058..c5b5281 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -821,6 +821,7 @@ static int keyboard_write_command(struct guest_info * core, ushort_t port, void case 0xfb: case 0xfc: case 0xfd: + case 0xfe: case 0xff: if (!(cmd & 0x1)) { // general purpose reset diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 292e780..a007201 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -12,6 +12,7 @@ * All rights reserved. * * Author: Jack Lange + * Peter Dinda (Reset) * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "V3VEE_LICENSE". @@ -463,12 +464,22 @@ static int svm_handle_standard_reset(struct guest_info *core) // I could be a ROS core, or I could be in a non-HVM // either way, if I'm core 0, I'm the leader if (core->vcpu_id==0) { + uint64_t mem_size=core->vm_info->mem_size; + +#ifdef V3_CONFIG_HVM + // on a ROS reset, we should only + // manipulate the part of the memory seen by + // the ROS + if (core->vm_info->hvm_state.is_hvm) { + mem_size=v3_get_hvm_ros_memsize(core->vm_info); + } +#endif core->vm_info->run_state = VM_RESETTING; // copy bioses again because some, // like seabios, assume // this should also blow away the BDA and EBDA PrintDebug(core->vm_info,core,"Clear memory (%p bytes)\n",(void*)core->vm_info->mem_size); - if (v3_set_gpa_memory(core, 0, core->vm_info->mem_size, 0)!=core->vm_info->mem_size) { + if (v3_set_gpa_memory(core, 0, mem_size, 0)!=mem_size) { PrintError(core->vm_info,core,"Clear of memory failed\n"); } PrintDebug(core->vm_info,core,"Copying bioses\n"); @@ -484,7 +495,7 @@ static int svm_handle_standard_reset(struct guest_info *core) core->cpl = 0; core->cpu_mode = REAL; core->mem_mode = PHYSICAL_MEM; - core->num_exits=0; + //core->num_exits=0; PrintDebug(core->vm_info,core,"Machine reset to REAL/PHYSICAL\n"); diff --git a/palacios/src/palacios/vmm_hvm.c b/palacios/src/palacios/vmm_hvm.c index 24ae9fd..7fb278b 100644 --- a/palacios/src/palacios/vmm_hvm.c +++ b/palacios/src/palacios/vmm_hvm.c @@ -1166,11 +1166,19 @@ int v3_handle_hvm_reset(struct guest_info *core) // and recopy the .data, but for now we'll just // do everything rc |= v3_setup_hvm_vm_for_boot(core->vm_info); + + if (rc) { + PrintError(core->vm_info,core,"hvm: failed to setup HVM VM for boot rc=%d\n",rc); + } } // now everyone is ready to reset rc |= v3_setup_hvm_hrt_core_for_boot(core); + if (rc) { + PrintError(core->vm_info,core,"hvm: failed to setup HVM core for boot rc=%d\n",rc); + } + core->core_run_state = CORE_RUNNING; if (core->vcpu_id==core->vm_info->hvm_state.first_hrt_core) { @@ -1181,6 +1189,7 @@ int v3_handle_hvm_reset(struct guest_info *core) v3_counting_barrier(&core->vm_info->reset_barrier); if (rc<0) { + PrintError(core->vm_info,core,"hvm: reset failed\n"); return rc; } else { return 1;