Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel' of palacios@newskysaw.cs.northwestern.edu:/home/palacios/palacio...
[palacios.git] / palacios / src / palacios / svm.c
index 51901e3..03a99f5 100644 (file)
@@ -463,7 +463,9 @@ int v3_svm_enter(struct guest_info * info) {
     // disable global interrupts for vm state transition
     v3_clgi();
 
-    // Update timer devices prior to entering VM.
+    // Update timer devices after being in the VM, with interupts
+    // disabled, but before doing IRQ updates, so that any interrupts they 
+    //raise get seen immediately.
     v3_update_timers(info);
 
     // Synchronize the guest state to the VMCB
@@ -548,13 +550,11 @@ int v3_svm_enter(struct guest_info * info) {
     info->mem_mode = v3_get_vm_mem_mode(info);
     /* ** */
 
-
     // save exit info here
     exit_code = guest_ctrl->exit_code;
     exit_info1 = guest_ctrl->exit_info1;
     exit_info2 = guest_ctrl->exit_info2;
 
-
 #ifdef V3_CONFIG_SYMCALL
     if (info->sym_core_state.symcall_state.sym_call_active == 0) {
        update_irq_exit_state(info);
@@ -563,15 +563,12 @@ int v3_svm_enter(struct guest_info * info) {
     update_irq_exit_state(info);
 #endif
 
-
     // reenable global interrupts after vm exit
     v3_stgi();
-
  
     // Conditionally yield the CPU if the timeslice has expired
     v3_yield_cond(info);
 
-
     {
        int ret = v3_handle_svm_exit(info, exit_code, exit_info1, exit_info2);
        
@@ -580,6 +577,10 @@ int v3_svm_enter(struct guest_info * info) {
            PrintError("  last Exit was %d (exit code=0x%llx)\n", v3_last_exit, (uint64_t) exit_code);
            return -1;
        }
+    if (v3_handle_svm_exit(info, exit_code, exit_info1, exit_info2) != 0) {
+       PrintError("Error in SVM exit handler\n");
+       PrintError("  last exit was %d\n", v3_last_exit);
+       return -1;
     }