qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 2/8] xics: add flags for interrupts


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH 2/8] xics: add flags for interrupts
Date: Thu, 10 Apr 2014 14:43:30 +0200
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0


On 14.03.14 05:18, Alexey Kardashevskiy wrote:
We will need soon an "allocated" flag for every interrupt to support
interrupt configuration change which may happen during migration.

This replaces a separate lslsi[] array with a byte in the ICSIRQState
struct and defines "LSI" and "MSI" flags. Neither of these flags set
signals that the descriptor is not in use.

Signed-off-by: Alexey Kardashevskiy <address@hidden>
---
  hw/intc/xics.c        | 17 +++++++++++------
  hw/intc/xics_kvm.c    |  5 ++---
  include/hw/ppc/xics.h |  4 +++-
  3 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index 64aabe7..7eac85a 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -438,7 +438,7 @@ static void ics_set_irq(void *opaque, int srcno, int val)
  {
      ICSState *ics = (ICSState *)opaque;
- if (ics->islsi[srcno]) {
+    if (ics->irqs[srcno].flags & XICS_FLAGS_LSI) {
          set_irq_lsi(ics, srcno, val);
      } else {
          set_irq_msi(ics, srcno, val);
@@ -475,7 +475,7 @@ static void ics_write_xive(ICSState *ics, int nr, int 
server,
trace_xics_ics_write_xive(nr, srcno, server, priority); - if (ics->islsi[srcno]) {
+    if (ics->irqs[srcno].flags & XICS_FLAGS_LSI) {
          write_xive_lsi(ics, srcno);
      } else {
          write_xive_msi(ics, srcno);
@@ -497,7 +497,7 @@ static void ics_resend(ICSState *ics)
for (i = 0; i < ics->nr_irqs; i++) {
          /* FIXME: filter by server#? */
-        if (ics->islsi[i]) {
+        if (ics->irqs[i].flags & XICS_FLAGS_LSI) {
              resend_lsi(ics, i);
          } else {
              resend_msi(ics, i);
@@ -512,7 +512,7 @@ static void ics_eoi(ICSState *ics, int nr)
trace_xics_ics_eoi(nr); - if (ics->islsi[srcno]) {
+    if (ics->irqs[srcno].flags & XICS_FLAGS_LSI) {
          irq->status &= ~XICS_STATUS_SENT;
      }
  }
@@ -609,7 +609,6 @@ static void ics_realize(DeviceState *dev, Error **errp)
          return;
      }
      ics->irqs = g_malloc0(ics->nr_irqs * sizeof(ICSIRQState));
-    ics->islsi = g_malloc0(ics->nr_irqs * sizeof(bool));
      ics->qirqs = qemu_allocate_irqs(ics_set_irq, ics, ics->nr_irqs);
  }
@@ -646,11 +645,17 @@ qemu_irq xics_get_qirq(XICSState *icp, int irq)
      return icp->ics->qirqs[irq - icp->ics->offset];
  }
+static void ics_set_irq_type(ICSState *ics, int irq, bool lsi)
+{
+    ics->irqs[irq - ics->offset].flags |=
+        lsi ? XICS_FLAGS_LSI : XICS_FLAGS_MSI;

If I configure an IRQ as LSI then as MSI this doesn't work. Sure, we probably don't do this but in general this is not how a "set" function should behave.


Alex




reply via email to

[Prev in Thread] Current Thread [Next in Thread]