[PATCH] hw/char/pl011: fix receiving multiple chars

Zack Marvel posted 1 patch 3 years, 2 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20210221150430.6223-1-zpmarvel@gmail.com
Maintainers: Paolo Bonzini <pbonzini@redhat.com>, Peter Maydell <peter.maydell@linaro.org>, "Marc-André Lureau" <marcandre.lureau@redhat.com>
hw/char/pl011.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
[PATCH] hw/char/pl011: fix receiving multiple chars
Posted by Zack Marvel 3 years, 2 months ago
When using the GTK UI with libvte, multicharacter keystrokes are not
sent correctly (such as arrow keys). This is not an issue for e.g. the
SDL UI because qemu_chr_be_write is called with len=1 for each character
(SDL sends more than once keystroke).

Buglink: https://bugs.launchpad.net/qemu/+bug/1407808

Signed-off-by: Zack Marvel <zpmarvel@gmail.com>
---
 hw/char/pl011.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/hw/char/pl011.c b/hw/char/pl011.c
index ea4a4e5235..2ea8fd2685 100644
--- a/hw/char/pl011.c
+++ b/hw/char/pl011.c
@@ -300,7 +300,9 @@ static void pl011_put_fifo(void *opaque, uint32_t value)
 
 static void pl011_receive(void *opaque, const uint8_t *buf, int size)
 {
-    pl011_put_fifo(opaque, *buf);
+    for (int i = 0; i < size; i++) {
+        pl011_put_fifo(opaque, buf[i]);
+    }
 }
 
 static void pl011_event(void *opaque, QEMUChrEvent event)
-- 
2.20.1


Re: [PATCH] hw/char/pl011: fix receiving multiple chars
Posted by Peter Maydell 3 years, 2 months ago
On Sun, 21 Feb 2021 at 15:04, Zack Marvel <zpmarvel@gmail.com> wrote:
>
> When using the GTK UI with libvte, multicharacter keystrokes are not
> sent correctly (such as arrow keys). This is not an issue for e.g. the
> SDL UI because qemu_chr_be_write is called with len=1 for each character
> (SDL sends more than once keystroke).
>
> Buglink: https://bugs.launchpad.net/qemu/+bug/1407808
>
> Signed-off-by: Zack Marvel <zpmarvel@gmail.com>

> @@ -300,7 +300,9 @@ static void pl011_put_fifo(void *opaque, uint32_t value)
>
>  static void pl011_receive(void *opaque, const uint8_t *buf, int size)
>  {
> -    pl011_put_fifo(opaque, *buf);
> +    for (int i = 0; i < size; i++) {
> +        pl011_put_fifo(opaque, buf[i]);
> +    }
>  }

I think this is a bug in whatever is on the other end
of the chardev connection. The pl011 can_receive routine
only ever returns 0 or 1, so it is an error for the
code calling its receive function to ever pass a
size that is greater than 1.

thanks
-- PMM

Re: [PATCH] hw/char/pl011: fix receiving multiple chars
Posted by Zack Marvel 3 years, 2 months ago
Peter,

Thanks for the quick review. You're right, I misunderstood the API and 
the bug is in ui/gtk.c.

Thanks,
Zack M

On 2/21/21 8:19 AM, Peter Maydell wrote:
> On Sun, 21 Feb 2021 at 15:04, Zack Marvel <zpmarvel@gmail.com> wrote:
>>
>> When using the GTK UI with libvte, multicharacter keystrokes are not
>> sent correctly (such as arrow keys). This is not an issue for e.g. the
>> SDL UI because qemu_chr_be_write is called with len=1 for each character
>> (SDL sends more than once keystroke).
>>
>> Buglink: https://bugs.launchpad.net/qemu/+bug/1407808
>>
>> Signed-off-by: Zack Marvel <zpmarvel@gmail.com>
> 
>> @@ -300,7 +300,9 @@ static void pl011_put_fifo(void *opaque, uint32_t value)
>>
>>   static void pl011_receive(void *opaque, const uint8_t *buf, int size)
>>   {
>> -    pl011_put_fifo(opaque, *buf);
>> +    for (int i = 0; i < size; i++) {
>> +        pl011_put_fifo(opaque, buf[i]);
>> +    }
>>   }
> 
> I think this is a bug in whatever is on the other end
> of the chardev connection. The pl011 can_receive routine
> only ever returns 0 or 1, so it is an error for the
> code calling its receive function to ever pass a
> size that is greater than 1.
> 
> thanks
> -- PMM
>