From 3a81f63ec148da0023dab10ed9b734036fcb0362 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 30 Jan 2018 03:36:15 -0800 Subject: [PATCH] SCP: Add support to handle CTRL+C while executing command files --- README.md | 26 ++++-- doc/simh_doc.doc | Bin 279552 -> 290816 bytes scp.c | 221 +++++++++++++++++++++++++++++------------------ sim_defs.h | 6 +- 4 files changed, 159 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index 3f68726c..39f31373 100644 --- a/README.md +++ b/README.md @@ -230,17 +230,16 @@ The following extensions to the SCP command language without affecting prior beh targets of goto's, they could be used to provide comments in do command files, for example (":: This is a comment") + RETURN {status} Return from the current do command file + execution with the specified status or + the status from the last executed command + if no status is specified. Status can be + a number or a SCPE_ name + string. SET ON Enables error trapping for currently defined traps (by ON commands) SET NOON Disables error trapping for currently defined traps (by ON commands) - RETURN Return from the current do command file - execution with the status from the last - executed command - RETURN Return from the current do command file - execution with the indicated status. Status - can be a number or a SCPE_ - name string. ON commandtoprocess{; additionalcommandtoprocess} Sets the action(s) to take when the specific error status is returned by a command in the @@ -256,16 +255,25 @@ The following extensions to the SCP command language without affecting prior beh specified with each delimited by a semicolon character (just like breakpoint action commands). - ON + ON CONTROL_C commandtoprocess{; additionalcommandtoprocess} + Specifies particular actions to perform when + the operator enters CTRL+C while a command + procedure is running. The default action is + to exit the current and any nested command + procedures and return to the sim> input prompt. + ON Clears the action(s) to take when condition occurs ON ERROR Clears the default actions to take when any otherwise unspecified error status is returned by a command in the currently running do command file. + ON CONTROL_C + Restores the default CTRL+C behavior for the + currently running command procedure. Error traps can be taken for any command which returns a status other than SCPE_STEP, SCPE_OK, and SCPE_EXIT. -ON Traps can specify any status value from the following list: NXM, UNATT, IOERR, CSUM, FMT, NOATT, OPENERR, MEM, ARG, STEP, UNK, RO, INCOMP, STOP, TTIERR, TTOERR, EOF, REL, NOPARAM, ALATT, TIMER, SIGERR, TTYERR, SUB, NOFNC, UDIS, NORO, INVSW, MISVAL, 2FARG, 2MARG, NXDEV, NXUN, NXREG, NXPAR, NEST, IERR, MTRLNT, LOST, TTMO, STALL, AFAIL. These values can be indicated by name or by their internal numeric value (not recommended). +ON Traps can specify any status value from the following list: NXM, UNATT, IOERR, CSUM, FMT, NOATT, OPENERR, MEM, ARG, STEP, UNK, RO, INCOMP, STOP, TTIERR, TTOERR, EOF, REL, NOPARAM, ALATT, TIMER, SIGERR, TTYERR, SUB, NOFNC, UDIS, NORO, INVSW, MISVAL, 2FARG, 2MARG, NXDEV, NXUN, NXREG, NXPAR, NEST, IERR, MTRLNT, LOST, TTMO, STALL, AFAIL, NOTATT, AMBREG. These values can be indicated by name or by their internal numeric value (not recommended). Interactions with ASSERT command and "DO -e": diff --git a/doc/simh_doc.doc b/doc/simh_doc.doc index e79c30bb1d23efd27650b9128d5204bc86b2a24d..969c85eca30a2700db613cfc642f172c357d2066 100644 GIT binary patch delta 47040 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 D8WK|q delta 38246 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 diff --git a/scp.c b/scp.c index d7dbcfb8..0c24bf7b 100644 --- a/scp.c +++ b/scp.c @@ -565,6 +565,7 @@ static double sim_time; static uint32 sim_rtime; static int32 noqueue_time; volatile int32 stop_cpu = 0; +static sim_stop_sleep_ms = 250; static char **sim_argv; t_value *sim_eval = NULL; static t_value sim_last_val; @@ -1557,6 +1558,10 @@ static const char simh_help[] = " Assertion failed\n" "5 INVREM\n" " Invalid remote console command\n" + "5 NOTATT\n" + " Not attached \n" + "5 AMBREG\n" + " Ambiguous register\n" #define HLP_SHIFT "*Commands Executing_Command_Files SHIFT" "3SHIFT\n" "++shift shift the command file's positional parameters\n" @@ -1564,10 +1569,59 @@ static const char simh_help[] = "3CALL\n" "++call transfer control to a labeled subroutine\n" " a command file.\n" -#define HLP_ON "*Commands Executing_Command_Files ON" - "3ON\n" - "++on perform action(s) after condition\n" - "++on clear action for specific condition\n" + /***************** 80 character line width template *************************/ +#define HLP_ON "*Commands Executing_Command_Files Error_Trapping" + "3Error Trapping\n" + " Error traps can be taken when any command returns a non success status.\n" + " Actions to be performed for particular status returns are specified with\n" + " the ON command.\n" + "4Enabling Error Traps\n" + " Error trapping is enabled with:\n\n" + "++set on enable error traps\n" + "4Disabling Error Traps\n" + " Error trapping is disabled with:\n\n" + "++set noon disable error traps\n" + "4ON\n" + " To set the action(s) to take when a specific error status is returned by\n" + " a command in the currently running do command file:\n\n" + "++on commandtoprocess{; additionalcommandtoprocess}\n\n" + " To clear the action(s) taken take when a specific error status is returned:\n\n" + "++on \n\n" + " To set the default action(s) to take when any otherwise unspecified error\n" + " status is returned by a command in the currently running do command file:\n\n" + "++on error commandtoprocess{; additionalcommandtoprocess}\n\n" + " To clear the default action(s) taken when any otherwise unspecified error\n" + " status is returned:\n\n" + "++on error\n" + "5Parameters\n" + " Error traps can be taken for any command which returns a status other\n" + " than SCPE_STEP, SCPE_OK, and SCPE_EXIT.\n\n" + " ON Traps can specify any of these status values:\n\n" + "++NXM, UNATT, IOERR, CSUM, FMT, NOATT, OPENERR, MEM, ARG,\n" + "++STEP, UNK, RO, INCOMP, STOP, TTIERR, TTOERR, EOF, REL,\n" + "++NOPARAM, ALATT, TIMER, SIGERR, TTYERR, SUB, NOFNC, UDIS,\n" + "++NORO, INVSW, MISVAL, 2FARG, 2MARG, NXDEV, NXUN, NXREG,\n" + "++NXPAR, NEST, IERR, MTRLNT, LOST, TTMO, STALL, AFAIL,\n" + "++NOTATT, AMBREG\n\n" + " These values can be indicated by name or by their internal\n" + " numeric value (not recommended).\n" + /***************** 80 character line width template *************************/ + "3CONTROL-C Trapping\n" + " A special ON trap is available to describe action(s) to be taken\n" + " when CONTROL_C (aka SIGINT) occurs during the execution of\n" + " simh commands and/or command procedures.\n\n" + "++on CONTROL_C perform action(s) after CTRL+C\n" + "++on CONTROL_C restore default CTRL+C action\n\n" + " The default ON CONTROL_C handler will exit nested DO command\n" + " procedures and return to the sim> prompt.\n\n" + " Note 1: When a simulator is executing instructions entering CTRL+C\n" + "+will cause the CNTL+C character to be delivered to the simulator as\n" + "+input. The simulator instruction execution can be stopped by entering\n" + "+the WRU character (usually CTRL+E). Once instruction execution has\n" + "+stopped, CTRL+C can be entered and potentially acted on by the\n" + "+ON CONTROL_C trap handler.\n" + " Note 2: The ON CONTROL_C trapping is not affected by the SET ON and\n" + "+SET NOON commands.\n" #define HLP_PROCEED "*Commands Executing_Command_Files PROCEED" #define HLP_IGNORE "*Commands Executing_Command_Files PROCEED" /***************** 80 character line width template *************************/ @@ -1576,49 +1630,21 @@ static const char simh_help[] = " placeholders for an ON action condition which should be explicitly ignored\n" "++proceed continue command file execution without doing anything\n" "++ignore continue command file execution without doing anything\n" - -#if 0 - - SET ON Enables error trapping for currently defined - traps (by ON commands) - SET NOON Disables error trapping for currently - defined traps (by ON commands) - ON commandtoprocess{; additionalcommandtoprocess} - Sets the action(s) to take when the specific - error status is returned by a command in the - currently running do command file. Multiple - actions can be specified with each delimited - by a semicolon character (just like - breakpoint action commands). - ON ERROR commandtoprocess{; additionalcommandtoprocess} - Sets the default action(s) to take when any - otherwise unspecified error status is returned - by a command in the currently running do - command file. Multiple actions can be - specified with each delimited by a semicolon - character (just like breakpoint action - commands). - ON - ON ERROR Clears the default actions to take when any - otherwise unspecified error status is - returned by a command in the currently - running do command file. - - -Error traps can be taken for any command which returns a status other than SCPE_STEP, SCPE_OK, and SCPE_EXIT. - -ON Traps can specify any status value from the following list: NXM, UNATT, IOERR, CSUM, FMT, NOATT, OPENERR, MEM, ARG, STEP, UNK, RO, INCOMP, STOP, TTIERR, TTOERR, EOF, REL, NOPARAM, ALATT, TIMER, SIGERR, TTYERR, SUB, NOFNC, UDIS, NORO, INVSW, MISVAL, 2FARG, 2MARG, NXDEV, NXUN, NXREG, NXPAR, NEST, IERR, MTRLNT, LOST, TTMO, STALL, AFAIL. These values can be indicated by name or by their internal numeric value (not recommended). - -Interactions with ASSERT command and "DO -e": -DO -e is equivalent to SET ON, which by itself it equivalent to "SET ON; ON ERROR RETURN". -ASSERT failure have several different actions: - If error trapping is not enabled then AFAIL causes exit from the current do command file. - If error trapping is enabled and an explicit "ON AFAIL" action is defined, then the specified action is performed. - If error trapping is enabled and no "ON AFAIL" action is defined, then an AFAIL causes exit from the current do command file. - -#endif - - + "3DO Command Processing Interactions With ASSERT\n" + " The command:\n\n" + "++DO -e commandfile\n\n" + " is equivalent to starting the invoked command file with:\n\n" + "++SET ON\n\n" + " which by itself it equivalent to:\n\n" + "++SET ON\n" + "++ON ERROR RETURN\n\n" + " ASSERT failures have several different actions:\n\n" + "+* If error trapping is not enabled then AFAIL causes exit from the\n" + "++current do command file.\n" + "+* If error trapping is enabled and an explicit \"ON AFAIL\" action\n" + "++is defined, then the specified action is performed.\n" + "+* If error trapping is enabled and no \"ON AFAIL\" action is defined,\n" + "++then an AFAIL causes exit from the current do command file.\n" #define HLP_ECHO "*Commands Executing_Command_Files Displaying_Arbitrary_Text ECHO_Command" /***************** 80 character line width template *************************/ "3Displaying Arbitrary Text\n" @@ -1851,7 +1877,7 @@ ASSERT failure have several different actions: " 'm' for minutes, 'h' for hours or 'd' for days. NUMBER may be an\n" " arbitrary floating point number. Given two or more arguments, pause\n" " for the amount of time specified by the sum of their values.\n" - " NOTE: A SLEEP command is interruptable with SIGINT (^C).\n\n" + " NOTE: A SLEEP command is interruptable with SIGINT (CTRL+C).\n\n" /***************** 80 character line width template *************************/ #define HLP_ASSERT "*Commands Executing_Command_Files Testing_Simulator_State" #define HLP_IF "*Commands Executing_Command_Files Testing_Simulator_State" @@ -2268,6 +2294,7 @@ if ((stat = sim_brk_init ()) != SCPE_OK) { sim_error_text (stat)); return 0; } +signal (SIGINT, int_handler); if (!sim_quiet) { printf ("\n"); show_version (stdout, NULL, NULL, 0, NULL); @@ -2356,16 +2383,32 @@ CTAB *cmdp; stat = SCPE_BARE_STATUS(stat); /* remove possible flag */ while (stat != SCPE_EXIT) { /* in case exit */ + if (stop_cpu) { /* SIGINT happened? */ + stop_cpu = FALSE; + if (!sim_ttisatty()) { + stat = SCPE_EXIT; + break; + } + if (sim_on_actions[sim_do_depth][SCPE_MAX_ERR]) + sim_brk_setact (sim_on_actions[sim_do_depth][SCPE_MAX_ERR]); + } if ((cptr = sim_brk_getact (cbuf, sizeof(cbuf)))) /* pending action? */ printf ("%s%s\n", sim_prompt, cptr); /* echo */ - else if (sim_vm_read != NULL) { /* sim routine? */ - printf ("%s", sim_prompt); /* prompt */ - cptr = (*sim_vm_read) (cbuf, sizeof(cbuf), stdin); + else { + if (sim_vm_read != NULL) { /* sim routine? */ + printf ("%s", sim_prompt); /* prompt */ + cptr = (*sim_vm_read) (cbuf, sizeof(cbuf), stdin); + } + else + cptr = read_line_p (sim_prompt, cbuf, sizeof(cbuf), stdin);/* read with prmopt*/ } - else cptr = read_line_p (sim_prompt, cbuf, sizeof(cbuf), stdin);/* read with prmopt*/ - if (cptr == NULL) { /* EOF? */ - if (sim_ttisatty()) continue; /* ignore tty EOF */ - else break; /* otherwise exit */ + if (cptr == NULL) { /* EOF? or SIGINT? */ + if (sim_ttisatty()) { + printf ("\n"); + continue; /* ignore tty EOF */ + } + else + break; /* otherwise exit */ } if (*cptr == 0) /* ignore blank */ continue; @@ -3147,7 +3190,7 @@ if (flag >= 0) { /* Only bump nesting fro ++sim_do_depth; if (sim_on_inherit) { /* inherit ON condition actions? */ sim_on_check[sim_do_depth] = sim_on_check[sim_do_depth-1]; /* inherit On mode */ - for (i=0; iaction (cmdp->arg, cptr); /* exec other cmd */ } - else stat = SCPE_UNK; /* bad cmd given */ + else + stat = SCPE_UNK; /* bad cmd given */ echo = sim_do_echo; /* Allow for SET VERIFY */ stat_nomessage = stat & SCPE_NOMESSAGE; /* extract possible message supression flag */ stat_nomessage = stat_nomessage || (!sim_show_message);/* Apply global suppression */ @@ -3232,7 +3284,8 @@ do { (cmdp->action != &goto_cmd) && (cmdp->action != &on_cmd) && (cmdp->action != &echo_cmd) && - (cmdp->action != &echof_cmd))) + (cmdp->action != &echof_cmd) && + (cmdp->action != &sleep_cmd))) sim_last_cmd_stat = stat; /* save command error status */ switch (stat) { case SCPE_AFAIL: @@ -3287,7 +3340,7 @@ if (flag >= 0) { sim_quiet = saved_sim_quiet; /* restore quiet mode we entered with */ } if ((flag >= 0) || (!sim_on_inherit)) { - for (i=0; iop) return sim_messagef (SCPE_ARG, "Invalid operator: %s\n", op); cptr += strlen (op); - while (sim_isspace (*cptr)) /* skip spaces */ + while (sim_isspace (*cptr)) /* skip spaces */ ++cptr; - cptr = _get_string (cptr, gbuf2, 0); /* get second string */ - if (*cptr) { /* more? */ - if (flag) /* ASSERT has no more args */ + cptr = _get_string (cptr, gbuf2, 0); /* get second string */ + if (*cptr) { /* more? */ + if (flag) /* ASSERT has no more args */ return SCPE_2MARG; } else { - if (!flag) - return SCPE_2FARG; /* IF needs actions! */ + if (!flag) + return SCPE_2FARG; /* IF needs actions! */ } result = sim_cmp_string (gbuf, gbuf2); result = ((result == optr->aval) || (result == optr->bval)); @@ -4100,8 +4153,6 @@ t_stat sleep_cmd (int32 flag, CONST char *cptr) char *tptr; double wait; -stop_cpu = 0; -signal (SIGINT, int_handler); while (*cptr) { wait = strtod (cptr, &tptr); switch (*tptr) { @@ -4129,7 +4180,6 @@ while (*cptr) { wait *= (24.0*60.0*60.0); break; default: - signal (SIGINT, SIG_DFL); /* cancel WRU */ return sim_messagef (SCPE_ARG, "Invalid Sleep unit '%c'\n", *cptr); } wait *= 1000.0; /* Convert to Milliseconds */ @@ -4139,8 +4189,7 @@ while (*cptr) { if ((wait > 0.0) && (!stop_cpu)) sim_os_ms_sleep ((unsigned)wait); } -signal (SIGINT, SIG_DFL); /* cancel WRU */ -stop_cpu = 0; +stop_cpu = 0; /* Clear in case sleep was interrupted */ return SCPE_OK; } @@ -4241,9 +4290,15 @@ cptr = get_glyph (cptr, gbuf, 0); if ('\0' == gbuf[0]) return SCPE_ARG; /* unspecified condition */ if (0 == strcmp("ERROR", gbuf)) cond = 0; -else - if (SCPE_OK != sim_string_to_stat (gbuf, &cond)) - return SCPE_ARG; +else { + if (SCPE_OK != sim_string_to_stat (gbuf, &cond)) { + if ((MATCH_CMD (gbuf, "CONTROL_C") == 0) || + (MATCH_CMD (gbuf, "SIGINT") == 0)) + cond = SCPE_MAX_ERR; + else + return SCPE_ARG; + } + } if ((NULL == cptr) || ('\0' == *cptr)) { /* Empty Action */ free(sim_on_actions[sim_do_depth][cond]); /* Clear existing condition */ sim_on_actions[sim_do_depth][cond] = NULL; } @@ -7163,11 +7218,6 @@ if ((r = sim_check_console (30)) != SCPE_OK) { /* check console, error? sim_ttcmd (); sim_messagef (r, "sim_check_console () returned: %s\n", sim_error_text (r)); } -if (signal (SIGINT, int_handler) == SIG_ERR) { /* set WRU */ - sim_is_running = 0; /* flag idle */ - sim_ttcmd (); - return sim_messagef (SCPE_SIGERR, "Can't establish SIGINT"); - } #ifdef SIGHUP if (signal (SIGHUP, int_handler) == SIG_ERR) { /* set WRU */ sim_is_running = 0; /* flag idle */ @@ -7232,11 +7282,14 @@ do { sim_activate (&sim_step_unit, sim_step); } while (1); +if ((SCPE_BARE_STATUS(r) == SCPE_STOP) && /* WRU exit from sim_instr() */ + (sim_on_actions[sim_do_depth][SCPE_STOP] == NULL) && /* without a handler for a STOP condition */ + (sim_on_actions[sim_do_depth][0] == NULL)) + sim_os_ms_sleep (sim_stop_sleep_ms); /* wait a bit for SIGINT */ sim_is_running = 0; /* flag idle */ sim_stop_timer_services (); /* disable wall clock timing */ sim_ttcmd (); /* restore console */ sim_brk_clrall (BRK_TYP_DYN_STEPOVER); /* cancel any step/over subroutine breakpoints */ -signal (SIGINT, SIG_DFL); /* cancel WRU */ #ifdef SIGHUP signal (SIGHUP, SIG_DFL); /* cancel WRU */ #endif @@ -9796,8 +9849,10 @@ t_stat sim_process_event (void) UNIT *uptr; t_stat reason; -if (stop_cpu) /* stop CPU? */ +if (stop_cpu) { /* stop CPU? */ + stop_cpu = 0; return SCPE_STOP; + } AIO_UPDATE_QUEUE; UPDATE_SIM_TIME; /* update sim time */ @@ -9839,8 +9894,10 @@ if (sim_clock_queue == QUEUE_LIST_END) { /* queue empty? */ else sim_debug (SIM_DBG_EVENT, sim_dflt_dev, "Processing Queue Complete New Interval = %d(%s)\n", sim_interval, sim_uname(sim_clock_queue)); -if ((reason == SCPE_OK) && stop_cpu) +if ((reason == SCPE_OK) && stop_cpu) { + stop_cpu = 0; reason = SCPE_STOP; + } sim_processing_event = FALSE; return reason; } @@ -11343,9 +11400,9 @@ if (cond == (SCPE_MAX_ERR-SCPE_BASE)) { /* not found? */ if (0 == (cond = strtol(gbuf, NULL, 0))) /* try explicit number */ return SCPE_ARG; } +*stat = cond; if (cond > SCPE_MAX_ERR) return SCPE_ARG; -*stat = cond; return SCPE_OK; } diff --git a/sim_defs.h b/sim_defs.h index a24e8a6a..6f5ed726 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -404,9 +404,9 @@ typedef uint32 t_addr; #define SCPE_REMOTE (SCPE_BASE + 47) /* remote console command */ #define SCPE_MAX_ERR (SCPE_BASE + 47) /* Maximum SCPE Error Value */ -#define SCPE_KFLAG 0x1000 /* tti data flag */ -#define SCPE_BREAK 0x2000 /* tti break flag */ -#define SCPE_NOMESSAGE 0x10000000 /* message display supression flag */ +#define SCPE_KFLAG 0x10000000 /* tti data flag */ +#define SCPE_BREAK 0x20000000 /* tti break flag */ +#define SCPE_NOMESSAGE 0x40000000 /* message display supression flag */ #define SCPE_BARE_STATUS(stat) ((stat) & ~(SCPE_NOMESSAGE|SCPE_KFLAG|SCPE_BREAK)) /* Print value format codes */