summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cpu/inst_pb_trace.cc16
-rw-r--r--src/cpu/inst_pb_trace.hh3
2 files changed, 17 insertions, 2 deletions
diff --git a/src/cpu/inst_pb_trace.cc b/src/cpu/inst_pb_trace.cc
index 400360078..138ef5386 100644
--- a/src/cpu/inst_pb_trace.cc
+++ b/src/cpu/inst_pb_trace.cc
@@ -69,7 +69,7 @@ InstPBTraceRecord::dump()
}
InstPBTrace::InstPBTrace(const InstPBTraceParams *p)
- : InstTracer(p), curMsg(nullptr)
+ : InstTracer(p), buf(nullptr), bufSize(0), curMsg(nullptr)
{
// Create our output file
createTraceFile(p->file_name);
@@ -141,10 +141,22 @@ InstPBTrace::traceInst(ThreadContext *tc, StaticInstPtr si, TheISA::PCState pc)
curMsg = NULL;
}
+ size_t instSize = si->asBytes(buf.get(), bufSize);
+ if (instSize > bufSize) {
+ bufSize = instSize;
+ buf.reset(new uint8_t[bufSize]);
+ instSize = si->asBytes(buf.get(), bufSize);
+ }
+
// Create a new instruction message and fill out the fields
curMsg = new ProtoMessage::Inst;
curMsg->set_pc(pc.pc());
- curMsg->set_inst(static_cast<uint32_t>(bits(si->machInst, 31, 0)));
+ if (instSize == sizeof(uint32_t)) {
+ curMsg->set_inst(letoh(*reinterpret_cast<uint32_t *>(buf.get())));
+ } else if (instSize) {
+ curMsg->set_inst_bytes(
+ std::string(reinterpret_cast<const char *>(buf.get()), bufSize));
+ }
curMsg->set_cpuid(tc->cpuId());
curMsg->set_tick(curTick());
curMsg->set_type(static_cast<ProtoMessage::Inst_InstType>(si->opClass()));
diff --git a/src/cpu/inst_pb_trace.hh b/src/cpu/inst_pb_trace.hh
index 57b3c2c59..e9e014769 100644
--- a/src/cpu/inst_pb_trace.hh
+++ b/src/cpu/inst_pb_trace.hh
@@ -93,6 +93,9 @@ class InstPBTrace : public InstTracer
StaticInstPtr mi = NULL) override;
protected:
+ std::unique_ptr<uint8_t []> buf;
+ size_t bufSize;
+
/** One output stream for the entire simulation.
* We encode the CPU & system ID so all we need is a single file
*/