From 7581b92f9dd80eeae4af16f1ca5f7327c196e719 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 8 Jan 2020 11:49:22 -0800 Subject: [PATCH] SCP: Add a RUNLIMIT command to bound simulator execution time --- README.md | 1 + doc/simh_doc.doc | Bin 265216 -> 273408 bytes scp.c | 148 ++++++++++++++++++++++++++++++++++++++++++++--- scp.h | 1 + sim_defs.h | 3 +- 5 files changed, 145 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3503dd32..46980cbd 100644 --- a/README.md +++ b/README.md @@ -405,6 +405,7 @@ Device simulator authors can easily schedule their device polling activities to RUN UNTIL "output-string" ... Establish the specified "output-string" as an EXPECT and run until it is encountered. GO UNTIL breakpoint Establish the breakpoint specified and go until it is encountered GO UNTIL "output-string" ... Establish the specified "output-string" as an EXPECT and go until it is encountered. + RUNLIMIT Bound simulator execution time #### Command Processing Enhancements diff --git a/doc/simh_doc.doc b/doc/simh_doc.doc index 3f11ff96ae5cc72b4319947f7d7e54077ad762f4..feaa0a54227e58ab39cbec28395e38fe61bfd628 100644 GIT binary patch delta 52788 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 delta 45736 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 diff --git a/scp.c b/scp.c index 5ddf5d0c..3556f90c 100644 --- a/scp.c +++ b/scp.c @@ -545,6 +545,7 @@ t_stat dep_addr (int32 flag, const char *cptr, t_addr addr, DEVICE *dptr, UNIT *uptr, int32 dfltinc); void fprint_fields (FILE *stream, t_value before, t_value after, BITFIELD* bitdefs); t_stat step_svc (UNIT *ptr); +t_stat runlimit_svc (UNIT *ptr); t_stat expect_svc (UNIT *ptr); t_stat flush_svc (UNIT *ptr); t_stat shift_args (char *do_arg[], size_t arg_count); @@ -596,6 +597,10 @@ int32 sim_brk_lnt = 0; int32 sim_brk_ins = 0; int32 sim_quiet = 0; int32 sim_step = 0; +int32 sim_runlimit = 0; +double sim_runlimit_d = 0.0; +int32 sim_runlimit_switches = 0; +t_bool sim_runlimit_enabled = FALSE; char *sim_sub_instr = NULL; /* Copy of pre-substitution buffer contents */ char *sim_sub_instr_buf = NULL; /* Buffer address that substitutions were saved in */ size_t sim_sub_instr_size = 0; /* substitution buffer size */ @@ -662,6 +667,31 @@ DEVICE sim_step_dev = { NULL, NULL, NULL, NULL, NULL, NULL, sim_int_step_description}; +static const char *sim_int_runlimit_description (DEVICE *dptr) +{ +return "Run time limit facility"; +} + +static t_stat sim_int_runlimit_reset (DEVICE *dptr) +{ +if (sim_runlimit_enabled) { + if (sim_runlimit_switches & SWMASK ('T')) + return sim_activate_after_d (dptr->units, sim_runlimit_d); + else + return sim_activate (dptr->units, sim_runlimit); + } +return SCPE_OK; +} + +static UNIT sim_runlimit_unit = { UDATA (&runlimit_svc, UNIT_IDLE, 0) }; +DEVICE sim_runlimit_dev = { + "INT-RUNLIMIT", &sim_runlimit_unit, NULL, NULL, + 1, 0, 0, 0, 0, 0, + NULL, NULL, &sim_int_runlimit_reset, NULL, NULL, NULL, + NULL, DEV_NOSAVE, 0, + NULL, NULL, NULL, NULL, NULL, NULL, + sim_int_runlimit_description}; + static const char *sim_int_expect_description (DEVICE *dptr) { return "Expect facility"; @@ -764,6 +794,7 @@ const struct scp_error { {"INVEXPR", "invalid expression"}, {"SIGTERM", "SIGTERM received"}, {"FSSIZE", "File System size larger than disk size"}, + {"RUNTIME", "Run time limit exhausted"}, }; const size_t size_map[] = { sizeof (int8), @@ -1072,6 +1103,20 @@ static const char simh_help[] = " \"SET NODEBUG\" commands. Additionally, support is provided that is\n" " equivalent to the \"SET DEBUG=opt1{;opt2}\" and\n" " \"SET NODEBUG=opt1{;opt2}\" commands.\n\n" +#define HLP_RUNLIMIT "*Commands Stopping_The_Simulator User_Specified_Stop_Conditions RUNLIMIT" + "4RUNLIMIT\n" + " A simulator user may want to limit the maximum execution time that a\n" + " simulator may run for. This might be appropriate to limit a runaway\n" + " diagnostic which didn't achieve explicit success or failure within\n" + " some user specified time. The RUNLIMIT command provides ways to\n" + " limit execution.\n\n" + "++RUNLIMIT n {CYCLES|MICROSECONDS|SECONDS|MINUTES|HOURS}\n" + "++NORUNLIMIT\n\n" + " If the units of the run limit are not specified, the default units are\n" + " cycles. Once an execution run limit has beenn reached, any subsequent\n" + " GO, RUN, CONTINUE, STEP or BOOT commands will cause the simulator to\n" + " exit. A previously defined RUNLIMIT can be cleared with the NORUNLIMIT\n" + " command or the establishment of a new run limit.\n" /***************** 80 character line width template *************************/ "2Connecting and Disconnecting Devices\n" " Except for main memory and network devices, units are simulated as\n" @@ -1802,6 +1847,8 @@ static const char simh_help[] = " Invalid remote console command\n" "5 AMBREG\n" " Ambiguous register\n" + "5 RUNTIME\n" + " Run time limit exhausted\n" #define HLP_SHIFT "*Commands Executing_Command_Files SHIFT" "3SHIFT\n" "++shift shift the command file's positional parameters\n" @@ -2389,6 +2436,8 @@ static CTAB cmd_table[] = { #if defined(USE_SIM_VIDEO) { "SCREENSHOT", &screenshot_cmd,0, HLP_SCREENSHOT, NULL, NULL }, #endif + { "RUNLIMIT", &runlimit_cmd, 1, HLP_RUNLIMIT, NULL, NULL }, + { "NORUNLIMIT", &runlimit_cmd, 0, HLP_RUNLIMIT, NULL, NULL }, { NULL, NULL, 0, NULL, NULL, NULL } }; @@ -2596,6 +2645,7 @@ sim_register_internal_device (&sim_scp_dev); sim_register_internal_device (&sim_expect_dev); sim_register_internal_device (&sim_step_dev); sim_register_internal_device (&sim_flush_dev); +sim_register_internal_device (&sim_runlimit_dev); if ((stat = sim_ttinit ()) != SCPE_OK) { fprintf (stderr, "Fatal terminal initialization error\n%s\n", @@ -6827,6 +6877,69 @@ if (dptr->reset != NULL) else return SCPE_OK; } +t_stat runlimit_cmd (int32 flag, CONST char *cptr) +{ +char gbuf[CBUFSIZE]; +int32 num; +t_stat r; +double usec_factor = 1.0; + +GET_SWITCHES (cptr); /* get switches */ +if (0 == flag) { + if (*cptr) + return sim_messagef (SCPE_ARG, "NORUNLIMIT expects no arguments: %s\n", cptr); + sim_runlimit = 0; + sim_runlimit_switches = 0; + sim_runlimit_enabled = FALSE; + sim_cancel (&sim_runlimit_unit); + return SCPE_OK; + } + +cptr = get_glyph (cptr, gbuf, 0); /* get next glyph */ +num = (int32) get_uint (gbuf, 10, INT_MAX, &r); +if ((r != SCPE_OK) || (num == 0)) /* error? */ + return sim_messagef (SCPE_ARG, "Invalid argument: %s\n", gbuf); +cptr = get_glyph (cptr, gbuf, 0); /* get next glyph */ +if (MATCH_CMD (gbuf, "CYCLES") == 0) + sim_switches &= ~SWMASK ('T'); +else { + int i; + struct { + const char *name; + double usec_factor; + } time_units[] = { + {"MICROSECONDS", 1.0}, + {"USECONDS", 1.0}, + {"SECONDS", 1000000.0}, + {"MINUTES", 60*1000000.0}, + {"HOURS", 60*60*1000000.0}, + {NULL, 0.0}}; + + for (i=0; time_units[i].name; i++) { + if (MATCH_CMD (gbuf, time_units[i].name) == 0) { + sim_switches |= SWMASK ('T'); + usec_factor = time_units[i].usec_factor; + break; + } + } + if (time_units[i].name == NULL) + return sim_messagef (SCPE_2MARG, "Too many arguments: %s %s\n", gbuf, cptr); + } +if (*cptr) + return sim_messagef (SCPE_2MARG, "Too many arguments: %s\n", cptr); +sim_runlimit_enabled = TRUE; +sim_cancel (&sim_runlimit_unit); +sim_runlimit_switches = sim_switches; +if (sim_runlimit_switches & SWMASK ('T')) { + sim_runlimit_d = num * usec_factor; + return sim_activate_after_d (&sim_runlimit_unit, sim_runlimit_d); + } +else { + sim_runlimit = num; + return sim_activate (&sim_runlimit_unit, sim_runlimit); + } +} + /* Reset devices start..end Inputs: @@ -7950,6 +8063,11 @@ t_stat r; DEVICE *dptr; UNIT *uptr; +if (sim_runlimit_enabled && /* If the run limit has been hit? */ + (!sim_is_active (&sim_runlimit_unit))) { + sim_messagef (SCPE_RUNTIME, "Execution limit exceeded, can't proceed. Exiting...\n"); + exit (SCPE_RUNTIME); /* Execution can't proceed */ + } GET_SWITCHES (cptr); /* get switches */ sim_step = 0; if ((flag == RU_RUN) || (flag == RU_GO)) { /* run or go */ @@ -8168,6 +8286,13 @@ if ((SCPE_BARE_STATUS(r) == SCPE_STOP) && sigterm_received) r = SCPE_SIGTERM; +if (sim_runlimit_enabled) { + if (sim_runlimit_switches & SWMASK ('T')) + sim_runlimit_d = sim_activate_time_usecs (&sim_runlimit_unit); + else + sim_runlimit = sim_activate_time (&sim_runlimit_unit); + } + 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)) @@ -8298,6 +8423,14 @@ t_stat step_svc (UNIT *uptr) return SCPE_STEP; } +/* Unit service for run for timeout, originally scheduled by RUNFOR n command + Return runlimit timeout SCP code, will cause simulation to stop */ + +t_stat runlimit_svc (UNIT *uptr) +{ +return SCPE_RUNTIME; +} + /* Unit service to facilitate expect matching to stop simulation. Return expect SCP code, will cause simulation to stop */ @@ -10893,13 +11026,14 @@ do { } AIO_EVENT_COMPLETE(uptr, reason); bare_reason = SCPE_BARE_STATUS (reason); - if ((bare_reason != SCPE_OK) && /* Provide context for unexpected errors */ - (bare_reason >= SCPE_BASE) && - (bare_reason != SCPE_EXPECT) && - (bare_reason != SCPE_REMOTE) && - (bare_reason != SCPE_MTRLNT) && - (bare_reason != SCPE_STOP) && - (bare_reason != SCPE_STEP) && + if ((bare_reason != SCPE_OK) && /* Provide context for unexpected errors */ + (bare_reason >= SCPE_BASE) && + (bare_reason != SCPE_EXPECT) && + (bare_reason != SCPE_REMOTE) && + (bare_reason != SCPE_MTRLNT) && + (bare_reason != SCPE_STOP) && + (bare_reason != SCPE_STEP) && + (bare_reason != SCPE_RUNTIME) && (bare_reason != SCPE_EXIT)) sim_messagef (reason, "\nUnexpected internal error while processing event for %s which returned %d - %s\n", sim_uname (uptr), reason, sim_error_text (reason)); } while ((reason == SCPE_OK) && diff --git a/scp.h b/scp.h index 6b07009e..7309da66 100644 --- a/scp.h +++ b/scp.h @@ -116,6 +116,7 @@ t_stat spawn_cmd (int32 flag, CONST char *ptr); t_stat echo_cmd (int32 flag, CONST char *ptr); t_stat echof_cmd (int32 flag, CONST char *ptr); t_stat debug_cmd (int32 flag, CONST char *ptr); +t_stat runlimit_cmd (int32 flag, CONST char *ptr); /* Allow compiler to help validate printf style format arguments */ #if !defined __GNUC__ diff --git a/sim_defs.h b/sim_defs.h index f68d0a6f..a90eb2d6 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -413,8 +413,9 @@ typedef uint32 t_addr; #define SCPE_INVEXPR (SCPE_BASE + 47) /* invalid expression */ #define SCPE_SIGTERM (SCPE_BASE + 48) /* SIGTERM has been received */ #define SCPE_FSSIZE (SCPE_BASE + 49) /* File System size larger than disk size */ +#define SCPE_RUNTIME (SCPE_BASE + 50) /* Run Time Limit Exhausted */ -#define SCPE_MAX_ERR (SCPE_BASE + 49) /* Maximum SCPE Error Value */ +#define SCPE_MAX_ERR (SCPE_BASE + 50) /* Maximum SCPE Error Value */ #define SCPE_KFLAG 0x10000000 /* tti data flag */ #define SCPE_BREAK 0x20000000 /* tti break flag */ #define SCPE_NOMESSAGE 0x40000000 /* message display supression flag */