qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 3/7] RTC: Update interrupt state when interrupts are


From: Paolo Bonzini
Subject: [Qemu-devel] [PATCH 3/7] RTC: Update interrupt state when interrupts are masked/unmasked
Date: Fri, 20 Jul 2012 12:53:49 +0200

From: "Zhang, Yang Z" <address@hidden>

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 <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
 hw/mc146818rtc.c      |    9 +++++++++
 hw/mc146818rtc_regs.h |    1 +
 2 files changed, 10 insertions(+)

diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 6a7dcb8..46f0c10 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -220,6 +220,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;
diff --git a/hw/mc146818rtc_regs.h b/hw/mc146818rtc_regs.h
index 3ab3770..fc10076 100644
--- a/hw/mc146818rtc_regs.h
+++ b/hw/mc146818rtc_regs.h
@@ -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
-- 
1.7.10.2





reply via email to

[Prev in Thread] Current Thread [Next in Thread]