提交 6c3bc244 编写于 作者: D David Gibson

spapr: Implement bug in spapr-vty device to be compatible with PowerVM

The spapr-vty device implements the PAPR defined virtual console,
which is also implemented by IBM's proprietary PowerVM hypervisor.

PowerVM's implementation has a bug where it inserts an extra \0 after
every \r going to the guest.  Because of that Linux's guest side
driver has a workaround which strips \0 characters that appear
immediately after a \r.

That means that when running under qemu, sending a binary stream from
host to guest via spapr-vty which happens to include a \r\0 sequence
will get corrupted by that workaround.

To deal with that, this patch duplicates PowerVM's bug, inserting an
extra \0 after each \r.  Ugly, but the best option available.
Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
Reviewed-by: NThomas Huth <thuth@redhat.com>
Reviewed-by: NGreg Kurz <groug@kaod.org>
上级 bac658d1
......@@ -58,6 +58,24 @@ static int vty_getchars(VIOsPAPRDevice *sdev, uint8_t *buf, int max)
while ((n < max) && (dev->out != dev->in)) {
buf[n++] = dev->buf[dev->out++ % VTERM_BUFSIZE];
/* PowerVM's vty implementation has a bug where it inserts a
* \0 after every \r going to the guest. Existing guests have
* a workaround for this which removes every \0 immediately
* following a \r, so here we make ourselves bug-for-bug
* compatible, so that the guest won't drop a real \0-after-\r
* that happens to occur in a binary stream. */
if (buf[n - 1] == '\r') {
if (n < max) {
buf[n++] = '\0';
} else {
/* No room for the extra \0, roll back and try again
* next time */
dev->out--;
n--;
break;
}
}
}
qemu_chr_fe_accept_input(&dev->chardev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册