X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fdev%2Fterminal.cc;h=a11d45554eaa4716b159946410d3f2d3d51c5497;hb=eae1e97fb002b44a9d8c46df2da1ddc1d0156ce4;hp=47f280ad3b09831bed62ef224f08a2473a9d0cb5;hpb=3205768ea57b4e2f75561eebb39671045a6d6746;p=gem5.git diff --git a/src/dev/terminal.cc b/src/dev/terminal.cc index 47f280ad3..a11d45554 100644 --- a/src/dev/terminal.cc +++ b/src/dev/terminal.cc @@ -35,20 +35,23 @@ #include #include -#include -#include #include #include -#include +#include +#include #include +#include #include #include +#include "base/atomicio.hh" #include "base/misc.hh" #include "base/output.hh" #include "base/socket.hh" #include "base/trace.hh" +#include "debug/Terminal.hh" +#include "debug/TerminalVerbose.hh" #include "dev/platform.hh" #include "dev/terminal.hh" #include "dev/uart.hh" @@ -99,6 +102,9 @@ Terminal::Terminal(const Params *p) { if (p->output) { outfile = simout.find(p->name); + if (!outfile) + outfile = simout.create(p->name); + outfile->setf(ios::unitbuf); } @@ -125,6 +131,11 @@ Terminal::~Terminal() void Terminal::listen(int port) { + if (ListenSocket::allDisabled()) { + warn_once("Sockets disabled, not accepting terminal connections"); + return; + } + while (!listener.listen(port, true)) { DPRINTF(Terminal, ": can't bind address terminal port %d inuse PID %d\n", @@ -151,7 +162,7 @@ Terminal::accept() int fd = listener.accept(true); if (data_fd != -1) { char message[] = "terminal already attached!\n"; - ::write(fd, message, sizeof(message)); + atomic_write(fd, message, sizeof(message)); ::close(fd); return; } @@ -233,16 +244,9 @@ Terminal::write(const uint8_t *buf, size_t len) if (data_fd < 0) panic("Terminal not properly attached.\n"); - size_t ret; - for (;;) { - ret = ::write(data_fd, buf, len); - - if (ret >= 0) - break; - - if (errno != EINTR) - detach(); - } + ssize_t ret = atomic_write(data_fd, buf, len); + if (ret < len) + detach(); return ret; } @@ -255,17 +259,13 @@ Terminal::write(const uint8_t *buf, size_t len) uint8_t Terminal::in() { - bool empty; uint8_t c; - empty = rxbuf.empty(); - assert(!empty); + assert(!rxbuf.empty()); rxbuf.read((char *)&c, 1); - empty = rxbuf.empty(); - DPRINTF(TerminalVerbose, "in: \'%c\' %#02x more: %d\n", - isprint(c) ? c : ' ', c, !empty); + isprint(c) ? c : ' ', c, !rxbuf.empty()); return c; } @@ -295,8 +295,7 @@ Terminal::out(char c) if (DTRACE(Terminal)) { static char last = '\0'; - if (c != '\n' && c != '\r' || - last != '\n' && last != '\r') { + if ((c != '\n' && c != '\r') || (last != '\n' && last != '\r')) { if (c == '\n' || c == '\r') { int size = linebuf.size(); char *buffer = new char[size + 1];