diff --git a/src/cpu/inst_pb_trace.cc b/src/cpu/inst_pb_trace.cc index 400360078c..138ef53869 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(bits(si->machInst, 31, 0))); + if (instSize == sizeof(uint32_t)) { + curMsg->set_inst(letoh(*reinterpret_cast(buf.get()))); + } else if (instSize) { + curMsg->set_inst_bytes( + std::string(reinterpret_cast(buf.get()), bufSize)); + } curMsg->set_cpuid(tc->cpuId()); curMsg->set_tick(curTick()); curMsg->set_type(static_cast(si->opClass())); diff --git a/src/cpu/inst_pb_trace.hh b/src/cpu/inst_pb_trace.hh index 57b3c2c594..e9e014769f 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 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 */