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.


Cleaned up time management stuff, being more careful on signs of various time computa...
[palacios.git] / palacios / src / palacios / vmm_time.c
index 27bb2fc..2295b3f 100644 (file)
@@ -99,7 +99,7 @@ int v3_start_time(struct guest_info * info) {
 int v3_offset_time( struct guest_info * info, sint64_t offset )
 {
     struct vm_time * time_state = &(info->time_state);
-//    PrintDebug("Adding additional offset of %lld to guest time.\n", offset);
+    PrintDebug("Adding additional offset of %lld to guest time.\n", offset);
     time_state->guest_host_offset += offset;
     return 0;
 }
@@ -152,7 +152,7 @@ static int yield_host_time(struct guest_info * info) {
 
     /* We do *not* assume the guest timer was paused in the VM. If it was
      * this offseting is 0. If it wasn't, we need this. */
-    v3_offset_time(info, (sint64_t)old_guest_time - (sint64_t)guest_time);
+    v3_offset_time(info, (sint64_t)(old_guest_time - guest_time));
 
     return 0;
 }
@@ -175,12 +175,12 @@ static int skew_guest_time(struct guest_info * info) {
        if (time_state->enter_time) {
            /* Limit forward skew to 10% of the amount the guest has
             * run since we last could skew time */
-           max_skew = ((sint64_t)guest_time - (sint64_t)time_state->enter_time) / 10;
+           max_skew = (sint64_t)(guest_time - time_state->enter_time) / 10.0;
        } else {
            max_skew = 0;
        }
 
-       desired_skew = (sint64_t)target_guest_time - (sint64_t)guest_time;
+       desired_skew = (sint64_t)(target_guest_time - guest_time);
        skew = desired_skew > max_skew ? max_skew : desired_skew;
        PrintDebug("Guest %lld cycles behind where it should be.\n",
                   desired_skew);
@@ -226,13 +226,21 @@ int
 v3_time_enter_vm( struct guest_info * info )
 {
     struct vm_time * time_state = &(info->time_state);
-    uint64_t guest_time, host_time;
+    uint64_t host_time;
 
     host_time = v3_get_host_time(time_state);
-    guest_time = v3_get_guest_time(time_state);
     time_state->enter_time = host_time;
 #ifdef V3_CONFIG_TIME_DILATION
-    time_state->guest_host_offset = (sint64_t)guest_time - (sint64_t)host_time;
+    { 
+        uint64_t guest_time;
+       sint64_t offset;
+        guest_time = v3_compute_guest_time(time_state, host_time);
+       // XXX we probably want to use an inline function to do these
+        // time differences to deal with sign and overflow carefully
+       offset = (sint64_t)guest_time - (sint64_t)host_time;
+       PrintDebug("v3_time_enter_vm: guest time offset %lld from host time.\n", offset);
+        time_state->guest_host_offset = offset;
+    }
 #else
     time_state->guest_host_offset = 0;
 #endif
@@ -269,11 +277,11 @@ int v3_remove_timer(struct guest_info * info, struct v3_timer * timer) {
 void v3_update_timers(struct guest_info * info) {
     struct vm_time *time_state = &info->time_state;
     struct v3_timer * tmp_timer;
-    uint64_t old_time = info->time_state.last_update;
     sint64_t cycles;
+    uint64_t old_time = info->time_state.last_update;
 
     time_state->last_update = v3_get_guest_time(time_state);
-    cycles = time_state->last_update - old_time;
+    cycles = (sint64_t)(time_state->last_update - old_time);
     V3_ASSERT(cycles >= 0);
 
     //    V3_Print("Updating timers with %lld elapsed cycles.\n", cycles);