Better simulation console integration

This commit is contained in:
Charles Papon 2019-04-01 10:31:55 +02:00
parent 369a3d0f5f
commit e74a5a71eb
1 changed files with 30 additions and 2 deletions

View File

@ -3005,6 +3005,7 @@ public:
#include <termios.h> #include <termios.h>
#include <fcntl.h> #include <fcntl.h>
termios stdinRestoreSettings;
void stdinNonBuffered(){ void stdinNonBuffered(){
static struct termios old, new1; static struct termios old, new1;
tcgetattr(STDIN_FILENO, &old); /* grab old terminal i/o settings */ tcgetattr(STDIN_FILENO, &old); /* grab old terminal i/o settings */
@ -3013,12 +3014,17 @@ void stdinNonBuffered(){
new1.c_lflag &= ~ECHO; new1.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &new1); /* use these new terminal i/o settings now */ tcsetattr(STDIN_FILENO, TCSANOW, &new1); /* use these new terminal i/o settings now */
setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdin, NULL, _IONBF, 0);
stdinRestoreSettings = old;
} }
void stdoutNonBuffered(){ void stdoutNonBuffered(){
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0);
} }
void stdinRestore(){
tcsetattr(STDIN_FILENO, TCSANOW, &stdinRestoreSettings); /* use these new terminal i/o settings now */
}
bool stdinNonEmpty(){ bool stdinNonEmpty(){
struct timeval tv; struct timeval tv;
fd_set fds; fd_set fds;
@ -3030,6 +3036,23 @@ bool stdinNonEmpty(){
return (FD_ISSET(0, &fds)); return (FD_ISSET(0, &fds));
} }
void my_handler(int s){
printf("Caught signal %d\n",s);
stdinRestore();
exit(1);
}
#include <signal.h>
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 #ifdef LINUX_SOC
class LinuxSoc : public Workspace{ class LinuxSoc : public Workspace{
public: public:
@ -3037,6 +3060,11 @@ public:
LinuxSoc(string name) : Workspace(name) { LinuxSoc(string name) : Workspace(name) {
stdinNonBuffered(); stdinNonBuffered();
stdoutNonBuffered(); stdoutNonBuffered();
captureCtrlC();
}
virtual ~LinuxSoc(){
stdinRestore();
} }
virtual bool isDBusCheckedRegion(uint32_t address){ return true;} virtual bool isDBusCheckedRegion(uint32_t address){ return true;}
virtual bool isPerifRegion(uint32_t addr) { return (addr & 0xF0000000) == 0xF0000000 || (addr & 0xE0000000) == 0xE0000000;} 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(VMLINUX, 0xC0000000)
->loadBin(DTB, 0xC3000000) ->loadBin(DTB, 0xC3000000)
->loadBin(RAMDISK, 0xC2000000) ->loadBin(RAMDISK, 0xC2000000)
->setIStall(false) //TODO It currently improve speed but should be removed later ->setIStall(true) //TODO It currently improve speed but should be removed later
->setDStall(false) ->setDStall(true)
->bootAt(0x80000000) ->bootAt(0x80000000)
->run(0); ->run(0);
// ->run(1173000000l ); // ->run(1173000000l );