* Steve Raasch
*/
-#include "arch/isa_specific.hh"
+#include "config/the_isa.hh"
#if THE_ISA != SPARC_ISA
#error Legion tracing only works with SPARC simulations!
#endif
-#include "config/full_system.hh"
-#if !FULL_SYSTEM
- #error Legion tracing only works in full system!
-#endif
-
-#include <iomanip>
#include <sys/ipc.h>
#include <sys/shm.h>
-#include "arch/sparc/predecoder.hh"
-#include "arch/sparc/regfile.hh"
+#include <cstdio>
+#include <iomanip>
+
+#include "arch/sparc/decoder.hh"
+#include "arch/sparc/registers.hh"
#include "arch/sparc/utility.hh"
+#include "arch/tlb.hh"
#include "base/socket.hh"
#include "cpu/base.hh"
#include "cpu/legiontrace.hh"
#include "cpu/static_inst.hh"
#include "cpu/thread_context.hh"
+#include "sim/full_system.hh"
#include "sim/system.hh"
-#if FULL_SYSTEM
-#include "arch/tlb.hh"
-#endif
-
//XXX This is temporary
#include "cpu/m5legion_interface.h"
using namespace std;
using namespace TheISA;
-#if FULL_SYSTEM
static int diffcount = 0;
static bool wasMicro = false;
-#endif
namespace Trace {
SharedData *shared_data = NULL;
// Utility methods for pretty printing a report about a difference
//
-inline char * genCenteredLabel(int length, char * buffer, char * label)
+inline char * genCenteredLabel(int length, char * buffer, const char * label)
{
int labelLength = strlen(label);
assert(labelLength <= length);
ccprintf(os, "--------------------+-----------------------+-----------------------\n");
}
-inline void printSectionHeader(ostream & os, char * name)
+inline void printSectionHeader(ostream & os, const char * name)
{
char sectionString[70];
genCenteredLabel(69, sectionString, name);
{
ostream &outs = Trace::output();
- static TheISA::Predecoder predecoder(NULL);
// Compare
bool compared = false;
bool diffPC = false;
bool diffTnpc = false;
bool diffTstate = false;
bool diffTt = false;
- bool diffTba = false;
+ bool diffTba M5_VAR_USED = false;
bool diffHpstate = false;
bool diffHtstate = false;
bool diffHtba = false;
if(!staticInst->isMicroop() || staticInst->isLastMicroop()) {
while (!compared) {
if (shared_data->flags == OWN_M5) {
- m5Pc = PC & SparcISA::PAddrImplMask;
+ m5Pc = pc.instAddr() & SparcISA::PAddrImplMask;
if (bits(shared_data->pstate,3,3)) {
m5Pc &= mask(32);
}
}
}
for (int i = 0; i < TheISA::NumFloatRegs/2; i++) {
- if (thread->readFloatRegBits(i*2,
- FloatRegFile::DoubleWidth) !=
+ if (thread->readFloatRegBits(i*2) !=
shared_data->fpregs[i]) {
diffFpRegs = true;
}
<< staticInst->disassemble(m5Pc, debugSymbolTable)
<< endl;
- predecoder.setTC(thread);
- predecoder.moreBytes(m5Pc, m5Pc,
- shared_data->instruction);
+ TheISA::Decoder *decoder = thread->getDecoderPtr();
+ decoder->setTC(thread);
+ decoder->moreBytes(m5Pc, m5Pc, shared_data->instruction);
- assert(predecoder.extMachInstReady());
+ assert(decoder->instReady());
- StaticInstPtr legionInst =
- StaticInst::decode(predecoder.getExtMachInst(), lgnPc);
+ PCState tempPC = pc;
+ StaticInstPtr legionInst = decoder->decode(tempPC);
outs << setfill(' ') << setw(15)
<< " Legion Inst: "
<< "0x" << setw(8) << setfill('0') << hex
char label[8];
sprintf(label, "%%f%d", x);
printRegPair(outs, label,
- thread->readFloatRegBits(x*2,
- FloatRegFile::DoubleWidth),
+ thread->readFloatRegBits(x*2),
shared_data->fpregs[x]);
}
}
if (diffTlb) {
printColumnLabels(outs);
- char label[8];
+ char label[9];
for (int x = 0; x < 64; x++) {
if (shared_data->itb[x] !=
ULL(0xFFFFFFFFFFFFFFFF) ||
} // if not microop
}
-/* namespace Trace */ }
+} // namespace Trace
////////////////////////////////////////////////////////////////////////
//
Trace::LegionTrace *
LegionTraceParams::create()
{
+ if (!FullSystem)
+ panic("Legion tracing only works in full system!");
return new Trace::LegionTrace(this);
};