From 1b4e9434e4a3ac82285486d730f32a1697139f5f Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 26 Nov 2019 09:03:52 -0800 Subject: [PATCH] Add accurate std output option This gives us accurate stdout and stderr output. Useful for terminal applications that take advantage of ncurses or similar --- Source/Interface/Config/Config.cpp | 6 +++++ Source/Interface/Context/Context.h | 1 + Source/Interface/HLE/FileManagement.cpp | 31 ++++++++++++++++--------- include/FEXCore/Config/Config.h | 1 + 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Source/Interface/Config/Config.cpp b/Source/Interface/Config/Config.cpp index 3bf59ed32..df02d8f1a 100644 --- a/Source/Interface/Config/Config.cpp +++ b/Source/Interface/Config/Config.cpp @@ -24,6 +24,9 @@ namespace FEXCore::Config { case FEXCore::Config::CONFIG_GDBSERVER: Config != 0 ? CTX->StartGdbServer() : CTX->StopGdbServer(); break; + case FEXCore::Config::CONFIG_ACCURATESTDOUT: + CTX->Config.AccurateSTDOut = Config != 0; + break; default: LogMan::Msg::A("Unknown configuration option"); } } @@ -47,6 +50,9 @@ namespace FEXCore::Config { case FEXCore::Config::CONFIG_GDBSERVER: return CTX->GetGdbServerStatus(); break; + case FEXCore::Config::CONFIG_ACCURATESTDOUT: + return CTX->Config.AccurateSTDOut; + break; default: LogMan::Msg::A("Unknown configuration option"); } diff --git a/Source/Interface/Context/Context.h b/Source/Interface/Context/Context.h index 7dda4f494..b3872f1b7 100644 --- a/Source/Interface/Context/Context.h +++ b/Source/Interface/Context/Context.h @@ -41,6 +41,7 @@ namespace FEXCore::Context { struct { bool Multiblock {false}; bool BreakOnFrontendFailure {true}; + bool AccurateSTDOut {false}; int64_t MaxInstPerBlock {-1LL}; uint64_t VirtualMemSize {1ULL << 36}; FEXCore::Config::ConfigCore Core {FEXCore::Config::CONFIG_INTERPRETER}; diff --git a/Source/Interface/HLE/FileManagement.cpp b/Source/Interface/HLE/FileManagement.cpp index d2cc19bb8..0327b7823 100644 --- a/Source/Interface/HLE/FileManagement.cpp +++ b/Source/Interface/HLE/FileManagement.cpp @@ -36,20 +36,29 @@ public: OutputString += '\0'; - if (FDOffset == STDOUT_FILENO) - LogMan::Msg::OUT("[%ld] %s", FinalSize, OutputString.c_str()); - else if (FDOffset == STDERR_FILENO) - LogMan::Msg::ERR("[%ld] %s", FinalSize, OutputString.c_str()); - - return FinalSize; + if (CTX->Config.AccurateSTDOut) { + return ::writev(fd, (const struct iovec*)iov, iovcnt); + } + else { + if (FDOffset == STDOUT_FILENO) + LogMan::Msg::OUT("[%ld] %s", FinalSize, OutputString.c_str()); + else if (FDOffset == STDERR_FILENO) + LogMan::Msg::ERR("[%ld] %s", FinalSize, OutputString.c_str()); + return FinalSize; + } } uint64_t write(int fd, void *buf, size_t count) override { - if (FDOffset == STDOUT_FILENO) - LogMan::Msg::OUT("%s", reinterpret_cast(buf)); - else if (FDOffset == STDERR_FILENO) - LogMan::Msg::ERR("%s", reinterpret_cast(buf)); - return count; + if (CTX->Config.AccurateSTDOut) { + return ::write(fd, buf, count); + } + else { + if (FDOffset == STDOUT_FILENO) + LogMan::Msg::OUT("%s", reinterpret_cast(buf)); + else if (FDOffset == STDERR_FILENO) + LogMan::Msg::ERR("%s", reinterpret_cast(buf)); + return count; + } } }; diff --git a/include/FEXCore/Config/Config.h b/include/FEXCore/Config/Config.h index 5c87fba33..3910fbca7 100644 --- a/include/FEXCore/Config/Config.h +++ b/include/FEXCore/Config/Config.h @@ -11,6 +11,7 @@ namespace FEXCore::Config { CONFIG_VIRTUALMEMSIZE, CONFIG_SINGLESTEP, CONFIG_GDBSERVER, + CONFIG_ACCURATESTDOUT, }; enum ConfigCore {