From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:42919) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SsAqi-0005Gk-5w for qemu-devel@nongnu.org; Fri, 20 Jul 2012 06:54:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SsAqc-0001Zk-CS for qemu-devel@nongnu.org; Fri, 20 Jul 2012 06:54:20 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:51109) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SsAqb-0001Wc-VU for qemu-devel@nongnu.org; Fri, 20 Jul 2012 06:54:14 -0400 Received: by mail-pb0-f45.google.com with SMTP id ro12so5957264pbb.4 for ; Fri, 20 Jul 2012 03:54:13 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Fri, 20 Jul 2012 12:53:49 +0200 Message-Id: <1342781633-7288-4-git-send-email-pbonzini@redhat.com> In-Reply-To: <1342781633-7288-1-git-send-email-pbonzini@redhat.com> References: <1342781633-7288-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 3/7] RTC: Update interrupt state when interrupts are masked/unmasked List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: "Zhang, Yang Z" From: "Zhang, Yang Z" 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 --- 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