qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH target-arm v1 0/2]  More Cadence UART fixes
@ 2014-02-12  3:36 Peter Crosthwaite
  2014-02-12  3:36 ` [Qemu-devel] [PATCH target-arm v1 1/2] char/cadence_uart: Handle qemu_chr_fe_write errors Peter Crosthwaite
  2014-02-12  3:37 ` [Qemu-devel] [PATCH target-arm v1 2/2] char/cadence_uart: Add NULL guards against chr Peter Crosthwaite
  0 siblings, 2 replies; 5+ messages in thread
From: Peter Crosthwaite @ 2014-02-12  3:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, chrisj


Hi Peter,

Two fixes to Cadence UART. First is a bug in the recently refactored
TX code path around error handling.

Second is the long known crashing-cadence-UART bug when there in no
backing serial device (i.e. boot a kernel that talks to serial without
adding -serial args).

Chris recently reported the second issue to me offline.

Chris,

Please test to see if this a resolution to your issue.

Regards,
Peter


Peter Crosthwaite (2):
  char/cadence_uart: Handle qemu_chr_fe_write errors
  char/cadence_uart: Add NULL guards against chr

 hw/char/cadence_uart.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

-- 
1.8.5.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH target-arm v1 1/2] char/cadence_uart: Handle qemu_chr_fe_write errors
  2014-02-12  3:36 [Qemu-devel] [PATCH target-arm v1 0/2] More Cadence UART fixes Peter Crosthwaite
@ 2014-02-12  3:36 ` Peter Crosthwaite
  2014-02-12 19:22   ` Peter Maydell
  2014-02-12  3:37 ` [Qemu-devel] [PATCH target-arm v1 2/2] char/cadence_uart: Add NULL guards against chr Peter Crosthwaite
  1 sibling, 1 reply; 5+ messages in thread
From: Peter Crosthwaite @ 2014-02-12  3:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, chrisj

By just ignoring them and trying again later. This handles the
EGAIN case properly (the previous implementation was only dealing
with short returns and not errors).

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---

 hw/char/cadence_uart.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
index 1012f1a..1985047 100644
--- a/hw/char/cadence_uart.c
+++ b/hw/char/cadence_uart.c
@@ -302,8 +302,11 @@ static gboolean cadence_uart_xmit(GIOChannel *chan, GIOCondition cond,
     }
 
     ret = qemu_chr_fe_write(s->chr, s->tx_fifo, s->tx_count);
-    s->tx_count -= ret;
-    memmove(s->tx_fifo, s->tx_fifo + ret, s->tx_count);
+
+    if (ret >= 0) {
+        s->tx_count -= ret;
+        memmove(s->tx_fifo, s->tx_fifo + ret, s->tx_count);
+    }
 
     if (s->tx_count) {
         int r = qemu_chr_fe_add_watch(s->chr, G_IO_OUT, cadence_uart_xmit, s);
-- 
1.8.5.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH target-arm v1 2/2] char/cadence_uart: Add NULL guards against chr
  2014-02-12  3:36 [Qemu-devel] [PATCH target-arm v1 0/2] More Cadence UART fixes Peter Crosthwaite
  2014-02-12  3:36 ` [Qemu-devel] [PATCH target-arm v1 1/2] char/cadence_uart: Handle qemu_chr_fe_write errors Peter Crosthwaite
@ 2014-02-12  3:37 ` Peter Crosthwaite
  2014-02-12 19:24   ` Peter Maydell
  1 sibling, 1 reply; 5+ messages in thread
From: Peter Crosthwaite @ 2014-02-12  3:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, chrisj

It's possible and valid for users of this device model to instantiate
it without a backing chr device. To avoid crashes, guard all uses of
the backing chr device against NULL.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---

 hw/char/cadence_uart.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
index 1985047..10abb4d 100644
--- a/hw/char/cadence_uart.c
+++ b/hw/char/cadence_uart.c
@@ -175,8 +175,10 @@ static void uart_send_breaks(UartState *s)
 {
     int break_enabled = 1;
 
-    qemu_chr_fe_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_BREAK,
-                               &break_enabled);
+    if (s->chr) {
+        qemu_chr_fe_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_BREAK,
+                          &break_enabled);
+    }
 }
 
 static void uart_parameters_setup(UartState *s)
