| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | /**************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Contact: Nokia Corporation (qt-info@nokia.com) | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Commercial Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Licensees holding valid Qt Commercial licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the Qt Commercial License Agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and Nokia. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
					
						
							|  |  |  | ** General Public License version 2.1 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation and appearing in the file LICENSE.LGPL included in the | 
					
						
							|  |  |  | ** packaging of this file.  Please review the following information to | 
					
						
							|  |  |  | ** ensure the GNU Lesser General Public License version 2.1 requirements | 
					
						
							|  |  |  | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** If you are unsure which license is appropriate for your use, please | 
					
						
							|  |  |  | ** contact the sales department at http://www.qtsoftware.com/contact.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | **************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef DEBUGGER_TRK_UTILS
 | 
					
						
							|  |  |  | #define DEBUGGER_TRK_UTILS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QtCore/QByteArray>
 | 
					
						
							|  |  |  | #include <QtCore/QHash>
 | 
					
						
							|  |  |  | #include <QtCore/QString>
 | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  | #include <QtCore/QVariant>
 | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef unsigned char byte; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-24 16:19:14 +02:00
										 |  |  | namespace trk { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-28 15:46:46 +02:00
										 |  |  | enum Command { | 
					
						
							| 
									
										
										
										
											2009-07-29 17:17:17 +02:00
										 |  |  |     TrkPing = 0x00, | 
					
						
							| 
									
										
										
										
											2009-07-28 15:46:46 +02:00
										 |  |  |     TrkConnect = 0x01, | 
					
						
							| 
									
										
										
										
											2009-07-29 18:51:58 +02:00
										 |  |  |     TrkDisconnect = 0x02, | 
					
						
							| 
									
										
										
										
											2009-07-28 15:46:46 +02:00
										 |  |  |     TrkVersions = 0x04, | 
					
						
							|  |  |  |     TrkSupported = 0x05, | 
					
						
							|  |  |  |     TrkCpuType = 0x06, | 
					
						
							| 
									
										
										
										
											2009-07-29 17:17:17 +02:00
										 |  |  |     TrkHostVersions = 0x09, | 
					
						
							| 
									
										
										
										
											2009-07-28 15:46:46 +02:00
										 |  |  |     TrkContinue = 0x18, | 
					
						
							|  |  |  |     TrkCreateItem = 0x40, | 
					
						
							|  |  |  |     TrkDeleteItem = 0x41, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-29 17:17:17 +02:00
										 |  |  |     TrkWriteFile = 0x48, | 
					
						
							|  |  |  |     TrkOpenFile = 0x4a, | 
					
						
							|  |  |  |     TrkCloseFile = 0x4b, | 
					
						
							|  |  |  |     TrkInstallFile = 0x4d, | 
					
						
							|  |  |  |     TrkInstallFile2 = 0x4e, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-28 15:46:46 +02:00
										 |  |  |     TrkNotifyAck = 0x80, | 
					
						
							|  |  |  |     TrkNotifyNak = 0xff, | 
					
						
							|  |  |  |     TrkNotifyStopped = 0x90, | 
					
						
							|  |  |  |     TrkNotifyException = 0x91, | 
					
						
							|  |  |  |     TrkNotifyInternalError = 0x92, | 
					
						
							|  |  |  |     TrkNotifyCreated = 0xa0, | 
					
						
							|  |  |  |     TrkNotifyDeleted = 0xa1, | 
					
						
							|  |  |  |     TrkNotifyProcessorStarted = 0xa2, | 
					
						
							|  |  |  |     TrkNotifyProcessorStandBy = 0xa6, | 
					
						
							|  |  |  |     TrkNotifyProcessorReset = 0xa7 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | QByteArray decode7d(const QByteArray &ba); | 
					
						
							|  |  |  | QByteArray encode7d(const QByteArray &ba); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ushort extractShort(const char *data); | 
					
						
							|  |  |  | uint extractInt(const char *data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString quoteUnprintableLatin1(const QByteArray &ba); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // produces "xx "
 | 
					
						
							|  |  |  | QString stringFromByte(byte c); | 
					
						
							|  |  |  | // produces "xx xx xx "
 | 
					
						
							| 
									
										
										
										
											2009-07-28 12:54:25 +02:00
										 |  |  | QString stringFromArray(const QByteArray &ba, int maxLen = - 1); | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  | enum Endianness | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     LittleEndian, | 
					
						
							|  |  |  |     BigEndian, | 
					
						
							|  |  |  |     TargetByteOrder = BigEndian, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void appendByte(QByteArray *ba, byte b); | 
					
						
							|  |  |  | void appendShort(QByteArray *ba, ushort s, Endianness = TargetByteOrder); | 
					
						
							|  |  |  | void appendInt(QByteArray *ba, uint i, Endianness = TargetByteOrder); | 
					
						
							| 
									
										
										
										
											2009-07-29 17:17:17 +02:00
										 |  |  | void appendString(QByteArray *ba, const QByteArray &str, Endianness = TargetByteOrder, bool appendNullTerminator = true); | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | enum CodeMode | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ArmMode = 0, | 
					
						
							|  |  |  |     ThumbMode, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  | enum TargetConstants | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-29 14:06:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-24 09:50:31 +02:00
										 |  |  |     RegisterCount = 17, | 
					
						
							| 
									
										
										
										
											2009-07-29 14:06:44 +02:00
										 |  |  |     RegisterSP = 13, // Stack Pointer
 | 
					
						
							|  |  |  |     RegisterLR = 14, // Return address
 | 
					
						
							| 
									
										
										
										
											2009-07-23 12:35:57 +02:00
										 |  |  |     RegisterPC = 15, // Program counter
 | 
					
						
							| 
									
										
										
										
											2009-07-24 09:50:31 +02:00
										 |  |  |     RegisterPSGdb = 25, // gdb's view of the world
 | 
					
						
							| 
									
										
										
										
											2009-07-29 14:06:44 +02:00
										 |  |  |     RegisterPSTrk = 16, // TRK's view of the world
 | 
					
						
							| 
									
										
										
										
											2009-07-24 09:50:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 12:35:57 +02:00
										 |  |  |     MemoryChunkSize = 256 | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | struct Session | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Session() { | 
					
						
							|  |  |  |         cpuMajor = 0; | 
					
						
							|  |  |  |         cpuMinor = 0; | 
					
						
							|  |  |  |         bigEndian = 0; | 
					
						
							|  |  |  |         defaultTypeSize = 0; | 
					
						
							|  |  |  |         fpTypeSize = 0; | 
					
						
							|  |  |  |         extended1TypeSize = 0; | 
					
						
							|  |  |  |         extended2TypeSize = 0; | 
					
						
							|  |  |  |         pid = 0; | 
					
						
							|  |  |  |         tid = 0; | 
					
						
							|  |  |  |         codeseg = 0; | 
					
						
							|  |  |  |         dataseg = 0; | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         currentThread = 0; | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  |     // Trk feedback
 | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  |     byte cpuMajor; | 
					
						
							|  |  |  |     byte cpuMinor; | 
					
						
							|  |  |  |     byte bigEndian; | 
					
						
							|  |  |  |     byte defaultTypeSize; | 
					
						
							|  |  |  |     byte fpTypeSize; | 
					
						
							|  |  |  |     byte extended1TypeSize; | 
					
						
							|  |  |  |     byte extended2TypeSize; | 
					
						
							|  |  |  |     uint pid; | 
					
						
							|  |  |  |     uint tid; | 
					
						
							|  |  |  |     uint codeseg; | 
					
						
							|  |  |  |     uint dataseg; | 
					
						
							|  |  |  |     QHash<uint, uint> tokenToBreakpointIndex; | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Gdb request
 | 
					
						
							|  |  |  |     uint currentThread; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 12:35:57 +02:00
										 |  |  | struct Snapshot | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-23 12:35:57 +02:00
										 |  |  |     uint registers[RegisterCount]; | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  |     typedef QHash<uint, QByteArray> Memory; | 
					
						
							|  |  |  |     Memory memory; | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Breakpoint | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Breakpoint(uint offset_ = 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         number = 0; | 
					
						
							|  |  |  |         offset = offset_; | 
					
						
							|  |  |  |         mode = ArmMode; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     uint offset; | 
					
						
							|  |  |  |     ushort number; | 
					
						
							|  |  |  |     CodeMode mode; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct TrkResult | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-16 16:05:43 +02:00
										 |  |  |     TrkResult() { code = token = 0; } | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  |     QString toString() const; | 
					
						
							| 
									
										
										
										
											2009-08-04 16:36:52 +02:00
										 |  |  |     // 0 for no error.
 | 
					
						
							|  |  |  |     int errorCode() const; | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     byte code; | 
					
						
							|  |  |  |     byte token; | 
					
						
							|  |  |  |     QByteArray data; | 
					
						
							| 
									
										
										
										
											2009-07-17 12:13:38 +02:00
										 |  |  |     QVariant cookie; | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // returns a QByteArray containing 0x01 0x90 <len> 0x7e encoded7d(ba) 0x7e
 | 
					
						
							|  |  |  | QByteArray frameMessage(byte command, byte token, const QByteArray &data); | 
					
						
							| 
									
										
										
										
											2009-07-24 16:19:14 +02:00
										 |  |  | ushort isValidTrkResult(const QByteArray &buffer); | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | TrkResult extractResult(QByteArray *buffer); | 
					
						
							| 
									
										
										
										
											2009-07-16 16:05:43 +02:00
										 |  |  | QByteArray errorMessage(byte code); | 
					
						
							| 
									
										
										
										
											2009-07-28 12:54:25 +02:00
										 |  |  | QByteArray hexNumber(uint n, int digits = 0); | 
					
						
							| 
									
										
										
										
											2009-07-29 16:40:25 +02:00
										 |  |  | uint swapEndian(uint in); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-16 10:13:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | } // namespace trk
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // DEBUGGER_TRK_UTILS
 |