qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Sam King <kingst@gmail.com>
To: Jan Kiszka <jan.kiszka@web.de>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: PATCH: debugging apic
Date: Wed, 29 Sep 2010 11:47:53 -0500	[thread overview]
Message-ID: <4CA36DB9.6040801@gmail.com> (raw)
In-Reply-To: <4CA2E057.80204@web.de>

  Thanks for the info.  I started looking at the APIC logic and fixing 
the behavior is going to take me a little bit of time to make sure that 
I keep all of the APIC states consistent.  In the meantime, TeLeMan 
suggested a patch a few years ago that would fix this (and potentially 
other) problems.  I have updated this patch and included it in this email:

*** cpu-exec.c  2010-07-22 07:39:04.000000000 -0500
--- ../qemu-0.12.5-fixed/cpu-exec.c     2010-09-29 11:41:25.991566727 -0500
***************
*** 388,396 ****
                                        (env->eflags & IF_MASK &&
                                         !(env->hflags & 
HF_INHIBIT_IRQ_MASK))))) {
                               int intno;
-                             svm_check_intercept(SVM_EXIT_INTR);
                               env->interrupt_request &= 
~(CPU_INTERRUPT_HARD | CPU_INTERRUPT_VIRQ);
                               intno = cpu_get_pic_interrupt(env);
                               qemu_log_mask(CPU_LOG_TB_IN_ASM, 
"Servicing hardware INT=0x%02x\n", intno);
   #if defined(__sparc__) && !defined(CONFIG_SOLARIS)
   #undef env
--- 388,397 ----
                                        (env->eflags & IF_MASK &&
                                         !(env->hflags & 
HF_INHIBIT_IRQ_MASK))))) {
                               int intno;
                               env->interrupt_request &= 
~(CPU_INTERRUPT_HARD | CPU_INTERRUPT_VIRQ);
                               intno = cpu_get_pic_interrupt(env);
+                             if(intno >= 0) {
+                                 svm_check_intercept(SVM_EXIT_INTR);
                                   qemu_log_mask(CPU_LOG_TB_IN_ASM, 
"Servicing hardware INT=0x%02x\n", intno);
   #if defined(__sparc__) && !defined(CONFIG_SOLARIS)
   #undef env
***************
*** 401,406 ****
--- 402,409 ----
                                   /* ensure that no TB jump will be 
modified as
                                      the program flow was changed */
                                   next_tb = 0;
+                             }
+
   #if !defined(CONFIG_USER_ONLY)
                           } else if ((interrupt_request & 
CPU_INTERRUPT_VIRQ) &&
                                      (env->eflags & IF_MASK) &&


On 9/29/10 1:44 AM, Jan Kiszka wrote:
> Am 28.09.2010 21:57, Sam King wrote:
>>   Thanks to Bernhard Kauer for pointing out the problem.  Apparently if
>> software disables LVT_LINT0 when there is a pending CPU_HARD_INTERRUPT
>> you can get into trouble.  I attached a patch that fixes the problem by
>> resetting the interrupt_request.  I am not sure if we need to do the
>> same for LINT1, but this fixed the incorrect GPF I was getting.
>>
> ...
> [ please inline patches ]
>
>> *** hw/apic.c	2010-07-22 07:39:04.000000000 -0500
>> --- ../qemu-0.12.5-fixed/hw/apic.c	2010-09-28 14:45:55.476945540 -0500
>> ***************
>> *** 841,846 ****
>> --- 841,851 ----
>>                s->lvt[n] = val;
>>                if (n == APIC_LVT_TIMER)
>>                    apic_timer_update(s, qemu_get_clock(vm_clock));
>> +
>> +             if(n == APIC_LVT_LINT0) {
>> +                 if((val&  APIC_LVT_MASKED)&&  (env->interrupt_request&  CPU_INTERRUPT_HARD))
>> +                     cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
>> +             }
>>            }
>>            break;
>>        case 0x38:
> This actually points out open issues, but more work is required:
>
> You need to consider other potentially pending interrupts as well, thus
> you must not blindly reset here. And the same is true for invocations of
> apic_deliver_pic_intr(..., 0). The APIC has to save the PIC line state
> and forward it according to its current LVT mask state, which includes
> raising the interrupt if the mask is removed while the PIC line is high.
>
> Jan
>

  reply	other threads:[~2010-09-29 16:48 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-28 15:15 [Qemu-devel] debugging apic Sam King
2010-09-28 19:57 ` [Qemu-devel] PATCH: " Sam King
2010-09-29  6:44   ` [Qemu-devel] " Jan Kiszka
2010-09-29 16:47     ` Sam King [this message]
2010-09-29  0:53 ` [Qemu-devel] " TeLeMan

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=4CA36DB9.6040801@gmail.com \
    --to=kingst@gmail.com \
    --cc=jan.kiszka@web.de \
    --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).