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).
This commit is contained in:
parent
0e72400e09
commit
4db4f90429
6 changed files with 53 additions and 23 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue