diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cpu/inst_pb_trace.cc | 16 | ||||
-rw-r--r-- | src/cpu/inst_pb_trace.hh | 3 |
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 */ |