From 81ba81a9103c509e7b0e7265fe20b3c2f6e48dd4 Mon Sep 17 00:00:00 2001 From: Justin Moore Date: Tue, 16 Apr 2024 09:15:01 -0500 Subject: [PATCH] Prevent a serial RX overflow if the port is in FIFO mode --- bochs/iodev/serial.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/bochs/iodev/serial.cc b/bochs/iodev/serial.cc index 4e7478385..63e5d6871 100644 --- a/bochs/iodev/serial.cc +++ b/bochs/iodev/serial.cc @@ -544,8 +544,8 @@ bx_serial_c::init(void) if (server) { // server mode pipe = CreateNamedPipe( dev, - PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE, - PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, + PIPE_ACCESS_DUPLEX, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT, 1, 4096, 4096, 0, NULL); if (pipe == INVALID_HANDLE_VALUE) { @@ -553,7 +553,8 @@ bx_serial_c::init(void) continue; } BX_INFO(("com%d: waiting for client to connect to %s", i+1, dev)); - if (!ConnectNamedPipe(pipe, NULL) && GetLastError() != ERROR_PIPE_CONNECTED) + if (!ConnectNamedPipe(pipe, NULL) && GetLastError() != ERROR_PIPE_CONNECTED + && GetLastError() != ERROR_PIPE_LISTENING) { CloseHandle(pipe); pipe = INVALID_HANDLE_VALUE; @@ -1538,8 +1539,10 @@ void bx_serial_c::rx_timer(void) if (BX_SER_THIS s[port].tty_id >= 0) FD_SET(BX_SER_THIS s[port].tty_id, &fds); #endif } + + // N.B: Throttle inputs if the OS has not yet responded to us. if ((BX_SER_THIS s[port].line_status.rxdata_ready == 0) || - (BX_SER_THIS s[port].fifo_cntl.enable)) { + ((BX_SER_THIS s[port].fifo_cntl.enable) && (BX_SER_THIS s[port].rx_fifo_end < 15))) { switch (BX_SER_THIS s[port].io_mode) { case BX_SER_MODE_SOCKET_CLIENT: case BX_SER_MODE_SOCKET_SERVER: