From bb05a1869e7ab73bd9f7785d333aff59fa493990 Mon Sep 17 00:00:00 2001 From: Ulrich Obergfell <uobergfe@redhat.com> Date: Tue, 18 Oct 2011 06:43:23 +0200 Subject: [PATCH 4/5] BZ725876: make RTC alarm work RH-Author: Ulrich Obergfell <uobergfe@redhat.com> Message-id: <1318920204-3733-2-git-send-email-uobergfe@redhat.com> Patchwork-id: 34341 O-Subject: [PATCH RHEL-5.8 qemu-kvm 1/2] BZ725876: make RTC alarm work Bugzilla: 725876 RH-Acked-by: Gleb Natapov <gleb@redhat.com> RH-Acked-by: Ronen Hod <rhod@redhat.com> RH-Acked-by: Amos Kong <akong@redhat.com> Upstream: commit f292787d9addffd5f0a2df9516c158bfb5792b61 Bugzilla: 725876 The format of the alarm time stored in 'cmos_data' can either be binary or BCD, depending on the data mode bit in control register C. Hence, rtc_update_second2() needs to convert 'cmos_data' to binary before comparing the alarm time with 'current_tm'. The upstream version of the patch calls rtc_from_bcd() to do the conversion. Since rtc_from_bcd() does not exist in RHEL5 qemu-kvm code, we utilize from_bcd() instead. Signed-off-by: Ulrich Obergfell <uobergfe@redhat.com> --- qemu/hw/mc146818rtc.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) Signed-off-by: Michal Novotny <mignov@gmail.com> --- qemu/hw/mc146818rtc.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff --git a/qemu/hw/mc146818rtc.c b/qemu/hw/mc146818rtc.c index 247b56a..ab412c6 100644 --- a/qemu/hw/mc146818rtc.c +++ b/qemu/hw/mc146818rtc.c @@ -204,7 +204,6 @@ static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data) case RTC_SECONDS_ALARM: case RTC_MINUTES_ALARM: case RTC_HOURS_ALARM: - /* XXX: not supported */ s->cmos_data[s->cmos_index] = data; break; case RTC_SECONDS: @@ -410,11 +409,11 @@ static void rtc_update_second2(void *opaque) /* check alarm */ if (s->cmos_data[RTC_REG_B] & REG_B_AIE) { if (((s->cmos_data[RTC_SECONDS_ALARM] & 0xc0) == 0xc0 || - s->cmos_data[RTC_SECONDS_ALARM] == s->current_tm.tm_sec) && + from_bcd(s, s->cmos_data[RTC_SECONDS_ALARM]) == s->current_tm.tm_sec) && ((s->cmos_data[RTC_MINUTES_ALARM] & 0xc0) == 0xc0 || - s->cmos_data[RTC_MINUTES_ALARM] == s->current_tm.tm_mon) && + from_bcd(s, s->cmos_data[RTC_MINUTES_ALARM]) == s->current_tm.tm_min) && ((s->cmos_data[RTC_HOURS_ALARM] & 0xc0) == 0xc0 || - s->cmos_data[RTC_HOURS_ALARM] == s->current_tm.tm_hour)) { + from_bcd(s, s->cmos_data[RTC_HOURS_ALARM]) == s->current_tm.tm_hour)) { s->cmos_data[RTC_REG_C] |= 0xa0; rtc_irq_raise(s->irq); -- 1.7.4.4