diff --git a/VAX/vax_cpu.c b/VAX/vax_cpu.c index 3c1c9140..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 } }; @@ -3459,10 +3457,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/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) diff --git a/scp.c b/scp.c index 683d0cfe..25590ea0 100644 --- a/scp.c +++ b/scp.c @@ -91,7 +91,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 [local fix 4] ASSERT now requires a conditional operator + 13-Mar-05 JDB ASSERT now requires a conditional operator 25-Feb-05 JDB [local fix 3] Added SCPE_CHALT message string [local fix 3] Added halt unit support in show_queue 07-Feb-05 RMS Added ASSERT command (Dave Bryan) @@ -839,6 +839,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? */ @@ -1028,7 +1029,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; @@ -1206,8 +1210,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; iradix, &sim_stab) || /* parse condition */ (sim_stab.boolop == -1)) /* relational op reqd */ -/* [JDB local fix 4] end */ return SCPE_MISVAL; val = get_rval (rptr, idx); /* get register value */ if (test_search (val, &sim_stab)) /* test condition */ 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; }