--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgagents/trkagent/engine/msgcmd.h Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,3132 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef __MSGCMD_H__
+#define __MSGCMD_H__
+
+
+#include "dstypes.h"
+
+/*
+** This is the maximum number of fields that will be encountered
+** in a message, including the header field(s).
+*/
+#define DS_MAXMESSAGEFIELDCOUNT 15
+
+/*
+** Some items are declared here only for debug purposes (e.g.,
+** string names for messages and fields). The following macros
+** allow these items to be removed when debugging is disabled,
+** eliminating otherwise wasted data space.
+*/
+#ifndef DEBUG_MSGCMD
+ #error "DEBUG_MSGCMD must be defined to either 0 or 1"
+#endif
+
+#if DEBUG_MSGCMD
+ #define __debug_only_parm( x ) x,
+ #define __debug_only_field( x ) x;
+#else
+ #define __debug_only_parm( x )
+ #define __debug_only_field( x )
+#endif
+
+/*
+** Descriptor for a message field.
+*/
+typedef struct TrkMsgFieldDesc
+{
+ __debug_only_field( char *name ) /* Field name - for debugging */
+ int length; /* Length of the field in bytes */
+} TrkMsgFieldDesc;
+
+/*
+** Use this macro to initialize TrkMsgFieldDesc variables.
+*/
+#define __trk_msg_field( name, length ) { __debug_only_parm( name ) length }
+
+/*
+** Descriptor for a message. Each message consists of a header followed
+** by additional fields. Note that length, count, and farray should
+** only account for the additional fields. For example: if the header
+** has 1 field and the message has 3 additional fields (4 total), count
+** should be 3.
+**
+** Only fixed-length numeric fields should be included in the descriptor.
+** Variable-length portions of a message, such as memory data, are
+** typically handled by code that is specific to the message type.
+** They are outside the scope of the general-purpose routines which use
+** these descriptors.
+*/
+//#if __MWERKS__
+#if 0 /* SCM: MIPS compiler defect generates bad code in this case */
+ #define __TrkMsgFieldMax
+#else
+ #define __TrkMsgFieldMax DS_MAXMESSAGEFIELDCOUNT
+#endif /* #if __MWERKS__ */
+
+typedef struct TrkMsgDesc
+{
+ __debug_only_field( char *name ) /* Message name - for debugging */
+ const struct TrkMsgDesc *header; /* Descriptor for header/previous fragment */
+ int length; /* Length of the message in bytes */
+ unsigned int count; /* Number of fields in the message */
+ TrkMsgFieldDesc farray[__TrkMsgFieldMax];/* Descriptors for the message fields */
+} TrkMsgDesc;
+
+
+#ifdef TRK_MSGCMD_INIT
+ #define DESCDECLNC
+ #define DESCDECL const
+#else
+ #define DESCDECLNC extern
+ #define DESCDECL extern const
+#endif
+
+/****************************************************************************/
+/*
+ * Commands
+ *
+ * constant definitions of commands sent from host to target
+ *
+ * L1 = Level 1 CWDS (required)
+ * L2 = Level 2 CWDS (extended board-level debugger)
+ * L3 = Level 3 CWDS (OS-level debugger)
+ */
+/****************************************************************************/
+
+#define DS_PROTOCOL_MIN 1 /* L1 */
+#define DS_PROTOCOL_BOARD 2 /* L2 */
+#define DS_PROTOCOL_RTOS 3 /* L3 */
+
+#if (!defined( DS_PROTOCOL )) || (DS_PROTOCOL == 0)
+ #pragma error "Protocol level must be defined"
+#endif
+
+/*
+** The current protocol version.
+*/
+
+#define DS_PROTOCOL_MAJOR_VERSION_3 3
+#define DS_PROTOCOL_MINOR_VERSION_0 0
+
+#define DS_PROTOCOL_MINOR_VERSION_1 1
+#define DS_PROTOCOL_MINOR_VERSION_2 2
+#define DS_PROTOCOL_MINOR_VERSION_3 3
+#define DS_PROTOCOL_MINOR_VERSION_4 4
+#define DS_PROTOCOL_MINOR_VERSION_5 5
+#define DS_PROTOCOL_MINOR_VERSION_6 6
+
+
+#define DS_PROTOCOL_MAJOR_VERSION DS_PROTOCOL_MAJOR_VERSION_3
+#define DS_PROTOCOL_MINOR_VERSION DS_PROTOCOL_MINOR_VERSION_6
+#define DS_PROTOCOL_VERSION_STRING version_str( DS_PROTOCOL_MAJOR_VERSION, \
+ DS_PROTOCOL_MINOR_VERSION )
+
+/*
+** Named constants for significant protocol revisions can be added
+** here (the existing definitions should not be changed).
+*/
+
+/* Sequence IDs were introduced in version 2.0 */
+#define DS_PROTOCOL_MAJOR_VERSION_SEQUENCEIDS 2
+#define DS_PROTOCOL_MINOR_VERSION_SEQUENCEIDS 0
+
+/* Multi-channel communication, ethernet, & other comm enhancements in 3.0 */
+#define DS_PROTOCOL_MAJOR_VERSION_MULTICHANNEL 3
+#define DS_PROTOCOL_MINOR_VERSION_MULTICHANNEL 0
+
+
+#if __MWERKS__
+#pragma mark MessageCommandID command value list
+#endif /* __MWERKS__ */
+
+/****************************************************************************/
+/*
+ * MessageCommandID command value list
+ */
+/****************************************************************************/
+
+typedef enum MessageCommandID
+{
+ /* meta commands, minimum feature set */
+
+ kDSPing = 0x00, /* */
+ kDSConnect = 0x01, /* L1 L2 L3 */
+ kDSDisconnect = 0x02, /* L3 */
+ kDSReset = 0x03, /* L2 L3 */
+ kDSVersions = 0x04, /* L1 L2 L3 */
+ kDSSupportMask = 0x05, /* L1 L2 L3 */
+ kDSCPUType = 0x06, /* L2 L3 */
+ kDSConfigTransport = 0x07, /* L2 L3 */
+ kDSVersions2 = 0x08, /* L1 L2 L3 */
+ kDSHostVersions = 0x09,
+
+ /* state commands */
+
+ kDSReadMemory = 0x10, /* L1 L2 L3 */
+ kDSWriteMemory = 0x11, /* L1 L2 L3 */
+ kDSReadRegisters = 0x12, /* L1 L2 L3 */
+ kDSWriteRegisters = 0x13, /* L1 L2 L3 */
+ kDSFillMemory = 0x14, /* */
+ kDSCopyMemory = 0x15, /* */
+ kDSFlushCache = 0x16, /* */
+
+ /* execution commands */
+
+ kDSContinue = 0x18, /* L1 L2 L3 */
+ kDSStep = 0x19, /* L2 L3 */
+ kDSStop = 0x1a, /* L2 L3 */
+ kDSSetBreak = 0x1b, /* L2 L3 */
+ kDSClearBreak = 0x1c, /* L2 L3 */
+ kDSDownload = 0x1d, /* */
+ kDSModifyBreakThread = 0x1e, /* L3 */
+ /* Note: kDSSetWatch & kDSClearWatch are obsolete and have been removed */
+
+ /* host->target IO management */
+ kDSNotifyFileInput = 0x20, /* L2 L3 */
+ kDSBlockFileIo = 0x21, /* L2 L3 */
+
+ /* host->target OS commands */
+
+ kDSOSCreateItem = 0x40, /* L3 */
+ kDSOSDeleteItem = 0x41, /* L3 */
+ kDSOSReadInfo = 0x42, /* L3 */
+ kDSOSWriteInfo = 0x43, /* L3 */
+
+ kDSOSWriteFile = 0x48, /* L3 */
+ kDSOSReadFile = 0x49, /* L3 */
+ kDSOSOpenFile = 0x4a, /* L3 */
+ kDSOSCloseFile = 0x4b, /* L3 */
+ kDSOSPositionFile = 0x4c, /* L3 */
+ kDSOSInstallFile = 0x4d, /* L3 */
+ kDSOSInstallFile2 = 0x4e, /* L3 */
+
+ kDSOSPhoneSWVersion = 0x4f, /* L3 */
+ kDSOSPhoneName = 0x50, /* L3 */
+ kDSVersions3 = 0x51, /* L1 L2 L3 */
+ /*
+ * 0x70 - 0x7F reserved for host->target target-specific commands
+ */
+
+ /* replies */
+
+ kDSReplyACK = 0x80, /* L1 L2 L3 */
+ kDSReplyNAK = 0xFF, /* L1 L2 L3 */
+
+
+ /*
+ * target->host notification
+ */
+
+ kDSNotifyStopped = 0x90, /* L1 L2 L3 */
+ kDSNotifyException = 0x91, /* OBSOLETE! */
+ /* kDSNotifyException (0x91) is included for historical */
+ /* reasons only; DON'T IMPLEMENT IN NEW DEBUG NUB CODE! */
+ kDSNotifyInternalError = 0x92, /* */
+//not used, remove? kDSNotifyBreak = 0x93, /* L2 L3 */
+ kDSNotifyStopped2 = 0x94, /* L3 */
+
+ /*
+ * target->host OS notification
+ */
+
+ kDSOSNotifyCreated = 0xa0, /* L3 */
+ kDSOSNotifyDeleted = 0xa1, /* L3 */
+ kDSOSNotifyProcessorStarted = 0xa2, /* L3 */
+ kDSOSNotifyProcessorStandby = 0xa6, /* L3 */
+ kDSOSNotifyProcessorReset = 0xa7, /* L3 */
+
+ /*
+ * target->host support commands
+ */
+
+ kDSWriteFile = 0xD0, /* L2 L3 */
+ kDSReadFile = 0xD1, /* L2 L3 */
+ kDSOpenFile = 0xD2, /* L2 L3 */
+ kDSCloseFile = 0xD3, /* L2 L3 */
+ kDSPositionFile = 0xD4 /* L2 L3 */
+
+ /*
+ * 0xE0 - 0xEF reserved for target->host target-specific commands
+ */
+} MessageCommandID;
+
+/****************************************************************************/
+/*
+ *
+ * Formatted data for messages sent between host and target.
+ *
+ * Primitive Scalar Types:
+ *
+ * Only use hard data types with fixed sizes:
+ * ui8 8-bit unsigned integer
+ * ui16 16-bit unsigned integer
+ * ui32 32-bit unsigned integer
+ * ui8 [] array of bytes
+ * char[] array of characters (C string)
+ * etc.
+ *
+ * Endian:
+ *
+ * Messages are sent in big-endian format.
+ *
+ * Example layouts:
+ *
+ * Type Value Big Endian Little Endian
+ * -------------------- --------------------------- ---------------------------
+ * ui8 0x12 [0x12] [0x12]
+ * ui16 0x1234 [0x12] [0x34] [0x34] [0x12]
+ * ui32 0x12345678 [0x12] [0x34] [0x56] [0x78] [0x78] [0x56] [0x34] [0x12]
+ * ui8[] 0x12 0x34 [0x12] [0x34] [0x12] [0x34]
+ * ui16[] 0x1234 0x5678 [0x12] [0x34] [0x56] [0x78] [0x34] [0x12] [0x78] [0x56]
+ * ui32[] 0x12345678 [0x12] [0x34] [0x56] [0x78] [0x78] [0x56] [0x34] [0x12]
+ * 0x9ABCDEF0 [0x9A] [0xBC] [0xDE] [0xF0] [0xF0] [0xDE] [0xBC] [0x9A]
+ * char[] "Abcd 234" [0x41] [0x62] [0x63] [0x64] [0x41] [0x62] [0x63] [0x64]
+ * [0x20] [0x32] [0x33] [0x34] [0x20] [0x32] [0x33] [0x34]
+ *
+ * Alignment:
+ *
+ * Messages have no alignment restrictions. For transmission efficiency,
+ * alignment padding is not recommended in messages.
+ */
+/****************************************************************************/
+
+#if __MWERKS__
+#pragma mark -
+#pragma mark Message Formats
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * M E S S A G E F O R M A T S
+ */
+/****************************************************************************/
+
+#if __MWERKS__
+#pragma mark Message Header (common)
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * Message Header (new format):
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 sequenceId - (1) sequence ID of message
+ * <2> total
+ * - OR - (old format):
+ *
+ * ui8 command - (1) MessageCommandID
+ * <1> total
+ *
+ * All messages, including replies begin with this header. Some may consist
+ * of nothing else (e.g., the Reset message). Others contain additional
+ * information following the header.
+ *
+ * Currently MetroTRK only supports sending 1 message at a time, which
+ * means that the sender must wait for a reply to each message before
+ * sending the next message. For this case, the sequence IDs follow
+ * these rules:
+ * - For non-reply messages, the sequence ID should be 1 larger
+ * than the sequence ID of the previous message from the same
+ * sender, or 0x01 if the previous value was 0xFF. The host
+ * and target sequence ID's are independent.
+ * A sequence ID of 0 is a special case. It is always valid
+ * and resets the sequence so that the next expected ID is 1
+ * for both the host and target.
+ * - For ACK reply messages, the sequence ID should equal the
+ * sequence ID of the message to which it is replying.
+ * - For NAK reply messages, if the error code is
+ * kDSReplySequenceMissing then the sequence ID should be the
+ * next value that was expected by the receiver. For
+ * any other error code, the sequence ID is indeterminate.
+ * - If a received, non-reply sequence ID is the same as the
+ * previous received sequence ID, the receiver should re-send
+ * the reply to the previous message *without* re-processing
+ * the message. It is important for certain messages (e.g., file
+ * writes) that duplicates not be re-processed.
+ * - If a received, non-reply sequence ID is not equal to the
+ * previous received sequence ID, the next expected ID, or 0,
+ * the receiver should send a NAK reply with the
+ * kDSReplySequenceMissing error code and discard the
+ * received message.
+ *
+ * The sequenceId field is new in version 2.0 of the protocol. For
+ * backwards compatibility, descriptors are included for both the new
+ * and the old header formats. The new format will be used by default,
+ * but it can be changed at runtime. The old format can also be forced
+ * at build time by defining the following in target.h:
+ * #define TRK_MSG_SEQUENCE_IDS 0
+ *
+ */
+/****************************************************************************/
+#define TRK_MSG_HEADER_LENGTH (gTrkMsgHeader.length)
+#define TRK_MSG_HEADER_COUNT 2 /* 2 field in header */
+
+/*
+** For L1 and L2, sequence IDs are disabled by default. For L3 they are
+** enabled by default. Individual targets can override this setting by
+** defining TRK_MSG_SEQUENCE_IDS in target.h.
+*/
+
+#ifndef TRK_MSG_SEQUENCE_IDS
+ #if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ #define TRK_MSG_SEQUENCE_IDS 0
+ #else
+ #define TRK_MSG_SEQUENCE_IDS 1
+ #endif
+#endif
+
+/* The current header descriptor as of protocol version 2.0 */
+#define TRK_MSG_HEADER_20_INIT \
+{ \
+ __debug_only_parm( "Header" ) \
+ NULL, /* previous fragment/header */ \
+ 2, /* # of bytes */ \
+ TRK_MSG_HEADER_COUNT, /* # of fields */ \
+ { /* field descriptors: */ \
+ __trk_msg_field( "command", 1 ), \
+ __trk_msg_field( "sequence ID", 1 ) \
+ } \
+}
+
+DESCDECL TrkMsgDesc gTrkMsgHeader20
+#ifdef TRK_MSGCMD_INIT
+= TRK_MSG_HEADER_20_INIT
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* The old header descriptor prior to protocol version 2.0 */
+#define TRK_MSG_HEADER_PRE_20_INIT \
+{ \
+ __debug_only_parm( "Header" ) \
+ NULL, /* previous fragment/header */ \
+ 1, /* # of bytes */ \
+ TRK_MSG_HEADER_COUNT, /* # of fields */ \
+ { /* field descriptors: */ \
+ __trk_msg_field( "command", 1 ), \
+ __trk_msg_field( "sequence ID (N/A)", 0 ) /* placeholder to make indices consistent */ \
+ } \
+}
+
+DESCDECL TrkMsgDesc gTrkMsgHeaderPre20
+#ifdef TRK_MSGCMD_INIT
+= TRK_MSG_HEADER_PRE_20_INIT
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* Use new header by default - can be changed at runtime. */
+DESCDECLNC TrkMsgDesc gTrkMsgHeader
+#ifdef TRK_MSGCMD_INIT
+ #if TRK_MSG_SEQUENCE_IDS
+ = TRK_MSG_HEADER_20_INIT;
+ #else
+ = TRK_MSG_HEADER_PRE_20_INIT
+ #endif
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. */
+#define TRK_MSG_COMMAND_INDEX 0
+#define TRK_MSG_SID_INDEX 1
+
+#if __MWERKS__
+#pragma mark Reply Header (common)
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * Reply Message Header
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui8 error - (1) CWDS error value
+ * <1 + header> total
+ *
+ * The command for a reply message must be either kDSReplyACK or kDSReplyNAK.
+ *
+ * A NAK reply indicates that an invalid message or portion of a message
+ * was received. The error value will specify the problem.
+ *
+ * An ACK with an error value other than kDSReplyNoError indicates that
+ * the message was valid but could not be processed for some reason (e.g.,
+ * invalid memory ranges, bad parameters, etc.). The error value will
+ * specify the problem.
+ *
+ * Some command replies include additional information that is specific to
+ * the command. This additional information is included ONLY if the
+ * reply is an ACK with kDSReplyNoError.
+ */
+/****************************************************************************/
+#define TRK_MSG_REPLY_HEADER_LENGTH (1 + TRK_MSG_HEADER_LENGTH) /* 1 addl bytes */
+#define TRK_MSG_REPLY_HEADER_COUNT (1 + TRK_MSG_HEADER_COUNT) /* 1 addl fields */
+
+DESCDECL TrkMsgDesc gTrkMsgReplyHeader
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Reply Header" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 1, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "error", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_REPLY_ERROR_INDEX (0 + TRK_MSG_HEADER_COUNT)
+
+/* Retain these for compatibility with older code */
+#define DS_MIN_MSG_LENGTH TRK_MSG_HEADER_LENGTH
+#define DS_MIN_REPLY_LENGTH TRK_MSG_REPLY_HEADER_LENGTH
+
+/****************************************************************************/
+/*
+ * Required Send and Reply Messsages
+ */
+/****************************************************************************/
+
+#if __MWERKS__
+#pragma mark Ping
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSPing
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Can be sent by the host at any time. Simply replies with an
+ * ACK. Currently not supported.
+ */
+/****************************************************************************/
+
+#define DS_MIN_MSG_PING_LENGTH DS_MIN_MSG_LENGTH
+#define DS_MIN_REPLY_PING_LENGTH DS_MIN_REPLY_LENGTH
+
+
+#if __MWERKS__
+#pragma mark Connect
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSConnect
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * The host should send a connect message once at the beginning of
+ * a debug session.
+ */
+/****************************************************************************/
+
+#define DS_MIN_MSG_CONNECT_LENGTH DS_MIN_MSG_LENGTH
+#define DS_MIN_REPLY_CONNECT_LENGTH DS_MIN_REPLY_LENGTH
+
+#if __MWERKS__
+#pragma mark Disconnect
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSDisconnect
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * The host should send a disconnect message once at the end of
+ * a debug session.
+ */
+/****************************************************************************/
+
+#define DS_MIN_MSG_DISCONNECT_LENGTH DS_MIN_MSG_LENGTH
+#define DS_MIN_REPLY_DISCONNECT_LENGTH DS_MIN_REPLY_LENGTH
+
+#if __MWERKS__
+#pragma mark Reset
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSReset
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host. Causes a soft reset on the target board. The
+ * ACK reply is sent before reset. The host should also expect a
+ * welcome message after reset.
+ */
+/****************************************************************************/
+
+#define DS_MIN_MSG_RESET_LENGTH DS_MIN_MSG_LENGTH
+#define DS_MIN_REPLY_RESET_LENGTH DS_MIN_REPLY_LENGTH
+
+#if __MWERKS__
+#pragma mark Versions
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSVersions
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui8 kernelMajor - (1)
+ * ui8 kernelMinor - (1)
+ * ui8 protocolMajor - (1)
+ * ui8 protocolMinor - (1)
+ * <4 + header> total
+ *
+ * Sent by the host, returns TRK version numbers.
+ */
+/****************************************************************************/
+#define DS_MIN_MSG_VERSIONS_LENGTH DS_MIN_MSG_LENGTH
+
+DESCDECL TrkMsgDesc gTrkMsgVersionsReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Versions Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 4, /* # of addl bytes */
+ 4, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "kernel major", 1 ),
+ __trk_msg_field( "kernel minor", 1 ),
+ __trk_msg_field( "protocol major", 1 ),
+ __trk_msg_field( "protocol minor", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_VR_KMAJOR_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_VR_KMINOR_INDEX (1 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_VR_PMAJOR_INDEX (2 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_VR_PMINOR_INDEX (3 + TRK_MSG_REPLY_HEADER_COUNT)
+
+#if __MWERKS__
+#pragma mark CPUType
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSCPUType
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui8 CPU major type - (1) DS_CPU_MAJOR_* (see below)
+ * ui8 CPU minor type - (1) DS_CPU_* (see below)
+ * ui8 big_endian - (1) 1 ==> big endian, 0 ==> little endian
+ * ui8 default type size - (1) size of DefaultType
+ * ui8 FP type size - (1) size of FPType (0 if unsupported)
+ * ui8 extended1 type size - (1) size of Extended1Type (0 if unsupported)
+ * ui8 extended2 type size - (1) size of Extended2Type (0 if unsupported)
+ * <7 + header> total
+ *
+ * Sent by the host, returns information indicating the CPU type and
+ * CPU implementation details for the target system.
+ */
+/****************************************************************************/
+#define DS_MIN_MSG_CPUTYPE_LENGTH DS_MIN_MSG_LENGTH
+
+DESCDECL TrkMsgDesc gTrkMsgCpuTypeReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "CPU Type Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 7, /* # of addl bytes */
+ 7, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "CPU major", 1 ),
+ __trk_msg_field( "CPU minor", 1 ),
+ __trk_msg_field( "big endian", 1 ),
+ __trk_msg_field( "default type size", 1 ),
+ __trk_msg_field( "FP type size", 1 ),
+ __trk_msg_field( "extended1 type size", 1 ),
+ __trk_msg_field( "extended2 type size", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_CTR_CMAJOR_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_CTR_CMINOR_INDEX (1 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_CTR_BIGENDIAN_INDEX (2 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_CTR_DEFAULT_SIZE_INDEX (3 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_CTR_FP_SIZE_INDEX (4 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_CTR_EXTENDED1_SIZE_INDEX (5 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_CTR_EXTENDED2_SIZE_INDEX (6 + TRK_MSG_REPLY_HEADER_COUNT)
+
+/*
+** CPU Major types.
+*/
+
+#define DS_CPU_MAJOR_PPC 0x00
+#define DS_CPU_MAJOR_MIPS 0x01
+#define DS_CPU_MAJOR_NEC_V8XX 0x02
+#define DS_CPU_MAJOR_MOT_DSP 0x03
+#define DS_CPU_MAJOR_ARM 0x04
+#define DS_CPU_MAJOR_X86 0x05
+#define DS_CPU_MAJOR_MCORE 0x06
+#define DS_CPU_MAJOR_M68K 0x07 /* includes ColdFire */
+#define DS_CPU_MAJOR_SUPERH 0x08
+#define DS_CPU_MAJOR_STARCORE 0x09
+
+/*
+** ARM CPU minor types.
+*/
+
+#define DS_CPU_ARM_920T 0x00
+
+/*
+** MIPS CPU minor types.
+*/
+
+#define DS_CPU_MIPS_R3000 0x00
+#define DS_CPU_MIPS_R3081E 0x01
+
+#define DS_CPU_MIPS_VR4100 0x20
+#define DS_CPU_MIPS_VR4300 0x21
+#define DS_CPU_MIPS_VR4500 0x22
+#define DS_CPU_MIPS_VR4111 0x23
+#define DS_CPU_MIPS_TR4101 0x24
+#define DS_CPU_MIPS_EZ4103 0x25
+#define DS_CPU_MIPS_RM7000 0x26
+#define DS_CPU_MIPS_MIPS32_4kc 0x27
+#define DS_CPU_MIPS_RM5231 0x28
+
+#define DS_CPU_MIPS_VR5000 0x40
+
+
+/*
+** PowerPC CPU minor types.
+*/
+
+#define DS_CPU_PPC_403 0x00
+
+#define DS_CPU_PPC_5XX 0x20 /* used when not precisely known */
+#define DS_CPU_PPC_505 0x21
+#define DS_CPU_PPC_509 0x22
+#define DS_CPU_PPC_50X 0x27 /* used when not precisely known */
+#define DS_CPU_PPC_555 0x28
+
+#define DS_CPU_PPC_603E 0x40
+
+#define DS_CPU_PPC_7XX 0x50 /* used when not precisely known */
+#define DS_CPU_PPC_740 0x51
+#define DS_CPU_PPC_750 0x52
+#define DS_CPU_PPC_7400 0x53
+#define DS_CPU_PPC_7410 0x54
+
+#define DS_CPU_PPC_8260 0x61
+
+#define DS_CPU_PPC_8XX 0x80 /* used when not precisely known */
+#define DS_CPU_PPC_821 0x81
+#define DS_CPU_PPC_823 0x82
+#define DS_CPU_PPC_860 0x83
+
+
+/*
+** NEC V8xx CPU minor types.
+*/
+
+#define DS_CPU_NEC_V8XX_V810 0x00
+#define DS_CPU_NEC_V8XX_V821 0x01
+
+#define DS_CPU_NEC_V8XX_V830 0x10
+#define DS_CPU_NEC_V8XX_V831 0x11
+#define DS_CPU_NEC_V8XX_V832 0x12
+
+#define DS_CPU_NEC_V8XX_V850 0x20
+#define DS_CPU_NEC_V8XX_V853 0x21
+#define DS_CPU_NEC_V8XX_V850E 0x22
+#define DS_CPU_NEC_V8XX_V850_SA1 0x23
+
+/*
+** M68K/Coldfire CPU minor types.
+*/
+
+#define DS_CPU_M68K_68000 0x00
+#define DS_CPU_M68K_68020 0x02
+#define DS_CPU_M68K_68030 0x04
+#define DS_CPU_M68K_68040 0x06
+#define DS_CPU_M68K_68060 0x08
+
+#define DS_CPU_M68K_68302 0x20
+#define DS_CPU_M68K_68306 0x22
+#define DS_CPU_M68K_68307 0x24
+#define DS_CPU_M68K_68328 0x26
+#define DS_CPU_M68K_68EZ328 0x28
+#define DS_CPU_M68K_68VZ328 0x29
+#define DS_CPU_M68K_68340 0x2a
+#define DS_CPU_M68K_68360 0x2c
+
+#define DS_CPU_M68K_CF5102 0x80
+#define DS_CPU_M68K_CF5202 0x82
+#define DS_CPU_M68K_CF5204 0x84
+#define DS_CPU_M68K_CF5206 0x86
+#define DS_CPU_M68K_CF5206E 0x88
+#define DS_CPU_M68K_CF5307 0x8a
+
+/*
+** MCore CPU minor types.
+*/
+
+#define DS_CPU_MCORE_200 0x00
+#define DS_CPU_MCORE_340 0x20
+
+/*
+** STARCORE CPU minor types
+*/
+
+#define DS_CPU_STARCORE_8101 0x01
+#define DS_CPU_STARCORE_8102 0x02
+
+#if __MWERKS__
+#pragma mark SupportMask
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSSupportMask
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ *
+ * Reply:
+ *
+ * ui8 command - (1) ack/nak MessageCommandID
+ * ui8 error - (1) CWDS error value
+ * ui8 mask[32] - (32) DSSupportMask
+ * ui8 protocolLevel - (1) value of DS_PROTOCOL (1-3)
+ * <34>
+ *
+ * Sent by the host, returns support mask indicating which commands are
+ * supported by that particular TRK.
+ */
+/****************************************************************************/
+
+/*
+ * Meaning: (bit x == 1) <==> (command x is supported)
+ * where bit 0 is the least significant bit of mask[0] and
+ * bit 255 is the most significant bit of mask[31].
+ */
+typedef ui8 DSSupportMask[32]; /* 256 bits total */
+
+#define DS_MIN_MSG_SUPPORTMASK_LENGTH DS_MIN_MSG_LENGTH
+#define DS_MIN_REPLY_SUPPORTMASK_LENGTH (DS_MIN_REPLY_LENGTH + sizeof( DSSupportMask ) + 1)
+
+#if __MWERKS__
+#pragma mark ConfigTransport
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSConfigTransport
+ *
+ * Send: (if type == TRK_TRANSPORT_TYPE_ETHERNET)
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 general options - (4) reserved (set to 0)
+ * ui32 type - (4) TRK_TRANSPORT_TYPE_ETHERNET (see below)
+ * ui32 channel# - (4) reserved (set to 0)
+ * ui32 ethernet options - (4) reserved (set to 0)
+ * ui32 address - (4) IP address of TRK
+ * ui32 port - (4) port used by TRK
+ * ui32 gateway - (4) gateway IP address (0 if none)
+ * ui32 subnet mask - (4) IP subnet mask (0 if none)
+ * <header + 32> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host, configures a transport channel on the target with
+ * appropriate parameters. The first 3 fields should be common to all
+ * transport types. The number and format of any remaining fields
+ * depend on the value of the "type" field. Currently only ethernet
+ * channels can be configured in this way. Also, since the bare-board
+ * TRK TCP/IP stack only supports a single hardware ethernet channel, the
+ * "channel#" field should be set to 0 for now.
+ */
+/****************************************************************************/
+/* values to be used in the "type" field */
+#define TRK_MSG_TRANSPORT_TYPE_ETHERNET 0
+
+
+/* common segment of message */
+#define TRK_MSG_CT_HEADER_COUNT (3 + TRK_MSG_HEADER_COUNT)
+DESCDECL TrkMsgDesc gTrkMsgConfigTransport
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Config Transport" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 12, /* # of addl bytes */
+ 3, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "general options", 4 ),
+ __trk_msg_field( "type", 4 ),
+ __trk_msg_field( "channel#", 4 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_CT_GENOPT_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_CT_TYPE_INDEX (1 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_CT_CHANNEL_INDEX (2 + TRK_MSG_HEADER_COUNT)
+
+
+/* ethernet-specific segment of message */
+DESCDECL TrkMsgDesc gTrkMsgConfigTransportEthernet
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Config Transport (Ethernet)" )
+ &gTrkMsgConfigTransport, /* previous fragment/header */
+ 20, /* # of addl bytes */
+ 5, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "ethernet options", 4 ),
+ __trk_msg_field( "address", 4 ),
+ __trk_msg_field( "port", 4 ),
+ __trk_msg_field( "gateway", 4 ),
+ __trk_msg_field( "netmask", 4 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_CTE_ETHOPT_INDEX (0 + TRK_MSG_CT_HEADER_COUNT)
+#define TRK_MSG_CTE_ADDRESS_INDEX (1 + TRK_MSG_CT_HEADER_COUNT)
+#define TRK_MSG_CTE_PORT_INDEX (2 + TRK_MSG_CT_HEADER_COUNT)
+#define TRK_MSG_CTE_GATEWAY_INDEX (3 + TRK_MSG_CT_HEADER_COUNT)
+#define TRK_MSG_CTE_NETMASK_INDEX (4 + TRK_MSG_CT_HEADER_COUNT)
+
+#if __MWERKS__
+#pragma mark Versions2
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSVersions
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui8 kernelMajor - (1)
+ * ui8 kernelMinor - (1)
+ * ui8 protocolMajor - (1)
+ * ui8 protocolMinor - (1)
+ * <4 + header> total
+ *
+ * Sent by the host, returns TRK version numbers.
+ */
+/****************************************************************************/
+#define DS_MIN_MSG_VERSIONS2_LENGTH DS_MIN_MSG_LENGTH
+
+DESCDECL TrkMsgDesc gTrkMsgVersions2Reply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Versions2 Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 5, /* # of addl bytes */
+ 5, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "kernel major", 1 ),
+ __trk_msg_field( "kernel minor", 1 ),
+ __trk_msg_field( "protocol major", 1 ),
+ __trk_msg_field( "protocol minor", 1 ),
+ __trk_msg_field( "build number", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_VR2_KMAJOR_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_VR2_KMINOR_INDEX (1 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_VR2_PMAJOR_INDEX (2 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_VR2_PMINOR_INDEX (3 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_VR2_BUILDNUM_INDEX (4 + TRK_MSG_REPLY_HEADER_COUNT)
+
+#if __MWERKS__
+#pragma mark ReadMemory
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSReadMemory
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS &&
+ * (header.options & DS_MSG_MEMORYEXTENDED) == 0
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui16 length - (2) memory data length
+ * ui32 start - (4) memory start address
+ *
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS &&
+ * (header.options & DS_MSG_MEMORYEXTENDED) != 0
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui16 length - (2) memory data length
+ * ui32 startHigh - (4) memory start high-order address
+ * ui32 startLow - (4) memory start low-order address
+ * <12> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (header.options & DS_MSG_MEMORYEXTENDED) == 0
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui16 length - (2) memory data length
+ * ui32 start - (4) memory start address
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <16> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (header.options & DS_MSG_MEMORYEXTENDED) != 0
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui16 length - (2) memory data length
+ * ui32 startHigh - (4) memory start high-order address
+ * ui32 startLow - (4) memory start low-order address
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <20> total
+ *
+ * Reply:
+ *
+ * ui8 command - (1) ack/nak MessageCommandID
+ * ui8 error - (1) CWDS error value
+ * ui16 length - (2) amount that was read
+ * ui8 data[] - (0 to 2048) data
+ * <4 + length> total
+ *
+ * Sent by the host, returns the requested memory contents. The TRK
+ * will attempt to catch and handle any memory access exceptions that
+ * occur during this operation.
+ *
+ * This command can only be used on a stopped system (protocol level 2)
+ * or stopped thread (protocol level 3).
+ */
+/****************************************************************************/
+
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_READMEMORY_LENGTH (DS_MIN_MSG_LENGTH + 15)
+#else
+ #define DS_MIN_MSG_READMEMORY_LENGTH (DS_MIN_MSG_LENGTH + 7)
+#endif
+#define DS_MIN_REPLY_READMEMORY_LENGTH (DS_MIN_REPLY_LENGTH + 2)
+
+#if __MWERKS__
+#pragma mark WriteMemory
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSWriteMemory
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS &&
+ * (header.options & DS_MSG_MEMORYEXTENDED) == 0
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui16 length - (2) memory data length in bytes
+ * ui32 start - (4) memory start address
+ * ui8 data[] - (0 to 2048) data
+ * <8 + length> total
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS &&
+ * (header.options & DS_MSG_MEMORYEXTENDED) != 0
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui16 length - (2) memory data length in bytes
+ * ui32 startHigh - (4) memory start high-order address
+ * ui32 startLow - (4) memory start low-order address
+ * ui8 data[] - (0 to 2048) data
+ * <12 + length> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (header.options & DS_MSG_MEMORYEXTENDED) == 0
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui16 length - (2) memory data length in bytes
+ * ui32 start - (4) memory start address
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * ui8 data[] - (0 to 2048) data
+ * <16 + length> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (header.options & DS_MSG_MEMORYEXTENDED) != 0
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui16 length - (2) memory data length in bytes
+ * ui32 startHigh - (4) memory start high-order address
+ * ui32 startLow - (4) memory start low-order address
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * ui8 data[] - (0 to 2048) data
+ * <20 + length> total
+ *
+ * Reply:
+ *
+ * ui8 command - (1) ack/nak MessageCommandID
+ * ui8 error - (1) CWDS error value
+ * ui16 length - (2) amount that was written in bytes
+ * <4> total
+ *
+ * Sent by the host, writes the specified values to target memory The TRK
+ * will attempt to catch and handle any memory access exceptions that
+ * occur during this operation.
+ *
+ * This command can only be used on a stopped system (protocol level 2)
+ * or stopped thread (protocol level 3).
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_WRITEMEMORY_LENGTH (DS_MIN_MSG_LENGTH + 15)
+#else
+ #define DS_MIN_MSG_WRITEMEMORY_LENGTH (DS_MIN_MSG_LENGTH + 7)
+#endif
+#define DS_MIN_REPLY_WRITEMEMORY_LENGTH (DS_MIN_REPLY_LENGTH + 2)
+
+#if __MWERKS__
+#pragma mark FillMemory
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSFillMemory
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui8 fillValue - (1) value with which to fill memory
+ * ui32 length - (4) data length in bytes
+ * ui32 start - (4) memory start address
+ * <11> total
+ *
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui8 fillValue - (1) value with which to fill memory
+ * ui32 length - (4) data length in bytes
+ * ui32 start - (4) memory start address
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <19> total
+ *
+ * Reply - Basic Reply
+ *
+ * Sent by the host, fills the specified memory range with the given
+ * fillValue. The TRK will attempt to catch and handle any memory
+ * access exceptions that occur during this operation.
+ *
+ * This command can only be used on a stopped system (protocol level 2)
+ * or stopped thread (protocol level 3).
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_FILLMEMORY_LENGTH (DS_MIN_MSG_LENGTH + 18)
+#else
+ #define DS_MIN_MSG_FILLMEMORY_LENGTH (DS_MIN_MSG_LENGTH + 10)
+#endif
+#define DS_MIN_REPLY_FILLMEMORY_LENGTH (DS_MIN_REPLY_LENGTH)
+
+#if __MWERKS__
+#pragma mark CopyMemory
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSCopyMemory
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui32 length - (4) data length in bytes
+ * ui32 source - (4) source memory start address
+ * ui32 destination - (4) destination memory start address
+ * <14> total
+ *
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) One of DS_MSG_MEMORY_* below
+ * ui32 length - (4) data length in bytes
+ * ui32 source - (4) source memory start address
+ * ui32 destination - (4) destination memory start address
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <22> total
+ *
+ * Reply - Basic Reply
+ *
+ * Sent by the host, copies a block of memory with the specified
+ * size from the source address to the destination address. This
+ * operation will function correctly even if the source and
+ * destination memory ranges overlap. The TRK will attempt to
+ * catch and handle any memory access exceptions that occur during
+ * this operation.
+ *
+ * This command can only be used on a stopped system (protocol level 2)
+ * or stopped thread (protocol level 3).
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_COPYMEMORY_LENGTH (DS_MIN_MSG_LENGTH + 21)
+#else
+ #define DS_MIN_MSG_COPYMEMORY_LENGTH (DS_MIN_MSG_LENGTH + 13)
+#endif
+#define DS_MIN_REPLY_COPYMEMORY_LENGTH (DS_MIN_REPLY_LENGTH)
+
+ /* option flags in DSMessage.options */
+#define DS_MSG_MEMORY_SEGMENTED 0x01 /* non-flat addr space */
+#define DS_MSG_MEMORY_EXTENDED 0x02 /* > 32-bit data addr */
+#define DS_MSG_MEMORY_PROTECTED 0x04 /* non-user memory */
+#define DS_MSG_MEMORY_USERVIEW 0x08 /* breakpoints are invisible */
+
+/*
+** The desired memory space can be specified using one of
+** the following options. It can be logically OR'ed with
+** the flags defined above.
+*/
+
+#define DS_MSG_MEMORY_SPACE_PROGRAM 0x00
+#define DS_MSG_MEMORY_SPACE_DATA 0x40
+#define DS_MSG_MEMORY_SPACE_IO 0x80
+
+/*
+** Use this mask to extract the memory space specifier
+** from the options field. The specifier occupies the
+** 2 most significant bits.
+*/
+
+#define DS_MSG_MEMORY_SPACE_MASK 0xc0
+
+#define DS_MAXREADWRITELENGTH 0x0800 /* 2K data portion */
+#define DS_MAXMESSAGESIZE (DS_MAXREADWRITELENGTH + 0x80)
+ /* max size of all message including cmd hdr */
+#define MAXMESSAGESIZE DS_MAXMESSAGESIZE
+
+#define DS_MAXREADWRITELENGTH_V2 0x0716 /* for some comms API, packet len needs bet less 2K */
+#define DS_MAXMESSAGESIZE_V2 (DS_MAXREADWRITELENGTH_V2 + 0x80)
+
+// With USB connection, transferring big chunks of data seems to be cause problems.
+// So reduce the size of each data transfer by almost half.
+#define DS_MAXFILEWRITELENGTH 0x0400
+
+#define MAXMESSAGESIZE_V2 DS_MAXMESSAGESIZE_V2
+
+
+
+#if __MWERKS__
+#pragma mark FlushCache
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSFlushCache
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DS_MSG_CACHE_* (see below)
+ * ui32 start - (4) start of mem region for which to clear cache
+ * ui32 end - (4) end of mem region for which to clear cache
+ * <10> total
+ *
+ * Reply - Basic Reply
+ *
+ * Sent by the host, flushes all cache entries corresponding to the
+ * given memory range, at least. Additional cache entries may
+ * be flushed as well, depending on the target implementation.
+ *
+ * This command can only be used on a stopped system.
+ */
+/****************************************************************************/
+
+#define DS_MIN_MSG_FLUSHCACHE_LENGTH (DS_MIN_MSG_LENGTH + 9)
+#define DS_MIN_REPLY_FLUSHCACHE_LENGTH (DS_MIN_REPLY_LENGTH)
+
+/*
+** The following values may be logically OR'ed together in the
+** options field of the kDSFlushCache command to specify
+** the cache types to be flushed.
+*/
+
+#define DS_MSG_CACHE_TYPE_INSTRUCTION 0x01
+#define DS_MSG_CACHE_TYPE_DATA 0x02
+#define DS_MSG_CACHE_TYPE_SECONDARY 0x04
+
+
+#if __MWERKS__
+#pragma mark ReadRegisters
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSReadRegisters
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageRegisterOptions
+ * ui16 firstRegister - (2) first register ID
+ * ui16 lastRegister - (2) last register ID
+ * <6>
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageRegisterOptions
+ * ui16 firstRegister - (2) first register ID
+ * ui16 lastRegister - (2) last register ID
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <14>
+ *
+ * Reply:
+ *
+ * ui8 command - (1) ack/nak MessageCommandID
+ * ui8 error - (1) CWDS error value
+ * register data - (0-2048)
+ * <2 + register data>
+ *
+ * Sent by the host, reads the requested register contents. The TRK
+ * will attempt to catch and handle any access exceptions that
+ * occur during this operation.
+ *
+ * This command can only be used on a stopped system (protocol level 2)
+ * or stopped thread (protocol level 3).
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_READREGISTERS_LENGTH (DS_MIN_MSG_LENGTH + 13)
+#else
+ #define DS_MIN_MSG_READREGISTERS_LENGTH (DS_MIN_MSG_LENGTH + 5)
+#endif
+#define DS_MIN_REPLY_READREGISTERS_LENGTH DS_MIN_REPLY_LENGTH
+
+#if __MWERKS__
+#pragma mark WriteRegisters
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSWriteRegisters
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageRegisterOptions
+ * ui16 firstRegister - (2) first register ID
+ * ui16 lastRegister - (2) last register ID
+ * register data - (0-2048)
+ * <6 + register data>
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageRegisterOptions
+ * ui16 firstRegister - (2) first register ID
+ * ui16 lastRegister - (2) last register ID
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * register data - (0-2048)
+ * <14 + register data>
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host, writes the specified values to target registers.
+ * The TRK will attempt to catch and handle any access exceptions that
+ * occur during this operation.
+ *
+ * This command can only be used on a stopped system (protocol level 2)
+ * or stopped thread (protocol level 3).
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_WRITEREGISTERS_LENGTH (DS_MIN_MSG_LENGTH + 13)
+#else
+ #define DS_MIN_MSG_WRITEREGISTERS_LENGTH (DS_MIN_MSG_LENGTH + 5)
+#endif
+#define DS_MIN_REPLY_WRITEREGISTERS_LENGTH DS_MIN_REPLY_LENGTH
+
+ /* option flags for reading registers */
+
+#define DS_MSG_REGISTERS_TYPE_MASK 0x07 /* "register type" mask */
+#define DS_MSG_REGISTERS_TYPE_SHIFT 0 /* # bits to shift mask from lsb. */
+#define DS_MSG_REGISTERS_TYPE(_x_) ((_x_ & DS_MSG_REGISTERS_TYPE_MASK) << DS_MSG_REGISTERS_TYPE_SHIFT)
+
+/*
+ * kDSReadRegisters & kDSWriteRegister options
+ */
+
+typedef enum DSMessageRegisterOptions {
+ kDSRegistersDefault = 0x0, /* Default register block */
+ kDSRegistersFP = 0x1, /* floating point registers */
+ kDSRegistersExtended1 = 0x2, /* Extended register set 1 */
+ kDSRegistersExtended2 = 0x3 /* Extended register set 2 */
+} DSMessageRegisterOptions;
+
+
+#if __MWERKS__
+#pragma mark Continue
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSContinue
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <header + 8> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ *
+ * Sent by the host. Begins execution on the target at the current PC.
+ *
+ * Replies with an ACK before execution starts. Once execution begins,
+ * most commands which access that process or thread will not be
+ * accepted. For DS_PROTOCOL values of 1 or 2, this means that it
+ * will not respond to any of the state or execution commands
+ * except kDSStop. It will respond to meta-commands. For
+ * a DS_PROTOCOL value of 3, it will not accept any commands
+ * specifying that process or thread except kDSStop or
+ * kDSOSDeleteItem.
+ *
+ * The host should wait for a NotifyStopped or NotifyException command
+ * and reply with a corresponding ACK. Once that process and thread
+ * have stopped again, MetroTRK will once again accept other commands
+ * which access them.
+ *
+ * This command can only be used on a stopped system (protocol level 2)
+ * or stopped thread (protocol level 3).
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_CONTINUE_LENGTH (DS_MIN_MSG_LENGTH + 8)
+#else
+ #define DS_MIN_MSG_CONTINUE_LENGTH DS_MIN_MSG_LENGTH
+#endif
+#define DS_MIN_REPLY_CONTINUE_LENGTH DS_MIN_REPLY_LENGTH
+
+#if __MWERKS__
+#pragma mark Step
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSStep
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS &&
+ * (options == kDSStepIntoCount || options == kDSStepOverCount)
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageStepOptions
+ * ui8 count - (1) # of instructions
+ * <3>
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (options == kDSStepIntoCount || options == kDSStepOverCount)
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageStepOptions
+ * ui8 count - (1) # of instructions
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <11>
+ *
+ * Sent by the host. Steps over the specified number of instructions.
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS &&
+ * (options == kDSStepIntoRange || options == kDSStepOverRange)
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageStepOptions
+ * ui32 rangeStart - (4) Start address of memory range
+ * ui32 rangeEnd - (4) End address of memory range
+ * <10>
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (options == kDSStepIntoRange || options == kDSStepOverRange)
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageStepOptions
+ * ui32 rangeStart - (4) Start address of memory range
+ * ui32 rangeEnd - (4) End address of memory range
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <18>
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host. Steps until the PC is outside of the specified
+ * range.
+ *
+ * Replies with an ACK before execution starts. Once execution begins,
+ * most commands which access that process or thread will not be
+ * accepted. For DS_PROTOCOL values of 1 or 2, this means that it
+ * will not respond to any of the state or execution commands
+ * except kDSStop. It will respond to meta-commands. For
+ * a DS_PROTOCOL value of 3, it will not accept any commands
+ * specifying that process or thread except kDSStop or
+ * kDSOSDeleteItem.
+ *
+ * The host should wait for a NotifyStopped or NotifyException command
+ * and reply with a corresponding ACK. Once that process and thread
+ * have stopped again, MetroTRK will once again accept other commands
+ * which access them.
+ *
+ * This command can only be used on a stopped system (protocol level 2)
+ * or stopped thread (protocol level 3).
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_STEP_COUNT_LENGTH (DS_MIN_MSG_LENGTH + 10)
+ #define DS_MIN_MSG_STEP_RANGE_LENGTH (DS_MIN_MSG_LENGTH + 17)
+#else
+ #define DS_MIN_MSG_STEP_COUNT_LENGTH (DS_MIN_MSG_LENGTH + 2)
+ #define DS_MIN_MSG_STEP_RANGE_LENGTH (DS_MIN_MSG_LENGTH + 9)
+#endif
+#define DS_MIN_MSG_STEP_LENGTH (DS_MIN_MSG_STEP_COUNT_LENGTH)
+#define DS_MIN_REPLY_STEP_LENGTH DS_MIN_REPLY_LENGTH
+
+/*
+** The following option values are predefined. Desired
+** target-specific options can be added to the
+** DSTargMessageStepOptions enum (see msgtarg.h).
+*/
+
+typedef enum {
+ kDSStepIntoCount = 0x00, /* Exec count instructions & stop */
+ kDSStepIntoRange = 0x01, /* Exec until PC is out of specified range */
+ kDSStepOverCount = 0x10, /* Step over 1*count instructions & stop */
+ kDSStepOverRange = 0x11 /* Step over until PC is out of specified range */
+} DSMessageStepOptions;
+
+
+#if __MWERKS__
+#pragma mark Stop
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSStop
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ *
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (options == kDSStopSystem)
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageStopOptions
+ * <2>
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (options == kDSStopProcess)
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageStopOptions
+ * ui32 processID - (4) unique process ID
+ * <6>
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS &&
+ * (options == kDSStopThread)
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageStopOptions
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <10>
+ *
+ * Sent by the host. Forces the target system/process/thread to stop.
+ * Replies with an ACK.
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_STOP_LENGTH (DS_MIN_MSG_LENGTH + 3)
+#else
+ #define DS_MIN_MSG_STOP_LENGTH (DS_MIN_MSG_LENGTH + 2)
+#endif
+#define DS_MIN_REPLY_STOP_LENGTH DS_MIN_REPLY_LENGTH
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+
+/*
+** The following option values are predefined. Desired
+** target-specific options can be added to the
+** DSTargMessageStopOptions enum (see msgtarg.h).
+*/
+
+typedef enum {
+ kDSStopSystem = 0x0, /* Stop the entire system */
+ kDSStopProcess = 0x1, /* Stop all threads in a specific process */
+ kDSStopThread = 0x2 /* Stop a specific thread in a specific process */
+} DSMessageStopOptions;
+
+#endif
+
+#if __MWERKS__
+#pragma mark SetBreak
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSSetBreak
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui8 options - (1) DSMessageBreakOptions
+ * ui8 targetOptions - (1) target-defined
+ * ui32 address - (4) Start of breakpoint memory range
+ * ui32 length - (4) Length of breakpoint memory range
+ * ui32 count - (4) Only stop after triggered this many times (currently not used, set to 0)
+ * <14 + header> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui8 options - (1) DSMessageBreakOptions
+ * ui8 targetOptions - (1) target-defined
+ * ui32 address - (4) Start of breakpoint memory range
+ * ui32 length - (4) Length of breakpoint memory range
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * ui32 count - (4) Only stop after triggered this many times (currently not used, set to 0)
+ * <22 + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui32 id - (4) ID of the new breakpoint
+ * <4 + header> total
+ * Sent by the host. Sets a breakpoint at the specified location.
+ * Replies with an ACK.
+ *
+ * For software execution breakpoints, the length field should be 1.
+ *
+ * Note: This command should not be implemented unless there is a
+ * compelling reason to do so. In most cases, both software and
+ * hardware breakpoints can be implemented via memory and register reads
+ * and writes.
+ *
+ *
+ */
+/****************************************************************************/
+#define TRK_MSG_REPLY_HEADER_LENGTH (1 + TRK_MSG_HEADER_LENGTH) /* 1 addl bytes */
+#define TRK_MSG_REPLY_HEADER_COUNT (1 + TRK_MSG_HEADER_COUNT) /* 1 addl fields */
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+
+ DESCDECL TrkMsgDesc gTrkMsgSetBreak
+ #ifdef TRK_MSGCMD_INIT
+ = {
+ __debug_only_parm( "Set Breakpoint" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 22, /* # of addl bytes */
+ 7, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "options", 1 ),
+ __trk_msg_field( "target options", 1 ),
+ __trk_msg_field( "address", 4 ),
+ __trk_msg_field( "length", 4 ),
+ __trk_msg_field( "count", 4 ),
+ __trk_msg_field( "process ID", 4 ),
+ __trk_msg_field( "thread ID", 4 ),
+ }
+ }
+ #endif /* #ifdef TRK_MSGCMD_INIT */
+ ;
+
+#else /* #if DS_PROTOCOL == DS_PROTOCOL_RTOS */
+
+ DESCDECL TrkMsgDesc gTrkMsgSetBreak
+ #ifdef TRK_MSGCMD_INIT
+ = {
+ __debug_only_parm( "Set Breakpoint" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 14, /* # of addl bytes */
+ 5, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "options", 1 ),
+ __trk_msg_field( "target options", 1 ),
+ __trk_msg_field( "address", 4 ),
+ __trk_msg_field( "length", 4 ),
+ __trk_msg_field( "count", 4 )
+ }
+ }
+ #endif /* #ifdef TRK_MSGCMD_INIT */
+ ;
+
+#endif /* #if DS_PROTOCOL == DS_PROTOCOL_RTOS */
+
+/* field indices */
+#define TRK_MSG_SETBREAK_OPTIONS_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_SETBREAK_TOPTIONS_INDEX (1 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_SETBREAK_ADDRESS_INDEX (2 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_SETBREAK_LENGTH_INDEX (3 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_SETBREAK_COUNT_INDEX (4 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_SETBREAK_PID_INDEX (5 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_SETBREAK_TID_INDEX (6 + TRK_MSG_HEADER_COUNT)
+
+DESCDECL TrkMsgDesc gTrkMsgSetBreakReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Set Breakpoint Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 4, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "breakpoint ID", 4 ),
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_SETBREAKREPLY_BID_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+
+#if __MWERKS__
+#pragma mark ClearBreak
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSClearBreak
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 id - (4) ID of the breakpoint to clear
+ * <4 + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host. Clears the specified breakpoint. If the specified
+ * id is DS_MSG_BREAK_ID_ALL, clears all breakpoints.
+ *
+ */
+/****************************************************************************/
+DESCDECL TrkMsgDesc gTrkMsgClearBreak
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Clear Breakpoint" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 8, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "breakpoint ID", 4 ),
+ __trk_msg_field( "breakpoint Address", 4)
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_CLEARBREAK_BID_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_CLEARBREAK_BADDR_INDEX (1 + TRK_MSG_HEADER_COUNT)
+
+/*
+** The following values should be logically OR'ed with one
+** of the DSMessageBreakOptions values to specify the
+** type of access which will cause the target program to
+** stop. More than one stop type can be specified.
+** the kDSSetBreak command will fail if one of the specified
+** conditions is not supported on the target, but there is
+** one exception:
+**
+** NOTE: If both the write and modify conditions are
+** specified, the kDSSetBreak command will succeed if
+** one of the two is supported.
+**
+*/
+
+#define DS_MSG_BREAK_CONDITION_READ 0x10 /* stop on read access */
+#define DS_MSG_BREAK_CONDITION_WRITE 0x20 /* stop on write access */
+#define DS_MSG_BREAK_CONDITION_MODIFY 0x40 /* stop on modify access */
+#define DS_MSG_BREAK_CONDITION_EXECUTE 0x80 /* stop on execution */
+
+/*
+** Use the following mask to extract the breakpoint condition flags
+** from the options.
+*/
+
+#define DS_MSG_BREAK_CONDITION_MASK 0xf0
+
+/*
+** The following option values are predefined. Desired
+** target-specific options can be added to the
+** DSTargMessageBreakOptions enum (see msgtarg.h).
+*/
+
+typedef enum {
+ kDSBreakSoftware = 0x00, /* Set a software breakpoint */
+ kDSBreakHardware = 0x01, /* Set a hardware breakpoint */
+ kDSBreakAuto = 0x02 /* Set a SW BP if possible, otherwise HW */
+} DSMessageBreakOptions;
+
+/*
+** If the following is provided as the breakpoint ID in the kDSClearBreak
+** command, all breakpoints will be cleared.
+*/
+
+#define DS_MSG_BREAK_ID_ALL 0xffffffff
+
+/*
+** If the following is provided as the thread ID in the kDSSetBreak
+** command, the operation will apply to all threads in the process.
+*/
+
+#define DS_MSG_BREAK_THREAD_ID_ALL 0xffffffff
+
+#if __MWERKS__
+#pragma mark ModifyBreakThread
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSModifyBreakThread
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 id - (4) ID of the breakpoint to modify
+ * ui32 threadID - (4) new thread ID
+ * <8 + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host. Associates an existing breakpoint with the
+ * specified thread. The thread ID can be for a specific thread or
+ * it can be DS_MSG_BREAK_THREAD_ID_ALL.
+ *
+ * This command is only valid if DS_PROTOCOL == DS_PROTOCOL_RTOS.
+ *
+ */
+/****************************************************************************/
+DESCDECL TrkMsgDesc gTrkMsgModifyBreakThread
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Modify Breakpoint Thread" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 8, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "breakpoint ID", 4 ),
+ __trk_msg_field( "thread ID", 4 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_MBT_BID_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_MBT_TID_INDEX (1 + TRK_MSG_HEADER_COUNT)
+
+
+#if __MWERKS__
+#pragma mark Download
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSDownload
+ *
+ * Send: if (DSMessageDownloadOptions == kDSMessageDownloadTFTP)
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 options - (1) DSMessageDownloadOptions (see below)
+ * ui32 IP address - (4) IP address of the target system
+ * ui32 TFTP address - (4) IP address of the TFTP server
+ * ui32 length - (4) file size in bytes
+ * ui32 start address - (4) load address of the file
+ * ui16 name_length - (2) length of file name in bytes
+ * ui8[] file name (0 - 2048) name of the file to download
+ * <20 + name_length>
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host. Downloads a file to the target system according
+ * to the specified parameters. This command is intended to allow
+ * downloading via communication channels other than the TRK's command
+ * channel.
+ * Replies with an ACK.
+ *
+ */
+/****************************************************************************/
+
+#define DS_MIN_MSG_DOWNLOAD_LENGTH (DS_MIN_MSG_LENGTH + 19)
+#define DS_MIN_REPLY_CLEARBREAK_LENGTH DS_MIN_REPLY_LENGTH
+
+/*
+** The following option values are predefined. Desired
+** target-specific options can be added to the
+** DSTargMessageDownloadOptions enum (see msgtarg.h).
+*/
+
+typedef enum {
+ kDSMessageDownloadTFTP = 0x0
+} DSMessageDownloadOptions;
+
+#if __MWERKS__
+#pragma mark NotifyStopped
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSNotifyStopped
+ *
+ * Send:
+ *
+ * ui8 command - (1) MessageCommandID
+ * target-defined info (PC, instr @PC, exception word)
+ * <1 + target info> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the target. This message will only be sent when the target
+ * is executing (after a kDSContinue or kDSStep command). It indicates
+ * that the target stopped running. On a bare-board system (no OS), this
+ * typically means the target stopped due to an exception. The
+ * target-defind info should provide additional details about why
+ * the target stopped.
+ * Expects an ACK in response.
+ *
+ */
+/****************************************************************************/
+
+#define DS_MIN_MSG_NOTIFYSTOPPED_LENGTH DS_MIN_MSG_LENGTH
+#define DS_MIN_REPLY_NOTIFYSTOPPED_LENGTH DS_MIN_REPLY_LENGTH
+
+#if __MWERKS__
+#pragma mark NotifyInternalError
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSNotifyInternalError
+ *
+ * Send:
+ *
+ * ui8 command - (1) MessageCommandID
+ * ui8 error code - (1) DSInternalError
+ * <2> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the target. It indicates that an internal error occurred
+ * in MetroTRK.
+ * Expects an ACK in response.
+ *
+ */
+/****************************************************************************/
+
+#define DS_MIN_MSG_NOTIFYINTERNALERROR_LENGTH (DS_MIN_MSG_LENGTH + 1)
+#define DS_MIN_REPLY_NOTIFYINTERNALERROR_LENGTH DS_MIN_REPLY_LENGTH
+
+#if __MWERKS__
+#pragma mark OSNotifyCreated / OSNotifyDeleted
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSOSNotifyCreated / kDSOSNotifyDeleted
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui16 itemType - (2) DSOSItemTypes
+ * target-defined info (e.g., process ID for kDSOSDLLItem)
+ * <2 + header + target info> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * target-defined info (e.g., code & data offset for
+ * kDSOSProcessItem)
+ * <header + target info> total
+ *
+ * Sent by the target. This message indicates that an item of the
+ * given type has been created/deleted.
+ * Expects an ACK in response.
+ *
+ */
+/****************************************************************************/
+
+#if __MWERKS__
+#pragma mark OSCreateItem / OSDeleteItem Header
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSOSCreateItem / kDSOSDeleteItem
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui16 itemType - (2) DSOSItemTypes
+ * target-defined info (e.g., DLL name for kDSOSDLLItem)
+ * <2 + header + target info> total
+ *
+ * Reply
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * target-defined info (e.g., code & data offset for
+ * kDSOSProcessItem)
+ * <header + target info> total
+ *
+ * Sent by the host. Creates/deletes an item of the specified type in
+ * the system. It allows the host to create/delete processes (load),
+ * threads, DLL's, and any other system resources. This command may
+ * either operate synchronously or asynchronously. The behavior may be
+ * differ on an item-by-item basis. The two scenarios:
+ *
+ * synchronous: The host sends a OSCreateItem/OSDeleteItem command.
+ * The target system creates the item and then replies with an
+ * ACK containing specific information about the
+ * created/deleted item.
+ *
+ * asynchronous: The host sends a OSCreateItem/OSDeleteItem command.
+ * The target system queues the request and replies with
+ * an ACK. At some later time, when the item is
+ * actually created/deleted, the target system sends an
+ * OSNotifyCreated/OSNotifyDeleted message to the host
+ * containing specific information about the created/deleted
+ * item.
+ *
+ * Expects an ACK in response. The reply may contain specific
+ * information about the created/deleted item, such as code and data
+ * offsets for relocatable processes (if the operation is
+ * synchronous).
+ *
+ */
+/****************************************************************************/
+
+#define TRK_MSG_ITEM_HEADER_LENGTH (2 + TRK_MSG_HEADER_LENGTH) /* 2 addl bytes */
+#define TRK_MSG_ITEM_HEADER_COUNT (1 + TRK_MSG_HEADER_COUNT) /* 1 addl fields */
+
+DESCDECL TrkMsgDesc gTrkMsgItemHeader
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Item Header" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 2, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "item type", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+#define TRK_MSG_ITEM_HEADER_TYPE_INDEX (0 + TRK_MSG_HEADER_COUNT)
+
+
+/*
+** The following option values are predefined. Desired
+** target-specific options can be added to the
+** DSTargOSItemTypes enum (see msgtarg.h).
+*/
+
+typedef enum {
+ kDSOSProcessItem = 0x0000,
+ kDSOSThreadItem = 0x0001,
+ kDSOSDLLItem = 0x0002,
+ kDSOSAppItem = 0x0003,
+ kDSOSMemBlockItem = 0x0004,
+ kDSOSProcAttachItem = 0x0005,
+ kDSOSThreadAttachItem = 0x0006,
+ kDSOSProcAttach2Item = 0x0007,
+ kDSOSProcRunItem = 0x0008,
+ kDSOSProcAttach3Item = 0x0009
+ /* 0x0009 - 0x00ff reserved for general expansion */
+ /* 0x0100 - 0xffff available for target-specific use */
+} DSOSItemTypes;
+
+#if __MWERKS__
+#pragma mark OSReadInfo / OSWriteInfo Header
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSOSReadInfo / KDSOSWriteInfo (Common Header)
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui16 infoType - (2) DSOSInfoTypes
+ * target-defined info (e.g., process ID for
+ * kDSOSProcessStateInfo)
+ * <2 + header + target info> total
+ *
+ * Reply
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * target-defined info (e.g., process state for
+ * kDSOSProcessStateInfo)
+ * <header + target info> total
+ *
+ * Sent by the host. Reads/writes the requested info from/to the
+ * target system. It allows the host to get/set information about the
+ * internal system state. For ReadInfo, there are additional fields
+ * specified in a secondary header (see below).
+ *
+ */
+/****************************************************************************/
+
+#define TRK_MSG_INFO_HEADER_LENGTH (2 + TRK_MSG_HEADER_LENGTH) /* 2 addl bytes */
+#define TRK_MSG_INFO_HEADER_COUNT (1 + TRK_MSG_HEADER_COUNT) /* 1 addl fields */
+
+DESCDECL TrkMsgDesc gTrkMsgInfoHeader
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Info Header" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 2, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "info type", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+#define TRK_MSG_INFO_HEADER_TYPE_INDEX (0 + TRK_MSG_HEADER_COUNT)
+
+/*
+** The following option values are predefined. Desired
+** target-specific options can be added to the
+** DSTargOSInfoTypes enum (see msgtarg.h).
+*/
+
+typedef enum {
+ kDSOSProcessList = 0x0000,
+ kDSOSProcessState = 0x0001,
+ kDSOSThreadList = 0x0002,
+ kDSOSThreadState = 0x0003,
+ kDSOSDLLList = 0x0004,
+ kDSOSDLLState = 0x0005,
+ kDSOSDLLInfo = 0x0006,
+ kDSOSProcessInfo = 0x0007,
+ /* 0x0008 - 0x00ff reserved for expansion */
+ /* 0x0100 - 0xffff available for target-specific use */
+} DSOSInfoTypes;
+
+#if __MWERKS__
+#pragma mark OSReadInfo Header
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSOSReadInfo (header)
+ *
+ * Send:
+ *
+ * .... <Info Header> ... (see gTrkMsgInfoHeader)
+ * ui32 startIndex - (4) starting index of returned info
+ * target-defined info (e.g., process ID for
+ * kDSOSProcessStateInfo)
+ * <4 + header + target info> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui32 returnedCount - (4) # of items in this reply
+ * ui32 totalCount - (4) total # of items in complete response
+ * target-defined info (e.g., process state for
+ * kDSOSProcessStateInfo)
+ * <8 + header + target info> total
+ *
+ *
+ * This is the header to be used by all kDSReadInfo requests. The
+ * complete info may not fit in a single MetroTRK message, so it is
+ * possible to read the info in segments. When reading the info, the
+ * startIndex should be 0 the first time. If, in the reply,
+ * totalCount > (startIndex + returnedCount), then the next segment of
+ * the info can be read by sending another request with the new
+ * startIndex set to the previous (startIndex + returnedCount).
+ *
+ * startIndex, returnedCount, and totalCount all refer to the number of
+ * "items" (the definition of which depends on the info type), not
+ * necessarily the number of bytes.
+ *
+ */
+/****************************************************************************/
+#define TRK_MSG_RI_HEADER_LENGTH (4 + TRK_MSG_INFO_HEADER_LENGTH) /* 4 addl bytes */
+#define TRK_MSG_RI_HEADER_COUNT (1 + TRK_MSG_INFO_HEADER_COUNT) /* 1 addl fields */
+
+
+DESCDECL TrkMsgDesc gTrkMsgReadInfoHeader
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Read Info Header" )
+ &gTrkMsgInfoHeader, /* previous fragment/header */
+ 4, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "start index", 4 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_RI_HEADER_START_INDEX (0 + TRK_MSG_INFO_HEADER_COUNT)
+
+
+#define TRK_MSG_RIR_HEADER_LENGTH (8 + TRK_MSG_REPLY_HEADER_LENGTH) /* 4 addl bytes */
+#define TRK_MSG_RIR_HEADER_COUNT (2 + TRK_MSG_REPLY_HEADER_COUNT) /* 1 addl fields */
+
+DESCDECL TrkMsgDesc gTrkMsgReadInfoReplyHeader
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Read Info Reply Header" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 8, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "returned count", 4 ),
+ __trk_msg_field( "total count", 4 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_RIR_HEADER_RETURNED_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_RIR_HEADER_TOTAL_INDEX (1 + TRK_MSG_REPLY_HEADER_COUNT)
+
+
+#if __MWERKS__
+#pragma mark WriteFile
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSWriteFile
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 file_handle - (4) DSFileHandles (see below)
+ * ui16 length - (2) file data length in bytes
+ * file data - (0 to 2048)
+ * <6 + length + header> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 file_handle - (4) DSFileHandles (see below)
+ * ui16 length - (2) file data length in bytes
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * file data - (0 to 2048)
+ * <14 + length + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui8 io_result - (1) DSIOResult (see below)
+ * ui16 length - (2) amount that was written in bytes
+ * <3 + header> total
+ *
+ * kDSWriteFile: Sent by the target. Instructs the host to write the
+ * specified data to the file with the given handle. Assumes that stdout
+ * and stderr are always open for writing.
+ * Expects a reply from the host in the above format.
+ *
+ * Note: The startup welcome message is sent as a kDSWriteFile
+ * message, but it is a special case and does not require a reply.
+ *
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_WRITEFILE_LENGTH (DS_MIN_MSG_LENGTH + 14)
+#else
+ #define DS_MIN_MSG_WRITEFILE_LENGTH (DS_MIN_MSG_LENGTH + 6)
+#endif
+#define DS_MIN_REPLY_WRITEFILE_LENGTH (DS_MIN_REPLY_LENGTH + 3)
+
+#if __MWERKS__
+#pragma mark ReadFile
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSReadFile
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 file_handle - (4) DSFileHandles (see below)
+ * ui16 length - (2) file data length in bytes
+ * <6 + header> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 file_handle - (4) DSFileHandles (see below)
+ * ui16 length - (2) file data length in bytes
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <14 + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui8 io_result - (1) DSIOResult (see below)
+ * ui16 length - (2) amount that was read in bytes
+ * file data - (0 to 2048)
+ * <3 + length + header> total
+ *
+ * Sent by the target. Instructs the host to read the specified
+ * amount of data from the file with the given handle. Assumes
+ * that stdin is always open for reading.
+ * Expects a reply from the host in the above format.
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_READFILE_LENGTH (DS_MIN_MSG_LENGTH + 14)
+#else
+ #define DS_MIN_MSG_READFILE_LENGTH (DS_MIN_MSG_LENGTH + 6)
+#endif
+#define DS_MIN_REPLY_READFILE_LENGTH (DS_MIN_REPLY_LENGTH + 3)
+
+#if __MWERKS__
+#pragma mark NotifyFileInput
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSNotifyFileInput
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 file_handle - (4) DSFileHandles (see below)
+ * <4 + header> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 file_handle - (4) DSFileHandles (see below)
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <12 + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host. Notifies MetroTRK that new input is available for
+ * the given file. This is intended to be used for stdin, but can be
+ * used for other files as well.
+ *
+ */
+/****************************************************************************/
+
+/*** kDSNotifyFileInput ***/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+
+ DESCDECL TrkMsgDesc gTrkMsgNotifyFileInput
+ #ifdef TRK_MSGCMD_INIT
+ = {
+ __debug_only_parm( "Notify File Input" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 12, /* # of addl bytes */
+ 3, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "file handle", 4 ),
+ __trk_msg_field( "process ID", 4 ),
+ __trk_msg_field( "thread ID", 4 )
+ }
+ }
+ #endif /* #ifdef TRK_MSGCMD_INIT */
+ ;
+
+#else /* #if DS_PROTOCOL == DS_PROTOCOL_RTOS */
+
+ DESCDECL TrkMsgDesc gTrkMsgNotifyFileInput
+ #ifdef TRK_MSGCMD_INIT
+ = {
+ __debug_only_parm( "Notify File Input" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 4, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "file handle", 4 )
+ }
+ }
+ #endif /* #ifdef TRK_MSGCMD_INIT */
+ ;
+
+#endif /* #if DS_PROTOCOL == DS_PROTOCOL_RTOS */
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_NFI_HANDLE_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_NFI_PID_INDEX (1 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_NFI_TID_INDEX (2 + TRK_MSG_HEADER_COUNT)
+
+
+#if __MWERKS__
+#pragma mark BlockFileIo
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSBlockFileIo
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui8 block - (1) if 0, OK to send file IO requests, otherwise no
+ * <1 + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * <header> total
+ *
+ * Sent by the host. Blocks/unblocks all file IO requests from the target.
+ * If the host becomes overwhelmed with file IO processing, it can send this
+ * message with a block value of 1. When it is able to handle more file IO
+ * requests it can send this message again with a block value of 0. This
+ * affects target->host IO requests from all files on all processes and threads.
+ *
+ */
+/****************************************************************************/
+
+/*** kDSBlockFileIo ***/
+
+DESCDECL TrkMsgDesc gTrkMsgBlockFileIo
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Block File IO" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 1, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "block", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_BFIO_BLOCK_INDEX (0 + TRK_MSG_HEADER_COUNT)
+
+
+#if __MWERKS__
+#pragma mark OpenFile
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSOpenFile
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui8 modes - (1) DSFileOpenModes (see below)
+ * ui16 name_length - (2) file name length in bytes
+ * ui8[] file_name - (0 to 2048) file name (no string
+ * terminator)
+ * <3 + name_length + header> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui8 modes - (1) DSFileOpenModes (see below)
+ * ui16 name_length - (2) file name length in bytes
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * ui8[] file_name - (0 to 2048) file name (no string
+ * terminator)
+ * <11 + name_length + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui8 io_result - (1) DSIOResult (see below)
+ * ui32 file_handle - (4) handle of the newly opened file
+ * ui32 timestamp - (4) timestamp of file on open (replyer-dependent format)
+ * <9 + header> total
+ *
+ * Sent by the target. Instructs the host to open a file with the
+ * given name and modes. The resulting file_handle can then be
+ * used by kDSWriteFile, kDSReadFile, kDSCloseFile, and kDSPositionFile.
+ * Expects a reply from the host in the above format.
+ *
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_OPENFILE_LENGTH (DS_MIN_MSG_LENGTH + 11)
+#else
+ #define DS_MIN_MSG_OPENFILE_LENGTH (DS_MIN_MSG_LENGTH + 3)
+#endif
+#define DS_MIN_REPLY_OPENFILE_LENGTH (DS_MIN_REPLY_LENGTH + 5)
+
+#if __MWERKS__
+#pragma mark CloseFile
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSCloseFile
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 file_handle - (4) handle of the file to be closed
+ * ui32 timestamp - (4) new timestamp value to be set for the file (receiver-dependent format)
+ * <8 + header> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui32 file_handle - (4) handle of the file to be closed
+ * ui32 timestamp - (4) new timestamp value to be set for the file (receiver-dependent format)
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <16 + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui8 io_result - (1) DSIOResult (see below)
+ * <1 + header> total
+ *
+ * Sent by the target. Instructs the host to close the file with the
+ * specified file_handle. Note: the timestamp value will only affect
+ * the file if it was opened in write mode.
+ * Expects a reply from the host in the above format.
+ *
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_CLOSEFILE_LENGTH (DS_MIN_MSG_LENGTH + 16)
+#else
+ #define DS_MIN_MSG_CLOSEFILE_LENGTH (DS_MIN_MSG_LENGTH + 8)
+#endif
+#define DS_MIN_REPLY_CLOSEFILE_LENGTH (DS_MIN_REPLY_LENGTH + 1)
+
+#if __MWERKS__
+#pragma mark PositionFile
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSPositionFile
+ *
+ * Send: if DS_PROTOCOL < DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui8 mode - (1) DSFilePositionModes (see below)
+ * ui32 file_handle - (4) handle of the file to be positioned
+ * ui32 offset - (4) position offset
+ * <9 + header> total
+ *
+ * Send: if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * ui8 mode - (1) DSFilePositionModes (see below)
+ * ui32 file_handle - (4) handle of the file to be positioned
+ * ui32 offset - (4) position offset
+ * ui32 processID - (4) unique process ID
+ * ui32 threadID - (4) unique thread ID
+ * <17 + header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui8 io_result - (1) DSIOResult (see below)
+ * <1 + header> total
+ *
+ * Sent by the target. Instructs the host to set the file position
+ * of the specified file. The new position will be at the specified
+ * offset from one of three reference points in the file, as specified
+ * by the mode.
+ * Expects a reply from the host in the above format.
+ *
+ */
+/****************************************************************************/
+
+#if DS_PROTOCOL == DS_PROTOCOL_RTOS
+ #define DS_MIN_MSG_POSITIONFILE_LENGTH (DS_MIN_MSG_LENGTH + 13)
+#else
+ #define DS_MIN_MSG_POSITIONFILE_LENGTH (DS_MIN_MSG_LENGTH + 5)
+#endif
+#define DS_MIN_REPLY_POSITIONFILE_LENGTH (DS_MIN_REPLY_LENGTH + 1)
+
+/*
+** These are the predefined file handles. Additional files may
+** be opened via the kDSOpenFile command. New file handles
+** returned by that command may be used in addition to the
+** ones defined here.
+*/
+
+typedef enum DSFileHandle
+{
+ kDSStdin = 0x00,
+ kDSStdout = 0x01,
+ kDSStderr = 0x02
+} DSFileHandle;
+
+/*
+** The result of an I/O command can be any one of the following.
+*/
+
+typedef enum DSIOResult
+{
+ kDSIONoError = 0x00,
+ kDSIOError = 0x01,
+ kDSIOEOF = 0x02
+} DSIOResult;
+
+/*
+** When opening a file, the following values can be OR'ed together
+** to specify the desired open modes. The following table shows
+** the correlation between the various modes and the standard mode
+** option for fopen:
+**
+** read write append binary create fopen mode
+** -------------------------------------------------------
+** yes "r"
+** yes* yes "w"
+** yes* yes yes "a"
+** yes yes "r+"
+** yes yes* yes "w+"
+** yes yes* yes yes "a+"
+** yes yes "rb"
+** yes* yes yes "wb"
+** yes* yes yes yes "ab"
+** yes yes yes "r+b"
+** yes yes* yes yes "w+b"
+** yes yes* yes yes yes "a+b"
+**
+**
+** * Note that when the append or create modes are specified,
+** the write mode is always assumed.
+**
+** If the exec mode is specified, the resulting file will
+** be created as an executable file (with execute permissions).
+** This is only meaningful if the create mode is also specified.
+*/
+
+typedef enum DSFileOpenModes
+{
+ kDSFileOpenRead = 0x01,
+ kDSFileOpenWrite = 0x02,
+ kDSFileOpenAppend = 0x04,
+ kDSFileOpenBinary = 0x08,
+ kDSFileOpenCreate = 0x10,
+ kDSFileOpenExec = 0x20
+} DSFileOpenModes;
+
+/*
+** Use one of the following values to specify a file positioning mode.
+*/
+
+typedef enum DSFilePositionModes
+{
+ kDSFileSeekSet = 0x00, /* Position is offset from file start */
+ kDSFileSeekCur = 0x01, /* Position is offset from current pos. */
+ kDSFileSeekEnd = 0x02 /* Position is offset from file end */
+} DSFilePositionModes;
+
+#if __MWERKS__
+#pragma mark OS File Operations
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * kDSOSWriteFile
+ * kDSOSReadFile
+ * kDSOSOpenFile
+ * kDSOSCloseFile
+ * kDSOSPositionFile
+ * kDSOSInstallFile
+ * kDSOSInstallFile2
+ *
+ * The format and function of these commands is identical to
+ * that of the kDSWriteFile, kDSReadFile, kDSOpenFile,
+ * kDSCloseFile, and kDSPositionFile commands described above.
+ *
+ * The difference is that these commands are sent from the host to
+ * the target, they operate on files on the target system, and they
+ * do not include the processId and threadId fields (i.e., they are
+ * formatted as described above as if DS_PROTOCOL < DS_PROTOCOL_RTOS).
+ */
+/****************************************************************************/
+
+/*** kDSOSWriteFile ***/
+DESCDECL TrkMsgDesc gTrkMsgOsWriteFile
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Write File" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 6, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors (data handled separately): */
+ __trk_msg_field( "file handle", 4 ),
+ __trk_msg_field( "length", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OWF_HANDLE_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_OWF_LENGTH_INDEX (1 + TRK_MSG_HEADER_COUNT)
+
+DESCDECL TrkMsgDesc gTrkMsgOsWriteFileReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Write File Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 3, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors (data handled separately): */
+ __trk_msg_field( "io result", 1 ),
+ __trk_msg_field( "length", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OWFR_IORESULT_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_OWFR_LENGTH_INDEX (1 + TRK_MSG_REPLY_HEADER_COUNT)
+
+
+/*** kDSOSReadFile ***/
+DESCDECL TrkMsgDesc gTrkMsgOsReadFile
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Read File" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 6, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "file handle", 4 ),
+ __trk_msg_field( "length", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_ORF_HANDLE_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_ORF_LENGTH_INDEX (1 + TRK_MSG_HEADER_COUNT)
+
+DESCDECL TrkMsgDesc gTrkMsgOsReadFileReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Read File Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 3, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors (data handled separately): */
+ __trk_msg_field( "IO result", 1 ),
+ __trk_msg_field( "length", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_ORFR_IORESULT_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_ORFR_LENGTH_INDEX (1 + TRK_MSG_REPLY_HEADER_COUNT)
+
+
+/*** kDSOSOpenFile ***/
+DESCDECL TrkMsgDesc gTrkMsgOsOpenFile
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Open File" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 3, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors (file_name handled separately): */
+ __trk_msg_field( "modes", 1 ),
+ __trk_msg_field( "name length", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OOF_MODES_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_OOF_LENGTH_INDEX (1 + TRK_MSG_HEADER_COUNT)
+
+DESCDECL TrkMsgDesc gTrkMsgOsOpenFileReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Open File Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 9, /* # of addl bytes */
+ 3, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "IO result", 1 ),
+ __trk_msg_field( "file handle", 4 ),
+ __trk_msg_field( "timestamp", 4 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OOFR_IORESULT_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_OOFR_HANDLE_INDEX (1 + TRK_MSG_REPLY_HEADER_COUNT)
+#define TRK_MSG_OOFR_TIMESTAMP_INDEX (2 + TRK_MSG_REPLY_HEADER_COUNT)
+
+
+/*** kDSOSCloseFile ***/
+DESCDECL TrkMsgDesc gTrkMsgOsCloseFile
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Close File" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 8, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "file handle", 4 ),
+ __trk_msg_field( "timestamp", 4 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OCF_HANDLE_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_OCF_TIMESTAMP_INDEX (1 + TRK_MSG_HEADER_COUNT)
+
+DESCDECL TrkMsgDesc gTrkMsgOsCloseFileReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Close File Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 1, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "IO result", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OCFR_IORESULT_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+
+
+/*** kDSOSPositionFile ***/
+DESCDECL TrkMsgDesc gTrkMsgOsPositionFile
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Position File" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 9, /* # of addl bytes */
+ 3, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "modes", 1 ),
+ __trk_msg_field( "file handle", 4 ),
+ __trk_msg_field( "offset", 4 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OPF_MODES_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_OPF_HANDLE_INDEX (1 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_OPF_OFFSET_INDEX (2 + TRK_MSG_HEADER_COUNT)
+
+DESCDECL TrkMsgDesc gTrkMsgOsPositionFileReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Position File Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 1, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "IO result", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OPFR_IORESULT_INDEX (0 + TRK_MSG_REPLY_HEADER_COUNT)
+
+
+/*** kDSOSInstallFile ***/
+DESCDECL TrkMsgDesc gTrkMsgOsInstallFile
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Install File" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 3, /* # of addl bytes */
+ 2, /* # of addl fields */
+ { /* addl field descriptors (file_name handled separately): */
+ __trk_msg_field( "drive", 1 ),
+ __trk_msg_field( "name length", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OIF_DRIVE_INDEX (0 + TRK_MSG_HEADER_COUNT)
+#define TRK_MSG_OIF_LENGTH_INDEX (1 + TRK_MSG_HEADER_COUNT)
+
+DESCDECL TrkMsgDesc gTrkMsgOsInstallFileReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Install File Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 1, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "IO result", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/*** kDSOSInstallFile2 ***/
+DESCDECL TrkMsgDesc gTrkMsgOsInstallFile2
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Install File2" )
+ &gTrkMsgHeader, /* previous fragment/header */
+ 2, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors (file_name handled separately): */
+ __trk_msg_field( "name length", 2 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/* "Index" of fields. Take # of header fields into account. */
+#define TRK_MSG_OIF2_LENGTH_INDEX (0 + TRK_MSG_HEADER_COUNT)
+
+DESCDECL TrkMsgDesc gTrkMsgOsInstallFile2Reply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "OS Install File2 Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ 1, /* # of addl bytes */
+ 1, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "IO result", 1 )
+ }
+}
+#endif /* #ifdef TRK_MSGCMD_INIT */
+;
+
+/****************************************************************************/
+/*
+ * kDSOSPhoneSWVersion
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui16 version string len - (2)
+ * string sw version string
+ *
+ *
+ */
+/****************************************************************************/
+#define DS_MIN_MSG_PHONESWVERSION_LENGTH DS_MIN_MSG_LENGTH
+
+DESCDECL TrkMsgDesc gTrkMsgPhoneSWVersionReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Phone SW Version Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ x, /* # of addl bytes */
+ x, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "version string len", 2 ),
+ __trk_msg_field( "version string", x )
+ }
+}
+#endif
+;
+/****************************************************************************/
+/*
+ * kDSOSPhoneName
+ *
+ * Send:
+ *
+ * .... <Message Header> ... (see gTrkMsgHeader)
+ * <header> total
+ *
+ * Reply:
+ *
+ * .... <Reply Header> ... (see gTrkMsgReplyHeader)
+ * ui16 phone name len - (2)
+ * string phone name string
+ *
+ *
+ */
+/****************************************************************************/
+#define DS_MIN_MSG_PHONENAME_LENGTH DS_MIN_MSG_LENGTH
+
+DESCDECL TrkMsgDesc gTrkMsgPhoneNameReply
+#ifdef TRK_MSGCMD_INIT
+= {
+ __debug_only_parm( "Phone Name Reply" )
+ &gTrkMsgReplyHeader, /* previous fragment/header */
+ x, /* # of addl bytes */
+ x, /* # of addl fields */
+ { /* addl field descriptors: */
+ __trk_msg_field( "phone name string len", 2 ),
+ __trk_msg_field( "phone name string", x )
+ }
+}
+#endif
+;
+
+#if __MWERKS__
+#pragma mark Message Error Values
+#endif /* __MWERKS__ */
+/****************************************************************************/
+/*
+ * Error values returned in ACK/NAK packets
+ */
+/****************************************************************************/
+ typedef enum {
+ kDSReplyNoError = 0x00, /* no error */
+ kDSReplyError = 0x01, /* generic error in CWDS message */
+ kDSReplyPacketSizeError = 0x02, /* unexpected pkt size in send msg */
+ kDSReplyCWDSError = 0x03, /* internal error occurred in CWDS */
+ kDSReplyEscapeError = 0x04, /* escape followed by frame flag */
+ kDSReplyBadFCS = 0x05, /* bad FCS in packet */
+ kDSReplyOverflow = 0x06, /* packet too long */
+ kDSReplySequenceMissing = 0x07, /* sequence ID != expected (gap in sequence) */
+
+ kDSReplyUnsupportedCommandError = 0x10, /* command not supported */
+ kDSReplyParameterError = 0x11, /* command param out of range */
+ kDSReplyUnsupportedOptionError = 0x12, /* an option was not supported */
+ kDSReplyInvalidMemoryRange = 0x13, /* read/write to invalid memory */
+ kDSReplyInvalidRegisterRange = 0x14, /* read/write invalid registers */
+ kDSReplyCWDSException = 0x15, /* exception occurred in CWDS */
+ kDSReplyNotStopped = 0x16, /* targeted system or thread is running */
+ kDSReplyBreakpointsFull = 0x17, /* bp resources (HW or SW) exhausted */
+ kDSReplyBreakpointConflict = 0x18, /* requested bp conflicts w/existing bp */
+
+ kDSReplyOsError = 0x20, /* general OS-related error */
+ kDSReplyInvalidProcessId = 0x21, /* request specified invalid process */
+ kDSReplyInvalidThreadId = 0x22, /* request specified invalid thread */
+
+ kDSDebugSecurityError = 0x23 /* security error from DSS */
+
+} DSReplyError;
+
+
+#endif /* __MSGCMD_H__ */