47 #include "debug/ExecRegDelta.hh"
48 #include "params/ArmNativeTrace.hh"
54 using namespace ArmISA;
58 GEM5_VAR_USED
static const char *
regNames[] = {
59 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
60 "r8",
"r9",
"r10",
"fp",
"r12",
"sp",
"lr",
"pc",
61 "cpsr",
"f0",
"f1",
"f2",
"f3",
"f4",
"f5",
"f6",
62 "f7",
"f8",
"f9",
"f10",
"f11",
"f12",
"f13",
"f14",
63 "f15",
"f16",
"f17",
"f18",
"f19",
"f20",
"f21",
"f22",
64 "f23",
"f24",
"f25",
"f26",
"f27",
"f28",
"f29",
"f30",
71 oldState = state[current];
72 current = (current + 1) % 2;
73 newState = state[current];
75 memcpy(newState, oldState,
sizeof(state[0]));
78 parent->
read(&diffVector,
sizeof(diffVector));
79 diffVector =
letoh(diffVector);
82 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
83 if (diffVector & 0x1) {
92 uint64_t values[changes];
93 parent->
read(values,
sizeof(values));
95 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
97 newState[
i] =
letoh(values[pos++]);
98 changed[
i] = (newState[
i] != oldState[
i]);
106 oldState = state[current];
107 current = (current + 1) % 2;
108 newState = state[current];
111 for (
int i = 0;
i < 15;
i++) {
113 changed[
i] = (oldState[
i] != newState[
i]);
117 newState[STATE_PC] = tc->
pcState().npc();
118 changed[STATE_PC] = (newState[STATE_PC] != oldState[STATE_PC]);
127 newState[STATE_CPSR] = cpsr;
128 changed[STATE_CPSR] = (newState[STATE_CPSR] != oldState[STATE_CPSR]);
132 newState[STATE_F0 + 2*
i] =
vec[0];
133 newState[STATE_F0 + 2*
i + 1] =
vec[1];
151 if ((mState.oldState[STATE_PC] == nState.oldState[STATE_PC]) &&
152 (mState.newState[STATE_PC] - 4 == nState.newState[STATE_PC])) {
153 DPRINTF(ExecRegDelta,
"Advancing to match PCs after syscall\n");
158 bool errorFound =
false;
160 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
161 if (nState.changed[
i] || mState.changed[
i]) {
162 bool oldMatch = (mState.oldState[
i] == nState.oldState[
i]);
163 bool newMatch = (mState.newState[
i] == nState.newState[
i]);
164 if (oldMatch && newMatch) {
172 const char *vergence =
" ";
173 if (oldMatch && !newMatch) {
175 }
else if (!oldMatch && newMatch) {
179 if (!nState.changed[
i]) {
180 DPRINTF(ExecRegDelta,
"%s [%5s] "\
182 "M5: %#010x => %#010x\n",
185 mState.oldState[
i], mState.newState[
i]);
186 }
else if (!mState.changed[
i]) {
187 DPRINTF(ExecRegDelta,
"%s [%5s] "\
188 "Native: %#010x => %#010x "\
191 nState.oldState[
i], nState.newState[
i],
194 DPRINTF(ExecRegDelta,
"%s [%5s] "\
195 "Native: %#010x => %#010x "\
196 "M5: %#010x => %#010x\n",
198 nState.oldState[
i], nState.newState[
i],
199 mState.oldState[
i], mState.newState[
i]);
215 bool pcError = (mState.newState[STATE_PC] !=
216 nState.newState[STATE_PC]);
217 if (stopOnPCError && pcError)
218 panic(
"Native trace detected an error in control flow!");