From 9324cc50c6b5df0998d46e8fca76e35f00ced6c3 Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Thu, 2 Aug 2012 18:04:07 +0200 Subject: RTC: Update interrupt state when interrupts are masked/unmasked If an interrupt flag is already set when the interrupt becomes enabled, raise an interrupt immediately, and vice versa if interrupts become disabled. Signed-off-by: Yang Zhang Signed-off-by: Paolo Bonzini Signed-off-by: Anthony Liguori --- hw/mc146818rtc.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'hw/mc146818rtc.c') diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index 175ddac6fb..b41eb4b944 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -221,6 +221,15 @@ static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data) rtc_set_time(s); } } + /* if an interrupt flag is already set when the interrupt + * becomes enabled, raise an interrupt immediately. */ + if (data & s->cmos_data[RTC_REG_C] & REG_C_MASK) { + s->cmos_data[RTC_REG_C] |= REG_C_IRQF; + qemu_irq_raise(s->irq); + } else { + s->cmos_data[RTC_REG_C] &= ~REG_C_IRQF; + qemu_irq_lower(s->irq); + } s->cmos_data[RTC_REG_B] = data; periodic_timer_update(s, qemu_get_clock_ns(rtc_clock)); break; -- cgit v1.2.3