]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SourceLevelDebugPkg/Include/TransferProtocol.h
This revision can only work with Intel(c) UDK Debugger Tool version 1.2 or greater...
[mirror_edk2.git] / SourceLevelDebugPkg / Include / TransferProtocol.h
index af80a7450c005614ae5c9d36c0a3ca017b3bd813..bb7b07b4e286407f30f59ce1c881698c735e77c8 100644 (file)
 #define __TRANSFER_PROTOCOL_H__\r
 \r
 #include "ProcessorContext.h"\r
-#include "SoftDebuggerDefinitions.h"\r
+\r
+//\r
+// Current revision of transfer protocol\r
+//\r
+#define DEBUG_AGENT_REVISION            ((0 << 16) | 02)\r
+#define DEBUG_AGENT_CAPABILITIES        0\r
 \r
 //\r
 // Definitions for break command.\r
 //\r
-#define DEBUG_STARTING_SYMBOL_BREAK     (0x21)  //  '!'\r
-#define DEBUG_STARTING_SYMBOL_BREAK_STRING     ("!")\r
+#define DEBUG_STARTING_SYMBOL_BREAK         (0xFC)\r
+\r
+//\r
+// Definitions for attach command\r
+//\r
+#define DEBUG_STARTING_SYMBOL_ATTACH        (0xFA)\r
 \r
 //\r
-//  Definition for starting symbol of a normal debug packet. Choose a non-ASCII to avoid conflict with other serial output.\r
+// Definition for starting symbol of a normal debug packet. Choose a non-ASCII to avoid conflict with other serial output.\r
 //\r
 #define DEBUG_STARTING_SYMBOL_NORMAL    (0xFE)\r
 \r
 #pragma pack(1)\r
 \r
 //\r
-// Definition for common header for normal debug packets (not including break command)\r
+// Definition for debug packet header for normal debug packets (not including break/attach command)\r
 //\r
 typedef struct {\r
   UINT8                      StartSymbol;\r
   UINT8                      Command;\r
-  UINT8                      DataLength;\r
-} DEBUG_COMMAND_HEADER;\r
-\r
-//\r
-// Structure to facilitate debug packet header parsing or construction\r
-//\r
-typedef struct {\r
-  UINT8                      Command;\r
-  UINT8                      DataLength;\r
-} DEBUG_COMMAND_HEADER_NO_START_SYMBOL;\r
-\r
+  UINT8                      Length;    // Length of Debug Packet including header and payload in byte\r
+  UINT8                      CheckSum;\r
+} DEBUG_PACKET_HEADER;\r
 \r
 //\r
 // Definition for Command field for debug packets\r
