Stephen Rothwell <s...@canb.auug.org.au> writes:
> ev_byte_channel_send() assumes that its third argument is a 16 byte array.
> Some places where it is called it may not be (or we can't easily tell
> if it is).  Newer compilers have started producing warnings about this,
> so make sure we actually pass a 16 byte array.
>
> There may be more elegant solutions to this, but the driver is quite
> old and hasn't been updated in many years.
...
> Fixes: dcd83aaff1c8 ("tty/powerpc: introduce the ePAPR embedded hypervisor 
> byte channel driver")
> Cc: Michael Ellerman <m...@ellerman.id.au>
> Cc: PowerPC Mailing List <linuxppc-dev@lists.ozlabs.org>
> Signed-off-by: Stephen Rothwell <s...@canb.auug.org.au>
> ---
>  drivers/tty/ehv_bytechan.c | 20 +++++++++++++++++---
>  1 file changed, 17 insertions(+), 3 deletions(-)
>
> I have only build tested this change so it would be good to get some
> response from the PowerPC maintainers/developers.

I've never heard of it, and I have no idea how to test it.

It's not used by qemu, I guess there is/was a Freescale hypervisor that
used it.

But maybe it's time to remove it if it's not being maintained/used by
anyone?

cheers


> diff --git a/drivers/tty/ehv_bytechan.c b/drivers/tty/ehv_bytechan.c
> index 769e0a5d1dfc..546f80c49ae6 100644
> --- a/drivers/tty/ehv_bytechan.c
> +++ b/drivers/tty/ehv_bytechan.c
> @@ -136,6 +136,20 @@ static int find_console_handle(void)
>       return 1;
>  }
>  
> +static unsigned int local_ev_byte_channel_send(unsigned int handle,
> +        unsigned int *count, const char *p)
> +{
> +     char buffer[EV_BYTE_CHANNEL_MAX_BYTES];
> +     unsigned int c = *count;
> +
> +     if (c < sizeof(buffer)) {
> +             memcpy(buffer, p, c);
> +             memset(&buffer[c], 0, sizeof(buffer) - c);
> +             p = buffer;
> +     }
> +     return ev_byte_channel_send(handle, count, p);
> +}
> +
>  /*************************** EARLY CONSOLE DRIVER 
> ***************************/
>  
>  #ifdef CONFIG_PPC_EARLY_DEBUG_EHV_BC
> @@ -154,7 +168,7 @@ static void byte_channel_spin_send(const char data)
>  
>       do {
>               count = 1;
> -             ret = ev_byte_channel_send(CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE,
> +             ret = 
> local_ev_byte_channel_send(CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE,
>                                          &count, &data);
>       } while (ret == EV_EAGAIN);
>  }
> @@ -221,7 +235,7 @@ static int ehv_bc_console_byte_channel_send(unsigned int 
> handle, const char *s,
>       while (count) {
>               len = min_t(unsigned int, count, EV_BYTE_CHANNEL_MAX_BYTES);
>               do {
> -                     ret = ev_byte_channel_send(handle, &len, s);
> +                     ret = local_ev_byte_channel_send(handle, &len, s);
>               } while (ret == EV_EAGAIN);
>               count -= len;
>               s += len;
> @@ -401,7 +415,7 @@ static void ehv_bc_tx_dequeue(struct ehv_bc_data *bc)
>                           CIRC_CNT_TO_END(bc->head, bc->tail, BUF_SIZE),
>                           EV_BYTE_CHANNEL_MAX_BYTES);
>  
> -             ret = ev_byte_channel_send(bc->handle, &len, bc->buf + 
> bc->tail);
> +             ret = local_ev_byte_channel_send(bc->handle, &len, bc->buf + 
> bc->tail);
>  
>               /* 'len' is valid only if the return code is 0 or EV_EAGAIN */
>               if (!ret || (ret == EV_EAGAIN))
> -- 
> 2.25.0.rc1
>
> -- 
> Cheers,
> Stephen Rothwell

Reply via email to