Re: [PATCH v2] hw/char/pl011: support backend hotswap

Philippe Mathieu-Daudé <[email protected]>
Newsgroups org.nongnu.qemu-arm,org.nongnu.qemu-devel
Message-ID <[email protected]>
Hi Alexander,

On 11/8/26 10:14, Alexander Mikhalitsyn wrote:
> From: Alexander 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.
> 
> Please, note that we have to "replay" CHR_IOCTL_SERIAL_SET_BREAK, because
> if BRK bit was set before backend change (i.e. (s->lcr & LCR_BRK) is true),
> then after change we need to send break to a new backend too.
> 
> 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]>
> Reviewed-by: Alex Bennée <[email protected]>
> Signed-off-by: Alexander Mikhalitsyn <[email protected]>
> ---
> v2:
> 	- fixed a typo in commit author name
> 	  [ I did `git format-patch` and copied this patch from my Raspberry PI
> 	    dev/test machine and it turns out that I have a stupid typo in my
> 	    `git config get user.name` on that machine. ]
> 	- added RWB tag from Alex Bennée
> 	- adjusted a commit message
> ---
>   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);

Could we factor the common code used in pl011_write() in a common
helper?

> +
> +    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)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.