@@ -227,7 +229,9 @@ static void uart_parameters_setup(UartState *s)
 
     packet_size += ssp.data_bits + ssp.stop_bits;
     s->char_tx_time = (get_ticks_per_sec() / ssp.speed) * packet_size;
-    qemu_chr_fe_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
+    if (s->chr) {
+        qemu_chr_fe_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
+    }
 }
 
 static int uart_can_receive(void *opaque)
@@ -377,7 +381,9 @@ static void uart_read_rx_fifo(UartState *s, uint32_t *c)
         *c = s->rx_fifo[rx_rpos];
         s->rx_count--;
 
-        qemu_chr_accept_input(s->chr);
+        if (s->chr) {
+            qemu_chr_accept_input(s->chr);
+        }
     } else {
         *c = 0;
     }
-- 
1.8.5.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH target-arm v1 1/2] char/cadence_uart: Handle qemu_chr_fe_write errors
  2014-02-12  3:36 ` [Qemu-devel] [PATCH target-arm v1 1/2] char/cadence_uart: Handle qemu_chr_fe_write errors Peter Crosthwaite
@ 2014-02-12 19:22   ` Peter Maydell
  0 siblings, 0 replies; 5+ messages in thread
From: Peter Maydell @ 2014-02-12 19:22 UTC (permalink / raw)
  To: Peter Crosthwaite; +Cc: QEMU Developers, Chris Johns

On 12 February 2014 03:36, Peter Crosthwaite
<peter.crosthwaite@xilinx.com> wrote:
> By just ignoring them and trying again later. This handles the
> EGAIN case properly (the previous implementation was only dealing
> with short returns and not errors).
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> ---
>
>  hw/char/cadence_uart.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
> index 1012f1a..1985047 100644
> --- a/hw/char/cadence_uart.c
> +++ b/hw/char/cadence_uart.c
> @@ -302,8 +302,11 @@ static gboolean cadence_uart_xmit(GIOChannel *chan, GIOCondition cond,
>      }
>
>      ret = qemu_chr_fe_write(s->chr, s->tx_fifo, s->tx_count);
> -    s->tx_count -= ret;
> -    memmove(s->tx_fifo, s->tx_fifo + ret, s->tx_count);
> +
> +    if (ret >= 0) {
> +        s->tx_count -= ret;
> +        memmove(s->tx_fifo, s->tx_fifo + ret, s->tx_count);
> +    }
>
>      if (s->tx_count) {
>          int r = qemu_chr_fe_add_watch(s->chr, G_IO_OUT, cadence_uart_xmit, s);

If we got EAGAIN do we really need to re-add the watch and recompute
the UART status, or could we just return early?

Incidentally, this looks like the third or fourth patch fixing use of
qemu_chr_fe_write() in a UART model; perhaps we should audit
the others...

thanks
-- PMM

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH target-arm v1 2/2] char/cadence_uart: Add NULL guards against chr
  2014-02-12  3:37 ` [Qemu-devel] [PATCH target-arm v1 2/2] char/cadence_uart: Add NULL guards against chr Peter Crosthwaite
@ 2014-02-12 19:24   ` Peter Maydell
  0 siblings, 0 replies; 5+ messages in thread
From: Peter Maydell @ 2014-02-12 19:24 UTC (permalink / raw)
  To: Peter Crosthwaite; +Cc: QEMU Developers, Chris Johns

On 12 February 2014 03:37, Peter Crosthwaite
<peter.crosthwaite@xilinx.com> wrote:
> It's possible and valid for users of this device model to instantiate
> it without a backing chr device. To avoid crashes, guard all uses of
> the backing chr device against NULL.
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

I guess the other way to approach this would be to require the
backing device and just set it up to be a "throw away output,
never provide input" dummy if there isn't a real one. No idea
if that's feasible though so NULL-guards seems reasonable.

thanks
-- PMM

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-02-12 19:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-12  3:36 [Qemu-devel] [PATCH target-arm v1 0/2] More Cadence UART fixes Peter Crosthwaite
2014-02-12  3:36 ` [Qemu-devel] [PATCH target-arm v1 1/2] char/cadence_uart: Handle qemu_chr_fe_write errors Peter Crosthwaite
2014-02-12 19:22   ` Peter Maydell
2014-02-12  3:37 ` [Qemu-devel] [PATCH target-arm v1 2/2] char/cadence_uart: Add NULL guards against chr Peter Crosthwaite
2014-02-12 19:24   ` Peter Maydell

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).