diff --git a/tests/manual/trk/adapter.cpp b/tests/manual/trk/adapter.cpp index 7880e9cfef012a039d9049162d2988c50327b750..9eaec584242d9dc3fbae0843f62deca7904769d8 100644 --- a/tests/manual/trk/adapter.cpp +++ b/tests/manual/trk/adapter.cpp @@ -39,7 +39,7 @@ #include <QtNetwork/QLocalServer> #include <QtNetwork/QLocalSocket> -#if USE_NATIVE +#ifdef Q_OS_WIN #include <windows.h> // Non-blocking replacement for win-api ReadFile function @@ -60,6 +60,25 @@ BOOL WINAPI TryReadFile(HANDLE hFile, lpNumberOfBytesRead, lpOverlapped); } + +// Format windows error from GetLastError() value. +QString winErrorMessage(unsigned long error) +{ + QString rc = QString::fromLatin1("#%1: ").arg(error); + ushort *lpMsgBuf; + + const int len = FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, error, 0, (LPTSTR)&lpMsgBuf, 0, NULL); + if (len) { + rc = QString::fromUtf16(lpMsgBuf, len); + LocalFree(lpMsgBuf); + } else { + rc += QString::fromLatin1("<unknown error>"); + } + return rc; +} + #endif #ifdef Q_OS_UNIX @@ -105,10 +124,11 @@ static inline void dumpRegister(int n, uint value, QByteArray &a) } struct AdapterOptions { - AdapterOptions() : verbose(1),registerEndianness(BigEndian) {} + AdapterOptions() : verbose(1),registerEndianness(BigEndian),useSocket(false) {} int verbose; Endianness registerEndianness; + bool useSocket; QString gdbServer; QString trkServer; }; @@ -126,6 +146,7 @@ public: void setTrkServerName(const QString &name) { m_trkServerName = name; } void setVerbose(int verbose) { m_verbose = verbose; } void setRegisterEndianness(Endianness r) { m_registerEndianness = r; } + void setUseSocket(bool s) { m_useSocket = s; } bool startServer(); private: @@ -147,7 +168,7 @@ private: bool invokeOnFailure; }; - bool openTrkPort(const QString &port); // or server name for local server + bool openTrkPort(const QString &port, QString *errorMessage); // or server name for local server void sendTrkMessage(byte code, TrkCallBack calBack = 0, const QByteArray &data = QByteArray(), @@ -193,11 +214,10 @@ private: void startInferiorIfNeeded(); void interruptInferior(); -#if USE_NATIVE - HANDLE m_hdevice; -#else - QLocalSocket *m_trkDevice; +#ifdef Q_OS_WIN + HANDLE m_winComDevice; #endif + QLocalSocket *m_socketDevice; QString m_trkServerName; QByteArray m_trkReadBuffer; @@ -234,42 +254,40 @@ private: Snapshot m_snapshot; // local-ish data (memory and registers) int m_verbose; Endianness m_registerEndianness; + bool m_useSocket; }; Adapter::Adapter() : - m_registerEndianness(BigEndian) -{ - // Trk -#if USE_NATIVE - m_hdevice = NULL; -#else - m_trkDevice = 0; +#ifdef Q_OS_WIN + m_winComDevice(NULL), #endif - m_trkWriteToken = 0; - m_trkWriteBusy = false; - //m_breakpoints.append(Breakpoint(0x0370)); - //m_breakpoints.append(Breakpoint(0x0340)); - //m_breakpoints.append(Breakpoint(0x0040)); // E32Main + m_socketDevice(0), + m_trkWriteToken(0), + m_trkWriteBusy(false), + m_gdbConnection(0), + m_gdbServerPort(0), + m_gdbAckMode(true), + m_verbose(1), + m_registerEndianness(BigEndian), + m_useSocket(false) +{ startTimer(100); - - // Gdb - m_gdbConnection = 0; - m_gdbAckMode = true; } Adapter::~Adapter() { // Trk -#if USE_NATIVE - CloseHandle(m_hdevice); -#else - m_trkDevice->abort(); - delete m_trkDevice; +#ifdef Q_OS_WIN + if (m_winComDevice) + CloseHandle(m_winComDevice); #endif + if (m_socketDevice) { + m_socketDevice->abort(); + delete m_socketDevice; + } // Gdb m_gdbServer.close(); - //>disconnectFromServer(); logMessage("Shutting down.\n", true); } @@ -287,8 +305,9 @@ void Adapter::setGdbServerName(const QString &name) bool Adapter::startServer() { - if (!openTrkPort(m_trkServerName)) { - logMessage("Unable to connect to TRK server " + m_trkServerName + " " +m_trkDevice->errorString(), true); + QString errorMessage; + if (!openTrkPort(m_trkServerName, &errorMessage)) { + logMessage(errorMessage, true); return false; } @@ -743,10 +762,18 @@ void Adapter::readFromTrk() //logMessage("Read from gdb: " + ba); } -bool Adapter::openTrkPort(const QString &port) +bool Adapter::openTrkPort(const QString &port, QString *errorMessage) { -#if USE_NATIVE - m_hdevice = CreateFile(port.toStdWString().c_str(), + if (m_useSocket) { + m_socketDevice = new QLocalSocket(this); + m_socketDevice->connectToServer(port); + const bool rc = m_socketDevice->waitForConnected(); + if (!rc) + *errorMessage = "Unable to connect to TRK server " + m_trkServerName + ' ' + m_socketDevice->errorString(); + return rc; + } +#ifdef Q_OS_WIN + m_winComDevice = CreateFile(port.toStdWString().c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, @@ -754,32 +781,31 @@ bool Adapter::openTrkPort(const QString &port) FILE_ATTRIBUTE_NORMAL, NULL); - if (INVALID_HANDLE_VALUE == m_hdevice){ - logMessage("Could not open device " + port); + if (INVALID_HANDLE_VALUE == m_winComDevice){ + *errorMessage = "Could not open device " + port + ' ' + winErrorMessage(GetLastError()); return false; } return true; #else + logMessage("Not implemented", true); + return false; +#endif + #if 0 - m_trkDevice = new Win_QextSerialPort(port); - m_trkDevice->setBaudRate(BAUD115200); - m_trkDevice->setDataBits(DATA_8); - m_trkDevice->setParity(PAR_NONE); - //m_trkDevice->setStopBits(STO); - m_trkDevice->setFlowControl(FLOW_OFF); - m_trkDevice->setTimeout(0, 500); - - if (!m_trkDevice->open(QIODevice::ReadWrite)) { - QByteArray ba = m_trkDevice->errorString().toLatin1(); + m_socketDevice = new Win_QextSerialPort(port); + m_socketDevice->setBaudRate(BAUD115200); + m_socketDevice->setDataBits(DATA_8); + m_socketDevice->setParity(PAR_NONE); + //m_socketDevice->setStopBits(STO); + m_socketDevice->setFlowControl(FLOW_OFF); + m_socketDevice->setTimeout(0, 500); + + if (!m_socketDevice->open(QIODevice::ReadWrite)) { + QByteArray ba = m_socketDevice->errorString().toLatin1(); logMessage("Could not open device " << ba); return false; } return true -#else - m_trkDevice = new QLocalSocket(this); - m_trkDevice->connectToServer(port); - return m_trkDevice->waitForConnected(); -#endif #endif } @@ -880,45 +906,43 @@ void Adapter::trkWrite(const TrkMessage &msg) if (m_verbose > 1) logMessage("WRITE: " + stringFromArray(ba)); -#if USE_NATIVE - DWORD charsWritten; - if (!WriteFile(m_hdevice, ba.data(), ba.size(), &charsWritten, NULL)) - logMessage("WRITE ERROR: "); - - FlushFileBuffers(m_hdevice); -#else - if (!m_trkDevice->write(ba)) - logMessage("WRITE ERROR: " + m_trkDevice->errorString()); - m_trkDevice->flush(); - + if (m_useSocket) { + if (!m_socketDevice->write(ba)) + logMessage("WRITE ERROR: " + m_socketDevice->errorString()); + m_socketDevice->flush(); + } else { +#ifdef Q_OS_WIN + DWORD charsWritten; + if (!WriteFile(m_winComDevice, ba.data(), ba.size(), &charsWritten, NULL)) + logMessage("WRITE ERROR: " + winErrorMessage(GetLastError())); + FlushFileBuffers(m_winComDevice); #endif + } } void Adapter::tryTrkRead() { - //logMessage("TRY READ: " << m_trkDevice->bytesAvailable() + //logMessage("TRY READ: " << m_socketDevice->bytesAvailable() // << stringFromArray(m_trkReadQueue); + if (m_useSocket) { + if (m_socketDevice->bytesAvailable() == 0 && m_trkReadQueue.isEmpty()) + return; -#if USE_NATIVE - const DWORD BUFFERSIZE = 1024; - char buffer[BUFFERSIZE]; - DWORD charsRead; - - while (TryReadFile(m_hdevice, buffer, BUFFERSIZE, &charsRead, NULL)) { - m_trkReadQueue.append(buffer, charsRead); - if (isValidTrkResult(m_trkReadQueue)) - break; - } -#else // USE_NATIVE - - if (m_trkDevice->bytesAvailable() == 0 && m_trkReadQueue.isEmpty()) - return; - - QByteArray res = m_trkDevice->readAll(); - m_trkReadQueue.append(res); - - + QByteArray res = m_socketDevice->readAll(); + m_trkReadQueue.append(res); + } else { +#ifdef Q_OS_WIN + const DWORD BUFFERSIZE = 1024; + char buffer[BUFFERSIZE]; + DWORD charsRead; + + while (TryReadFile(m_winComDevice, buffer, BUFFERSIZE, &charsRead, NULL)) { + m_trkReadQueue.append(buffer, charsRead); + if (isValidTrkResult(m_trkReadQueue)) + break; + } #endif // USE_NATIVE + } if (m_trkReadQueue.size() < 9) { logMessage("ERROR READBUFFER INVALID (1): " @@ -1469,6 +1493,8 @@ static bool readAdapterArgs(const QStringList &args, AdapterOptions *o) o->verbose = 0; } else if (*it == QLatin1String("-l")) { o->registerEndianness = LittleEndian; + } else if (*it == QLatin1String("-s")) { + o->useSocket = true; } } else { switch (argNumber++) { @@ -1494,9 +1520,10 @@ int main(int argc, char *argv[]) AdapterOptions options; if (!readAdapterArgs(app.arguments(), &options)) { - qDebug("Usage: %s [-v|-q] [-l] <trkservername> <gdbserverport>\n" + qDebug("Usage: %s [-v|-q] [-s][-l] <trk com/trkservername> <gdbserverport>\n" "Options: -v verbose\n" " -q quiet\n" + " -s Use socket (simulation)\n" " -l Set register endianness to little\n", argv[0]); return 1; } @@ -1506,6 +1533,7 @@ int main(int argc, char *argv[]) adapter.setGdbServerName(options.gdbServer); adapter.setVerbose(options.verbose); adapter.setRegisterEndianness(options.registerEndianness); + adapter.setUseSocket(options.useSocket); if (adapter.startServer()) return app.exec(); return 4; diff --git a/tests/manual/trk/adapter.pro b/tests/manual/trk/adapter.pro index 9a773f6c432aa2acbc90f595f6f8c85002b82042..48ebd9bec67aefddfd82f670d3769b3b59733b00 100644 --- a/tests/manual/trk/adapter.pro +++ b/tests/manual/trk/adapter.pro @@ -2,6 +2,7 @@ TEMPLATE = app QT = core network +win32:CONFIG+=console HEADERS += trkutils.h diff --git a/tests/manual/trk/run.sh b/tests/manual/trk/run.sh index 3201dab858e0778d4f144c21d7fab1196dae7634..d12107195ca53ba82a5c0a0c12e88d4fd41d00cb 100755 --- a/tests/manual/trk/run.sh +++ b/tests/manual/trk/run.sh @@ -1,6 +1,6 @@ #!/bin/sh -ADAPTER_OPTIONS="" +ADAPTER_OPTIONS="-s" TRKSERVEROPTIONS="" DUMP_POSTFIX='-BigEndian.bin' ENDIANESS='big'