From: Jan Kiszka <jan.kiszka@web.de>
To: Blue Swirl <blauwirbel@gmail.com>
Cc: Jan Kiszka <jan.kiszka@siemens.com>,
Paul Brook <paul@codesourcery.com>,
qemu-devel@nongnu.org, Gleb Natapov <gleb@redhat.com>,
Juan Quintela <quintela@redhat.com>
Subject: [Qemu-devel] Re: [PATCH 11/16] hpet/rtc: Rework RTC IRQ replacement by HPET
Date: Sun, 06 Jun 2010 11:09:05 +0200 [thread overview]
Message-ID: <4C0B65B1.1070906@web.de> (raw)
In-Reply-To: <AANLkTimwZlVHvdiImJW7biprkZ4P8oM_-goHhd9a1GGA@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4694 bytes --]
Blue Swirl wrote:
> On Sun, Jun 6, 2010 at 8:11 AM, Jan Kiszka <jan.kiszka@web.de> wrote:
>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> Allow the intercept the RTC IRQ for the HPET legacy mode. Then push
>> routing to IRQ8 completely into the HPET. This allows to turn
>> hpet_in_legacy_mode() into a private function. Furthermore, this stops
>> the RTC from clearing IRQ8 even if the HPET is in control.
>>
>> This patch comes with a side effect: The RTC timers will no longer be
>> stoppend when there is no IRQ consumer, possibly causing a minor
>> performance degration. But as the guest may want to redirect the RTC to
>> the SCI in that mode, it should normally disable unused IRQ source
>> anyway.
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>> ---
>> hw/hpet.c | 42 +++++++++++++++++++++++++++++++++++-------
>> hw/hpet_emul.h | 4 ----
>> hw/mc146818rtc.c | 54 +++++++++++++++---------------------------------------
>> hw/mc146818rtc.h | 4 +++-
>> hw/mips_jazz.c | 2 +-
>> hw/mips_malta.c | 2 +-
>> hw/mips_r4k.c | 2 +-
>> hw/pc.c | 14 ++++++++------
>> hw/ppc_prep.c | 2 +-
>> 9 files changed, 65 insertions(+), 61 deletions(-)
>>
>> diff --git a/hw/hpet.c b/hw/hpet.c
>> index 041dd84..d26cad5 100644
>> --- a/hw/hpet.c
>> +++ b/hw/hpet.c
>> @@ -30,6 +30,7 @@
>> #include "qemu-timer.h"
>> #include "hpet_emul.h"
>> #include "sysbus.h"
>> +#include "mc146818rtc.h"
>>
>> //#define HPET_DEBUG
>> #ifdef HPET_DEBUG
>> @@ -58,6 +59,7 @@ typedef struct HPETState {
>> SysBusDevice busdev;
>> uint64_t hpet_offset;
>> qemu_irq irqs[HPET_NUM_IRQ_ROUTES];
>> + uint8_t rtc_irq_level;
>> HPETTimer timer[HPET_NUM_TIMERS];
>>
>> /* Memory-mapped, software visible registers */
>> @@ -69,12 +71,9 @@ typedef struct HPETState {
>>
>> static HPETState *hpet_statep;
>>
>> -uint32_t hpet_in_legacy_mode(void)
>> +static uint32_t hpet_in_legacy_mode(HPETState *s)
>> {
>> - if (!hpet_statep) {
>> - return 0;
>> - }
>> - return hpet_statep->config & HPET_CFG_LEGACY;
>> + return s->config & HPET_CFG_LEGACY;
>> }
>>
>> static uint32_t timer_int_route(struct HPETTimer *timer)
>> @@ -166,12 +165,12 @@ static void update_irq(struct HPETTimer *timer)
>> {
>> int route;
>>
>> - if (timer->tn <= 1 && hpet_in_legacy_mode()) {
>> + if (timer->tn <= 1 && hpet_in_legacy_mode(timer->state)) {
>> /* if LegacyReplacementRoute bit is set, HPET specification requires
>> * timer0 be routed to IRQ0 in NON-APIC or IRQ2 in the I/O APIC,
>> * timer1 be routed to IRQ8 in NON-APIC or IRQ8 in the I/O APIC.
>> */
>> - route = (timer->tn == 0) ? 0 : 8;
>> + route = (timer->tn == 0) ? 0 : RTC_ISA_IRQ;
>> } else {
>> route = timer_int_route(timer);
>> }
>> @@ -515,8 +514,10 @@ static void hpet_ram_writel(void *opaque, target_phys_addr_t addr,
>> /* i8254 and RTC are disabled when HPET is in legacy mode */
>> if (activating_bit(old_val, new_val, HPET_CFG_LEGACY)) {
>> hpet_pit_disable();
>> + qemu_irq_lower(s->irqs[RTC_ISA_IRQ]);
>> } else if (deactivating_bit(old_val, new_val, HPET_CFG_LEGACY)) {
>> hpet_pit_enable();
>> + qemu_set_irq(s->irqs[RTC_ISA_IRQ], s->rtc_irq_level);
>> }
>> break;
>> case HPET_CFG + 4:
>> @@ -607,6 +608,30 @@ static void hpet_reset(DeviceState *d)
>> count = 1;
>> }
>>
>> +static void hpet_rtc_delivery_cb(qemu_irq irq, void *opaque, int n, int level,
>> + int result)
>> +{
>> + qemu_irq orig_irq = opaque;
>> +
>> + qemu_irq_fire_delivery_cb(orig_irq, level, result);
>> +}
>> +
>> +static void hpet_handle_rtc_irq(qemu_irq irq, void *opaque, int n, int level)
>> +{
>> + HPETState *s = FROM_SYSBUS(HPETState, opaque);
>> + IRQMsg msg = {
>> + .delivery_cb = hpet_rtc_delivery_cb,
>> + .delivery_opaque = irq,
>> + };
>> +
>> + s->rtc_irq_level = level;
>> + if (hpet_in_legacy_mode(s)) {
>> + qemu_irq_fire_delivery_cb(irq, level, QEMU_IRQ_MASKED);
>> + } else {
>> + qemu_set_irq_msg(s->irqs[RTC_ISA_IRQ], level, &msg);
>
> This is the problem with passing around stack allocated objects: after
> this function finishes, s->irqs[RTC_ISA_IRQ].msg is a dangling pointer
> to some stack space.
s->irqs[RTC_ISA_IRQ].msg is NULL when qemu_set_irq_msg returned, msg
itself will not "leak" out of the qemu_irq subsystem.
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]
next prev parent reply other threads:[~2010-06-06 9:09 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-06 8:10 [Qemu-devel] [PATCH 00/16] HPET cleanups, fixes, enhancements Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 01/16] hpet: Catch out-of-bounds timer access Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 02/16] hpet: Coding style cleanups and some refactorings Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 03/16] hpet: Silence warning on write to running main counter Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 04/16] hpet: Move static timer field initialization Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 05/16] hpet: Convert to qdev Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 06/16] hpet: Start/stop timer when HPET_TN_ENABLE is modified Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 07/16] monitor/QMP: Drop info hpet / query-hpet Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 08/16] Pass IRQ object on handler invocation Jan Kiszka
2010-06-12 10:31 ` [Qemu-devel] [PATCH v3 " Jan Kiszka
2010-06-06 8:10 ` [Qemu-devel] [PATCH 09/16] Enable message delivery via IRQs Jan Kiszka
2010-06-12 12:21 ` Paul Brook
2010-06-12 12:32 ` Jan Kiszka
2010-06-12 13:44 ` Blue Swirl
2010-06-12 14:15 ` Paul Brook
2010-06-12 14:35 ` Blue Swirl
2010-06-12 15:58 ` Paul Brook
2010-06-12 19:33 ` Blue Swirl
2010-06-12 20:15 ` Paul Brook
2010-06-12 20:32 ` Blue Swirl
2010-06-13 6:47 ` Blue Swirl
2010-06-13 15:49 ` Paul Brook
2010-06-13 18:17 ` Blue Swirl
2010-06-13 18:39 ` Paul Brook
2010-06-13 18:54 ` Blue Swirl
2010-06-13 19:38 ` Paul Brook
2010-06-13 16:34 ` Paul Brook
2010-06-13 18:04 ` Blue Swirl
2010-06-14 5:40 ` Gleb Natapov
2010-06-06 8:10 ` [Qemu-devel] [PATCH 10/16] x86: Refactor RTC IRQ coalescing workaround Jan Kiszka
2010-06-06 8:49 ` [Qemu-devel] " Blue Swirl
2010-06-06 9:06 ` Jan Kiszka
2010-06-06 8:11 ` [Qemu-devel] [PATCH 11/16] hpet/rtc: Rework RTC IRQ replacement by HPET Jan Kiszka
2010-06-06 8:53 ` [Qemu-devel] " Blue Swirl
2010-06-06 9:09 ` Jan Kiszka [this message]
2010-06-06 8:11 ` [Qemu-devel] [PATCH 12/16] hpet: Drop static state Jan Kiszka
2010-06-06 8:11 ` [Qemu-devel] [PATCH 13/16] hpet: Add support for level-triggered interrupts Jan Kiszka
2010-06-06 8:11 ` [Qemu-devel] [PATCH 14/16] vmstate: Add VMSTATE_STRUCT_VARRAY_UINT8 Jan Kiszka
2010-06-06 8:11 ` [Qemu-devel] [PATCH 15/16] hpet: Make number of timers configurable Jan Kiszka
2010-06-06 8:11 ` [Qemu-devel] [PATCH 16/16] hpet: Add MSI support Jan Kiszka
2010-06-11 21:31 ` Paul Brook
2010-06-12 10:23 ` [Qemu-devel] [PATCH v3 " Jan Kiszka
2010-06-06 8:56 ` [Qemu-devel] Re: [PATCH 00/16] HPET cleanups, fixes, enhancements Blue Swirl
2010-06-06 9:12 ` Jan Kiszka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C0B65B1.1070906@web.de \
--to=jan.kiszka@web.de \
--cc=blauwirbel@gmail.com \
--cc=gleb@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=paul@codesourcery.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).