serial: chardev hotswap support
This allows to change the port's backend runtime, e.g. change it from file to a socket making it possible to establish a debug session with WinDbg > qemu-system [..] -chardev file,id=charchannel2,path=/tmp/charchannel2 \ -device isa-serial,chardev=charchannel2,id=channel2 QEMU 2.9.50 monitor - type 'help' for more information (qemu) chardev-change charchannel2 \ socket,host=127.0.0.1,port=4242,server,nowait For a backend change, a number of ioctls has to be replayed to sync the current setup of a frontend to a backend tty. This is hopefully enough so we don't have to track, store and replay the whole original control byte sequence. Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <1499342940-56739-14-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									757358425e
								
							
						
					
					
						commit
						1a29cc8f5e
					
				@ -891,6 +891,34 @@ static void serial_reset(void *opaque)
 | 
			
		||||
    s->msr &= ~UART_MSR_ANY_DELTA;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int serial_be_change(void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    SerialState *s = opaque;
 | 
			
		||||
 | 
			
		||||
    qemu_chr_fe_set_handlers(&s->chr, serial_can_receive1, serial_receive1,
 | 
			
		||||
                             serial_event, serial_be_change, s, NULL, true);
 | 
			
		||||
 | 
			
		||||
    serial_update_parameters(s);
 | 
			
		||||
 | 
			
		||||
    qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_BREAK,
 | 
			
		||||
                      &s->last_break_enable);
 | 
			
		||||
 | 
			
		||||
    s->poll_msl = (s->ier & UART_IER_MSI) ? 1 : 0;
 | 
			
		||||
    serial_update_msl(s);
 | 
			
		||||
 | 
			
		||||
    if (s->poll_msl >= 0 && !(s->mcr & UART_MCR_LOOP)) {
 | 
			
		||||
        serial_update_tiocm(s);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (s->watch_tag > 0) {
 | 
			
		||||
        g_source_remove(s->watch_tag);
 | 
			
		||||
        s->watch_tag = qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
 | 
			
		||||
                                             serial_watch_cb, s);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void serial_realize_core(SerialState *s, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    if (!qemu_chr_fe_backend_connected(&s->chr)) {
 | 
			
		||||
@ -904,7 +932,7 @@ void serial_realize_core(SerialState *s, Error **errp)
 | 
			
		||||
    qemu_register_reset(serial_reset, s);
 | 
			
		||||
 | 
			
		||||
    qemu_chr_fe_set_handlers(&s->chr, serial_can_receive1, serial_receive1,
 | 
			
		||||
                             serial_event, NULL, s, NULL, true);
 | 
			
		||||
                             serial_event, serial_be_change, s, NULL, true);
 | 
			
		||||
    fifo8_create(&s->recv_fifo, UART_FIFO_LENGTH);
 | 
			
		||||
    fifo8_create(&s->xmit_fifo, UART_FIFO_LENGTH);
 | 
			
		||||
    serial_reset(s);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user