diff --git a/tests/manual/trk/adapter.cpp b/tests/manual/trk/adapter.cpp index 306f91737cd4b64122463ed80a5a9fd7efb04fa9..8e2b447e8a9d4c5b0f2f52c8042a3a7bc3bd27bd 100644 --- a/tests/manual/trk/adapter.cpp +++ b/tests/manual/trk/adapter.cpp @@ -81,12 +81,14 @@ static inline void dumpRegister(int n, uint value, QByteArray &a) } struct AdapterOptions { - AdapterOptions() : verbose(1),serialFrame(true),registerEndianness(LittleEndian),useSocket(false) {} + AdapterOptions() : verbose(1),serialFrame(true),registerEndianness(LittleEndian), + useSocket(false), bufferedMemoryRead(true) {} int verbose; bool serialFrame; Endianness registerEndianness; bool useSocket; + bool bufferedMemoryRead; QString gdbServer; QString trkServer; }; @@ -106,6 +108,7 @@ public: void setSerialFrame(bool b) { m_serialFrame = b; } void setRegisterEndianness(Endianness r) { m_registerEndianness = r; } void setUseSocket(bool s) { m_useSocket = s; } + void setBufferedMemoryRead(bool b) { qDebug() << "Buffered=" << b; m_bufferedMemoryRead = b; } bool startServer(); private slots: @@ -146,8 +149,9 @@ private: void handleAndReportReadRegisters(const TrkResult &result); QByteArray memoryReadLogMessage(uint addr, uint len, const QByteArray &ba) const; void handleAndReportSetBreakpoint(const TrkResult &result); - void handleReadMemory(const TrkResult &result); - void reportReadMemory(const TrkResult &result); + void handleReadMemoryBuffered(const TrkResult &result); + void handleReadMemoryUnbuffered(const TrkResult &result); + void reportReadMemoryBuffered(const TrkResult &result); void reportToGdb(const TrkResult &result); void clearTrkBreakpoint(const Breakpoint &bp); @@ -192,6 +196,7 @@ private: bool m_useSocket; bool m_serialFrame; bool m_startInferiorTriggered; + bool m_bufferedMemoryRead; }; Adapter::Adapter() : @@ -202,7 +207,8 @@ Adapter::Adapter() : m_registerEndianness(LittleEndian), m_useSocket(false), m_serialFrame(true), - m_startInferiorTriggered(false) + m_startInferiorTriggered(false), + m_bufferedMemoryRead(true) { } @@ -1073,20 +1079,21 @@ void Adapter::handleAndReportReadRegisters(const TrkResult &result) sendGdbMessage(ba, logMsg); } -static inline QString msgMemoryReadError(int code, uint addr) +static inline QString msgMemoryReadError(int code, uint addr, uint len = 0) { - return QString::fromLatin1("Memory read error %1 at: 0x%2").arg(code).arg(addr, 0 ,16); + const QString lenS = len ? QString::number(len) : QLatin1String("<unknown>"); + return QString::fromLatin1("Memory read error %1 at: 0x%2 %3").arg(code).arg(addr, 0 ,16).arg(lenS); } -void Adapter::handleReadMemory(const TrkResult &result) +void Adapter::handleReadMemoryBuffered(const TrkResult &result) { - const uint blockaddr = result.cookie.toInt(); + const uint blockaddr = result.cookie.toUInt(); if (const int errorCode = result.errorCode()) { logMessage(msgMemoryReadError(errorCode, blockaddr)); - } else { - const QByteArray ba = result.data.mid(1); - m_snapshot.memory.insert(blockaddr , ba); + return; } + const QByteArray ba = result.data.mid(1); + m_snapshot.memory.insert(blockaddr , ba); } // Format log message for memory access with some smartness about registers @@ -1120,9 +1127,9 @@ QByteArray Adapter::memoryReadLogMessage(uint addr, uint len, const QByteArray & return logMsg; } -void Adapter::reportReadMemory(const TrkResult &result) +void Adapter::reportReadMemoryBuffered(const TrkResult &result) { - const qulonglong cookie = result.cookie.toLongLong(); + const qulonglong cookie = result.cookie.toULongLong(); const uint addr = cookie >> 32; const uint len = uint(cookie); @@ -1141,14 +1148,27 @@ void Adapter::reportReadMemory(const TrkResult &result) ba.remove(0, previousChunkOverlap); if (ba.size() > int(len)) ba.truncate(len); + if (ba.isEmpty()) { ba = "E20"; - sendGdbMessage(ba, msgMemoryReadError(32, addr).toLatin1()); + sendGdbMessage(ba, msgMemoryReadError(32, addr, len).toLatin1()); } else { sendGdbMessage(ba.toHex(), memoryReadLogMessage(addr, len, ba)); } } +void Adapter::handleReadMemoryUnbuffered(const TrkResult &result) +{ + const uint blockaddr = result.cookie.toUInt(); + if (const int errorCode = result.errorCode()) { + const QByteArray ba = "E20"; + sendGdbMessage(ba, msgMemoryReadError(32, blockaddr).toLatin1()); + } else { + const QByteArray ba = result.data.mid(1); + sendGdbMessage(ba.toHex(), memoryReadLogMessage(blockaddr, ba.size(), ba)); + } +} + void Adapter::handleAndReportSetBreakpoint(const TrkResult &result) { //---TRK------------------------------------------------------ @@ -1291,6 +1311,17 @@ void Adapter::cleanUp() // Error: 0x00 } +static inline QByteArray memoryRequestTrkMessage(uint addr, uint len, int pid, int tid) +{ + QByteArray ba; + appendByte(&ba, 0x08); // Options, FIXME: why? + appendShort(&ba, len); + appendInt(&ba, addr); + appendInt(&ba, pid); + appendInt(&ba, tid); + return ba; +} + void Adapter::readMemory(uint addr, uint len) { Q_ASSERT(len < (2 << 16)); @@ -1299,24 +1330,26 @@ void Adapter::readMemory(uint addr, uint len) if (m_verbose > 2) logMessage(QString::fromLatin1("readMemory %1 bytes from 0x%2 blocksize=%3").arg(len).arg(addr, 0, 16).arg(MemoryChunkSize)); - uint blockaddr = (addr / MemoryChunkSize) * MemoryChunkSize; - for (; blockaddr < addr + len; blockaddr += MemoryChunkSize) { - if (!m_snapshot.memory.contains(blockaddr)) { - if (m_verbose > 2) - logMessage(QString::fromLatin1("Requesting memory from 0x%1").arg(blockaddr, 0, 16)); - // fetch it - QByteArray ba; - appendByte(&ba, 0x08); // Options, FIXME: why? - appendShort(&ba, MemoryChunkSize); - appendInt(&ba, blockaddr); - appendInt(&ba, m_session.pid); - appendInt(&ba, m_session.tid); - // Read Memory - sendTrkMessage(0x10, Callback(this, &Adapter::handleReadMemory), ba, QVariant(blockaddr), true); + if (m_bufferedMemoryRead) { + uint blockaddr = (addr / MemoryChunkSize) * MemoryChunkSize; + for (; blockaddr < addr + len; blockaddr += MemoryChunkSize) { + if (!m_snapshot.memory.contains(blockaddr)) { + if (m_verbose) + logMessage(QString::fromLatin1("Requesting buffered memory %1 bytes from 0x%2").arg(MemoryChunkSize).arg(blockaddr, 0, 16)); + sendTrkMessage(0x10, Callback(this, &Adapter::handleReadMemoryBuffered), + memoryRequestTrkMessage(blockaddr, MemoryChunkSize, m_session.pid, m_session.tid), + QVariant(blockaddr), true); + } } + const qulonglong cookie = (qulonglong(addr) << 32) + len; + sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, Callback(this, &Adapter::reportReadMemoryBuffered), QByteArray(), cookie); + } else { + if (m_verbose) + logMessage(QString::fromLatin1("Requesting unbuffered memory %1 bytes from 0x%2").arg(len).arg(addr, 0, 16)); + sendTrkMessage(0x10, Callback(this, &Adapter::handleReadMemoryUnbuffered), + memoryRequestTrkMessage(addr, len, m_session.pid, m_session.tid), + QVariant(addr), true); } - qulonglong cookie = (qulonglong(addr) << 32) + len; - sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, Callback(this, &Adapter::reportReadMemory), QByteArray(), cookie); } void Adapter::startInferiorIfNeeded() @@ -1366,6 +1399,10 @@ static bool readAdapterArgs(const QStringList &args, AdapterOptions *o) o->useSocket = true; } else if (*it == QLatin1String("-f")) { o->serialFrame = false; + } else if (*it == QLatin1String("-u")) { + o->bufferedMemoryRead = false; + } else { + return false; } } else { switch (argNumber++) { @@ -1391,9 +1428,10 @@ int main(int argc, char *argv[]) AdapterOptions options; if (!readAdapterArgs(app.arguments(), &options)) { - qDebug("Usage: %s [-v|-q] [-s][-l] <trk com/trkservername> <gdbserverport>\n" + qDebug("Usage: %s [-v|-q] [-b][-s][-l][-u] <trk com/trkservername> <gdbserverport>\n" "Options: -v verbose\n" " -f Turn serial message frame off\n" + " -u Turn buffered memory read off\n" " -q quiet\n" " -s Use socket (simulation)\n" " -b Set register endianness to big\n", argv[0]); @@ -1404,6 +1442,7 @@ int main(int argc, char *argv[]) adapter.setTrkServerName(options.trkServer); adapter.setGdbServerName(options.gdbServer); adapter.setVerbose(options.verbose); + adapter.setBufferedMemoryRead(options.bufferedMemoryRead); adapter.setRegisterEndianness(options.registerEndianness); adapter.setUseSocket(options.useSocket); adapter.setSerialFrame(options.serialFrame); diff --git a/tests/manual/trk/run.pl b/tests/manual/trk/run.pl index 9f4e31097c6d55aa38a884f23fb31e4a8511f069..d38697866fbb78dafe57c179ec6c3f462ff02c59 100755 --- a/tests/manual/trk/run.pl +++ b/tests/manual/trk/run.pl @@ -17,10 +17,11 @@ my $trkservername; my $runTrkServer = 1; my $usage=<<EOF; -Usage: run.pl -av -aq -tv -tq -l [COM] +Usage: run.pl -av -aq -au -tv -tq -l [COM] Options: -av Adapter verbose -aq Adapter quiet + -au Adapter turn off buffered memory read -af Adapter turn off serial frame -tv TrkServer verbose -tq TrkServer quiet @@ -43,6 +44,8 @@ for (my $i = 0; $i < $argCount; $i++) { push(@ADAPTER_OPTIONS, '-q'); } elsif ($a eq '-af') { push(@ADAPTER_OPTIONS, '-f'); + } elsif ($a eq '-au') { + push(@ADAPTER_OPTIONS, '-u'); } elsif ($a eq '-tv') { push(@TRKSERVEROPTIONS, '-v'); } elsif ($a eq '-tq') {