hv: console reads all input chars in one poll

For uart console, some control keys are defined as byte sequences,
such as:
 * up arrow - 0x1b/0x5b/0x41
 * F8 - 0x1b/0x5b/0x31/0x39/0x7e

Currently hv console only read one char per poll.
When guest vuart console is active, those byte sequences may not be sent
to guest vuart in good timing due to the poll interval. Thus control keys
such as up/down can not be used in shell or vim.

The solution is to read all input chars in one poll, so that control keys
can be received by guest OS properly.

Tracked-On: #8564
Signed-off-by: Wu Zhou <wu.zhou@intel.com>
Reviewed-by: Junjie Mao <junjie.mao@intel.com>
This commit is contained in:
Wu Zhou 2024-02-20 16:09:47 +08:00 committed by acrnsi-robot
parent edeb5fe9ca
commit a052cda8e4
1 changed files with 16 additions and 9 deletions

View File

@ -104,20 +104,27 @@ struct acrn_vuart *vm_console_vuart(struct acrn_vm *vm)
static void vuart_console_rx_chars(struct acrn_vuart *vu)
{
char ch = -1;
bool recv = false;
/* Get data from physical uart */
ch = uart16550_getc();
while (1) {
/* Get data from physical uart */
ch = uart16550_getc();
if (ch == -1)
break;
if (ch == GUEST_CONSOLE_TO_HV_SWITCH_KEY) {
/* Switch the console */
console_vmid = ACRN_INVALID_VMID;
printf("\r\n\r\n ---Entering ACRN SHELL---\r\n");
break;
}
if (ch == GUEST_CONSOLE_TO_HV_SWITCH_KEY) {
/* Switch the console */
console_vmid = ACRN_INVALID_VMID;
printf("\r\n\r\n ---Entering ACRN SHELL---\r\n");
}
if (ch != -1) {
vuart_putchar(vu, ch);
recv = true;
}
if (recv) {
vuart_toggle_intr(vu);
}
}
/**