--- a/xen/arch/x86/hvm/rtc.c +++ b/xen/arch/x86/hvm/rtc.c @@ -84,9 +84,11 @@ void rtc_periodic_interrupt(void *opaque else if ( ++(s->pt_dead_ticks) >= 10 ) { /* VM is ignoring its RTC; no point in running the timer */ +printk("pt off @%d\n", __LINE__);//temp destroy_periodic_time(&s->pt); s->pt_code = 0; } +else if(s->pt_code) rtc_update_irq(s);//todo? spin_unlock(&s->lock); } @@ -114,6 +116,7 @@ static void rtc_timer_update(RTCState *s { if ( period_code != s->pt_code ) { +printk("pt on: %d\n", period_code);//temp s->pt_code = period_code; period = 1 << (period_code - 1); /* period in 32 Khz cycles */ period = DIV_ROUND(period * 1000000000ULL, 32768); /* in ns */ @@ -125,6 +128,7 @@ static void rtc_timer_update(RTCState *s } /* fall through */ default: +printk("pt off @%d\n", __LINE__);//temp destroy_periodic_time(&s->pt); s->pt_code = 0; break; @@ -451,6 +455,9 @@ static int rtc_ioport_write(void *opaque rtc_timer_update(s); break; case RTC_REG_B: +printk("B=%02x [A:%02x B:%02x C:%02x pt:%d/%d]\n",//temp + data, s->hw.cmos_data[RTC_REG_A], orig, s->hw.cmos_data[RTC_REG_C],//temp + s->pt_code, s->pt_dead_ticks);//temp if ( data & RTC_SET ) { /* set mode: reset UIP mode */ @@ -474,6 +481,7 @@ static int rtc_ioport_write(void *opaque */ rtc_update_irq(s); s->hw.cmos_data[RTC_REG_B] = data; +if((data & RTC_PIE) && !(orig & RTC_PIE)) rtc_timer_update(s);//todo? if ( (data ^ orig) & RTC_SET ) check_update_timer(s); if ( (data ^ orig) & (RTC_24H | RTC_DM_BINARY | RTC_SET) ) @@ -629,6 +637,7 @@ static uint32_t rtc_ioport_read(RTCState case RTC_REG_C: ret = s->hw.cmos_data[s->hw.cmos_index]; s->hw.cmos_data[RTC_REG_C] = 0x00; +printk("C=%02x pt=%d/%d\n", ret, s->pt_code, s->pt_dead_ticks);//temp rtc_update_irq(s); check_update_timer(s); alarm_timer_update(s); @@ -727,9 +736,12 @@ void rtc_reset(struct domain *d) { RTCState *s = domain_vrtc(d); +printk("pt off @%d\n", __LINE__);//temp destroy_periodic_time(&s->pt); s->pt_code = 0; s->pt.source = PTSRC_isa; +s->hw.cmos_data[RTC_REG_B] &= ~(RTC_PIE|RTC_AIE|RTC_UIE);//todo? +s->hw.cmos_data[RTC_REG_C] = 0;//todo? } void rtc_init(struct domain *d)