From fd702e407bcbe3ab955b587da58160cd5054c450 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 10 Apr 2012 07:02:49 -0700 Subject: [PATCH 1/6] Made automatic startup file be named {sim_name}.rc (i.e. hp2100.rc or vax.rc, etc.) --- scp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scp.c b/scp.c index ace333cc..a2763140 100644 --- a/scp.c +++ b/scp.c @@ -737,6 +737,7 @@ int setenv(const char *envname, const char *envval, int overwrite) int main (int argc, char *argv[]) { char cbuf[CBUFSIZE], gbuf[CBUFSIZE], *cptr; +char nbuf[PATH_MAX + 7]; int32 i, sw; t_bool lookswitch; t_stat stat, stat_nomessage; @@ -814,11 +815,12 @@ if (!sim_quiet) { if (sim_dflt_dev == NULL) /* if no default */ sim_dflt_dev = sim_devices[0]; -stat = do_cmd (-1, "simh.rc"); /* proc cmd file */ +sprintf(nbuf, "%s.rc", sim_name); +stat = do_cmd (-1, nbuf); /* {sim_name}.rc proc cmd file */ if (*cbuf) /* cmd file arg? */ stat = do_cmd (0, cbuf); /* proc cmd file */ else if (*argv[0]) { /* sim name arg? */ - char nbuf[PATH_MAX + 7], *np; /* "path.ini" */ + char *np; /* "path.ini" */ nbuf[0] = '"'; /* starting " */ strncpy (nbuf + 1, argv[0], PATH_MAX + 1); /* copy sim name */ if (np = match_ext (nbuf, "EXE")) /* remove .exe */ From 33567b474d358630a2fb56e64d36afc498b80877 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 10 Apr 2012 08:09:48 -0700 Subject: [PATCH 2/6] Sanity check when detaching a undetached unit. fro Dave Bryan. --- scp.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/scp.c b/scp.c index a2763140..fa67d4ba 100644 --- a/scp.c +++ b/scp.c @@ -61,6 +61,7 @@ 17-Aug-08 RMS Revert RUN/BOOT to standard, rather than powerup, reset 25-Jul-08 JDB DO cmd missing params now default to null string 29-Jun-08 JDB DO cmd sub_args now allows "\\" to specify literal backslash + 04-Jun-08 JDB label the patch delta more clearly 31-Mar-08 RMS Fixed bug in local/global register search (Mark Pizzolato) Fixed bug in restore of RO units (Mark Pizzolato) 06-Feb-08 RMS Added SET/SHO/NO BR with default argument @@ -70,6 +71,7 @@ Fixed bug in restoration with changed memory size 08-Mar-07 JDB Fixed breakpoint actions in DO command file processing 30-Jan-07 RMS Fixed bugs in get_ipaddr + 30-Aug-06 JDB detach_unit returns SCPE_UNATT if not attached 17-Oct-06 RMS Added idle support 04-Oct-06 JDB DO cmd failure now echoes cmd unless -q 14-Jul-06 RMS Added sim_activate_abs @@ -2150,7 +2152,7 @@ if (cptr && (*cptr != 0)) return SCPE_2MARG; fprintf (st, "%s simulator V%d.%d-%d", sim_name, vmaj, vmin, vpat); if (vdelt) - fprintf (st, "(%d)", vdelt); + fprintf (st, " delta %d", vdelt); if (flag) fprintf (st, " [%s, %s, %s]", sim_si64, sim_sa64, sim_snet); fprintf (st, "\n"); @@ -2846,8 +2848,11 @@ if (uptr == NULL) return SCPE_IERR; if (!(uptr->flags & UNIT_ATTABLE)) /* attachable? */ return SCPE_NOATT; -if (!(uptr->flags & UNIT_ATT)) /* attached? */ - return SCPE_OK; +if (!(uptr->flags & UNIT_ATT)) /* not attached? */ + if (sim_switches & SIM_SW_REST) /* restoring? */ + return SCPE_OK; /* allow detach */ + else + return SCPE_NOATT; /* complain */ if ((dptr = find_dev_from_unit (uptr)) == NULL) return SCPE_OK; if (uptr->flags & UNIT_BUF) { From 542c15844ce59dc45cc27dbfd9352ebbe6a873f9 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 11 Apr 2012 07:32:06 -0700 Subject: [PATCH 3/6] Added display of the OS sleep resolution which is now displayed as an explanation if idling is unavailable. --- VAX/vax_cpu.c | 6 ++---- sim_timer.c | 39 ++++++++++++++++++++++++++------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/VAX/vax_cpu.c b/VAX/vax_cpu.c index 3c1c9140..9f31abaf 100644 --- a/VAX/vax_cpu.c +++ b/VAX/vax_cpu.c @@ -3459,10 +3459,8 @@ return sim_set_idle (uptr, val, cptr, desc); t_stat cpu_show_idle (FILE *st, UNIT *uptr, int32 val, void *desc) { -if (sim_idle_enab && (cpu_idle_type != 0)) { +if (sim_idle_enab && (cpu_idle_type != 0)) fprintf (st, "idle=%s, ", os_tab[cpu_idle_type - 1].name); - sim_show_idle (st, uptr, val, desc); - } -else fprintf (st, "idle disabled"); +sim_show_idle (st, uptr, val, desc); return SCPE_OK; } diff --git a/sim_timer.c b/sim_timer.c index 20f47d0e..4822a7b8 100644 --- a/sim_timer.c +++ b/sim_timer.c @@ -83,6 +83,7 @@ t_bool sim_idle_enab = FALSE; /* global flag */ volatile t_bool sim_idle_wait = FALSE; /* global flag */ static uint32 sim_idle_rate_ms = 0; +static uint32 sim_os_sleep_min_ms = 0; static uint32 sim_idle_stable = SIM_IDLE_STDFLT; static uint32 sim_throt_ms_start = 0; static uint32 sim_throt_ms_stop = 0; @@ -155,10 +156,11 @@ return; uint32 sim_os_ms_sleep_init (void) { #if defined (__VAX) -return 10; /* VAX/VMS is 10ms */ +sim_os_sleep_min_ms = 10; /* VAX/VMS is 10ms */ #else -return 1; /* Alpha/VMS is 1ms */ +sim_os_sleep_min_ms = 1; /* Alpha/VMS is 1ms */ #endif +return sim_os_sleep_min_ms; } uint32 sim_os_ms_sleep (unsigned int msec) @@ -224,6 +226,7 @@ TIMECAPS timers; if (timeGetDevCaps (&timers, sizeof (timers)) != TIMERR_NOERROR) return 0; +sim_os_sleep_min_ms = timers.wPeriodMin; if ((timers.wPeriodMin == 0) || (timers.wPeriodMin > SIM_IDLE_MAX)) return 0; if (timeBeginPeriod (timers.wPeriodMin) != TIMERR_NOERROR) @@ -234,7 +237,7 @@ Sleep (1); Sleep (1); Sleep (1); Sleep (1); -return timers.wPeriodMin; /* sim_idle_rate_ms */ +return sim_os_sleep_min_ms; /* sim_idle_rate_ms */ } uint32 sim_os_ms_sleep (unsigned int msec) @@ -280,7 +283,7 @@ return; uint32 sim_os_ms_sleep_init (void) { -return FALSE; +return 0; } uint32 sim_os_ms_sleep (unsigned int msec) @@ -322,7 +325,7 @@ return; uint32 sim_os_ms_sleep_init (void) { -return 1; +return sim_os_sleep_min_ms = 1; } uint32 sim_os_ms_sleep (unsigned int milliseconds) @@ -392,6 +395,7 @@ for (i = 0, tot = 0; i < sleep1Samples; i++) { tot += (t2 - t1); } tim = (tot + (sleep1Samples - 1)) / sleep1Samples; +sim_os_sleep_min_ms = tim; if (tim > SIM_IDLE_MAX) tim = 0; return tim; @@ -631,10 +635,18 @@ t_stat sim_set_idle (UNIT *uptr, int32 val, char *cptr, void *desc) t_stat r; uint32 v; -if (sim_idle_rate_ms == 0) +if (sim_idle_rate_ms == 0) { + printf ("Idling is not available, Minimum OS sleep time is %dms\n", sim_os_sleep_min_ms); + if (sim_log) + fprintf (sim_log, "Idling is not available, Minimum OS sleep time is %dms\n", sim_os_sleep_min_ms); return SCPE_NOFNC; -if ((val != 0) && (sim_idle_rate_ms > (uint32) val)) + } +if ((val != 0) && (sim_idle_rate_ms > (uint32) val)) { + printf ("Idling is not available, Minimum OS sleep time is %dms, Requied minimum OS sleep is %dms\n", sim_os_sleep_min_ms, val); + if (sim_log) + fprintf (sim_log, "Idling is not available, Minimum OS sleep time is %dms, Requied minimum OS sleep is %dms\n", sim_os_sleep_min_ms, val); return SCPE_NOFNC; + } if (cptr) { v = (uint32) get_uint (cptr, 10, SIM_IDLE_STMAX, &r); if ((r != SCPE_OK) || (v < SIM_IDLE_STMIN)) @@ -663,12 +675,12 @@ return SCPE_OK; t_stat sim_show_idle (FILE *st, UNIT *uptr, int32 val, void *desc) { -if (sim_idle_enab) { +if (sim_idle_enab) fprintf (st, "idle enabled"); - if (sim_switches & SWMASK ('D')) - fprintf (st, ", stability wait = %ds, minimum sleep resolution = %dms", sim_idle_stable, sim_idle_rate_ms); - } -else fputs ("idle disabled", st); +else + fprintf (st, "idle disabled"); +if (sim_switches & SWMASK ('D')) + fprintf (st, ", stability wait = %ds, minimum sleep resolution = %dms", sim_idle_stable, sim_os_sleep_min_ms); return SCPE_OK; } @@ -755,11 +767,12 @@ else { } if (sim_switches & SWMASK ('D')) { - fprintf (st, "minimum sleep resolution = %d ms\n", sim_idle_rate_ms); if (sim_throt_type != 0) fprintf (st, "Throttle interval = %d cycles\n", sim_throt_wait); } } +if (sim_switches & SWMASK ('D')) + fprintf (st, "minimum sleep resolution = %d ms\n", sim_os_sleep_min_ms); return SCPE_OK; } From 95a1cb71df763f8e8d73e537def86871ef96223b Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 11 Apr 2012 10:46:43 -0700 Subject: [PATCH 4/6] Added a generic non simulator specific startup include file (simh.rc) to be processed. Corrected the ON INHERIT behavior to not allow nested procedures to change the ON INHERITance state. --- scp.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scp.c b/scp.c index fa67d4ba..4669421e 100644 --- a/scp.c +++ b/scp.c @@ -817,6 +817,7 @@ if (!sim_quiet) { if (sim_dflt_dev == NULL) /* if no default */ sim_dflt_dev = sim_devices[0]; +stat = do_cmd (-1, "simh.rc"); /* simh.rc proc cmd file */ sprintf(nbuf, "%s.rc", sim_name); stat = do_cmd (-1, nbuf); /* {sim_name}.rc proc cmd file */ if (*cbuf) /* cmd file arg? */ @@ -1006,7 +1007,10 @@ t_stat do_cmd_label (int32 flag, char *fcptr, char *label) char *cptr, cbuf[CBUFSIZE], gbuf[CBUFSIZE], *c, quote, *do_arg[10]; FILE *fpin; CTAB *cmdp; -int32 echo, saved_sim_do_echo = sim_do_echo, saved_sim_show_message = sim_show_message, nargs, errabort, i; +int32 echo, nargs, errabort, i; +int32 saved_sim_do_echo = sim_do_echo, + saved_sim_show_message = sim_show_message, + saved_sim_on_inherit = sim_on_inherit; t_bool interactive, isdo, staying; t_stat stat, stat_nomessage; char *ocptr; @@ -1184,8 +1188,10 @@ Cleanup_Return: fclose (fpin); /* close file */ sim_gotofile = NULL; sim_do_echo = saved_sim_do_echo; /* restore echo state we entered with */ -if (flag >= 0) +if (flag >= 0) { sim_show_message = saved_sim_show_message; /* restore message display state we entered with */ + sim_on_inherit = saved_sim_on_inherit; /* restore ON inheritance state we entered with */ + } for (i=0; i Date: Wed, 11 Apr 2012 19:24:42 -0700 Subject: [PATCH 5/6] Added VAX idle support for newer versions of NetBSD and OpenBSD guests if they use IPL 1 as the idle trigger --- VAX/vax_cpu.c | 12 +++++------- VAX/vax_cpu1.c | 3 +++ VAX/vax_defs.h | 8 ++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/VAX/vax_cpu.c b/VAX/vax_cpu.c index 9f31abaf..dcf712f5 100644 --- a/VAX/vax_cpu.c +++ b/VAX/vax_cpu.c @@ -188,10 +188,6 @@ #define UNIT_CONH (1u << UNIT_V_CONH) #define UNIT_MSIZE (1u << UNIT_V_MSIZE) #define GET_CUR acc = ACC_MASK (PSL_GETCUR (PSL)) -#define VAX_IDLE_VMS 0x01 -#define VAX_IDLE_ULT 0x02 -#define VAX_IDLE_ULTOLD 0x04 -#define VAX_IDLE_QUAD 0x08 #define OPND_SIZE 16 #define INST_SIZE 52 @@ -3428,13 +3424,15 @@ struct os_idle { static struct os_idle os_tab[] = { { "VMS", VAX_IDLE_VMS }, - { "NETBSD", VAX_IDLE_ULTOLD }, + { "NETBSDOLD", VAX_IDLE_ULTOLD }, + { "NETBSD", VAX_IDLE_BSDNEW }, { "ULTRIX", VAX_IDLE_ULT }, { "ULTRIXOLD", VAX_IDLE_ULTOLD }, - { "OPENBSD", VAX_IDLE_QUAD }, + { "OPENBSDOLD", VAX_IDLE_QUAD }, + { "OPENBSD", VAX_IDLE_BSDNEW }, { "QUASIJARUS", VAX_IDLE_QUAD }, { "32V", VAX_IDLE_QUAD }, - { "ALL", VAX_IDLE_VMS|VAX_IDLE_ULTOLD|VAX_IDLE_ULT|VAX_IDLE_QUAD }, + { "ALL", VAX_IDLE_VMS|VAX_IDLE_ULTOLD|VAX_IDLE_ULT|VAX_IDLE_QUAD|VAX_IDLE_BSDNEW }, { NULL, 0 } }; diff --git a/VAX/vax_cpu1.c b/VAX/vax_cpu1.c index 6e903e60..cb91fa54 100644 --- a/VAX/vax_cpu1.c +++ b/VAX/vax_cpu1.c @@ -1520,6 +1520,9 @@ switch (prn) { /* case on reg # */ case MT_IPL: /* IPL */ PSL = (PSL & ~PSL_IPL) | ((val & PSL_M_IPL) << PSL_V_IPL); + if ((VAX_IDLE_BSDNEW & cpu_idle_mask) && /* New NetBSD and OpenBSD */ + (val == 1)) /* IPL 1 */ + cpu_idle(); /* idle loop */ break; case MT_ASTLVL: /* ASTLVL */ diff --git a/VAX/vax_defs.h b/VAX/vax_defs.h index 608f8662..5592a066 100644 --- a/VAX/vax_defs.h +++ b/VAX/vax_defs.h @@ -718,6 +718,14 @@ enum opcodes { else cc = 0; \ if (((uint32) s1) < ((uint32) s2)) cc = cc | CC_C +#define VAX_IDLE_VMS 0x01 +#define VAX_IDLE_ULT 0x02 +#define VAX_IDLE_ULTOLD 0x04 +#define VAX_IDLE_QUAD 0x08 +#define VAX_IDLE_BSDNEW 0x10 +extern uint32 cpu_idle_mask; /* idle mask */ +void cpu_idle (void); + /* Model dependent definitions */ #if defined (VAX_780) From fc8856805d04665207fdaea3d9476d6594faa6fe Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 11 Apr 2012 19:26:27 -0700 Subject: [PATCH 6/6] Added a default initializing file simh.rc to the files automatically loaded when a simulator starts Fixed ASSERT command to require a condition operator (from Dave Bryan) --- scp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scp.c b/scp.c index 4669421e..a94d307f 100644 --- a/scp.c +++ b/scp.c @@ -90,6 +90,7 @@ 22-Mar-05 JDB Modified DO command to allow ten-level nesting 18-Mar-05 RMS Moved DETACH tests into detach_unit (Dave Bryan) Revised interface to fprint_sym, fparse_sym + 13-Mar-05 JDB ASSERT now requires a conditional operator 07-Feb-05 RMS Added ASSERT command (Dave Bryan) 02-Feb-05 RMS Fixed bug in global register search 26-Dec-04 RMS Qualified SAVE examine, RESTORE deposit with SIM_SW_REST @@ -1394,6 +1395,7 @@ t_value val; t_stat r; cptr = get_sim_opt (CMD_OPT_SW|CMD_OPT_DFT, cptr, &r); /* get sw, default */ +sim_stab.boolop = -1; /* no relational op dflt */ if (*cptr == 0) /* must be more */ return SCPE_2FARG; cptr = get_glyph (cptr, gbuf, 0); /* get register */ @@ -1420,7 +1422,8 @@ else { } if (*cptr != 0) /* must be done */ return SCPE_2MARG; -if (!get_search (gbuf, rptr->radix, &sim_stab)) /* parse condition */ +if (!get_search (gbuf, rptr->radix, &sim_stab) || /* parse condition */ + (sim_stab.boolop == -1)) /* relational op reqd */ return SCPE_MISVAL; val = get_rval (rptr, idx); /* get register value */ if (test_search (val, &sim_stab)) /* test condition */