From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53923) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xilzl-0004Mm-Mf for qemu-devel@nongnu.org; Mon, 27 Oct 2014 11:14:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xilzk-0001eg-RN for qemu-devel@nongnu.org; Mon, 27 Oct 2014 11:14:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41678) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xilzk-0001eT-Gr for qemu-devel@nongnu.org; Mon, 27 Oct 2014 11:14:08 -0400 From: Paolo Bonzini Date: Mon, 27 Oct 2014 16:13:26 +0100 Message-Id: <1414422825-6166-10-git-send-email-pbonzini@redhat.com> In-Reply-To: <1414422825-6166-1-git-send-email-pbonzini@redhat.com> References: <1414422825-6166-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 09/28] qtest/irq: Rework IRQ interception List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Crosthwaite From: Peter Crosthwaite Change the qtest intercept handler to accept just the individual IRQ being intercepted as opaque. n is still expected to be correctly set as for the original intercepted irq. qemu_intercept_irq_in is updated accordingly. Then covert the qemu_irq_intercept_out call to use qdev intercept version. This stops qtest from having to mess with the raw IRQ pointers (still has to mess with names and counts but a step in the right direction). Reviewed-by: Alexander Graf Signed-off-by: Peter Crosthwaite Signed-off-by: Paolo Bonzini --- hw/core/irq.c | 2 +- qtest.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/hw/core/irq.c b/hw/core/irq.c index cffced0..4a580a2 100644 --- a/hw/core/irq.c +++ b/hw/core/irq.c @@ -140,7 +140,7 @@ void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n) for (i = 0; i < n; i++) { *old_irqs[i] = *gpio_in[i]; gpio_in[i]->handler = handler; - gpio_in[i]->opaque = old_irqs; + gpio_in[i]->opaque = &old_irqs[i]; } } diff --git a/qtest.c b/qtest.c index 4b85995..946b560 100644 --- a/qtest.c +++ b/qtest.c @@ -201,8 +201,8 @@ static void GCC_FMT_ATTR(2, 3) qtest_send(CharDriverState *chr, static void qtest_irq_handler(void *opaque, int n, int level) { - qemu_irq *old_irqs = opaque; - qemu_set_irq(old_irqs[n], level); + qemu_irq old_irq = *(qemu_irq *)opaque; + qemu_set_irq(old_irq, level); if (irq_levels[n] != level) { CharDriverState *chr = qtest_chr; @@ -264,8 +264,15 @@ static void qtest_process_command(CharDriverState *chr, gchar **words) continue; } if (words[0][14] == 'o') { - qemu_irq_intercept_out(&ngl->out, qtest_irq_handler, - ngl->num_out); + int i; + for (i = 0; i < ngl->num_out; ++i) { + qemu_irq *disconnected = g_new0(qemu_irq, 1); + qemu_irq icpt = qemu_allocate_irq(qtest_irq_handler, + disconnected, i); + + *disconnected = qdev_intercept_gpio_out(dev, icpt, + ngl->name, i); + } } else { qemu_irq_intercept_in(ngl->in, qtest_irq_handler, ngl->num_in); -- 1.8.3.1