summaryrefslogtreecommitdiffstats
path: root/func.c
diff options
context:
space:
mode:
authorJiri Gaisler <jiri@gaisler.se>2019-11-14 11:51:10 +0100
committerJiri Gaisler <jiri@gaisler.se>2019-11-14 11:51:10 +0100
commit3475d6203ce56692cab1af0e402de286ac9bf0f8 (patch)
tree68836d196868c421e0df4aca1c3c5829b26af9d6 /func.c
parentSupport building on MinGW-W64/MSYS2 (diff)
downloadsis-3475d6203ce56692cab1af0e402de286ac9bf0f8.tar.bz2
Cross-platform support for async gdb break (ctrl-c)
Diffstat (limited to 'func.c')
-rw-r--r--func.c62
1 files changed, 25 insertions, 37 deletions
diff --git a/func.c b/func.c
index 8deb7e2..15af31b 100644
--- a/func.c
+++ b/func.c
@@ -786,44 +786,39 @@ init_bpt (sregs)
ebase.tlimit = 0;
}
-/* taken from gdbserver */
-static void
-check_interrup ()
-{
- fd_set readset;
- struct timeval immediate = { 0, 0 };
- /* Protect against spurious interrupts. This has been observed to
- be a problem under NetBSD 1.4 and 1.5. */
+/* support for catching ctrl-c */
- FD_ZERO (&readset);
- FD_SET (new_socket, &readset);
- if (select (new_socket + 1, &readset, 0, 0, &immediate) > 0)
- {
- int cc;
- char c = 0;
+#ifdef WIN32
- cc = read (new_socket, &c, 1);
+BOOL WINAPI ConsoleHandler (DWORD);
- if (cc == 0)
- {
- fprintf (stderr, "client connection closed\n");
- return;
- }
- else if (cc != 1 || c != '\003')
- {
- fprintf (stderr, "input_interrupt, count = %d c = %d ", cc, c);
- if (isprint (c))
- fprintf (stderr, "('%c')\n", c);
- else
- fprintf (stderr, "('\\x%02x')\n", c & 0xff);
- return;
- }
+void
+init_signals ()
+{
+ if (!SetConsoleCtrlHandler ((PHANDLER_ROUTINE) ConsoleHandler, TRUE))
+ {
+ fprintf (stderr, "Unable to install ctrl-c handler!\n");
+ }
+}
+BOOL WINAPI
+ConsoleHandler (DWORD dwType)
+{
+ switch (dwType)
+ {
+ case CTRL_C_EVENT:
+ case CTRL_BREAK_EVENT:
ctrl_c = 1;
+ break;
+ default:
+ break;
}
+ return TRUE;
}
+#else
+
void
int_handler (int sig)
{
@@ -832,14 +827,6 @@ int_handler (int sig)
switch (sig)
{
-#ifndef WIN32
- case SIGIO:
- if (sim_run)
- {
- check_interrup ();
- }
- break;
-#endif
case SIGINT:
ctrl_c = 1;
if (!sim_run)
@@ -864,6 +851,7 @@ init_signals ()
int_tab[0] = signal (SIGTERM, int_handler);
int_tab[1] = signal (SIGINT, int_handler);
}
+#endif
void
print_insn_sis (uint32 addr)