X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_halt.c;h=7970a404f4e877c078411086b0d828ad883bf927;hb=ef944e47f418cfbf344757e3fbab5e40927966fe;hp=ef796e416c9b2078a137cc36c5b525020f5479cd;hpb=0027db7c5ddd6b376f1d18e9cdd619126d5896c4;p=palacios.git diff --git a/palacios/src/palacios/vmm_halt.c b/palacios/src/palacios/vmm_halt.c index ef796e4..7970a40 100644 --- a/palacios/src/palacios/vmm_halt.c +++ b/palacios/src/palacios/vmm_halt.c @@ -38,62 +38,22 @@ 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"); - } + while (!v3_intr_pending(info)) { + /* Since we're in an exit, time is already paused here, so no need to pause again. */ + v3_yield(info); + v3_update_timers(info); + + /* 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); - } -#endif - - //PrintError("HLT instruction issued\n"); - - PrintDebug("CPU Yield Done (%d cycles)\n", gap); info->rip += 1; }