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 <yang.z.zhang@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
e46deabaa5
commit
9324cc50c6
|
@ -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;
|
||||
|
|
|
@ -58,5 +58,6 @@
|
|||
#define REG_C_IRQF 0x80
|
||||
#define REG_C_PF 0x40
|
||||
#define REG_C_AF 0x20
|
||||
#define REG_C_MASK 0x70
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue