From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: "Marc-André Lureau" <marcandre.lureau@gmail.com>
Cc: Bin Meng <bmeng.cn@gmail.com>,
pbonzini@redhat.com,
"Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
qemu-devel@nongnu.org, Alistair Francis <alistair@alistair23.me>
Subject: Re: [Qemu-devel] [PATCH 19/38] char: make some qemu_chr_fe skip if no driver
Date: Thu, 16 Feb 2023 16:29:47 +0100 [thread overview]
Message-ID: <18dff0d7-6417-b2c4-eb76-c8d5a89433aa@linaro.org> (raw)
In-Reply-To: <CAJ+F1C+4VJOytUS4kukBcnNEo7XN1dCLKcSzbiFmLkM4F+gSJA@mail.gmail.com>
On 16/2/23 15:23, Marc-André Lureau wrote:
> Hi Philippe
>
> On Thu, Feb 16, 2023 at 2:14 AM Philippe Mathieu-Daudé
> <philmd@linaro.org> wrote:
>>
>> Hi Marc-André,
>>
>> [very old patch...]
>>
>> On 22/10/16 11:52, Marc-André Lureau wrote:
>>> In most cases, front ends do not care about the side effect of
>>> CharBackend, so we can simply skip the checks and call the qemu_chr_fe
>>> functions even without associated CharDriver.
>>>
>>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>>> ---
>>> hw/arm/pxa2xx.c | 8 +++-----
>>> hw/arm/strongarm.c | 16 ++++++---------
>>> hw/char/bcm2835_aux.c | 18 ++++++-----------
>>> hw/char/cadence_uart.c | 24 +++++++---------------
>>
>>> qemu-char.c | 51 ++++++++++++++++++++++++++++++++++++++---------
>>> include/sysemu/char.h | 40 +++++++++++++++++++++++++------------
>>> 22 files changed, 156 insertions(+), 191 deletions(-)
>>
>>
>>> diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
>>> index 4459b2d..291818e 100644
>>> --- a/hw/char/cadence_uart.c
>>> +++ b/hw/char/cadence_uart.c
>>> @@ -142,9 +142,7 @@ static void uart_rx_reset(CadenceUARTState *s)
>>> {
>>> s->rx_wpos = 0;
>>> s->rx_count = 0;
>>> - if (s->chr.chr) {
>>> - qemu_chr_fe_accept_input(&s->chr);
>>> - }
>>> + qemu_chr_fe_accept_input(&s->chr);
>>
>> I'm trying to understand this change. This code comes from:
>>
>> commit 9121d02cb33c96b444a3973579f5edc119597e81
>>
>> char/cadence_uart: Fix reset for unattached instances
>>
>> commit 1db8b5efe0c2b5000e50691eea61264a615f43de introduced an issue
>> where QEMU would segfault if you have an unattached Cadence UART.
>>
>> Fix by guarding the flush-on-reset logic on there being a qemu_chr
>> attachment.
>>
>> diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
>> index 131370a74b..4d457f8c65 100644
>> --- a/hw/char/cadence_uart.c
>> +++ b/hw/char/cadence_uart.c
>> @@ -157,7 +157,9 @@ static void uart_rx_reset(UartState *s)
>> {
>> s->rx_wpos = 0;
>> s->rx_count = 0;
>> - qemu_chr_accept_input(s->chr);
>> + if (s->chr) {
>> + qemu_chr_accept_input(s->chr);
>> + }
>>
>> When resetting the xlnx-zcu102 machine, I hit:
>>
>> (lldb) bt
>> * thread #1, queue = 'com.apple.main-thread', stop reason =
>> EXC_BAD_ACCESS (code=1, address=0x50)
>> * frame #0: 0x10020a740 gd_vc_send_chars(vc=0x000000000) at
>> gtk.c:1759:41 [opt]
>> frame #1: 0x100636264 qemu_chr_fe_accept_input(be=<unavailable>) at
>> char-fe.c:159:9 [opt]
>> frame #2: 0x1000608e0 cadence_uart_reset_hold [inlined]
>> uart_rx_reset(s=0x10810a960) at cadence_uart.c:158:5 [opt]
>> frame #3: 0x1000608d4 cadence_uart_reset_hold(obj=0x10810a960) at
>> cadence_uart.c:530:5 [opt]
>> frame #4: 0x100580ab4 resettable_phase_hold(obj=0x10810a960,
>> opaque=0x000000000, type=<unavailable>) at resettable.c:0 [opt]
>> frame #5: 0x10057d1b0 bus_reset_child_foreach(obj=<unavailable>,
>> cb=(resettable_phase_hold at resettable.c:162), opaque=0x000000000,
>> type=RESET_TYPE_COLD) at bus.c:97:13 [opt]
>> frame #6: 0x1005809f8 resettable_phase_hold [inlined]
>> resettable_child_foreach(rc=0x000060000332d2c0, obj=0x0000600002c1c180,
>> cb=<unavailable>, opaque=0x000000000, type=RESET_TYPE_COLD) at
>> resettable.c:96:9 [opt]
>> frame #7: 0x1005809d8 resettable_phase_hold(obj=0x0000600002c1c180,
>> opaque=0x000000000, type=RESET_TYPE_COLD) at resettable.c:173:5 [opt]
>> frame #8: 0x1005803a0
>> resettable_assert_reset(obj=0x0000600002c1c180, type=<unavailable>) at
>> resettable.c:60:5 [opt]
>> frame #9: 0x10058027c resettable_reset(obj=0x0000600002c1c180,
>> type=RESET_TYPE_COLD) at resettable.c:45:5 [opt]
>>
>> Doing similar to commit 9121d02cb3...:
>>
>> -- >8 --
>> diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
>> index c069a30842..deadee1788 100644
>> --- a/hw/char/cadence_uart.c
>> +++ b/hw/char/cadence_uart.c
>> @@ -155,7 +155,9 @@ static void uart_rx_reset(CadenceUARTState *s)
>> {
>> s->rx_wpos = 0;
>> s->rx_count = 0;
>> - qemu_chr_fe_accept_input(&s->chr);
>> + if (qemu_chr_fe_backend_open(&s->chr)) {
>> + qemu_chr_fe_accept_input(&s->chr);
>> + }
>> }
>> ---
>>
>> ... fixes the issue but I'm not sure 1/ this is a correct use of the
>> chardev API and 2/ this is how the HW work at reset.
>
> The trouble is that GTK/VTE console/chardev creation is done later.
>
> I think we should rather fix ui/gtk.c, as this could happen with other
> char frontends:
>
> diff --git a/ui/gtk.c b/ui/gtk.c
> index 4817623c8f..dfaf6d33c3 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -1783,7 +1783,9 @@ static void gd_vc_chr_accept_input(Chardev *chr)
> VCChardev *vcd = VC_CHARDEV(chr);
> VirtualConsole *vc = vcd->console;
>
> - gd_vc_send_chars(vc);
> + if (vc) {
> + gd_vc_send_chars(vc);
> + }
Easy :) If you send a proper patch, feel free to include:
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Thanks!
next prev parent reply other threads:[~2023-02-16 15:30 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-22 9:52 [Qemu-devel] [PATCH 00/38] char: fixes and improvements (was "[PATCH 0/9] Fix mux regression") Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 01/38] rng: remove unused included header Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 02/38] char: remove use-after-free on win-stdio Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 03/38] ringbuf: fix chr_write return value Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 04/38] sun4uv: fix serial initialization regression Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 05/38] malta: replace chr init by CHR_EVENT_OPENED handler Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 06/38] char: remove init callback Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 07/38] xilinx: fix buffer overflow on realize Marc-André Lureau
2016-10-23 12:01 ` Paolo Bonzini
2016-10-22 9:52 ` [Qemu-devel] [PATCH 08/38] mux: split mux_chr_update_read_handler() Marc-André Lureau
2016-10-24 19:51 ` Eric Blake
2016-10-22 9:52 ` [Qemu-devel] [PATCH 09/38] char: introduce CharBackend Marc-André Lureau
2016-10-23 12:03 ` Paolo Bonzini
2016-10-22 9:52 ` [Qemu-devel] [PATCH 10/38] char: start converting mux driver to use CharBackend Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 11/38] char: replace PROP_CHR with CharBackend Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 12/38] char: remaining switch to CharBackend in frontend Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 13/38] char: rename some frontend functions Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 14/38] colo: claim in find_and_check_chardev Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 15/38] char: use qemu_chr_fe* functions with CharBackend argument Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 16/38] char: fold qemu_chr_set_handlers in qemu_chr_fe_set_handlers Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 17/38] vhost-user: only initialize queue 0 CharBackend Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 18/38] char: replace qemu_chr_claim/release with qemu_chr_fe_init/deinit Marc-André Lureau
2016-10-22 9:52 ` [Qemu-devel] [PATCH 19/38] char: make some qemu_chr_fe skip if no driver Marc-André Lureau
2023-02-15 22:13 ` Philippe Mathieu-Daudé
2023-02-16 14:23 ` Marc-André Lureau
2023-02-16 15:29 ` Philippe Mathieu-Daudé [this message]
2016-10-22 9:53 ` [Qemu-devel] [PATCH 20/38] tests: start chardev unit tests Marc-André Lureau
2016-10-27 18:27 ` Eric Blake
2016-10-22 9:53 ` [Qemu-devel] [PATCH 21/38] char: move front end handlers in CharBackend Marc-André Lureau
2016-10-24 13:40 ` Paolo Bonzini
2016-10-22 9:53 ` [Qemu-devel] [PATCH 22/38] char: rename chr_close/chr_free Marc-André Lureau
2016-10-22 9:53 ` [Qemu-devel] [PATCH 23/38] char: remove explicit_fe_open, use a set_handlers argument Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 24/38] char: move fe_open in CharBackend Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 25/38] char: remove unused CHR_EVENT_FOCUS Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 26/38] char: use an enum for CHR_EVENT Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 27/38] char: remove unused qemu_chr_fe_event Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 28/38] char: replace avail_connections Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 29/38] char: use common error path in qmp_chardev_add Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 30/38] char: remove explicit_be_open from CharDriverState Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 31/38] char: use a const CharDriver Marc-André Lureau
2016-10-23 12:24 ` Paolo Bonzini
2016-10-22 10:09 ` [Qemu-devel] [PATCH 32/38] char: use a static array for backends Marc-André Lureau
2016-10-23 12:21 ` Paolo Bonzini
2016-10-22 10:09 ` [Qemu-devel] [PATCH 33/38] char: move callbacks in CharDriver Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 34/38] char: fold single-user functions in caller Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 35/38] char: introduce generic qemu_chr_get_kind() Marc-André Lureau
2016-10-22 10:09 ` [Qemu-devel] [PATCH 36/38] char: use a feature bit for replay Marc-André Lureau
2016-10-22 10:16 ` [Qemu-devel] [PATCH 37/38] char: allocate CharDriverState as a single object Marc-André Lureau
2016-10-22 10:16 ` [Qemu-devel] [PATCH 38/38] bt: use qemu_chr_alloc() Marc-André Lureau
2016-10-23 12:28 ` [Qemu-devel] [PATCH 37/38] char: allocate CharDriverState as a single object Paolo Bonzini
2016-10-23 18:15 ` [Qemu-devel] [PATCH 00/38] char: fixes and improvements (was "[PATCH 0/9] Fix mux regression") Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=18dff0d7-6417-b2c4-eb76-c8d5a89433aa@linaro.org \
--to=philmd@linaro.org \
--cc=alistair@alistair23.me \
--cc=bmeng.cn@gmail.com \
--cc=edgar.iglesias@gmail.com \
--cc=marcandre.lureau@gmail.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).