Patchwork [2/2] ioapic: Implement polarity

login
register
mail settings
Submitter Jan Kiszka
Date May 15, 2011, 11:07 a.m.
Message ID <4DCFB3EF.3060801@web.de>
Download mbox | patch
Permalink /patch/95612/
State New
Headers show

Comments

Jan Kiszka - May 15, 2011, 11:07 a.m.
From: Jan Kiszka <jan.kiszka@siemens.com>

If the polarity bit is set in a redirection table entry, the input level
simply has to inverted as it is low active in this case.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/ioapic.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)
Jan Kiszka - June 7, 2011, 3:55 p.m.
On 2011-05-15 13:07, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
> 
> If the polarity bit is set in a redirection table entry, the input level
> simply has to inverted as it is low active in this case.

Ping for this and
http://thread.gmane.org/gmane.comp.emulators.qemu/102459. Maybe even
trivial, so CC'ing.

Jan

> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
>  hw/ioapic.c |    3 +++
>  1 files changed, 3 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/ioapic.c b/hw/ioapic.c
> index 5916387..61991d7 100644
> --- a/hw/ioapic.c
> +++ b/hw/ioapic.c
> @@ -148,6 +148,9 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
>          uint32_t mask = 1 << vector;
>          uint64_t entry = s->ioredtbl[vector];
>  
> +        if (entry & (1 << IOAPIC_LVT_POLARITY_SHIFT)) {
> +            level = !level;
> +        }
>          if (((entry >> IOAPIC_LVT_TRIGGER_MODE_SHIFT) & 1) ==
>              IOAPIC_TRIGGER_LEVEL) {
>              /* level triggered */
> 
>
Stefan Hajnoczi - June 8, 2011, 8:09 a.m.
On Tue, Jun 07, 2011 at 05:55:10PM +0200, Jan Kiszka wrote:
> On 2011-05-15 13:07, Jan Kiszka wrote:
> > From: Jan Kiszka <jan.kiszka@siemens.com>
> > 
> > If the polarity bit is set in a redirection table entry, the input level
> > simply has to inverted as it is low active in this case.
> 
> Ping for this and
> http://thread.gmane.org/gmane.comp.emulators.qemu/102459. Maybe even
> trivial, so CC'ing.

Looks simple but I don't know x86 interrupt controller details, let's
see if Anthony can pick this up.

Stefan

Patch

diff --git a/hw/ioapic.c b/hw/ioapic.c
index 5916387..61991d7 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -148,6 +148,9 @@  static void ioapic_set_irq(void *opaque, int vector, int level)
         uint32_t mask = 1 << vector;
         uint64_t entry = s->ioredtbl[vector];
 
+        if (entry & (1 << IOAPIC_LVT_POLARITY_SHIFT)) {
+            level = !level;
+        }
         if (((entry >> IOAPIC_LVT_TRIGGER_MODE_SHIFT) & 1) ==
             IOAPIC_TRIGGER_LEVEL) {
             /* level triggered */