From e74a5a71eb76512debc7c99ef0643b61b2f2114c Mon Sep 17 00:00:00 2001 From: Charles Papon Date: Mon, 1 Apr 2019 10:31:55 +0200 Subject: [PATCH] Better simulation console integration --- src/test/cpp/regression/main.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/test/cpp/regression/main.cpp b/src/test/cpp/regression/main.cpp index ab3cde9..e137a8c 100644 --- a/src/test/cpp/regression/main.cpp +++ b/src/test/cpp/regression/main.cpp @@ -3005,6 +3005,7 @@ public: #include #include +termios stdinRestoreSettings; void stdinNonBuffered(){ static struct termios old, new1; tcgetattr(STDIN_FILENO, &old); /* grab old terminal i/o settings */ @@ -3013,12 +3014,17 @@ void stdinNonBuffered(){ new1.c_lflag &= ~ECHO; tcsetattr(STDIN_FILENO, TCSANOW, &new1); /* use these new terminal i/o settings now */ setvbuf(stdin, NULL, _IONBF, 0); + stdinRestoreSettings = old; } void stdoutNonBuffered(){ setvbuf(stdout, NULL, _IONBF, 0); } +void stdinRestore(){ + tcsetattr(STDIN_FILENO, TCSANOW, &stdinRestoreSettings); /* use these new terminal i/o settings now */ +} + bool stdinNonEmpty(){ struct timeval tv; fd_set fds; @@ -3030,6 +3036,23 @@ bool stdinNonEmpty(){ return (FD_ISSET(0, &fds)); } +void my_handler(int s){ + printf("Caught signal %d\n",s); + stdinRestore(); + exit(1); +} +#include + +void captureCtrlC(){ + struct sigaction sigIntHandler; + + sigIntHandler.sa_handler = my_handler; + sigemptyset(&sigIntHandler.sa_mask); + sigIntHandler.sa_flags = 0; + + sigaction(SIGINT, &sigIntHandler, NULL); +} + #ifdef LINUX_SOC class LinuxSoc : public Workspace{ public: @@ -3037,6 +3060,11 @@ public: LinuxSoc(string name) : Workspace(name) { stdinNonBuffered(); stdoutNonBuffered(); + captureCtrlC(); + } + + virtual ~LinuxSoc(){ + stdinRestore(); } virtual bool isDBusCheckedRegion(uint32_t address){ return true;} virtual bool isPerifRegion(uint32_t addr) { return (addr & 0xF0000000) == 0xF0000000 || (addr & 0xE0000000) == 0xE0000000;} @@ -3399,8 +3427,8 @@ int main(int argc, char **argv, char **env) { ->loadBin(VMLINUX, 0xC0000000) ->loadBin(DTB, 0xC3000000) ->loadBin(RAMDISK, 0xC2000000) - ->setIStall(false) //TODO It currently improve speed but should be removed later - ->setDStall(false) + ->setIStall(true) //TODO It currently improve speed but should be removed later + ->setDStall(true) ->bootAt(0x80000000) ->run(0); // ->run(1173000000l );