From a1ea6f5f1f864c8d0e641de3420a5c30662a959c Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 8 Sep 2009 12:49:03 +0200
Subject: [PATCH] trk: refactoring

---
 tests/manual/trk/runner.cpp   | 54 +++++++++++++++++++----------------
 tests/manual/trk/trkutils.cpp | 16 +++++++++++
 tests/manual/trk/trkutils.h   |  2 ++
 3 files changed, 47 insertions(+), 25 deletions(-)

diff --git a/tests/manual/trk/runner.cpp b/tests/manual/trk/runner.cpp
index f73f8409363..a0bcef7f302 100755
--- a/tests/manual/trk/runner.cpp
+++ b/tests/manual/trk/runner.cpp
@@ -108,7 +108,7 @@ static QByteArray dumpRegister(int n, uint value)
         ba += '#';
         ba += QByteArray::number(n);
     }
-    ba += "=0x" + hexNumber(value);
+    ba += "=" + hexxNumber(value);
     return ba;
 }
 
@@ -856,22 +856,19 @@ void Adapter::handleGdbServerCommand(const QByteArray &cmd)
     }
 
     else if (cmd == "s" || cmd.startsWith("vCont;s")) {
-        static int used = 0;
-        if (!used) {
-        ++used;
         logMessage(msgGdbPacket(QLatin1String("Step range")));
+        logMessage("  from " + hexxNumber(m_snapshot.registers[RegisterPC]));
         sendGdbServerAck();
         m_running = true;
         QByteArray ba;
-        appendByte(&ba, 0); // options
+        appendByte(&ba, 1); // options
         appendInt(&ba, m_snapshot.registers[RegisterPC]); // start address
-        appendInt(&ba, m_snapshot.registers[RegisterPC] + 8); // end address
+        appendInt(&ba, m_snapshot.registers[RegisterPC] + 4); // end address
         appendInt(&ba, m_session.pid);
         appendInt(&ba, m_session.tid);
         sendTrkMessage(0x19, TrkCB(handleStepRange), ba, "Step range");
         // FIXME: should be triggered by "real" stop"
         //sendGdbServerMessageAfterTrkResponse("S05", "target halted");
-        }
     }
 
     else if (cmd == "vCont?") {
@@ -977,7 +974,8 @@ void Adapter::executeCommand(const QString &msg)
     } else if (msg == "C") {
         sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
     } else if (msg == "R") {
-        sendTrkMessage(0x18, TrkCallback(), trkReadRegisterMessage(), "READ REGS");
+        sendTrkMessage(0x18, TrkCB(handleReadRegisters),
+            trkReadRegisterMessage(), "READ REGS");
     } else if (msg == "I") {
         interruptInferior();
     } else {
@@ -1095,8 +1093,8 @@ void Adapter::handleTrkResult(const TrkResult &result)
             if (error)
                 str << " ERROR: " << int(error);
             str << " TYPE: " << int(type) << " PID: " << pid << " TID:   " <<  tid;
-            str << " CODE: 0x" << hexNumber(codeseg);
-            str << " DATA: 0x" << hexNumber(dataseg);
+            str << " CODE: " << hexxNumber(codeseg);
+            str << " DATA: " << hexxNumber(dataseg);
             str << " NAME: '" << name << '\'';
             logMessage(logMsg);
             // This lets gdb trigger a register update etc
@@ -1198,7 +1196,7 @@ void Adapter::handleSetTrkBreakpoint(const TrkResult &result)
     // [80 09 00 00 00 00 0A]
     const uint bpnr = extractInt(result.data.data());
     if (m_verbose)
-        logMessage("SET BREAKPOINT 0x" + hexNumber(bpnr)
+        logMessage("SET BREAKPOINT " + hexxNumber(bpnr)
             + stringFromArray(result.data.data()));
 }
 
@@ -1213,10 +1211,10 @@ void Adapter::handleCreateProcess(const TrkResult &result)
     m_session.codeseg = extractInt(data + 9);
     m_session.dataseg = extractInt(data + 13);
 
-    logMessage("PID: 0x" + hexNumber(m_session.pid));
-    logMessage("TID: 0x" + hexNumber(m_session.tid));
-    logMessage("COD: 0x" + hexNumber(m_session.codeseg));
-    logMessage("DAT: 0x" + hexNumber(m_session.dataseg));
+    logMessage("PID: " + hexxNumber(m_session.pid));
+    logMessage("TID: " + hexxNumber(m_session.tid));
+    logMessage("COD: " + hexxNumber(m_session.codeseg));
+    logMessage("DAT: " + hexxNumber(m_session.dataseg));
 
     QByteArray ba;
     appendInt(&ba, m_session.pid);
@@ -1263,7 +1261,10 @@ void Adapter::handleReadRegisters(const TrkResult &result)
     logMessage("       RESULT: " + result.toString());
     // [80 0B 00   00 00 00 00   C9 24 FF BC   00 00 00 00   00
     //  60 00 00   00 00 00 00   78 67 79 70   00 00 00 00   00...]
-
+    if (result.errorCode()) {
+        logMessage("ERROR: " + result.errorString());
+        return;
+    }
     const char *data = result.data.data() + 1; // Skip ok byte
     for (int i = 0; i < RegisterCount; ++i)
         m_snapshot.registers[i] = extractInt(data + 4 * i);
@@ -1313,8 +1314,7 @@ QByteArray Adapter::memoryReadLogMessage(uint addr, uint len, const QByteArray &
 {
     QByteArray logMsg = "memory contents";
     if (m_verbose > 1) {
-        logMsg += " addr: 0x";
-        logMsg += QByteArray::number(addr, 16);
+        logMsg += " addr: " + hexxNumber(addr);
         // indicate dereferencing of registers
         if (len == 4) {
             if (addr == m_snapshot.registers[RegisterPC]) {
@@ -1387,9 +1387,12 @@ void Adapter::handleReadMemoryUnbuffered(const TrkResult &result)
 
 void Adapter::handleStepRange(const TrkResult &result)
 {
-    // [80 0f 12]
-    //uint bpnr = extractInt(result.data.data());
-    logMessage("STEPPING FINISHED " + stringFromArray(result.data.data()));
+    // [80 0f 00]
+    if (result.errorCode()) {
+        logMessage("ERROR: " + result.errorString());
+        return;
+    }
+    logMessage("STEPPING FINISHED ");
     //sendGdbServerMessage("S05", "Stepping finished");
 }
 
@@ -1400,7 +1403,7 @@ void Adapter::handleAndReportSetBreakpoint(const TrkResult &result)
     //    Error: 0x00
     // [80 09 00 00 00 00 0A]
     uint bpnr = extractByte(result.data.data());
-    logMessage("SET BREAKPOINT 0x" + hexNumber(bpnr) + " "
+    logMessage("SET BREAKPOINT " + hexxNumber(bpnr) + " "
          + stringFromArray(result.data.data()));
     sendGdbServerMessage("OK");
 }
@@ -1656,6 +1659,7 @@ void Adapter::startGdb()
     sendGdbMessage("set endian little");
     sendGdbMessage("set remotebreak on");
     sendGdbMessage("set breakpoint pending on");
+    sendGdbMessage("set trust-readonly-sections on");
 
     // FIXME: "remote noack" does not seem to be supported on cs-gdb?
     //sendGdbMessage("set remote noack-packet");
@@ -1677,8 +1681,8 @@ void Adapter::startGdb()
     //sendGdbMessage("info files");
     //sendGdbMessage("file filebrowseapp.sym -readnow");
 
-    sendGdbMessage("add-symbol-file filebrowseapp.sym 0x"
-        + hexNumber(m_session.codeseg));
+    sendGdbMessage("add-symbol-file filebrowseapp.sym "
+        + hexxNumber(m_session.codeseg));
     sendGdbMessage("symbol-file filebrowseapp.sym");
 
     // -symbol-info-address not implemented in cs-gdb 6.4-6.8 (at least)
@@ -1772,7 +1776,7 @@ void Adapter::handleSetTrkMainBreakpoint(const TrkResult &result)
     //---TRK------------------------------------------------------
     // [80 09 00 00 00 00 0A]
     const uint bpnr = extractInt(result.data.data());
-    logMessage("SET MAIN BREAKPOINT 0x" + hexNumber(bpnr)
+    logMessage("SET MAIN BREAKPOINT " + hexxNumber(bpnr)
         + stringFromArray(result.data.data()));
 
     // 'continue after initial break'
diff --git a/tests/manual/trk/trkutils.cpp b/tests/manual/trk/trkutils.cpp
index 81925c07d67..4036b2ad656 100644
--- a/tests/manual/trk/trkutils.cpp
+++ b/tests/manual/trk/trkutils.cpp
@@ -43,6 +43,11 @@ QByteArray hexNumber(uint n, int digits)
     return QByteArray(digits - ba.size(), '0') + ba;
 }
 
+QByteArray hexxNumber(uint n, int digits)
+{
+    return "0x" + hexNumber(n, digits);
+}
+
 TrkResult::TrkResult() :
     code(0),
     token(0),
@@ -345,5 +350,16 @@ int TrkResult::errorCode() const
         return errorCode;
     return isNAK ? 0xff : 0;
 }
+
+QString TrkResult::errorString() const
+{
+    // NAK means always error, else data sized 1 with a non-null element
+    if (code == 0xff)
+        return "NAK";
+    if (data.size() < 1)
+        return "Unknown error packet";
+    return errorMessage(data.at(0));
+}
+
 } // namespace trk
 
diff --git a/tests/manual/trk/trkutils.h b/tests/manual/trk/trkutils.h
index 6bc05db157d..3ed06e3ca4a 100644
--- a/tests/manual/trk/trkutils.h
+++ b/tests/manual/trk/trkutils.h
@@ -178,6 +178,7 @@ struct TrkResult
     QString toString() const;
     // 0 for no error.
     int errorCode() const;
+    QString errorString() const;
 
     byte code;
     byte token;
@@ -193,6 +194,7 @@ ushort isValidTrkResult(const QByteArray &buffer, bool serialFrame);
 bool extractResult(QByteArray *buffer, bool serialFrame, TrkResult *r, QByteArray *rawData = 0);
 QByteArray errorMessage(byte code);
 QByteArray hexNumber(uint n, int digits = 0);
+QByteArray hexxNumber(uint n, int digits = 0); // prepends '0x', too
 uint swapEndian(uint in);
 
 
-- 
GitLab