aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Kauer <kauer@os.inf.tu-dresden.de>2009-09-02 09:49:05 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-09-22 21:15:58 -0500
commit621cc70bfbf0faae83b3b154ae97736472565a94 (patch)
tree8bcc7f4c47e8041a127a32fa481698252a72b429
parentebeab049b0932903befaf678980df37e0d7dbe27 (diff)
RTC polling mode broken
The RTC emulation does not set the IRQ flags independent of the IRQ enable bits. The original MC146818A datasheet from 1984 notes: "flag bits in Register C [...] are set independent of the state of the corresponding enable bits in Register B" Similar sections can be found in newer documentation e.g. in rtc82885. Qemu and Bochs set the IRQ flags only if they are enabled, which breaks drivers polling on them. The following patch corrects this for the update-ended-flag in Qemu only. It does not fix the handling of the other flags. Signed-off-by: Bernhard Kauer <kauer@tudos.org> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--hw/mc146818rtc.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 2022548f36..2b040a715c 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -421,9 +421,10 @@ static void rtc_update_second2(void *opaque)
}
/* update ended interrupt */
+ s->cmos_data[RTC_REG_C] |= REG_C_UF;
if (s->cmos_data[RTC_REG_B] & REG_B_UIE) {
- s->cmos_data[RTC_REG_C] |= 0x90;
- rtc_irq_raise(s->irq);
+ s->cmos_data[RTC_REG_C] |= REG_C_IRQF;
+ rtc_irq_raise(s->irq);
}
/* clear update in progress bit */