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 <andreas.sandberg@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2018-01-25 00:21:58 -08:00
parent 81050be736
commit 740619f5d3
2 changed files with 17 additions and 2 deletions

View File

@@ -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()));

View File

@@ -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
*/