changeset cf69f61d8f24 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=cf69f61d8f24
description:
ARM: Only send information that changed between statetrace and M5.
diffstat:
3 files changed, 46 insertions(+), 15 deletions(-)
src/arch/arm/nativetrace.cc | 27 ++++++++++++++++++++++++---
util/statetrace/arch/tracechild_arm.cc | 29 ++++++++++++++++++++++-------
util/statetrace/tracechild.cc | 5 -----
diffs (102 lines):
diff -r 362e27c08d96 -r cf69f61d8f24 src/arch/arm/nativetrace.cc
--- a/src/arch/arm/nativetrace.cc Mon Jul 27 00:54:24 2009 -0700
+++ b/src/arch/arm/nativetrace.cc Mon Jul 27 00:54:30 2009 -0700
@@ -51,10 +51,31 @@
current = (current + 1) % 2;
newState = state[current];
- parent->read(newState, sizeof(newState[0]) * STATE_NUMVALS);
+ memcpy(newState, oldState, sizeof(state[0]));
+
+ uint32_t diffVector;
+ parent->read(&diffVector, sizeof(diffVector));
+ diffVector = ArmISA::gtoh(diffVector);
+
+ int changes = 0;
for (int i = 0; i < STATE_NUMVALS; i++) {
- newState[i] = ArmISA::gtoh(newState[i]);
- changed[i] = (oldState[i] != newState[i]);
+ if (diffVector & 0x1) {
+ changed[i] = true;
+ changes++;
+ } else {
+ changed[i] = false;
+ }
+ diffVector >>= 1;
+ }
+
+ uint32_t values[changes];
+ parent->read(values, sizeof(values));
+ int pos = 0;
+ for (int i = 0; i < STATE_NUMVALS; i++) {
+ if (changed[i]) {
+ newState[i] = ArmISA::gtoh(values[pos++]);
+ changed[i] = (newState[i] != oldState[i]);
+ }
}
}
diff -r 362e27c08d96 -r cf69f61d8f24 util/statetrace/arch/tracechild_arm.cc
--- a/util/statetrace/arch/tracechild_arm.cc Mon Jul 27 00:54:24 2009 -0700
+++ b/util/statetrace/arch/tracechild_arm.cc Mon Jul 27 00:54:30 2009 -0700
@@ -46,23 +46,38 @@
ARMTraceChild::ARMTraceChild()
{
- for (int x = 0; x < numregs; x++)
+ for (int x = 0; x < numregs; x++) {
+ memset(®s, 0, sizeof(regs));
+ memset(&oldregs, 0, sizeof(regs));
regDiffSinceUpdate[x] = false;
+ }
}
bool ARMTraceChild::sendState(int socket)
{
uint32_t regVal = 0;
- for(int x = 0; x < numregs; x++)
- {
- regVal = getRegVal(x);
- if(write(socket, ®Val, sizeof(regVal)) == -1)
- {
+ uint32_t message[numregs + 1];
+ int pos = 1;
+ message[0] = 0;
+ for (int x = 0; x < numregs; x++) {
+ if (regDiffSinceUpdate[x]) {
+ message[0] = message[0] | (1 << x);
+ message[pos++] = getRegVal(x);
+ }
+ }
+
+ size_t sent = 0;
+ size_t toSend = pos * sizeof(message[0]);
+ uint8_t *messagePtr = (uint8_t *)message;
+ while (toSend != 0) {
+ sent = write(socket, messagePtr, toSend);
+ if (sent == -1) {
cerr << "Write failed! " << strerror(errno) << endl;
tracing = false;
return false;
}
-
+ toSend -= sent;
+ messagePtr += sent;
}
return true;
diff -r 362e27c08d96 -r cf69f61d8f24 util/statetrace/tracechild.cc
--- a/util/statetrace/tracechild.cc Mon Jul 27 00:54:24 2009 -0700
+++ b/util/statetrace/tracechild.cc Mon Jul 27 00:54:30 2009 -0700
@@ -79,11 +79,6 @@
return false;
}
tracing = true;
- if(!update(pid))
- {
- cout << "Didn't update successfully!" << endl;
- return false;
- }
return true;
}
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev