mirror of
https://github.com/simh/simh.git
synced 2026-01-11 23:52:58 +00:00
CONSOLE: Separate debug character from signal
Add the "DBGSIGNAL", "DBGSIG" options to enable sending the interrupt to
the user's debugger, which is presumably gdb. Separates setting the
debugging interrupt character from the action so that it is possible to
turn debugger interrupts on and off:
set console dbgint=1f dbgsignal
set console nodbgsignal
Previously, this feature was only available if the compiler did not
define __OPTIMIZE__, which precludes optimized debugging code, i.e.,
compiling with "-O2 -g".
This commit is contained in:
parent
0185df8fee
commit
474f84244d
128
sim_console.c
128
sim_console.c
@ -148,7 +148,9 @@ int setenv(const char *envname, const char *envval, int overwrite);
|
||||
/* Forward Declarations of Platform specific routines */
|
||||
|
||||
static t_stat sim_os_poll_kbd (void);
|
||||
#if defined(SIM_ASYNCH_IO) && defined(SIM_ASYNCH_MUX)
|
||||
static t_bool sim_os_poll_kbd_ready (int ms_timeout);
|
||||
#endif
|
||||
static t_stat sim_os_putchar (int32 out);
|
||||
static t_stat sim_os_ttinit (void);
|
||||
static t_stat sim_os_ttrun (void);
|
||||
@ -178,6 +180,7 @@ static t_stat sim_set_delay (int32 flag, CONST char *cptr);
|
||||
|
||||
int32 sim_int_char = 005; /* interrupt character */
|
||||
int32 sim_dbg_int_char = 0; /* SIGINT char under debugger */
|
||||
int32 sim_dbg_signal = 0; /* Enable SIGINT to debugger */
|
||||
static t_bool sigint_message_issued = FALSE;
|
||||
int32 sim_brk_char = 000; /* break character */
|
||||
int32 sim_tt_pchar = 0x00002780;
|
||||
@ -317,7 +320,6 @@ static CTAB set_con_tab[] = {
|
||||
{ "WRU", &sim_set_kmap, KMAP_WRU | KMAP_NZ },
|
||||
{ "BRK", &sim_set_kmap, KMAP_BRK },
|
||||
{ "DEL", &sim_set_kmap, KMAP_DEL | KMAP_NZ },
|
||||
{ "DBGINT", &sim_set_kmap, KMAP_DBGINT | KMAP_NZ },
|
||||
{ "PCHAR", &sim_set_pchar, 0 },
|
||||
{ "SPEED", &sim_set_cons_speed, 0 },
|
||||
{ "TELNET", &sim_set_telnet, 0 },
|
||||
@ -334,6 +336,11 @@ static CTAB set_con_tab[] = {
|
||||
{ "DELAY", &sim_set_delay, 0 },
|
||||
{ "RESPONSE", &sim_set_response, 1 | CMD_WANTSTR },
|
||||
{ "NORESPONSE", &sim_set_response, 0 },
|
||||
{ "DBGINT", &sim_set_kmap, KMAP_DBGINT | KMAP_NZ },
|
||||
{ "DBGSIG", &sim_set_dbgsignal, 0 },
|
||||
{ "DBGSIGNAL", &sim_set_dbgsignal, 0 },
|
||||
{ "NODBGSIG", &sim_reset_dbgsignal, 0 },
|
||||
{ "NODBGSIGNAL", &sim_reset_dbgsignal, 0 },
|
||||
{ NULL, NULL, 0 }
|
||||
};
|
||||
|
||||
@ -352,7 +359,7 @@ static SHTAB show_con_tab[] = {
|
||||
{ "WRU", &sim_show_kmap, KMAP_WRU },
|
||||
{ "BRK", &sim_show_kmap, KMAP_BRK },
|
||||
{ "DEL", &sim_show_kmap, KMAP_DEL },
|
||||
#if (defined(__GNUC__) && !defined(__OPTIMIZE__) && !defined(_WIN32)) /* Debug build? */
|
||||
#if !defined(_WIN32) && !defined(_WIN64) && !defined(VMS)
|
||||
{ "DBGINT", &sim_show_kmap, KMAP_DBGINT },
|
||||
#endif
|
||||
{ "PCHAR", &sim_show_pchar, 0 },
|
||||
@ -366,6 +373,7 @@ static SHTAB show_con_tab[] = {
|
||||
{ "INPUT", &sim_show_cons_send_input, 0 },
|
||||
{ "RESPONSE", &sim_show_cons_send_input, -1 },
|
||||
{ "DELAY", &sim_show_cons_expect, -1 },
|
||||
{ "DBGSIGNAL", &sim_show_dbgsignal, 0 },
|
||||
{ NULL, NULL, 0 }
|
||||
};
|
||||
|
||||
@ -2192,7 +2200,7 @@ else
|
||||
if (isprint(kmap_char&0xFF))
|
||||
fprintf (st, " = '%c'\n", kmap_char&0xFF);
|
||||
else
|
||||
if (kmap_char <= 26)
|
||||
if (kmap_char <= 32)
|
||||
fprintf (st, " = ^%c\n", '@' + (kmap_char&0xFF));
|
||||
else
|
||||
if (kmap_char == 28)
|
||||
@ -2951,6 +2959,48 @@ fprintf (st, "Console Send processing:\n");
|
||||
return sim_show_send_input (st, &sim_con_send);
|
||||
}
|
||||
|
||||
/* Enable console signal to debugger (for GNU C, Clang and not on Windows. */
|
||||
t_stat sim_set_dbgsignal (int32 flag, CONST char *cptr)
|
||||
{
|
||||
#if !defined(_WIN32) && !defined(_WIN64) && !defined(VMS)
|
||||
if (cptr != NULL && *cptr != '\0')
|
||||
return SCPE_2FARG;
|
||||
|
||||
sim_dbg_signal = TRUE; /* Enable SIGINT to debugger */
|
||||
return sim_messagef(SCPE_OK, "SIGINT to debugger enabled.\n");
|
||||
#else
|
||||
return sim_messagef(SCPE_NOFNC, "Debugger interrupt not supported on this platform.\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Turn off debugger signal */
|
||||
t_stat sim_reset_dbgsignal (int32 flag, CONST char *cptr)
|
||||
{
|
||||
#if !defined(_WIN32) && !defined(_WIN64) && !defined(VMS)
|
||||
if (cptr != NULL && *cptr != '\0') /* too many arguments? */
|
||||
return SCPE_2MARG;
|
||||
|
||||
sim_dbg_signal = FALSE; /* Disable SIGINT to debugger */
|
||||
return sim_messagef(SCPE_OK, "SIGINT to debugger is disabled.\n");
|
||||
#else
|
||||
return sim_messagef(SCPE_NOFNC, "Debugger interrupt not supported on this platform.\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
t_stat sim_show_dbgsignal (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr)
|
||||
{
|
||||
#if !defined(_WIN32) && !defined(_WIN64) && !defined(VMS)
|
||||
if (cptr != NULL && *cptr != '\0') /* too many arguments? */
|
||||
return SCPE_2MARG;
|
||||
|
||||
fprintf(st, "%s interrupts to the debugger.\n", sim_dbg_signal ? "Delivering" : "Not delivering");
|
||||
#else
|
||||
fprintf(st, "Debugger interrupt not supported.\n");
|
||||
#endif
|
||||
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
/* Poll for character */
|
||||
|
||||
t_stat sim_poll_kbd (void)
|
||||
@ -3791,26 +3841,30 @@ static t_stat sim_os_ttrun (void)
|
||||
{
|
||||
sim_debug (DBG_TRC, &sim_con_telnet, "sim_os_ttrun() - BSDTTY\n");
|
||||
|
||||
#if (defined(__GNUC__) && !defined(__OPTIMIZE__)) /* Debug build? */
|
||||
if (sim_dbg_int_char == 0)
|
||||
sim_dbg_int_char = sim_int_char + 1;
|
||||
runtchars.t_intrc = sim_dbg_int_char; /* let debugger get SIGINT with next highest char */
|
||||
if (!sigint_message_issued) {
|
||||
char sigint_name[8];
|
||||
if (sim_dbg_signal) {
|
||||
if (sim_dbg_int_char == 0)
|
||||
sim_dbg_int_char = sim_int_char + 1; /* Set a reasonable default */
|
||||
runtchars.t_intrc = sim_dbg_int_char; /* let debugger get SIGINT with next highest char */
|
||||
|
||||
if (isprint(sim_dbg_int_char&0xFF))
|
||||
sprintf(sigint_name, "'%c'", sim_dbg_int_char&0xFF);
|
||||
else
|
||||
if (sim_dbg_int_char <= 26)
|
||||
sprintf(sigint_name, "^%c", '@' + (sim_dbg_int_char&0xFF));
|
||||
if (!sigint_message_issued) {
|
||||
char sigint_name[8];
|
||||
|
||||
if (isprint(sim_dbg_int_char&0xFF))
|
||||
sprintf(sigint_name, "'%c'", sim_dbg_int_char&0xFF);
|
||||
else
|
||||
sprintf(sigint_name, "'\\%03o'", sim_dbg_int_char&0xFF);
|
||||
sigint_message_issued = TRUE;
|
||||
sim_messagef (SCPE_OK, "SIGINT will be delivered to your debugger when the %s character is entered\n", sigint_name);
|
||||
if (sim_dbg_int_char <= 32)
|
||||
sprintf(sigint_name, "'^%c'", '@' + (sim_dbg_int_char&0xFF));
|
||||
else
|
||||
sprintf(sigint_name, "'\\%03o'", sim_dbg_int_char&0xFF);
|
||||
|
||||
sim_messagef (SCPE_OK, "SIGINT will be delivered to your debugger when the %s character is entered\n",
|
||||
sigint_name);
|
||||
|
||||
sigint_message_issued = TRUE;
|
||||
}
|
||||
}
|
||||
#else
|
||||
runtchars.t_intrc = sim_int_char; /* in case changed */
|
||||
#endif
|
||||
else
|
||||
runtchars.t_intrc = sim_int_char; /* in case changed */
|
||||
fcntl (0, F_SETFL, runfl); /* non-block mode */
|
||||
if (ioctl (0, TIOCSETP, &runtty) < 0)
|
||||
return SCPE_TTIERR;
|
||||
@ -3979,24 +4033,28 @@ runtty.c_cc[VINTR] = 0; /* OS X doesn't deliver
|
||||
#else
|
||||
runtty.c_cc[VINTR] = sim_int_char; /* in case changed */
|
||||
#endif
|
||||
#if (defined(__GNUC__) && !defined(__OPTIMIZE__)) /* Debug build? */
|
||||
if (sim_dbg_int_char == 0)
|
||||
sim_dbg_int_char = sim_int_char + 1;
|
||||
runtty.c_cc[VINTR] = sim_dbg_int_char; /* let debugger get SIGINT with next highest char */
|
||||
if (!sigint_message_issued) {
|
||||
char sigint_name[8];
|
||||
if (sim_dbg_signal) {
|
||||
if (sim_dbg_int_char == 0)
|
||||
sim_dbg_int_char = sim_int_char + 1; /* Set a reasonable default */
|
||||
runtty.c_cc[VINTR] = sim_dbg_int_char; /* let debugger get SIGINT with next highest char */
|
||||
|
||||
if (isprint(sim_dbg_int_char&0xFF))
|
||||
sprintf(sigint_name, "'%c'", sim_dbg_int_char&0xFF);
|
||||
else
|
||||
if (sim_dbg_int_char <= 26)
|
||||
sprintf(sigint_name, "^%c", '@' + (sim_dbg_int_char&0xFF));
|
||||
if (!sigint_message_issued) {
|
||||
char sigint_name[8];
|
||||
|
||||
if (isprint(sim_dbg_int_char&0xFF))
|
||||
sprintf(sigint_name, "'%c'", sim_dbg_int_char&0xFF);
|
||||
else
|
||||
sprintf(sigint_name, "'\\%03o'", sim_dbg_int_char&0xFF);
|
||||
sigint_message_issued = TRUE;
|
||||
sim_messagef (SCPE_OK, "SIGINT will be delivered to your debugger when the %s character is entered\n", sigint_name);
|
||||
if (sim_dbg_int_char <= 32)
|
||||
sprintf(sigint_name, "'^%c'", '@' + (sim_dbg_int_char&0xFF));
|
||||
else
|
||||
sprintf(sigint_name, "'\\%03o'", sim_dbg_int_char&0xFF);
|
||||
|
||||
sim_messagef (SCPE_OK, "SIGINT will be delivered to your debugger when the %s character is entered\n",
|
||||
sigint_name);
|
||||
|
||||
sigint_message_issued = TRUE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (tcsetattr (fileno(stdin), TCSETATTR_ACTION, &runtty) < 0)
|
||||
return SCPE_TTIERR;
|
||||
sim_os_set_thread_priority (PRIORITY_BELOW_NORMAL); /* try to lower pri */
|
||||
|
||||
@ -94,6 +94,8 @@ t_stat sim_set_cons_expect (int32 flg, CONST char *cptr);
|
||||
t_stat sim_set_cons_noexpect (int32 flg, CONST char *cptr);
|
||||
t_stat sim_set_pchar (int32 flag, CONST char *cptr);
|
||||
t_stat sim_set_cons_speed (int32 flag, CONST char *cptr);
|
||||
t_stat sim_set_dbgsignal (int32 flag, CONST char *cptr);
|
||||
t_stat sim_reset_dbgsignal (int32 flag, CONST char *cptr);
|
||||
t_stat sim_show_console (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
|
||||
t_stat sim_show_remote_console (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
|
||||
t_stat sim_show_kmap (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
|
||||
@ -106,6 +108,7 @@ t_stat sim_show_cons_buff (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST
|
||||
t_stat sim_show_cons_log (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
|
||||
t_stat sim_show_cons_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
|
||||
t_stat sim_show_cons_expect (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
|
||||
t_stat sim_show_dbgsignal (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST char *cptr);
|
||||
t_stat sim_check_console (int32 sec);
|
||||
t_stat sim_open_logfile (const char *filename, t_bool binary, FILE **pf, FILEREF **pref);
|
||||
t_stat sim_close_logfile (FILEREF **pref);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user