TIMER: Add SET CLOCK STOP=nnn to stop execution after nnn instructions
This allows potential debug information to be bounded when execution is started using BOOT or NEXT.
This commit is contained in:
parent
e39965a9f6
commit
d6316cbd03
1 changed files with 58 additions and 3 deletions
61
sim_timer.c
61
sim_timer.c
|
@ -161,6 +161,7 @@ static uint32 sim_os_clock_resoluton_ms = 0;
|
||||||
static uint32 sim_os_tick_hz = 0;
|
static uint32 sim_os_tick_hz = 0;
|
||||||
static uint32 sim_idle_stable = SIM_IDLE_STDFLT;
|
static uint32 sim_idle_stable = SIM_IDLE_STDFLT;
|
||||||
static uint32 sim_idle_calib_pct = 0;
|
static uint32 sim_idle_calib_pct = 0;
|
||||||
|
static double sim_timer_stop_time = 0;
|
||||||
static uint32 sim_rom_delay = 0;
|
static uint32 sim_rom_delay = 0;
|
||||||
static uint32 sim_throt_ms_start = 0;
|
static uint32 sim_throt_ms_start = 0;
|
||||||
static uint32 sim_throt_ms_stop = 0;
|
static uint32 sim_throt_ms_stop = 0;
|
||||||
|
@ -760,11 +761,13 @@ static uint32 sim_idle_cyc_ms = 0; /* Cycles per millisecon
|
||||||
UNIT sim_timer_units[SIM_NTIMERS+1]; /* Clock assist units */
|
UNIT sim_timer_units[SIM_NTIMERS+1]; /* Clock assist units */
|
||||||
/* one for each timer and one for an internal */
|
/* one for each timer and one for an internal */
|
||||||
/* clock if no clocks are registered. */
|
/* clock if no clocks are registered. */
|
||||||
|
UNIT sim_stop_unit; /* Stop unit */
|
||||||
UNIT sim_internal_timer_unit; /* Internal calibration timer */
|
UNIT sim_internal_timer_unit; /* Internal calibration timer */
|
||||||
UNIT sim_throttle_unit; /* one for throttle */
|
UNIT sim_throttle_unit; /* one for throttle */
|
||||||
|
|
||||||
t_stat sim_throt_svc (UNIT *uptr);
|
t_stat sim_throt_svc (UNIT *uptr);
|
||||||
t_stat sim_timer_tick_svc (UNIT *uptr);
|
t_stat sim_timer_tick_svc (UNIT *uptr);
|
||||||
|
t_stat sim_timer_stop_svc (UNIT *uptr);
|
||||||
|
|
||||||
#define DBG_IDL TIMER_DBG_IDLE /* idling */
|
#define DBG_IDL TIMER_DBG_IDLE /* idling */
|
||||||
#define DBG_QUE TIMER_DBG_QUEUE /* queue activities */
|
#define DBG_QUE TIMER_DBG_QUEUE /* queue activities */
|
||||||
|
@ -793,6 +796,7 @@ DEBTAB sim_timer_debug[] = {
|
||||||
/* Forward device declarations */
|
/* Forward device declarations */
|
||||||
extern DEVICE sim_timer_dev;
|
extern DEVICE sim_timer_dev;
|
||||||
extern DEVICE sim_throttle_dev;
|
extern DEVICE sim_throttle_dev;
|
||||||
|
extern DEVICE sim_stop_dev;
|
||||||
|
|
||||||
|
|
||||||
void sim_rtcn_init_all (void)
|
void sim_rtcn_init_all (void)
|
||||||
|
@ -1034,6 +1038,7 @@ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) {
|
||||||
sim_timer_units[tmr].flags = UNIT_DIS | UNIT_IDLE;
|
sim_timer_units[tmr].flags = UNIT_DIS | UNIT_IDLE;
|
||||||
sim_clock_cosched_queue[tmr] = QUEUE_LIST_END;
|
sim_clock_cosched_queue[tmr] = QUEUE_LIST_END;
|
||||||
}
|
}
|
||||||
|
sim_stop_unit.action = &sim_timer_stop_svc;
|
||||||
SIM_INTERNAL_UNIT.flags = UNIT_IDLE;
|
SIM_INTERNAL_UNIT.flags = UNIT_IDLE;
|
||||||
sim_register_internal_device (&sim_timer_dev); /* Register Clock Assist device */
|
sim_register_internal_device (&sim_timer_dev); /* Register Clock Assist device */
|
||||||
sim_throttle_unit.action = &sim_throt_svc;
|
sim_throttle_unit.action = &sim_throt_svc;
|
||||||
|
@ -1309,6 +1314,26 @@ sim_idle_calib_pct = (uint32)newpct;
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set stop time */
|
||||||
|
|
||||||
|
t_stat sim_timer_set_stop (int32 flag, CONST char *cptr)
|
||||||
|
{
|
||||||
|
t_stat r;
|
||||||
|
t_value stop_time;
|
||||||
|
|
||||||
|
if (cptr == NULL)
|
||||||
|
return SCPE_ARG;
|
||||||
|
stop_time = get_uint (cptr, 10, 0, &r);
|
||||||
|
if (r != SCPE_OK)
|
||||||
|
return r;
|
||||||
|
if (stop_time <= (t_value)sim_gtime())
|
||||||
|
return SCPE_ARG;
|
||||||
|
sim_register_internal_device (&sim_stop_dev); /* Register Stop Device */
|
||||||
|
sim_timer_stop_time = (double)stop_time;
|
||||||
|
sim_activate_abs (&sim_stop_unit, (int32)(sim_timer_stop_time - sim_gtime()));
|
||||||
|
return SCPE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set/Clear asynch */
|
/* Set/Clear asynch */
|
||||||
|
|
||||||
t_stat sim_timer_set_async (int32 flag, CONST char *cptr)
|
t_stat sim_timer_set_async (int32 flag, CONST char *cptr)
|
||||||
|
@ -1336,6 +1361,7 @@ static CTAB set_timer_tab[] = {
|
||||||
{ "CATCHUP", &sim_timer_set_catchup, 1 },
|
{ "CATCHUP", &sim_timer_set_catchup, 1 },
|
||||||
{ "NOCATCHUP", &sim_timer_set_catchup, 0 },
|
{ "NOCATCHUP", &sim_timer_set_catchup, 0 },
|
||||||
{ "CALIB", &sim_timer_set_idle_pct, 0 },
|
{ "CALIB", &sim_timer_set_idle_pct, 0 },
|
||||||
|
{ "STOP", &sim_timer_set_stop, 0 },
|
||||||
{ NULL, NULL, 0 }
|
{ NULL, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1355,6 +1381,11 @@ static const char *sim_int_timer_description (DEVICE *dptr)
|
||||||
return "Internal Timer";
|
return "Internal Timer";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *sim_int_stop_description (DEVICE *dptr)
|
||||||
|
{
|
||||||
|
return "Stop facility";
|
||||||
|
}
|
||||||
|
|
||||||
static const char *sim_throttle_description (DEVICE *dptr)
|
static const char *sim_throttle_description (DEVICE *dptr)
|
||||||
{
|
{
|
||||||
return "Throttle facility";
|
return "Throttle facility";
|
||||||
|
@ -1364,16 +1395,33 @@ DEVICE sim_timer_dev = {
|
||||||
"INT-CLOCK", sim_timer_units, sim_timer_reg, sim_timer_mod,
|
"INT-CLOCK", sim_timer_units, sim_timer_reg, sim_timer_mod,
|
||||||
SIM_NTIMERS+1, 0, 0, 0, 0, 0,
|
SIM_NTIMERS+1, 0, 0, 0, 0, 0,
|
||||||
NULL, NULL, &sim_timer_clock_reset, NULL, NULL, NULL,
|
NULL, NULL, &sim_timer_clock_reset, NULL, NULL, NULL,
|
||||||
NULL, DEV_DEBUG | DEV_NOSAVE, 0, sim_timer_debug};
|
NULL, DEV_DEBUG | DEV_NOSAVE, 0,
|
||||||
|
sim_timer_debug, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
sim_timer_description};
|
||||||
|
|
||||||
DEVICE sim_int_timer_dev = {
|
DEVICE sim_int_timer_dev = {
|
||||||
"INT-TIMER", &sim_internal_timer_unit, NULL, NULL,
|
"INT-TIMER", &sim_internal_timer_unit, NULL, NULL,
|
||||||
1, 0, 0, 0, 0, 0,
|
1, 0, 0, 0, 0, 0,
|
||||||
NULL, NULL, NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
NULL, DEV_NOSAVE};
|
NULL, DEV_NOSAVE, 0,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
sim_int_timer_description};
|
||||||
|
|
||||||
|
DEVICE sim_stop_dev = {
|
||||||
|
"INT-STOP", &sim_stop_unit, NULL, NULL,
|
||||||
|
1, 0, 0, 0, 0, 0,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, DEV_NOSAVE, 0,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
sim_int_stop_description};
|
||||||
|
|
||||||
DEVICE sim_throttle_dev = {
|
DEVICE sim_throttle_dev = {
|
||||||
"INT-THROTTLE", &sim_throttle_unit, sim_throttle_reg, NULL, 1};
|
"INT-THROTTLE", &sim_throttle_unit, sim_throttle_reg, NULL, 1,
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
NULL, 0, 0,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
|
sim_throttle_description};
|
||||||
|
|
||||||
|
|
||||||
/* SET CLOCK command */
|
/* SET CLOCK command */
|
||||||
|
@ -1860,6 +1908,11 @@ if ((stat == SCPE_OK) &&
|
||||||
return stat;
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t_stat sim_timer_stop_svc (UNIT *uptr)
|
||||||
|
{
|
||||||
|
return SCPE_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
void sim_rtcn_get_time (struct timespec *now, int tmr)
|
void sim_rtcn_get_time (struct timespec *now, int tmr)
|
||||||
{
|
{
|
||||||
sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_get_time(tmr=%d)\n", tmr);
|
sim_debug (DBG_CAL, &sim_timer_dev, "sim_rtcn_get_time(tmr=%d)\n", tmr);
|
||||||
|
@ -2206,6 +2259,8 @@ void sim_start_timer_services (void)
|
||||||
{
|
{
|
||||||
sim_debug (DBG_TRC, &sim_timer_dev, "sim_start_timer_services()\n");
|
sim_debug (DBG_TRC, &sim_timer_dev, "sim_start_timer_services()\n");
|
||||||
_rtcn_configure_calibrated_clock (sim_calb_tmr);
|
_rtcn_configure_calibrated_clock (sim_calb_tmr);
|
||||||
|
if (sim_timer_stop_time > sim_gtime())
|
||||||
|
sim_activate_abs (&sim_stop_unit, (int32)(sim_timer_stop_time - sim_gtime()));
|
||||||
#if defined(SIM_ASYNCH_CLOCKS)
|
#if defined(SIM_ASYNCH_CLOCKS)
|
||||||
pthread_mutex_lock (&sim_timer_lock);
|
pthread_mutex_lock (&sim_timer_lock);
|
||||||
if (sim_asynch_timer) {
|
if (sim_asynch_timer) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue