ARM: Make native trace print out what instruction caused an error.

This commit is contained in:
Gabe Black 2009-07-27 00:54:09 -07:00
parent 1ad4de2528
commit 8ec235c7b1
4 changed files with 22 additions and 7 deletions

View file

@ -86,6 +86,7 @@ Trace::ArmNativeTrace::check(NativeTraceRecord *record)
nState.update(this); nState.update(this);
mState.update(record->getThread()); mState.update(record->getThread());
bool errorFound = false;
// Regular int regs // Regular int regs
for (int i = 0; i < STATE_NUMVALS; i++) { for (int i = 0; i < STATE_NUMVALS; i++) {
if (nState.changed[i] || mState.changed[i]) { if (nState.changed[i] || mState.changed[i]) {
@ -104,6 +105,7 @@ Trace::ArmNativeTrace::check(NativeTraceRecord *record)
vergence, regNames[i], vergence, regNames[i],
nState.newState[i], nState.newState[i],
mState.oldState[i], mState.newState[i]); mState.oldState[i], mState.newState[i]);
errorFound = true;
} else if (!mState.changed[i]) { } else if (!mState.changed[i]) {
DPRINTF(ExecRegDelta, "%s [%5s] "\ DPRINTF(ExecRegDelta, "%s [%5s] "\
"Native: %#010x => %#010x "\ "Native: %#010x => %#010x "\
@ -111,6 +113,7 @@ Trace::ArmNativeTrace::check(NativeTraceRecord *record)
vergence, regNames[i], vergence, regNames[i],
nState.oldState[i], nState.newState[i], nState.oldState[i], nState.newState[i],
mState.newState[i]); mState.newState[i]);
errorFound = true;
} else if (mState.oldState[i] != nState.oldState[i] || } else if (mState.oldState[i] != nState.oldState[i] ||
mState.newState[i] != nState.newState[i]) { mState.newState[i] != nState.newState[i]) {
DPRINTF(ExecRegDelta, "%s [%5s] "\ DPRINTF(ExecRegDelta, "%s [%5s] "\
@ -119,9 +122,21 @@ Trace::ArmNativeTrace::check(NativeTraceRecord *record)
vergence, regNames[i], vergence, regNames[i],
nState.oldState[i], nState.newState[i], nState.oldState[i], nState.newState[i],
mState.oldState[i], mState.newState[i]); mState.oldState[i], mState.newState[i]);
errorFound = true;
} }
} }
} }
if (errorFound) {
StaticInstPtr inst = record->getStaticInst();
assert(inst);
bool ran = true;
if (inst->isMicroop()) {
ran = false;
inst = record->getMacroStaticInst();
}
assert(inst);
record->traceInst(inst, ran);
}
} }
} /* namespace Trace */ } /* namespace Trace */

View file

@ -28,9 +28,9 @@
from m5.SimObject import SimObject from m5.SimObject import SimObject
from m5.params import * from m5.params import *
from InstTracer import InstTracer from ExeTracer import ExeTracer
class NativeTrace(InstTracer): class NativeTrace(ExeTracer):
abstract = True abstract = True
type = 'NativeTrace' type = 'NativeTrace'
cxx_class = 'Trace::NativeTrace' cxx_class = 'Trace::NativeTrace'

View file

@ -38,7 +38,7 @@ using namespace std;
namespace Trace { namespace Trace {
NativeTrace::NativeTrace(const Params *p) NativeTrace::NativeTrace(const Params *p)
: InstTracer(p) : ExeTracer(p)
{ {
if (ListenSocket::allDisabled()) if (ListenSocket::allDisabled())
fatal("All listeners are disabled!"); fatal("All listeners are disabled!");

View file

@ -37,8 +37,8 @@
#include "base/socket.hh" #include "base/socket.hh"
#include "base/trace.hh" #include "base/trace.hh"
#include "base/types.hh" #include "base/types.hh"
#include "cpu/exetrace.hh"
#include "cpu/static_inst.hh" #include "cpu/static_inst.hh"
#include "sim/insttracer.hh"
class ThreadContext; class ThreadContext;
@ -46,7 +46,7 @@ namespace Trace {
class NativeTrace; class NativeTrace;
class NativeTraceRecord : public InstRecord class NativeTraceRecord : public ExeTracerRecord
{ {
protected: protected:
NativeTrace * parent; NativeTrace * parent;
@ -56,7 +56,7 @@ class NativeTraceRecord : public InstRecord
Tick _when, ThreadContext *_thread, Tick _when, ThreadContext *_thread,
const StaticInstPtr _staticInst, Addr _pc, bool spec, const StaticInstPtr _staticInst, Addr _pc, bool spec,
const StaticInstPtr _macroStaticInst = NULL, MicroPC _upc = 0) const StaticInstPtr _macroStaticInst = NULL, MicroPC _upc = 0)
: InstRecord(_when, _thread, _staticInst, _pc, spec, : ExeTracerRecord(_when, _thread, _staticInst, _pc, spec,
_macroStaticInst, _upc), _macroStaticInst, _upc),
parent(_parent) parent(_parent)
{ {
@ -65,7 +65,7 @@ class NativeTraceRecord : public InstRecord
void dump(); void dump();
}; };
class NativeTrace : public InstTracer class NativeTrace : public ExeTracer
{ {
protected: protected:
int fd; int fd;