qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Blue Swirl <blauwirbel@gmail.com>
To: Artyom Tarasenko <atar4qemu@googlemail.com>
Cc: qemu-devel <qemu-devel@nongnu.org>
Subject: [Qemu-devel] Re: sparc32 double "Set CPU IRQ 14"
Date: Thu, 6 Aug 2009 22:54:33 +0300	[thread overview]
Message-ID: <f43fc5580908061254o15bdb425la925d7b28e5fcf0e@mail.gmail.com> (raw)
In-Reply-To: <fb8d4f70908060235m1a3a47c4r9713b5c695298159@mail.gmail.com>

On Thu, Aug 6, 2009 at 12:35 PM, Artyom
Tarasenko<atar4qemu@googlemail.com> wrote:
> I observe double "Set CPU IRQ 14" in the log.  I don't see how  the
> real harware would be able to generate the same irq twice, without
> resetting it. I put a printf in cpuexec.c:
>
> #elif defined(TARGET_SPARC)
>                    if ((interrupt_request & CPU_INTERRUPT_HARD) &&
>                        cpu_interrupts_enabled(env)) {
>                        int pil = env->interrupt_index & 15;
>                        int type = env->interrupt_index & 0xf0;
>
>                        if (((type == TT_EXTINT) &&
>                             (pil == 15 || pil > env->psrpil)) ||
>                            type != TT_EXTINT) {
>                            env->interrupt_request &= ~CPU_INTERRUPT_HARD;
>                            env->exception_index = env->interrupt_index;
>                            do_interrupt(env);
>                            env->interrupt_index = 0;
> #if !defined(CONFIG_USER_ONLY)
>               printf("cpuexec calls cpu_check_irqs\n");
>                            cpu_check_irqs(env);
> #endif
>                        next_tb = 0;
>                        }
>
>
> And now my log looks like this:
>
> CPUIRQ: Raise CPU IRQ 14
> CPUIRQ: Set CPU IRQ 14
> cpuexec calls cpu_check_irqs
> CPUIRQ: Set CPU IRQ 14
>
> Does it look like cpuexec does an unnecessary call of cpu_check_irqs ?
>
> I've removed this call, and see no difference: OBP works the same,
> OpenBIOS too, NetBSD boot log also seems to be the same.
>
> What this call is needed for?

IIRC it's there to handle this situation:
1) interrupts are masked by the CPU up to some level (e.g. 12)
2) some lower level interrupts are active (level 10), but due to the
mask CPU ignores them
3) a higher level interrupt arrives (level 14) and is delivered to the CPU
4) after the trap handling has started, the lower level (10) interrupt
should be active again but it's still being ignored
5) when the interrupt mask is lowered, the lower level interrupt (10)
should generate a trap

But step #4 does not look correct, especially the call to
cpu_check_irqs. The use of env->interrupt_index should be redesigned,
maybe the interrupt mask could be recalculated in helper_wrpsr
instead. Then step #4 would happen at the right time.

      reply	other threads:[~2009-08-06 19:54 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-06  9:35 [Qemu-devel] sparc32 double "Set CPU IRQ 14" Artyom Tarasenko
2009-08-06 19:54 ` Blue Swirl [this message]

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=f43fc5580908061254o15bdb425la925d7b28e5fcf0e@mail.gmail.com \
    --to=blauwirbel@gmail.com \
    --cc=atar4qemu@googlemail.com \
    --cc=qemu-devel@nongnu.org \
    /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).