qtest/irq: Rework IRQ interception
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 <agraf@suse.de> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									0c24db2b8c
								
							
						
					
					
						commit
						60a79016ae
					
				| 
						 | 
				
			
			@ -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];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										15
									
								
								qtest.c
								
								
								
								
							
							
						
						
									
										15
									
								
								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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue