From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:53056) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Swc03-0004dv-3O for qemu-devel@nongnu.org; Wed, 01 Aug 2012 12:42:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Swc01-0004sy-Ut for qemu-devel@nongnu.org; Wed, 01 Aug 2012 12:42:19 -0400 Received: from mail-gg0-f173.google.com ([209.85.161.173]:50350) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Swc01-0004su-QY for qemu-devel@nongnu.org; Wed, 01 Aug 2012 12:42:17 -0400 Received: by ggnp1 with SMTP id p1so7266979ggn.4 for ; Wed, 01 Aug 2012 09:42:17 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 1 Aug 2012 18:41:45 +0200 Message-Id: <1343839312-24030-4-git-send-email-pbonzini@redhat.com> In-Reply-To: <1343839312-24030-1-git-send-email-pbonzini@redhat.com> References: <1343839312-24030-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 03/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, 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 b99f4d3..293f174 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.4