46 #include "debug/ExecRegDelta.hh" 47 #include "params/ArmNativeTrace.hh" 53 static const char *regNames[] = {
54 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
55 "r8",
"r9",
"r10",
"fp",
"r12",
"sp",
"lr",
"pc",
56 "cpsr",
"f0",
"f1",
"f2",
"f3",
"f4",
"f5",
"f6",
57 "f7",
"f8",
"f9",
"f10",
"f11",
"f12",
"f13",
"f14",
58 "f15",
"f16",
"f17",
"f18",
"f19",
"f20",
"f21",
"f22",
59 "f23",
"f24",
"f25",
"f26",
"f27",
"f28",
"f29",
"f30",
67 oldState = state[current];
68 current = (current + 1) % 2;
69 newState = state[current];
71 memcpy(newState, oldState,
sizeof(state[0]));
74 parent->
read(&diffVector,
sizeof(diffVector));
75 diffVector =
letoh(diffVector);
78 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
79 if (diffVector & 0x1) {
88 uint64_t values[changes];
89 parent->
read(values,
sizeof(values));
91 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
93 newState[
i] =
letoh(values[pos++]);
94 changed[
i] = (newState[
i] != oldState[
i]);
102 oldState = state[current];
103 current = (current + 1) % 2;
104 newState = state[current];
107 for (
int i = 0;
i < 15;
i++) {
109 changed[
i] = (oldState[
i] != newState[
i]);
113 newState[STATE_PC] = tc->
pcState().npc();
114 changed[STATE_PC] = (newState[STATE_PC] != oldState[STATE_PC]);
123 newState[STATE_CPSR] = cpsr;
124 changed[STATE_CPSR] = (newState[STATE_CPSR] != oldState[STATE_CPSR]);
129 newState[STATE_F0 + 2*
i] = vec[0];
130 newState[STATE_F0 + 2*
i + 1] = vec[1];
148 if ((mState.oldState[STATE_PC] == nState.oldState[STATE_PC]) &&
149 (mState.newState[STATE_PC] - 4 == nState.newState[STATE_PC])) {
150 DPRINTF(ExecRegDelta,
"Advancing to match PCs after syscall\n");
155 bool errorFound =
false;
157 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
158 if (nState.changed[
i] || mState.changed[
i]) {
159 bool oldMatch = (mState.oldState[
i] == nState.oldState[
i]);
160 bool newMatch = (mState.newState[
i] == nState.newState[
i]);
161 if (oldMatch && newMatch) {
169 const char *vergence =
" ";
170 if (oldMatch && !newMatch) {
172 }
else if (!oldMatch && newMatch) {
176 if (!nState.changed[
i]) {
177 DPRINTF(ExecRegDelta,
"%s [%5s] "\
179 "M5: %#010x => %#010x\n",
180 vergence, regNames[
i],
182 mState.oldState[i], mState.newState[i]);
183 }
else if (!mState.changed[
i]) {
184 DPRINTF(ExecRegDelta,
"%s [%5s] "\
185 "Native: %#010x => %#010x "\
187 vergence, regNames[
i],
188 nState.oldState[i], nState.newState[i],
191 DPRINTF(ExecRegDelta,
"%s [%5s] "\
192 "Native: %#010x => %#010x "\
193 "M5: %#010x => %#010x\n",
194 vergence, regNames[
i],
195 nState.oldState[i], nState.newState[i],
196 mState.oldState[i], mState.newState[i]);
212 bool pcError = (mState.newState[STATE_PC] !=
213 nState.newState[STATE_PC]);
214 if (stopOnPCError && pcError)
215 panic(
"Native trace detected an error in control flow!");
226 ArmNativeTraceParams::create()
#define panic(...)
This implements a cprintf based panic() function.
StaticInstPtr getMacroStaticInst() const
virtual TheISA::PCState pcState() const =0
virtual RegVal readIntReg(RegIndex reg_idx) const =0
virtual RegVal readCCReg(RegIndex reg_idx) const =0
ThreadContext is the external interface to all thread state for anything outside of the CPU...
virtual const VecRegContainer & readVecReg(const RegId ®) const =0
ThreadContext * getThread() const
constexpr unsigned MaxSveVecLenInDWords
VecRegT< VecElem, NumElems, true > as() const
View interposers.
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
const int NumVecV7ArchRegs
void traceInst(const StaticInstPtr &inst, bool ran)
virtual Addr nextInstAddr() const =0
void read(void *ptr, size_t size)
void update(NativeTrace *parent)
Register ID: describe an architectural register with its class and index.
virtual RegVal readMiscReg(RegIndex misc_reg)=0
void check(NativeTraceRecord *record)
StaticInstPtr getStaticInst() const