From: Jack Lange Date: Wed, 28 Apr 2010 21:37:06 +0000 (-0500) Subject: cleaned up timer infrastructure X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=c4e343e346404fcc7674dcfa32e588a282be0f86;p=palacios.git cleaned up timer infrastructure --- diff --git a/palacios/include/palacios/vmm_time.h b/palacios/include/palacios/vmm_time.h index d805db9..25ed924 100644 --- a/palacios/include/palacios/vmm_time.h +++ b/palacios/include/palacios/vmm_time.h @@ -31,17 +31,10 @@ struct vm_time { uint32_t cpu_freq; // in kHZ // Total number of guest run time cycles - ullong_t guest_tsc; + uint64_t_t guest_tsc; // Cache value to help calculate the guest_tsc - ullong_t cached_host_tsc; - - - /* The total num of numcycles spent in the halt handler - that the halt handler has already updated to the - timer infrastructure about. That is, "update_time" has been - */ - ullong_t cached_hlt_tsc; + uint64_t_t cached_host_tsc; // The number of cycles pending for notification to the timers //ullong_t pending_cycles; diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index b6bd770..d755e34 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -468,7 +468,7 @@ int v3_svm_enter(struct guest_info * info) { rdtscll(tmp_tsc); - v3_update_time(info, (tmp_tsc - info->time_state.cached_host_tsc - info->time_state.cached_hlt_tsc)); + v3_update_time(info, (tmp_tsc - info->time_state.cached_host_tsc)); info->time_state.cached_hlt_tsc = 0; rdtscll(info->time_state.cached_host_tsc); // guest_ctrl->TSC_OFFSET = info->time_state.guest_tsc - info->time_state.cached_host_tsc; diff --git a/palacios/src/palacios/vmm_halt.c b/palacios/src/palacios/vmm_halt.c index ef796e4..5015046 100644 --- a/palacios/src/palacios/vmm_halt.c +++ b/palacios/src/palacios/vmm_halt.c @@ -38,62 +38,27 @@ int v3_handle_halt(struct guest_info * info) { if (info->cpl != 0) { v3_raise_exception(info, GPF_EXCEPTION); } else { - uint64_t yield_start = 0; - uint64_t yield_stop = 0; - uint32_t gap = 0; PrintDebug("CPU Yield\n"); - while(1){ - if (v3_intr_pending(info)) { - /* if there is pending interrupt, just return */ - break; - } - - rdtscll(yield_start); - v3_yield(info); - rdtscll(yield_stop); - - gap = yield_stop - yield_start; - /* - If we got here, either an interrupt has occured or - sufficient time has passed that we may need to inject - a timer interrupt. - First, we will update time, which may or may not inject an - interrupt - */ - v3_update_time(info, gap); - info->time_state.cached_hlt_tsc += gap; - - /* At this point, we either have some combination of - interrupts, including perhaps a timer interrupt, or - no interrupt. - */ - if (!v3_intr_pending(info)) { - /* if no interrupt, then we do halt*/ - asm("hlt"); - } - } - -#if 0 - /* WARNING!!! WARNING!!! - * - * DO NOT REMOVE THIS CONDITIONAL!!! - * - * It is common for an OS to issue an IO op, and then sit in a halt loop - * waiting for the device to complete and raise an irq. - * If you remove this then the timer interrupt will ALWAYS subvert the completion - * interrupt and stall the guest. - */ - if (!v3_intr_pending(info)) { - v3_advance_time(info); + while (!v3_intr_pending(info)) { + rdtscll(yield_start); + v3_yield(info); + + v3_update_time(info, yield_start - info->time_state.cached_host_tsc); + + rdtscll(info->time_state.cached_host_tsc); + + /* At this point, we either have some combination of + interrupts, including perhaps a timer interrupt, or + no interrupt. + */ + if (!v3_intr_pending(info)) { + /* if no interrupt, then we do halt */ + asm("hlt"); + } } -#endif - - //PrintError("HLT instruction issued\n"); - - PrintDebug("CPU Yield Done (%d cycles)\n", gap); info->rip += 1; } diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index 3334d2f..d2e3a79 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -660,7 +660,7 @@ int v3_vmx_enter(struct guest_info * info) { // We do timer injection here to track real host time. rdtscll(tmp_tsc); - v3_update_time(info, tmp_tsc - info->time_state.cached_host_tsc - info->time_state.cached_hlt_tsc); + v3_update_time(info, tmp_tsc - info->time_state.cached_host_tsc); info->time_state.cached_hlt_tsc = 0; rdtscll(info->time_state.cached_host_tsc);