qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v1 08/16] qdev: gpio: Add API for intercepting a


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH v1 08/16] qdev: gpio: Add API for intercepting an IRQ
Date: Tue, 12 Aug 2014 11:16:57 +0200
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:31.0) Gecko/20100101 Thunderbird/31.0


On 04.08.14 03:55, Peter Crosthwaite wrote:
To replace the old qemu_irq intercept API (which had users reaching
into qdev private state for IRQs).

Signed-off-by: Peter Crosthwaite <address@hidden>
---

  hw/core/qdev.c         | 25 +++++++++++++++++++++++++
  include/hw/qdev-core.h |  2 ++
  2 files changed, 27 insertions(+)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index e6b2231..4cbf773 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -412,6 +412,31 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const 
char *name, int n,
      g_free(propname);
  }
+/* disconnect a GPIO ouput, returning the disconnected input (if any) */
+
+static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
+                                               const char *name, int n)
+{
+    char *propname = g_strdup_printf("%s[%d]",
+                                     name ? name : "unnamed-gpio-out", n);
+
+    qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
+                                                      NULL);
+    if (ret) {
+        object_property_set_link(OBJECT(dev), NULL, propname, NULL);
+    }
+    g_free(propname);
+    return ret;
+}
+
+void qdev_intercept_gpio_out(DeviceState *dev, qemu_irq_handler handler,
+                             const char *name, int n)
+{
+    qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n);
+    qemu_irq icpt = qemu_allocate_irq(handler, disconnected, n);

This means that we can't pass in any other opaque to the intercepting handler which sounds suboptimal to me. Can't we pass in a qemu_irq as parameter and a pointer to a field where we can store the disconnected qemu_irq?

Then the caller can allocate its own qemu_irq with all the opaque data it wants and just have the intercept function overwrite a single field in the passed down opaque.

Or you just return the disconnected qemu_irq. Then the caller can do whatever it likes with it, such as set icpt->opaque to it.


Alex




reply via email to

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