Merge zizzer.eecs.umich.edu:/bk/newmem
into zower.eecs.umich.edu:/home/gblack/m5/newmem-statetrace --HG-- extra : convert_revision : 41214c71e7fa11d47395975a141793337d020463
This commit is contained in:
commit
63e2d3dcbf
2 changed files with 96 additions and 5 deletions
|
@ -132,7 +132,7 @@ SyscallDesc SparcLinuxProcess::syscall32Descs[] = {
|
||||||
/* 40 */ SyscallDesc("lstat", unimplementedFunc),
|
/* 40 */ SyscallDesc("lstat", unimplementedFunc),
|
||||||
/* 41 */ SyscallDesc("dup", unimplementedFunc),
|
/* 41 */ SyscallDesc("dup", unimplementedFunc),
|
||||||
/* 42 */ SyscallDesc("pipe", pipePseudoFunc),
|
/* 42 */ SyscallDesc("pipe", pipePseudoFunc),
|
||||||
/* 43 */ SyscallDesc("times", unimplementedFunc),
|
/* 43 */ SyscallDesc("times", ignoreFunc),
|
||||||
/* 44 */ SyscallDesc("getuid32", unimplementedFunc),
|
/* 44 */ SyscallDesc("getuid32", unimplementedFunc),
|
||||||
/* 45 */ SyscallDesc("umount2", unimplementedFunc), //32 bit
|
/* 45 */ SyscallDesc("umount2", unimplementedFunc), //32 bit
|
||||||
/* 46 */ SyscallDesc("setgid", unimplementedFunc), //32 bit
|
/* 46 */ SyscallDesc("setgid", unimplementedFunc), //32 bit
|
||||||
|
@ -320,7 +320,7 @@ SyscallDesc SparcLinuxProcess::syscall32Descs[] = {
|
||||||
/* 228 */ SyscallDesc("setfsuid", unimplementedFunc), //32 bit
|
/* 228 */ SyscallDesc("setfsuid", unimplementedFunc), //32 bit
|
||||||
/* 229 */ SyscallDesc("setfsgid", unimplementedFunc), //32 bit
|
/* 229 */ SyscallDesc("setfsgid", unimplementedFunc), //32 bit
|
||||||
/* 230 */ SyscallDesc("_newselect", unimplementedFunc), //32 bit
|
/* 230 */ SyscallDesc("_newselect", unimplementedFunc), //32 bit
|
||||||
/* 231 */ SyscallDesc("time", unimplementedFunc),
|
/* 231 */ SyscallDesc("time", ignoreFunc),
|
||||||
/* 232 */ SyscallDesc("oldstat", unimplementedFunc),
|
/* 232 */ SyscallDesc("oldstat", unimplementedFunc),
|
||||||
/* 233 */ SyscallDesc("stime", unimplementedFunc),
|
/* 233 */ SyscallDesc("stime", unimplementedFunc),
|
||||||
/* 234 */ SyscallDesc("statfs64", unimplementedFunc),
|
/* 234 */ SyscallDesc("statfs64", unimplementedFunc),
|
||||||
|
@ -435,7 +435,7 @@ SyscallDesc SparcLinuxProcess::syscallDescs[] = {
|
||||||
/* 40 */ SyscallDesc("lstat", unimplementedFunc),
|
/* 40 */ SyscallDesc("lstat", unimplementedFunc),
|
||||||
/* 41 */ SyscallDesc("dup", unimplementedFunc),
|
/* 41 */ SyscallDesc("dup", unimplementedFunc),
|
||||||
/* 42 */ SyscallDesc("pipe", pipePseudoFunc),
|
/* 42 */ SyscallDesc("pipe", pipePseudoFunc),
|
||||||
/* 43 */ SyscallDesc("times", unimplementedFunc),
|
/* 43 */ SyscallDesc("times", ignoreFunc),
|
||||||
/* 44 */ SyscallDesc("getuid32", unimplementedFunc),
|
/* 44 */ SyscallDesc("getuid32", unimplementedFunc),
|
||||||
/* 45 */ SyscallDesc("umount2", unimplementedFunc),
|
/* 45 */ SyscallDesc("umount2", unimplementedFunc),
|
||||||
/* 46 */ SyscallDesc("setgid", unimplementedFunc),
|
/* 46 */ SyscallDesc("setgid", unimplementedFunc),
|
||||||
|
@ -623,7 +623,7 @@ SyscallDesc SparcLinuxProcess::syscallDescs[] = {
|
||||||
/* 228 */ SyscallDesc("setfsuid", unimplementedFunc),
|
/* 228 */ SyscallDesc("setfsuid", unimplementedFunc),
|
||||||
/* 229 */ SyscallDesc("setfsgid", unimplementedFunc),
|
/* 229 */ SyscallDesc("setfsgid", unimplementedFunc),
|
||||||
/* 230 */ SyscallDesc("_newselect", unimplementedFunc),
|
/* 230 */ SyscallDesc("_newselect", unimplementedFunc),
|
||||||
/* 231 */ SyscallDesc("time", unimplementedFunc),
|
/* 231 */ SyscallDesc("time", ignoreFunc),
|
||||||
/* 232 */ SyscallDesc("oldstat", unimplementedFunc),
|
/* 232 */ SyscallDesc("oldstat", unimplementedFunc),
|
||||||
/* 233 */ SyscallDesc("stime", unimplementedFunc),
|
/* 233 */ SyscallDesc("stime", unimplementedFunc),
|
||||||
/* 234 */ SyscallDesc("statfs64", unimplementedFunc),
|
/* 234 */ SyscallDesc("statfs64", unimplementedFunc),
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
* Steve Raasch
|
* Steve Raasch
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sys/ipc.h>
|
#include <sys/ipc.h>
|
||||||
|
@ -40,6 +41,7 @@
|
||||||
#include "arch/regfile.hh"
|
#include "arch/regfile.hh"
|
||||||
#include "arch/utility.hh"
|
#include "arch/utility.hh"
|
||||||
#include "base/loader/symtab.hh"
|
#include "base/loader/symtab.hh"
|
||||||
|
#include "base/socket.hh"
|
||||||
#include "config/full_system.hh"
|
#include "config/full_system.hh"
|
||||||
#include "cpu/base.hh"
|
#include "cpu/base.hh"
|
||||||
#include "cpu/exetrace.hh"
|
#include "cpu/exetrace.hh"
|
||||||
|
@ -65,6 +67,7 @@ static bool wasMicro = false;
|
||||||
|
|
||||||
namespace Trace {
|
namespace Trace {
|
||||||
SharedData *shared_data = NULL;
|
SharedData *shared_data = NULL;
|
||||||
|
ListenSocket *cosim_listener = NULL;
|
||||||
|
|
||||||
void
|
void
|
||||||
setupSharedData()
|
setupSharedData()
|
||||||
|
@ -150,9 +153,96 @@ Trace::InstRecord::dump()
|
||||||
ostream &outs = Trace::output();
|
ostream &outs = Trace::output();
|
||||||
|
|
||||||
DPRINTF(Sparc, "Instruction: %#X\n", staticInst->machInst);
|
DPRINTF(Sparc, "Instruction: %#X\n", staticInst->machInst);
|
||||||
|
bool diff = true;
|
||||||
if (IsOn(ExecRegDelta))
|
if (IsOn(ExecRegDelta))
|
||||||
{
|
{
|
||||||
|
diff = false;
|
||||||
|
#ifndef NDEBUG
|
||||||
#if THE_ISA == SPARC_ISA
|
#if THE_ISA == SPARC_ISA
|
||||||
|
static int fd = 0;
|
||||||
|
//Don't print what happens for each micro-op, just print out
|
||||||
|
//once at the last op, and for regular instructions.
|
||||||
|
if(!staticInst->isMicroOp() || staticInst->isLastMicroOp())
|
||||||
|
{
|
||||||
|
if(!cosim_listener)
|
||||||
|
{
|
||||||
|
int port = 8000;
|
||||||
|
cosim_listener = new ListenSocket();
|
||||||
|
while(!cosim_listener->listen(port, true))
|
||||||
|
{
|
||||||
|
DPRINTF(GDBMisc, "Can't bind port %d\n", port);
|
||||||
|
port++;
|
||||||
|
}
|
||||||
|
ccprintf(cerr, "Listening for cosimulator on port %d\n", port);
|
||||||
|
fd = cosim_listener->accept();
|
||||||
|
}
|
||||||
|
char prefix[] = "goli";
|
||||||
|
for(int p = 0; p < 4; p++)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
uint64_t regVal;
|
||||||
|
int res = read(fd, ®Val, sizeof(regVal));
|
||||||
|
if(res < 0)
|
||||||
|
panic("First read call failed! %s\n", strerror(errno));
|
||||||
|
regVal = TheISA::gtoh(regVal);
|
||||||
|
uint64_t realRegVal = thread->readIntReg(p * 8 + i);
|
||||||
|
if((regVal & 0xffffffffULL) != (realRegVal & 0xffffffffULL))
|
||||||
|
{
|
||||||
|
DPRINTF(ExecRegDelta, "Register %s%d should be %#x but is %#x.\n", prefix[p], i, regVal, realRegVal);
|
||||||
|
diff = true;
|
||||||
|
}
|
||||||
|
//ccprintf(outs, "%s%d m5 = %#x statetrace = %#x\n", prefix[p], i, realRegVal, regVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*for(int f = 0; f <= 62; f+=2)
|
||||||
|
{
|
||||||
|
uint64_t regVal;
|
||||||
|
int res = read(fd, ®Val, sizeof(regVal));
|
||||||
|
if(res < 0)
|
||||||
|
panic("First read call failed! %s\n", strerror(errno));
|
||||||
|
regVal = TheISA::gtoh(regVal);
|
||||||
|
uint64_t realRegVal = thread->readFloatRegBits(f, 64);
|
||||||
|
if(regVal != realRegVal)
|
||||||
|
{
|
||||||
|
DPRINTF(ExecRegDelta, "Register f%d should be %#x but is %#x.\n", f, regVal, realRegVal);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
uint64_t regVal;
|
||||||
|
int res = read(fd, ®Val, sizeof(regVal));
|
||||||
|
if(res < 0)
|
||||||
|
panic("First read call failed! %s\n", strerror(errno));
|
||||||
|
regVal = TheISA::gtoh(regVal);
|
||||||
|
uint64_t realRegVal = thread->readNextPC();
|
||||||
|
if(regVal != realRegVal)
|
||||||
|
{
|
||||||
|
DPRINTF(ExecRegDelta, "Register pc should be %#x but is %#x.\n", regVal, realRegVal);
|
||||||
|
diff = true;
|
||||||
|
}
|
||||||
|
res = read(fd, ®Val, sizeof(regVal));
|
||||||
|
if(res < 0)
|
||||||
|
panic("First read call failed! %s\n", strerror(errno));
|
||||||
|
regVal = TheISA::gtoh(regVal);
|
||||||
|
realRegVal = thread->readNextNPC();
|
||||||
|
if(regVal != realRegVal)
|
||||||
|
{
|
||||||
|
DPRINTF(ExecRegDelta, "Register npc should be %#x but is %#x.\n", regVal, realRegVal);
|
||||||
|
diff = true;
|
||||||
|
}
|
||||||
|
res = read(fd, ®Val, sizeof(regVal));
|
||||||
|
if(res < 0)
|
||||||
|
panic("First read call failed! %s\n", strerror(errno));
|
||||||
|
regVal = TheISA::gtoh(regVal);
|
||||||
|
realRegVal = thread->readIntReg(SparcISA::NumIntArchRegs + 2);
|
||||||
|
if((regVal & 0xF) != (realRegVal & 0xF))
|
||||||
|
{
|
||||||
|
DPRINTF(ExecRegDelta, "Register ccr should be %#x but is %#x.\n", regVal, realRegVal);
|
||||||
|
diff = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if 0 //THE_ISA == SPARC_ISA
|
||||||
//Don't print what happens for each micro-op, just print out
|
//Don't print what happens for each micro-op, just print out
|
||||||
//once at the last op, and for regular instructions.
|
//once at the last op, and for regular instructions.
|
||||||
if(!staticInst->isMicroOp() || staticInst->isLastMicroOp())
|
if(!staticInst->isMicroOp() || staticInst->isLastMicroOp())
|
||||||
|
@ -211,7 +301,8 @@ Trace::InstRecord::dump()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (IsOn(ExecIntel)) {
|
if(!diff) {
|
||||||
|
} else if (IsOn(ExecIntel)) {
|
||||||
ccprintf(outs, "%7d ) ", when);
|
ccprintf(outs, "%7d ) ", when);
|
||||||
outs << "0x" << hex << PC << ":\t";
|
outs << "0x" << hex << PC << ":\t";
|
||||||
if (staticInst->isLoad()) {
|
if (staticInst->isLoad()) {
|
||||||
|
|
Loading…
Reference in a new issue