49 #include "debug/ExecRegDelta.hh"
50 #include "params/ArmNativeTrace.hh"
56 using namespace ArmISA;
60 [[maybe_unused]]
static const char *
regNames[] = {
61 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
62 "r8",
"r9",
"r10",
"fp",
"r12",
"sp",
"lr",
"pc",
63 "cpsr",
"f0",
"f1",
"f2",
"f3",
"f4",
"f5",
"f6",
64 "f7",
"f8",
"f9",
"f10",
"f11",
"f12",
"f13",
"f14",
65 "f15",
"f16",
"f17",
"f18",
"f19",
"f20",
"f21",
"f22",
66 "f23",
"f24",
"f25",
"f26",
"f27",
"f28",
"f29",
"f30",
73 oldState =
state[current];
74 current = (current + 1) % 2;
75 newState =
state[current];
77 memcpy(newState, oldState,
sizeof(
state[0]));
80 parent->
read(&diffVector,
sizeof(diffVector));
81 diffVector =
letoh(diffVector);
84 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
85 if (diffVector & 0x1) {
94 uint64_t values[changes];
95 parent->
read(values,
sizeof(values));
97 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
99 newState[
i] =
letoh(values[pos++]);
100 changed[
i] = (newState[
i] != oldState[
i]);
108 oldState =
state[current];
109 current = (current + 1) % 2;
110 newState =
state[current];
113 for (
int i = 0;
i < 15;
i++) {
115 changed[
i] = (oldState[
i] != newState[
i]);
120 changed[STATE_PC] = (newState[STATE_PC] != oldState[STATE_PC]);
129 newState[STATE_CPSR] = cpsr;
130 changed[STATE_CPSR] = (newState[STATE_CPSR] != oldState[STATE_CPSR]);
135 auto *
vec = vec_container.
as<uint64_t>();
136 newState[STATE_F0 + 2*
i] =
vec[0];
137 newState[STATE_F0 + 2*
i + 1] =
vec[1];
155 if ((mState.oldState[STATE_PC] == nState.oldState[STATE_PC]) &&
156 (mState.newState[STATE_PC] - 4 == nState.newState[STATE_PC])) {
157 DPRINTF(ExecRegDelta,
"Advancing to match PCs after syscall\n");
162 bool errorFound =
false;
164 for (
int i = 0;
i < STATE_NUMVALS;
i++) {
165 if (nState.changed[
i] || mState.changed[
i]) {
166 bool oldMatch = (mState.oldState[
i] == nState.oldState[
i]);
167 bool newMatch = (mState.newState[
i] == nState.newState[
i]);
168 if (oldMatch && newMatch) {
176 const char *vergence =
" ";
177 if (oldMatch && !newMatch) {
179 }
else if (!oldMatch && newMatch) {
183 if (!nState.changed[
i]) {
184 DPRINTF(ExecRegDelta,
"%s [%5s] "\
186 "M5: %#010x => %#010x\n",
189 mState.oldState[
i], mState.newState[
i]);
190 }
else if (!mState.changed[
i]) {
191 DPRINTF(ExecRegDelta,
"%s [%5s] "\
192 "Native: %#010x => %#010x "\
195 nState.oldState[
i], nState.newState[
i],
198 DPRINTF(ExecRegDelta,
"%s [%5s] "\
199 "Native: %#010x => %#010x "\
200 "M5: %#010x => %#010x\n",
202 nState.oldState[
i], nState.newState[
i],
203 mState.oldState[
i], mState.newState[
i]);
219 bool pcError = (mState.newState[STATE_PC] !=
220 nState.newState[STATE_PC]);
221 if (stopOnPCError && pcError)
222 panic(
"Native trace detected an error in control flow!");