From 740619f5d394da3816ff3fe6389cd7eb6ac55b8f Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 25 Jan 2018 00:21:58 -0800 Subject: cpu: Use the new asBytes function in the protobuf inst tracer. Use this function to get the binary representation of the instruction rather than referencing the ExtMachInst typed machInst member of the StaticInst directly. ExtMachInst is an ISA specific type and can't always be straightforwardly squished into a 32 bit integer. Change-Id: Ic1f74d6d86eb779016677ae45c022939ce3e2b9f Reviewed-on: https://gem5-review.googlesource.com/7563 Reviewed-by: Andreas Sandberg Maintainer: Gabe Black --- src/cpu/inst_pb_trace.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src/cpu/inst_pb_trace.cc') 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(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())); -- cgit v1.2.3