From: Jan Beulich Date: Thu, 2 May 2013 14:47:32 +0000 (+0200) Subject: x86/HVM: fix processing of RTC REG_B writes X-Git-Tag: 4.3.0-rc1~10 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=c2f79c464849e5f796aa9d1d0f26fe356abd1a1a;p=people%2Fiwj%2Fxen.git x86/HVM: fix processing of RTC REG_B writes We must store the new values before calling rtc_update_irq(), and we need to call rtc_timer_update() when PIE transitions from 0 to 1 (as we may have previously turned off the periodic timer due to the guest not reading REG_C, and hence may have to re-enable it in order to start IRQs getting delivered to the guest). Note that the timer is being kept running if PIE transitions from 1 to 0, to match the behavior of keeping it running for a brief period of time if the guest doesn't clear PF in time (in order to avoid permanently destroying and re-creating the periodic timer). Signed-off-by: Jan Beulich Tested-by: Roger Pau Monné (FreeBSD guest) Reviewed-by: Tim Deegan --- diff --git a/xen/arch/x86/hvm/rtc.c b/xen/arch/x86/hvm/rtc.c index 26ab12c7f3..b728d5e3db 100644 --- a/xen/arch/x86/hvm/rtc.c +++ b/xen/arch/x86/hvm/rtc.c @@ -468,12 +468,14 @@ static int rtc_ioport_write(void *opaque, uint32_t addr, uint32_t data) if ( orig & RTC_SET ) rtc_set_time(s); } + s->hw.cmos_data[RTC_REG_B] = data; /* * If the interrupt is already set when the interrupt becomes * enabled, raise an interrupt immediately. */ rtc_update_irq(s); - s->hw.cmos_data[RTC_REG_B] = data; + if ( (data & RTC_PIE) && !(orig & RTC_PIE) ) + rtc_timer_update(s); if ( (data ^ orig) & RTC_SET ) check_update_timer(s); if ( (data ^ orig) & (RTC_24H | RTC_DM_BINARY | RTC_SET) )