From 4db4f90429f254c441818245baf473ecd55886ae Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 9 Oct 2020 05:10:34 -0700 Subject: [PATCH] VAX, Unibus VAX: Record explicit TODR set immediately to backing store - Only if backing store is used (i.e. OS Agnostic mode) - Previously this was only done on a clean simulator exit. That could result in inconsistent timing information in operating system images vs the saved TODR baseline data - Always return TODR values rounded to the TODR granularity (10ms). --- VAX/vax730_stddev.c | 13 +++++++++---- VAX/vax750_stddev.c | 13 +++++++++---- VAX/vax780_stddev.c | 13 +++++++++---- VAX/vax820_stddev.c | 13 +++++++++---- VAX/vax860_stddev.c | 13 +++++++++---- VAX/vax_stddev.c | 11 ++++++++--- 6 files changed, 53 insertions(+), 23 deletions(-) diff --git a/VAX/vax730_stddev.c b/VAX/vax730_stddev.c index 8d340a74..2c7fb6dd 100644 --- a/VAX/vax730_stddev.c +++ b/VAX/vax730_stddev.c @@ -665,7 +665,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */ sim_cancel (&tmr_unit); /* cancel timer */ } if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */ - (10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */ + (10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */ sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */ tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */ tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */ @@ -934,7 +934,7 @@ base.tv_sec = (time_t)toy->toy_gmtbase; base.tv_nsec = toy->toy_gmtbasemsec * 1000000; sim_timespec_diff (&val, &now, &base); /* val = now - base */ sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000))); -return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */ +return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */ } void todr_wr (int32 data) @@ -952,7 +952,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000; sim_timespec_diff (&base, &now, &val); /* base = now - data */ toy->toy_gmtbase = (uint32)base.tv_sec; tbase = (time_t)base.tv_sec; -toy->toy_gmtbasemsec = base.tv_nsec/1000000; +toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000; +if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */ + rewind (clk_unit.fileref); + fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */ + fflush (clk_unit.fileref); + } sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000)); } @@ -982,7 +987,7 @@ else { /* Not-Attached means */ ctm->tm_min) * 60) + ctm->tm_sec; todr_wr ((base * 100) + 0x10000000 + /* use VMS form */ - (int32)(now.tv_nsec / 10000000)); + (int32)((now.tv_nsec + 5000000)/ 10000000)); } return SCPE_OK; } diff --git a/VAX/vax750_stddev.c b/VAX/vax750_stddev.c index 1323afd7..7f8252ad 100644 --- a/VAX/vax750_stddev.c +++ b/VAX/vax750_stddev.c @@ -661,7 +661,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */ sim_cancel (&tmr_unit); /* cancel timer */ } if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */ - (10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */ + (10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */ sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */ tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */ tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */ @@ -931,7 +931,7 @@ base.tv_sec = (time_t)toy->toy_gmtbase; base.tv_nsec = toy->toy_gmtbasemsec * 1000000; sim_timespec_diff (&val, &now, &base); /* val = now - base */ sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000))); -return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */ +return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */ } void todr_wr (int32 data) @@ -949,7 +949,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000; sim_timespec_diff (&base, &now, &val); /* base = now - data */ toy->toy_gmtbase = (uint32)base.tv_sec; tbase = (time_t)base.tv_sec; -toy->toy_gmtbasemsec = base.tv_nsec/1000000; +toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000; +if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */ + rewind (clk_unit.fileref); + fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */ + fflush (clk_unit.fileref); + } sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000)); } @@ -979,7 +984,7 @@ else { /* Not-Attached means */ ctm->tm_min) * 60) + ctm->tm_sec; todr_wr ((base * 100) + 0x10000000 + /* use VMS form */ - (int32)(now.tv_nsec / 10000000)); + (int32)((now.tv_nsec + 5000000)/ 10000000)); } return SCPE_OK; } diff --git a/VAX/vax780_stddev.c b/VAX/vax780_stddev.c index 28fde828..277d1988 100644 --- a/VAX/vax780_stddev.c +++ b/VAX/vax780_stddev.c @@ -633,7 +633,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */ sim_cancel (&tmr_unit); /* cancel timer */ } if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */ - (10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */ + (10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */ sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */ tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */ tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */ @@ -903,7 +903,7 @@ base.tv_sec = (time_t)toy->toy_gmtbase; base.tv_nsec = toy->toy_gmtbasemsec * 1000000; sim_timespec_diff (&val, &now, &base); /* val = now - base */ sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000))); -return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */ +return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */ } void todr_wr (int32 data) @@ -921,7 +921,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000; sim_timespec_diff (&base, &now, &val); /* base = now - data */ toy->toy_gmtbase = (uint32)base.tv_sec; tbase = (time_t)base.tv_sec; -toy->toy_gmtbasemsec = base.tv_nsec/1000000; +toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000; +if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */ + rewind (clk_unit.fileref); + fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */ + fflush (clk_unit.fileref); + } sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000)); } @@ -951,7 +956,7 @@ else { /* Not-Attached means */ ctm->tm_min) * 60) + ctm->tm_sec; todr_wr ((base * 100) + 0x10000000 + /* use VMS form */ - (int32)(now.tv_nsec / 10000000)); + (int32)((now.tv_nsec + 5000000)/ 10000000)); } return SCPE_OK; } diff --git a/VAX/vax820_stddev.c b/VAX/vax820_stddev.c index 1a94f0db..5c3ee9ec 100644 --- a/VAX/vax820_stddev.c +++ b/VAX/vax820_stddev.c @@ -662,7 +662,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */ sim_cancel (&tmr_unit); /* cancel timer */ } if ((val & CSR_DONE) && /* Interrupt Acked? */ - (10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */ + (10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */ sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */ tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */ tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */ @@ -938,7 +938,7 @@ base.tv_sec = toy->toy_gmtbase; base.tv_nsec = toy->toy_gmtbasemsec * 1000000; sim_timespec_diff (&val, &now, &base); sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000))); -return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */ +return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */ } void todr_wr (int32 data) @@ -956,7 +956,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000; sim_timespec_diff (&base, &now, &val); /* base = now - data */ toy->toy_gmtbase = (uint32)base.tv_sec; tbase = (time_t)base.tv_sec; -toy->toy_gmtbasemsec = base.tv_nsec/1000000; +toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000; +if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */ + rewind (clk_unit.fileref); + fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */ + fflush (clk_unit.fileref); + } sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000)); } @@ -986,7 +991,7 @@ else { /* Not-Attached means */ ctm->tm_min) * 60) + ctm->tm_sec; todr_wr ((base * 100) + 0x10000000 + /* use VMS form */ - (int32)(now.tv_nsec / 10000000)); + (int32)((now.tv_nsec + 5000000)/ 10000000)); } return SCPE_OK; } diff --git a/VAX/vax860_stddev.c b/VAX/vax860_stddev.c index f4962167..c7186962 100644 --- a/VAX/vax860_stddev.c +++ b/VAX/vax860_stddev.c @@ -769,7 +769,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */ sim_cancel (&tmr_unit); /* cancel timer */ } if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */ - (10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */ + (10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */ sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */ tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */ tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */ @@ -1038,7 +1038,7 @@ base.tv_sec = (time_t)toy->toy_gmtbase; base.tv_nsec = toy->toy_gmtbasemsec * 1000000; sim_timespec_diff (&val, &now, &base); /* val = now - base */ sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000))); -return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */ +return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */ } void todr_wr (int32 data) @@ -1056,7 +1056,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000; sim_timespec_diff (&base, &now, &val); /* base = now - data */ toy->toy_gmtbase = (uint32)base.tv_sec; tbase = (time_t)base.tv_sec; -toy->toy_gmtbasemsec = base.tv_nsec/1000000; +toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000; +if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */ + rewind (clk_unit.fileref); + fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */ + fflush (clk_unit.fileref); + } sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000)); } @@ -1086,7 +1091,7 @@ else { /* Not-Attached means */ ctm->tm_min) * 60) + ctm->tm_sec; todr_wr ((base * 100) + 0x10000000 + /* use VMS form */ - (int32)(now.tv_nsec / 10000000)); + (int32)((now.tv_nsec + 5000000)/ 10000000)); } return SCPE_OK; } diff --git a/VAX/vax_stddev.c b/VAX/vax_stddev.c index aeabd9bf..e4593dfe 100644 --- a/VAX/vax_stddev.c +++ b/VAX/vax_stddev.c @@ -499,7 +499,7 @@ if (val.tv_sec >= TOY_MAX_SECS) { /* todr overflowed? */ } sim_debug (DBG_REG, &clk_dev, "todr_rd() - TODR=0x%X\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000)); -return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */ +return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */ } @@ -518,12 +518,17 @@ if (data) { val.tv_nsec = (((uint32)data) % 100) * 10000000; sim_timespec_diff (&base, &now, &val); /* base = now - data */ toy->toy_gmtbase = (uint32)base.tv_sec; - toy->toy_gmtbasemsec = base.tv_nsec/1000000; + toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000; } else { /* stop the clock */ toy->toy_gmtbase = 0; toy->toy_gmtbasemsec = 0; } +if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */ + rewind (clk_unit.fileref); + fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */ + fflush (clk_unit.fileref); + } todr_reg = data; sim_debug (DBG_REG, &clk_dev, "todr_wr(0x%X) - TODR=0x%X blow=%d\n", data, todr_reg, todr_blow); } @@ -556,7 +561,7 @@ else { /* Not-Attached means */ ctm->tm_min) * 60) + ctm->tm_sec; todr_wr ((base * 100) + 0x10000000 + /* use VMS form */ - (int32)(now.tv_nsec / 10000000)); + (int32)((now.tv_nsec + 5000000)/ 10000000)); } return SCPE_OK; }