[PATCH] hw/char/pl011: support backend hotswap
Alexander Mikhalitsyn <[email protected]>
| Newsgroups | org.nongnu.qemu-arm,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
From: Aleksanr Mikhalitsyn <[email protected]> Currently, when Incus issues "chardev-change" QMP command to change chardev backend from ringbuf to socket it receives an error (with aarch64 VM): "Chardev user does not support chardev hotswap" [1], [2] Let's fix this by properly implementing BackendChangeHandler for pl011. Link: https://discuss.linuxcontainers.org/t/unable-to-connect-to-vm-console-on-arm-architecture/23096/3 [1] Link: https://github.com/lxc/distrobuilder/issues/892 [2] Reported-by: Stéphane Graber <[email protected]> Signed-off-by: Alexander Mikhalitsyn <[email protected]> --- hw/char/pl011.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index cb12c3e224f..3622248ec0c 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -660,12 +660,26 @@ static void pl011_init(Object *obj) s->id = pl011_id_arm; } +static int pl011_be_change(void *opaque) +{ + PL011State *s = opaque; + int break_enable = s->lcr & LCR_BRK; + + qemu_chr_fe_set_handlers(&s->chr, pl011_can_receive, pl011_receive, + pl011_event, pl011_be_change, s, NULL, true); + + qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_BREAK, + &break_enable); + + return 0; +} + static void pl011_realize(DeviceState *dev, Error **errp) { PL011State *s = PL011(dev); qemu_chr_fe_set_handlers(&s->chr, pl011_can_receive, pl011_receive, - pl011_event, NULL, s, NULL, true); + pl011_event, pl011_be_change, s, NULL, true); } static void pl011_reset(DeviceState *dev) -- 2.47.3