Implement a new m5exit instruction with an optional delay
arch/alpha/isa_desc:
move m5exit to m5exit old. The old version of the
instruction is now deprecated
Implement the new exit instruction with the optional delay
sim/sim_events.cc:
sim/sim_events.hh:
Make SimExit take a cycle
sim/universe.cc:
provide ticksPerMS, ticksPerUS, and ticksPerNS so we don't
have to do math during the cycle
--HG--
extra : convert_revision :
e2ed47a2e5cfcd57c82086c6fcb4a28bf801c214
if (!xc->misspeculating())
Annotate::EndInterval(xc);
}}, No_OpClass);
- 0x20: m5exit({{
+ 0x20: m5exit_old({{
if (!xc->misspeculating())
- SimExit("m5_exit instruction encountered");
+ SimExit(curTick, "m5_exit_old instruction encountered");
+ }}, No_OpClass);
+ 0x21: m5exit({{
+ if (!xc->misspeculating()) {
+ Tick when = curTick;
+ Tick delay = xc->regs.intRegFile[16];
+ if (delay != 0) {
+ delay *= ticksPerUS;
+ delay /= 1000;
+ when += delay;
+ }
+ SimExit(when, "m5_exit instruction encountered");
+ }
}}, No_OpClass);
0x30: initparam({{ Ra = xc->cpu->system->init_param; }});
0x40: resetstats({{
}
void
-SimExit(const char *message)
+SimExit(Tick when, const char *message)
{
- static SimExitEvent event(message);
+ static SimExitEvent event(when, message);
}
//
virtual const char *description();
};
-void SimExit(const char *message);
+void SimExit(Tick when, const char *message);
//
// Event class to terminate simulation after 'n' related events have
Tick curTick = 0;
Tick ticksPerSecond;
+Tick ticksPerMS;
+Tick ticksPerUS;
+Tick ticksPerNS;
class UniverseParamContext : public ParamContext
{
UniverseParamContext universe("Universe");
Param<Tick> universe_freq(&universe, "frequency", "tick frequency",
- 200000000);
+ 200000000);
void
UniverseParamContext::checkParams()
{
ticksPerSecond = universe_freq;
+ ticksPerMS = universe_freq / 1000;
+ ticksPerUS = universe_freq / (1000 * 1000);
+ ticksPerNS = universe_freq / (1000 * 1000 * 1000);
}