From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:49583) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SwxtA-0003t5-4H for qemu-devel@nongnu.org; Thu, 02 Aug 2012 12:04:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Swxt9-0001wB-5f for qemu-devel@nongnu.org; Thu, 02 Aug 2012 12:04:40 -0400 Received: from mail-wg0-f53.google.com ([74.125.82.53]:55152) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Swxt8-0001w2-V0 for qemu-devel@nongnu.org; Thu, 02 Aug 2012 12:04:39 -0400 Received: by wgbfm10 with SMTP id fm10so6532293wgb.10 for ; Thu, 02 Aug 2012 09:04:38 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Thu, 2 Aug 2012 18:04:07 +0200 Message-Id: <1343923453-13026-5-git-send-email-pbonzini@redhat.com> In-Reply-To: <1343923453-13026-1-git-send-email-pbonzini@redhat.com> References: <1343923453-13026-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH v3 04/10] 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: yang.z.zhang@intel.com, aliguori@linux.vnet.ibm.com, mdroth@linux.vnet.ibm.com, quintela@redhat.com From: Yang Zhang 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 175ddac..b41eb4b 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; 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.4