@@ -57,103 +58,79 @@ typedef struct {
 #define DEBUG_COMMAND_REQUEST      (0 << 7)\r
 #define DEBUG_COMMAND_RESPONSE     (1 << 7)\r
 \r
-\r
-\r
-#define DEBUG_COMMAND_RESET                       (DEBUG_COMMAND_REQUEST | 0)  // 0\r
-\r
-#define DEBUG_COMMAND_GO                          (DEBUG_COMMAND_REQUEST | 1)  // 1\r
-\r
-#define DEBUG_COMMAND_BREAK_CAUSE                 (DEBUG_COMMAND_REQUEST | 2)  // 2\r
-\r
-#define DEBUG_COMMAND_SET_HW_BREAKPOINT           (DEBUG_COMMAND_REQUEST | 3)  // 3\r
-#define DEBUG_COMMAND_CLEAR_HW_BREAKPOINT         (DEBUG_COMMAND_REQUEST | 4)  // 4\r
-\r
-#define DEBUG_COMMAND_SINGLE_STEPPING             (DEBUG_COMMAND_REQUEST | 5)  // 5\r
-\r
-#define DEBUG_COMMAND_SET_SW_BREAKPOINT           (DEBUG_COMMAND_REQUEST | 6)  // 6\r
-#define DEBUG_COMMAND_CLEAR_SW_BREAKPOINT         (DEBUG_COMMAND_REQUEST | 7)  // 7\r
-\r
-#define DEBUG_COMMAND_READ_MEMORY_8               (DEBUG_COMMAND_REQUEST | 8)  // 8\r
-#define DEBUG_COMMAND_READ_MEMORY_16              (DEBUG_COMMAND_REQUEST | 9)  // 9\r
-#define DEBUG_COMMAND_READ_MEMORY_32              (DEBUG_COMMAND_REQUEST | 10) // 10\r
-#define DEBUG_COMMAND_READ_MEMORY_64              (DEBUG_COMMAND_REQUEST | 11) // 11\r
-\r
-#define DEBUG_COMMAND_WRITE_MEMORY_8              (DEBUG_COMMAND_REQUEST | 12) // 12\r
-#define DEBUG_COMMAND_WRITE_MEMORY_16             (DEBUG_COMMAND_REQUEST | 13) // 13\r
-#define DEBUG_COMMAND_WRITE_MEMORY_32             (DEBUG_COMMAND_REQUEST | 14) // 14\r
-#define DEBUG_COMMAND_WRITE_MEMORY_64             (DEBUG_COMMAND_REQUEST | 15) // 15\r
-\r
-#define DEBUG_COMMAND_READ_IO                     (DEBUG_COMMAND_REQUEST | 16) // 16\r
-#define DEBUG_COMMAND_WRITE_IO                    (DEBUG_COMMAND_REQUEST | 20) // 20\r
-\r
-#define DEBUG_COMMAND_READ_REGISTER               (DEBUG_COMMAND_REQUEST | 24) // 24\r
-#define DEBUG_COMMAND_WRITE_REGISTER              (DEBUG_COMMAND_REQUEST | 26) // 26\r
-\r
-#define DEBUG_COMMAND_STEP_OVER                   (DEBUG_COMMAND_REQUEST | 28) // 28\r
-#define DEBUG_COMMAND_STEP_OUT                    (DEBUG_COMMAND_REQUEST | 29) // 29\r
-#define DEBUG_COMMAND_STEP_BRANCH                 (DEBUG_COMMAND_REQUEST | 30) // 30\r
-\r
-#define DEBUG_COMMAND_ARCH_MODE                   (DEBUG_COMMAND_REQUEST | 34) // 34\r
-\r
-#define DEBUG_COMMAND_READ_MSR                    (DEBUG_COMMAND_REQUEST | 35) // 35\r
-#define DEBUG_COMMAND_WRITE_MSR                   (DEBUG_COMMAND_REQUEST | 36) // 36\r
-\r
-#define DEBUG_COMMAND_READ_REGISTER_GROUP         (DEBUG_COMMAND_REQUEST | 37) // 37\r
-\r
-#define DEBUG_COMMAND_SET_DEBUG_FLAG              (DEBUG_COMMAND_REQUEST | 38) // 38\r
-\r
-#define DEBUG_COMMAND_GET_REVISION                (DEBUG_COMMAND_REQUEST | 39) // 39\r
-\r
-#define DEBUG_COMMAND_GET_EXCEPTION               (DEBUG_COMMAND_REQUEST | 40) // 40\r
-\r
-#define DEBUG_COMMAND_SET_VIEWPOINT               (DEBUG_COMMAND_REQUEST | 41) // 41\r
-\r
-#define DEBUG_COMMAND_GET_VIEWPOINT               (DEBUG_COMMAND_REQUEST | 42) // 42\r
-\r
-//\r
-// The below are target side initiated commands.\r
 //\r
-#define DEBUG_COMMAND_INIT_BREAK                  (DEBUG_COMMAND_REQUEST | 63) // 63\r
-#define DEBUG_COMMAND_BREAK_POINT                 (DEBUG_COMMAND_REQUEST | 62) // 62\r
-#define DEBUG_COMMAND_MEMORY_READY                (DEBUG_COMMAND_REQUEST | 61) // 61\r
-\r
-#define DEBUG_COMMAND_OK                          (DEBUG_COMMAND_RESPONSE | 0)\r
-#define DEBUG_COMMAND_RESEND                      (DEBUG_COMMAND_RESPONSE | 1)\r
-#define DEBUG_COMMAND_ABORT                       (DEBUG_COMMAND_RESPONSE | 2)\r
-\r
-//\r
-// The below 2 commands are used when transferring big data (like > ~250 bytes). The sequence is:\r
-//  Host Macine                      Target Macine\r
-//  Request                =>\r
-//                         <=        IN_PROGRESS with part of the data\r
-//  CONTINUE               =>\r
-//  (could have multiple IN_PROGRESS and CONTINUE interactions)\r
-//                         <=        OK with the last part of data\r
-//  OK (no data as ACK)    =>\r
-//\r
-#define DEBUG_COMMAND_IN_PROGRESS                 (DEBUG_COMMAND_RESPONSE | 3)  // Used when trying to\r
-#define DEBUG_COMMAND_CONTINUE                    (DEBUG_COMMAND_RESPONSE | 4)  // Used when trying to transfer big data (like > ~250 bytes)\r
-\r
-//\r
-// The below 2 commands are used to support deferred halt. HALT_DEFERRED will be returned when a halt request received while target is already in inter-active mode.\r
-// HALT_PROCESSED will be return as a possible return value for GO command, if target has a pending halt request.\r
-//\r
-#define DEBUG_COMMAND_HALT_DEFERRED               (DEBUG_COMMAND_RESPONSE | 5)\r
-#define DEBUG_COMMAND_HALT_PROCESSED              (DEBUG_COMMAND_RESPONSE | 6)\r
-\r
-#define DEBUG_COMMAND_TIMEOUT                     (DEBUG_COMMAND_RESPONSE | 7)\r
-#define DEBUG_COMMAND_NOT_SUPPORTED               (DEBUG_COMMAND_RESPONSE | 15)\r
+// HOST initiated commands\r
+//\r
+#define DEBUG_COMMAND_RESET                       (DEBUG_COMMAND_REQUEST | 0x00)\r
+#define DEBUG_COMMAND_GO                          (DEBUG_COMMAND_REQUEST | 0x01)\r
+#define DEBUG_COMMAND_BREAK_CAUSE                 (DEBUG_COMMAND_REQUEST | 0x02)\r
+#define DEBUG_COMMAND_SET_HW_BREAKPOINT           (DEBUG_COMMAND_REQUEST | 0x03)\r
+#define DEBUG_COMMAND_CLEAR_HW_BREAKPOINT         (DEBUG_COMMAND_REQUEST | 0x04)\r
+#define DEBUG_COMMAND_SINGLE_STEPPING             (DEBUG_COMMAND_REQUEST | 0x05)\r
+#define DEBUG_COMMAND_SET_SW_BREAKPOINT           (DEBUG_COMMAND_REQUEST | 0x06)\r
+#define DEBUG_COMMAND_READ_MEMORY                 (DEBUG_COMMAND_REQUEST | 0x07)\r
+#define DEBUG_COMMAND_WRITE_MEMORY                (DEBUG_COMMAND_REQUEST | 0x08)\r
+#define DEBUG_COMMAND_READ_IO                     (DEBUG_COMMAND_REQUEST | 0x09)\r
+#define DEBUG_COMMAND_WRITE_IO                    (DEBUG_COMMAND_REQUEST | 0x0A)\r
+#define DEBUG_COMMAND_READ_REGISTER               (DEBUG_COMMAND_REQUEST | 0x0B)\r
+#define DEBUG_COMMAND_WRITE_REGISTER              (DEBUG_COMMAND_REQUEST | 0x0C)\r
+#define DEBUG_COMMAND_READ_ALL_REGISTERS          (DEBUG_COMMAND_REQUEST | 0x0D)\r
+#define DEBUG_COMMAND_ARCH_MODE                   (DEBUG_COMMAND_REQUEST | 0x0E)\r
+#define DEBUG_COMMAND_READ_MSR                    (DEBUG_COMMAND_REQUEST | 0x0F)\r
+#define DEBUG_COMMAND_WRITE_MSR                   (DEBUG_COMMAND_REQUEST | 0x10)\r
+#define DEBUG_COMMAND_SET_DEBUG_SETTING           (DEBUG_COMMAND_REQUEST | 0x11)\r
+#define DEBUG_COMMAND_GET_REVISION                (DEBUG_COMMAND_REQUEST | 0x12)\r
+#define DEBUG_COMMAND_GET_EXCEPTION               (DEBUG_COMMAND_REQUEST | 0x13)\r
+#define DEBUG_COMMAND_SET_VIEWPOINT               (DEBUG_COMMAND_REQUEST | 0x14)\r
+#define DEBUG_COMMAND_GET_VIEWPOINT               (DEBUG_COMMAND_REQUEST | 0x15)\r
+#define DEBUG_COMMAND_DETACH                      (DEBUG_COMMAND_REQUEST | 0x16)\r
+#define DEBUG_COMMAND_CPUID                       (DEBUG_COMMAND_REQUEST | 0x17)\r
+#define DEBUG_COMMAND_SEARCH_SIGNATURE            (DEBUG_COMMAND_REQUEST | 0x18)\r
+\r
+//\r
+// TARGET initiated commands\r
+//\r
+#define DEBUG_COMMAND_INIT_BREAK                  (DEBUG_COMMAND_REQUEST | 0x3F)\r
+#define DEBUG_COMMAND_BREAK_POINT                 (DEBUG_COMMAND_REQUEST | 0x3E)\r
+#define DEBUG_COMMAND_MEMORY_READY                (DEBUG_COMMAND_REQUEST | 0x3D)\r
+#define DEBUG_COMMAND_PRINT_MESSAGE               (DEBUG_COMMAND_REQUEST | 0x3C)\r
+\r
+//\r
+// Response commands\r
+//\r
+#define DEBUG_COMMAND_OK                          (DEBUG_COMMAND_RESPONSE | 0x00)\r
+#define DEBUG_COMMAND_RESEND                      (DEBUG_COMMAND_RESPONSE | 0x01)\r
+#define DEBUG_COMMAND_ABORT                       (DEBUG_COMMAND_RESPONSE | 0x02)\r
+//\r
+// The below 2 commands are used when transferring big data (like > ~250 bytes).\r
+// The sequence is:\r
+//   HOST                             TARGET\r
+//   Request                =>\r
+//                          <=        IN_PROGRESS with partial data\r
+//   CONTINUE               =>\r
+//   (could have multiple IN_PROGRESS and CONTINUE interactions)\r
+//                          <=        OK with the last part of data\r
+//   OK (no data as ACK)    =>\r
+//\r
+#define DEBUG_COMMAND_IN_PROGRESS                 (DEBUG_COMMAND_RESPONSE | 0x03)\r
+#define DEBUG_COMMAND_CONTINUE                    (DEBUG_COMMAND_RESPONSE | 0x04)\r
+//\r
+// The below 2 commands are used to support deferred halt:\r
+// TARGET returns HALT_DEFERRED when it receives a HALT request in inter-active mode.\r
+// TARGET returns HALT_PROCESSED when it receives a GO request and has a pending HALT request.\r
+//\r
+#define DEBUG_COMMAND_HALT_DEFERRED               (DEBUG_COMMAND_RESPONSE | 0x05)\r
+#define DEBUG_COMMAND_HALT_PROCESSED              (DEBUG_COMMAND_RESPONSE | 0x06)\r
+\r
+#define DEBUG_COMMAND_TIMEOUT                     (DEBUG_COMMAND_RESPONSE | 0x07)\r
+#define DEBUG_COMMAND_NOT_SUPPORTED               (DEBUG_COMMAND_RESPONSE | 0x0F)\r
 \r
 //\r
 // Definition for data field for debug packets\r
 //\r
-#define DEBUG_DATA_MAXIMUM_LENGTH_FOR_SMALL_COMMANDS     20\r
-\r
-#define DEBUG_DATA_UPPER_LIMIT                           0xff  // This is the upper limit for the data size, by the limit of the packet header definition.\r
-\r
-#define DEBUG_DATA_MAXIMUM_REAL_DATA                     0xf8\r
+#define DEBUG_DATA_UPPER_LIMIT                    0xff  // Upper limit for the data size, by the limit of the packet header definition.\r
 \r
-#define DEBUG_DEFINITION_MAX_IO_LENGTH                   4\r
+#define DEBUG_DATA_MAXIMUM_REAL_DATA              (DEBUG_DATA_UPPER_LIMIT - sizeof (DEBUG_PACKET_HEADER))\r
 \r
 //\r
 // Response data for DEBUG_COMMAND_BREAK_CAUSE\r
@@ -162,7 +139,6 @@ typedef struct {
   UINT8       Cause;\r
   UINT64      StopAddress;\r
 } DEBUG_DATA_RESPONSE_BREAK_CAUSE;\r
-\r
 //\r
 // Break type defintions for DEBUG_DATA_BREAK_CAUSE\r
 //\r
@@ -183,7 +159,6 @@ typedef struct {
 typedef struct {\r
   UINT8       CpuMode;\r
 } DEBUG_DATA_RESPONSE_ARCH_MODE;\r
-\r
 //\r
 // Cpu architecture defintions for DEBUG_DATA_RESPONSE_ARCH_MODE\r
 //\r
@@ -191,28 +166,23 @@ typedef struct {
 #define DEBUG_DATA_BREAK_CPU_ARCH_IA32        1\r
 #define DEBUG_DATA_BREAK_CPU_ARCH_X64         2\r
 \r
-//\r
-// Command and response data for DEBUG_COMMAND_XX_YY_BREAKPOINT\r
-//\r
 typedef struct {\r
   UINT8  Length:2;                   // Refer to below DEBUG_DATA_BREAKPOINT_LENGTH_XX macros\r
   UINT8  Access:2;                   // Refer to below DEBUG_DATA_BREAKPOINT_ACCESS_XX macros\r
   UINT8  Index:2;                    // Index of debug register\r
   UINT8  Reserved:2;\r
 } DEBUG_DATA_BREAKPOINT_TYPE;\r
-\r
-#define DEBUG_DATA_BREAKPOINT_MEMORY_ACCESS    (0x11)\r
-#define DEBUG_DATA_BREAKPOINT_IO_ACCESS        (0x10)\r
-#define DEBUG_DATA_BREAKPOINT_MEMORY_WRITE     (0x01)\r
-#define DEBUG_DATA_BREAKPOINT_MEMORY_EXECUTE   (0x00)\r
-\r
-#define DEBUG_DATA_BREAKPOINT_LENGTH_64        (0x11)\r
-#define DEBUG_DATA_BREAKPOINT_LENGTH_32        (0x10)\r
-#define DEBUG_DATA_BREAKPOINT_LENGTH_16        (0x01)\r
-#define DEBUG_DATA_BREAKPOINT_LENGTH_8         (0x00)\r
+#define DEBUG_DATA_BREAKPOINT_MEMORY_ACCESS    (0x3)\r
+#define DEBUG_DATA_BREAKPOINT_IO_ACCESS        (0x2)\r
+#define DEBUG_DATA_BREAKPOINT_MEMORY_WRITE     (0x1)\r
+#define DEBUG_DATA_BREAKPOINT_MEMORY_EXECUTE   (0x0)\r
+#define DEBUG_DATA_BREAKPOINT_LENGTH_32        (0x3)\r
+#define DEBUG_DATA_BREAKPOINT_LENGTH_64        (0x2)\r
+#define DEBUG_DATA_BREAKPOINT_LENGTH_16        (0x1)\r
+#define DEBUG_DATA_BREAKPOINT_LENGTH_8         (0x0)\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_SET_HW_BREAKPOINT\r
+// Request data for DEBUG_COMMAND_SET_HW_BREAKPOINT\r
 //\r
 typedef struct {\r
   DEBUG_DATA_BREAKPOINT_TYPE Type;\r
@@ -220,133 +190,98 @@ typedef struct {
 } DEBUG_DATA_SET_HW_BREAKPOINT;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_CLEAR_HW_BREAKPOINT\r
+// Request data for DEBUG_COMMAND_CLEAR_HW_BREAKPOINT\r
 //\r
 typedef struct {\r
   UINT8                      IndexMask;  // 0x0f will clear all hw breakpoints\r
 } DEBUG_DATA_CLEAR_HW_BREAKPOINT;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_SET_SW_BREAKPOINT\r
+// Request and response data for DEBUG_COMMAND_SET_SW_BREAKPOINT\r
 //\r
 typedef struct {\r
   UINT64                     Address;\r
 } DEBUG_DATA_SET_SW_BREAKPOINT;\r
 \r
-//\r
-// Response data for DEBUG_COMMAND_SET_SW_BREAKPOINT\r
-//\r
 typedef struct {\r
   UINT8                      OriginalData;\r
 } DEBUG_DATA_RESPONSE_SET_SW_BREAKPOINT;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_CLEAR_SW_BREAKPOINT\r
-//\r
-typedef  DEBUG_DATA_SET_SW_BREAKPOINT DEBUG_DATA_CLEAR_SW_BREAKPOINT;\r
-\r
-//\r
-// Command data for DEBUG_COMMAND_READ_MEMORY_XX\r
+// Request data for DEBUG_COMMAND_READ_MEMORY\r
 //\r
 typedef struct {\r
   UINT64                     Address;\r
+  UINT8                      Width;\r
   UINT16                     Count;\r
-} DEBUG_DATA_READ_MEMORY_8;\r
-\r
-typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_16;\r
-\r
-typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_32;\r
-\r
-typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_64;\r
+} DEBUG_DATA_READ_MEMORY;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_WRITE_MEMORY_XX\r
+// Request data for DEBUG_COMMAND_WRITE_MEMORY\r
 //\r
 typedef struct {\r
   UINT64                     Address;\r
+  UINT8                      Width;\r
   UINT16                     Count;\r
-  UINT8                      Data;     // The actual length for this field is decided by Width x Count\r
-} DEBUG_DATA_WRITE_MEMORY_8;\r
-\r
-typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_16;\r
-\r
-typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_32;\r
-\r
-typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_64;\r
+  UINT8                      Data[1];  // The actual length is (Width * Count)\r
+} DEBUG_DATA_WRITE_MEMORY;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_READ_IO\r
+// Request and response data for DEBUG_COMMAND_READ_IO\r
 //\r
 typedef struct {\r
-  UINT16                     Port;\r
+  UINT64                     Port;\r
   UINT8                      Width;\r
 } DEBUG_DATA_READ_IO;\r
 \r
-//\r
-// Response data for DEBUG_COMMAND_READ_IO\r
-//\r
 typedef struct {\r
-  UINT8                      Data;  // The actual length of this structure will be adjusted according to the Width field\r
+  UINT8                      Data[1];  // The actual length depends on the packet header\r
 } DEBUG_DATA_RESPONSE_READ_IO;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_WRITE_IO\r
+// Request data for DEBUG_COMMAND_WRITE_IO\r
 //\r
 typedef struct {\r
-  UINT16                     Port;\r
+  UINT64                     Port;\r
   UINT8                      Width;\r
-  UINT8                      Data; // The actual length of this structure will be adjusted according to the Width field\r
+  UINT8                      Data[1];  // The actual length is Width\r
 } DEBUG_DATA_WRITE_IO;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_READ_REGISTER\r
+// Request data for DEBUG_COMMAND_READ_REGISTER\r
 //\r
 typedef struct {\r
-  UINT8                      Index;   // defined as DEBUG_DEFINITION_REGISTER_XX\r
-  UINT8                      Offset:4;\r
-  UINT8                      Length:4;\r
+  UINT8                      Index;   // defined as SOFT_DEBUGGER_REGISTER_XX\r
 } DEBUG_DATA_READ_REGISTER;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_WRITE_REGISTER\r
+// Request data for DEBUG_COMMAND_WRITE_REGISTER\r
 //\r
 typedef struct {\r
-  UINT8                      Index;   // defined as DEBUG_DEFINITION_REGISTER_XX\r
-  UINT8                      Offset:4;\r
-  UINT8                      Length:4;\r
-  UINT64                     Value;\r
+  UINT8                      Index;   // defined as SOFT_DEBUGGER_REGISTER_XX\r
+  UINT8                      Length;\r
+  UINT8                      Data[1]; // The actual length is Length\r
 } DEBUG_DATA_WRITE_REGISTER;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_READ_MSR\r
+// Request and response data for DEBUG_COMMAND_READ_MSR\r
 //\r
 typedef struct {\r
   UINT32                     Index;\r
 } DEBUG_DATA_READ_MSR;\r
 \r
-//\r
-// Response data for DEBUG_COMMAND_READ_MSR\r
-//\r
 typedef struct {\r
   UINT64                     Value;\r
 } DEBUG_DATA_RESPONSE_READ_MSR;\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_WRITE_MSR\r
+// Request data for DEBUG_COMMAND_WRITE_MSR\r
 //\r
 typedef struct {\r
   UINT32                     Index;\r
   UINT64                     Value;\r
 } DEBUG_DATA_WRITE_MSR;\r
 \r
-//\r
-// Command data for DEBUG_COMMAND_READ_REGISTER_GROUP\r
-//\r
-typedef struct {\r
-  // For possible values, refer to the definition for DEBUG_DEFINITION_REGISTER_GROUP_XXX (in another .h file as it is architecture specific)\r
-  UINT8                     Index;\r
-} DEBUG_DATA_READ_REGISTER_GROUP;\r
-\r
 //\r
 // Response data for DEBUG_COMMAND_GET_REVISION\r
 //\r
@@ -360,24 +295,31 @@ typedef struct {
 //\r
 typedef struct {\r
   UINT8                     ExceptionNum;\r
-  UINT64                    ExceptionData;\r
+  UINT32                    ExceptionData;\r
 } DEBUG_DATA_RESPONSE_GET_EXCEPTION;\r
 \r
-typedef struct {\r
-  UINT8                     DRn;    // The index of DR register which to be used as temporary breakpoint\r
-} DEBUG_DATA_STEP_OVER;\r
-\r
 //\r
-// Command data for DEBUG_COMMAND_SET_DEBUG_FLAG\r
+// Request data for DEBUG_DATA_SET_DEBUG_SETTING\r
 //\r
 typedef struct {\r
-  UINT32                    DebugFlag;    // The index of DR register which to be used as temporary breakpoint\r
-} DEBUG_DATA_SET_DEBUG_FLAG;\r
+  UINT8                    Key;\r
+  UINT8                    Value;\r
+} DEBUG_DATA_SET_DEBUG_SETTING;\r
+//\r
+// Supported keys\r
+//\r
+#define DEBUG_AGENT_SETTING_SMM_ENTRY_BREAK     1\r
+#define DEBUG_AGENT_SETTING_PRINT_ERROR_LEVEL   2\r
+//\r
+// Bitmask of print error level for debug message\r
+//\r
+#define DEBUG_AGENT_ERROR     BIT0\r
+#define DEBUG_AGENT_WARNING   BIT1\r
+#define DEBUG_AGENT_INFO      BIT2\r
+#define DEBUG_AGENT_VERBOSE   BIT3\r
 \r
 //\r
-// Command data for DEBUG_COMMAND_SET_VIEWPOINT\r
-// If viewpoint is changed successfully, DEBUG_COMMAND_OK will be returned.\r
-// If viewpoint is not availabe, DEBUG_COMMAND_NOT_SUPPORTED will be returned.\r
+// Request data for DEBUG_COMMAND_SET_VIEWPOINT\r
 //\r
 typedef struct {\r
   UINT32                    ViewPoint;     // The index of viewpoint will be set\r
@@ -390,19 +332,38 @@ typedef struct {
   UINT32                    ViewPoint;     // The index of viewpoint will be returned\r
 } DEBUG_DATA_RESPONSE_GET_VIEWPOINT;\r
 \r
-#pragma pack()\r
+//\r
+// Request and response data for DEBUG_COMMAND_CPUID\r
+//\r
+typedef struct {\r
+  UINT32                    Eax;           // The value of EAX prior to invoking the CPUID instruction\r
+  UINT32                    Ecx;           // The value of ECX prior to invoking the CPUID instruction\r
+} DEBUG_DATA_CPUID;\r
+\r
+typedef struct {\r
+  UINT32                    Eax;           // The value of EAX returned by the CPUID instruction\r
+  UINT32                    Ebx;           // The value of EBX returned by the CPUID instruction\r
+  UINT32                    Ecx;           // The value of ECX returned by the CPUID instruction\r
+  UINT32                    Edx;           // The value of EDX returned by the CPUID instruction\r
+} DEBUG_DATA_RESPONSE_CPUID;\r
 \r
-#define DEBUG_PACKET_CONSTRUCTOR_WITH_NO_DATA(DebugPacket,ShortCommandType)                              \\r
-  ((DEBUG_COMMAND_HEADER *)DebugPacket)->StartSymbol = DEBUG_STARTING_SYMBOL_NORMAL;                     \\r
-  ((DEBUG_COMMAND_HEADER *)DebugPacket)->Command = DEBUG_COMMAND_##ShortCommandType;                     \\r
-  ((DEBUG_COMMAND_HEADER *)DebugPacket)->DataLength = 0;\r
-\r
-#define DEBUG_PACKET_CONSTRUCTOR_WITH_DATA(DebugPacket,ShortCommandType, DebugPacketDataPointer, PacketLength)         \\r
-  ((DEBUG_COMMAND_HEADER *)DebugPacket)->StartSymbol = DEBUG_STARTING_SYMBOL_NORMAL;                     \\r
-  ((DEBUG_COMMAND_HEADER *)DebugPacket)->Command = DEBUG_COMMAND_##ShortCommandType;                     \\r
-  ((DEBUG_COMMAND_HEADER *)DebugPacket)->DataLength = sizeof (DEBUG_DATA_##ShortCommandType);            \\r
-  *DebugPacketDataPointer = (DEBUG_DATA_##ShortCommandType *)((DEBUG_COMMAND_HEADER *)DebugPacket+1);    \\r
-  *PacketLength = sizeof (DEBUG_COMMAND_HEADER) + sizeof (DEBUG_DATA_##ShortCommandType);\r
+//\r
+// Request and response data for DEBUG_COMMAND_SEARCH_SIGNATURE\r
+//\r
+typedef struct {\r
+  UINT64                    Start;\r
+  UINT32                    Count;\r
+  UINT32                    Alignment;\r
+  BOOLEAN                   Positive;      // TRUE to search in higher address memory\r
+  UINT8                     DataLength;\r
+  UINT8                     Data[1];\r
+} DEBUG_DATA_SEARCH_SIGNATURE;\r
+\r
+typedef struct {\r
+  UINT64                    Address;       // -1 indicates not found\r
+} DEBUG_DATA_RESPONSE_SEARCH_SIGNATURE;\r
+\r
+#pragma pack()\r
 \r
 #endif\r
 \r