]> git.proxmox.com Git - mirror_edk2.git/blame - SourceLevelDebugPkg/Include/TransferProtocol.h
Import SourceLevelDebugPkg.
[mirror_edk2.git] / SourceLevelDebugPkg / Include / TransferProtocol.h
CommitLineData
18b144ea 1/** @file\r
2 Transfer protocol defintions used by debug agent and host. It is only\r
3 intended to be used by Debug related module implementation.\r
4\r
5 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php.\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#ifndef __TRANSFER_PROTOCOL_H__\r
17#define __TRANSFER_PROTOCOL_H__\r
18\r
19#include "ProcessorContext.h"\r
20#include "SoftDebuggerDefinitions.h"\r
21\r
22//\r
23// Definitions for break command.\r
24//\r
25#define DEBUG_STARTING_SYMBOL_BREAK (0x21) // '!'\r
26#define DEBUG_STARTING_SYMBOL_BREAK_STRING ("!")\r
27\r
28//\r
29// Definition for starting symbol of a normal debug packet. Choose a non-ASCII to avoid conflict with other serial output.\r
30//\r
31#define DEBUG_STARTING_SYMBOL_NORMAL (0xFE)\r
32\r
33\r
34#pragma pack(1)\r
35\r
36//\r
37// Definition for common header for normal debug packets (not including break command)\r
38//\r
39typedef struct {\r
40 UINT8 StartSymbol;\r
41 UINT8 Command;\r
42 UINT8 DataLength;\r
43} DEBUG_COMMAND_HEADER;\r
44\r
45//\r
46// Structure to facilitate debug packet header parsing or construction\r
47//\r
48typedef struct {\r
49 UINT8 Command;\r
50 UINT8 DataLength;\r
51} DEBUG_COMMAND_HEADER_NO_START_SYMBOL;\r
52\r
53\r
54//\r
55// Definition for Command field for debug packets\r
56//\r
57#define DEBUG_COMMAND_REQUEST (0 << 7)\r
58#define DEBUG_COMMAND_RESPONSE (1 << 7)\r
59\r
60\r
61\r
62#define DEBUG_COMMAND_RESET (DEBUG_COMMAND_REQUEST | 0) // 0\r
63\r
64#define DEBUG_COMMAND_GO (DEBUG_COMMAND_REQUEST | 1) // 1\r
65\r
66#define DEBUG_COMMAND_BREAK_CAUSE (DEBUG_COMMAND_REQUEST | 2) // 2\r
67\r
68#define DEBUG_COMMAND_SET_HW_BREAKPOINT (DEBUG_COMMAND_REQUEST | 3) // 3\r
69#define DEBUG_COMMAND_CLEAR_HW_BREAKPOINT (DEBUG_COMMAND_REQUEST | 4) // 4\r
70\r
71#define DEBUG_COMMAND_SINGLE_STEPPING (DEBUG_COMMAND_REQUEST | 5) // 5\r
72\r
73#define DEBUG_COMMAND_SET_SW_BREAKPOINT (DEBUG_COMMAND_REQUEST | 6) // 6\r
74#define DEBUG_COMMAND_CLEAR_SW_BREAKPOINT (DEBUG_COMMAND_REQUEST | 7) // 7\r
75\r
76#define DEBUG_COMMAND_READ_MEMORY_8 (DEBUG_COMMAND_REQUEST | 8) // 8\r
77#define DEBUG_COMMAND_READ_MEMORY_16 (DEBUG_COMMAND_REQUEST | 9) // 9\r
78#define DEBUG_COMMAND_READ_MEMORY_32 (DEBUG_COMMAND_REQUEST | 10) // 10\r
79#define DEBUG_COMMAND_READ_MEMORY_64 (DEBUG_COMMAND_REQUEST | 11) // 11\r
80\r
81#define DEBUG_COMMAND_WRITE_MEMORY_8 (DEBUG_COMMAND_REQUEST | 12) // 12\r
82#define DEBUG_COMMAND_WRITE_MEMORY_16 (DEBUG_COMMAND_REQUEST | 13) // 13\r
83#define DEBUG_COMMAND_WRITE_MEMORY_32 (DEBUG_COMMAND_REQUEST | 14) // 14\r
84#define DEBUG_COMMAND_WRITE_MEMORY_64 (DEBUG_COMMAND_REQUEST | 15) // 15\r
85\r
86#define DEBUG_COMMAND_READ_IO (DEBUG_COMMAND_REQUEST | 16) // 16\r
87#define DEBUG_COMMAND_WRITE_IO (DEBUG_COMMAND_REQUEST | 20) // 20\r
88\r
89#define DEBUG_COMMAND_READ_REGISTER (DEBUG_COMMAND_REQUEST | 24) // 24\r
90#define DEBUG_COMMAND_WRITE_REGISTER (DEBUG_COMMAND_REQUEST | 26) // 26\r
91\r
92#define DEBUG_COMMAND_STEP_OVER (DEBUG_COMMAND_REQUEST | 28) // 28\r
93#define DEBUG_COMMAND_STEP_OUT (DEBUG_COMMAND_REQUEST | 29) // 29\r
94#define DEBUG_COMMAND_STEP_BRANCH (DEBUG_COMMAND_REQUEST | 30) // 30\r
95\r
96#define DEBUG_COMMAND_ARCH_MODE (DEBUG_COMMAND_REQUEST | 34) // 34\r
97\r
98#define DEBUG_COMMAND_READ_MSR (DEBUG_COMMAND_REQUEST | 35) // 35\r
99#define DEBUG_COMMAND_WRITE_MSR (DEBUG_COMMAND_REQUEST | 36) // 36\r
100\r
101#define DEBUG_COMMAND_READ_REGISTER_GROUP (DEBUG_COMMAND_REQUEST | 37) // 37\r
102\r
103#define DEBUG_COMMAND_SET_DEBUG_FLAG (DEBUG_COMMAND_REQUEST | 38) // 38\r
104\r
105#define DEBUG_COMMAND_GET_REVISION (DEBUG_COMMAND_REQUEST | 39) // 30\r
106\r
107#define DEBUG_COMMAND_GET_EXCEPTION (DEBUG_COMMAND_REQUEST | 40) // 40\r
108\r
109#define DEBUG_COMMAND_SET_VIEWPOINT (DEBUG_COMMAND_REQUEST | 41) // 41\r
110\r
111#define DEBUG_COMMAND_GET_VIEWPOINT (DEBUG_COMMAND_REQUEST | 42) // 42\r
112\r
113//\r
114// The below are target side initiated commands.\r
115//\r
116#define DEBUG_COMMAND_INIT_BREAK (DEBUG_COMMAND_REQUEST | 63) // 63\r
117#define DEBUG_COMMAND_BREAK_POINT (DEBUG_COMMAND_REQUEST | 62) // 62\r
118#define DEBUG_COMMAND_MEMORY_READY (DEBUG_COMMAND_REQUEST | 61) // 61\r
119\r
120#define DEBUG_COMMAND_OK (DEBUG_COMMAND_RESPONSE | 0)\r
121#define DEBUG_COMMAND_RESEND (DEBUG_COMMAND_RESPONSE | 1)\r
122#define DEBUG_COMMAND_ABORT (DEBUG_COMMAND_RESPONSE | 2)\r
123\r
124//\r
125// The below 2 commands are used when transferring big data (like > ~250 bytes). The sequence is:\r
126// Host Macine Target Macine\r
127// Request =>\r
128// <= IN_PROGRESS with part of the data\r
129// CONTINUE =>\r
130// (could have multiple IN_PROGRESS and CONTINUE interactions)\r
131// <= OK with the last part of data\r
132// OK (no data as ACK) =>\r
133//\r
134#define DEBUG_COMMAND_IN_PROGRESS (DEBUG_COMMAND_RESPONSE | 3) // Used when trying to\r
135#define DEBUG_COMMAND_CONTINUE (DEBUG_COMMAND_RESPONSE | 4) // Used when trying to transfer big data (like > ~250 bytes)\r
136\r
137//\r
138// 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
139// HALT_PROCESSED will be return as a possible return value for GO command, if target has a pending halt request.\r
140//\r
141#define DEBUG_COMMAND_HALT_DEFERRED (DEBUG_COMMAND_RESPONSE | 5)\r
142#define DEBUG_COMMAND_HALT_PROCESSED (DEBUG_COMMAND_RESPONSE | 6)\r
143\r
144#define DEBUG_COMMAND_NOT_SUPPORTED (DEBUG_COMMAND_RESPONSE | 15)\r
145\r
146//\r
147// Definition for data field for debug packets\r
148//\r
149#define DEBUG_DATA_MAXIMUM_LENGTH_FOR_SMALL_COMMANDS 20\r
150\r
151#define DEBUG_DATA_UPPER_LIMIT 0xff // This is the upper limit for the data size, by the limit of the packet header definition.\r
152\r
153#define DEBUG_DATA_MAXIMUM_REAL_DATA 0xf8\r
154\r
155#define DEBUG_DEFINITION_MAX_IO_LENGTH 4\r
156\r
157//\r
158// Response data for DEBUG_COMMAND_BREAK_CAUSE\r
159//\r
160typedef struct {\r
161 UINT8 Cause;\r
162 UINT64 StopAddress;\r
163} DEBUG_DATA_RESPONSE_BREAK_CAUSE;\r
164\r
165//\r
166// Break type defintions for DEBUG_DATA_BREAK_CAUSE\r
167//\r
168#define DEBUG_DATA_BREAK_CAUSE_UNKNOWN 0\r
169#define DEBUG_DATA_BREAK_CAUSE_HW_BREAKPOINT 1\r
170#define DEBUG_DATA_BREAK_CAUSE_STEPPING 2\r
171#define DEBUG_DATA_BREAK_CAUSE_SW_BREAKPOINT 3\r
172#define DEBUG_DATA_BREAK_CAUSE_USER_HALT 4\r
173#define DEBUG_DATA_BREAK_CAUSE_IMAGE_LOAD 5\r
174#define DEBUG_DATA_BREAK_CAUSE_IMAGE_UNLOAD 6\r
175#define DEBUG_DATA_BREAK_CAUSE_SYSTEM_RESET 7\r
176#define DEBUG_DATA_BREAK_CAUSE_EXCEPTION 8\r
177#define DEBUG_DATA_BREAK_CAUSE_MEMORY_READY 9\r
178\r
179//\r
180// Response data for DEBUG_COMMAND_ARCH_MODE, defined as SOFT_DEBUGGER_PROCESSOR_...\r
181//\r
182typedef struct {\r
183 UINT8 CpuMode;\r
184} DEBUG_DATA_RESPONSE_ARCH_MODE;\r
185\r
186//\r
187// Cpu architecture defintions for DEBUG_DATA_RESPONSE_ARCH_MODE\r
188//\r
189#define DEBUG_DATA_BREAK_CPU_ARCH_IA16 0\r
190#define DEBUG_DATA_BREAK_CPU_ARCH_IA32 1\r
191#define DEBUG_DATA_BREAK_CPU_ARCH_X64 2\r
192\r
193//\r
194// Command and response data for DEBUG_COMMAND_XX_YY_BREAKPOINT\r
195//\r
196typedef struct {\r
197 UINT8 Length:2; // Refer to below DEBUG_DATA_BREAKPOINT_LENGTH_XX macros\r
198 UINT8 Access:2; // Refer to below DEBUG_DATA_BREAKPOINT_ACCESS_XX macros\r
199 UINT8 Index:2; // Index of debug register\r
200 UINT8 Reserved:2;\r
201} DEBUG_DATA_BREAKPOINT_TYPE;\r
202\r
203#define DEBUG_DATA_BREAKPOINT_MEMORY_ACCESS (0x11)\r
204#define DEBUG_DATA_BREAKPOINT_IO_ACCESS (0x10)\r
205#define DEBUG_DATA_BREAKPOINT_MEMORY_WRITE (0x01)\r
206#define DEBUG_DATA_BREAKPOINT_MEMORY_EXECUTE (0x00)\r
207\r
208#define DEBUG_DATA_BREAKPOINT_LENGTH_64 (0x11)\r
209#define DEBUG_DATA_BREAKPOINT_LENGTH_32 (0x10)\r
210#define DEBUG_DATA_BREAKPOINT_LENGTH_16 (0x01)\r
211#define DEBUG_DATA_BREAKPOINT_LENGTH_8 (0x00)\r
212\r
213//\r
214// Command data for DEBUG_COMMAND_SET_HW_BREAKPOINT\r
215//\r
216typedef struct {\r
217 DEBUG_DATA_BREAKPOINT_TYPE Type;\r
218 UINT64 Address;\r
219} DEBUG_DATA_SET_HW_BREAKPOINT;\r
220\r
221//\r
222// Command data for DEBUG_COMMAND_CLEAR_HW_BREAKPOINT\r
223//\r
224typedef struct {\r
225 UINT8 IndexMask; // 0x0f will clear all hw breakpoints\r
226} DEBUG_DATA_CLEAR_HW_BREAKPOINT;\r
227\r
228//\r
229// Command data for DEBUG_COMMAND_SET_SW_BREAKPOINT\r
230//\r
231typedef struct {\r
232 UINT64 Address;\r
233} DEBUG_DATA_SET_SW_BREAKPOINT;\r
234\r
235//\r
236// Response data for DEBUG_COMMAND_SET_SW_BREAKPOINT\r
237//\r
238typedef struct {\r
239 UINT8 OriginalData;\r
240} DEBUG_DATA_RESPONSE_SET_SW_BREAKPOINT;\r
241\r
242//\r
243// Command data for DEBUG_COMMAND_CLEAR_SW_BREAKPOINT\r
244//\r
245typedef DEBUG_DATA_SET_SW_BREAKPOINT DEBUG_DATA_CLEAR_SW_BREAKPOINT;\r
246\r
247//\r
248// Command data for DEBUG_COMMAND_READ_MEMORY_XX\r
249//\r
250typedef struct {\r
251 UINT64 Address;\r
252 UINT16 Count;\r
253} DEBUG_DATA_READ_MEMORY_8;\r
254\r
255typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_16;\r
256\r
257typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_32;\r
258\r
259typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_64;\r
260\r
261//\r
262// Command data for DEBUG_COMMAND_WRITE_MEMORY_XX\r
263//\r
264typedef struct {\r
265 UINT64 Address;\r
266 UINT16 Count;\r
267 UINT8 Data; // The actual length for this field is decided by Width x Count\r
268} DEBUG_DATA_WRITE_MEMORY_8;\r
269\r
270typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_16;\r
271\r
272typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_32;\r
273\r
274typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_64;\r
275\r
276//\r
277// Command data for DEBUG_COMMAND_READ_IO\r
278//\r
279typedef struct {\r
280 UINT16 Port;\r
281 UINT8 Width;\r
282} DEBUG_DATA_READ_IO;\r
283\r
284//\r
285// Response data for DEBUG_COMMAND_READ_IO\r
286//\r
287typedef struct {\r
288 UINT8 Data; // The actual length of this structure will be adjusted according to the Width field\r
289} DEBUG_DATA_RESPONSE_READ_IO;\r
290\r
291//\r
292// Command data for DEBUG_COMMAND_WRITE_IO\r
293//\r
294typedef struct {\r
295 UINT16 Port;\r
296 UINT8 Width;\r
297 UINT8 Data; // The actual length of this structure will be adjusted according to the Width field\r
298} DEBUG_DATA_WRITE_IO;\r
299\r
300//\r
301// Command data for DEBUG_COMMAND_READ_REGISTER\r
302//\r
303typedef struct {\r
304 UINT8 Index; // defined as DEBUG_DEFINITION_REGISTER_XX\r
305 UINT8 Offset:4;\r
306 UINT8 Length:4;\r
307} DEBUG_DATA_READ_REGISTER;\r
308\r
309//\r
310// Command data for DEBUG_COMMAND_WRITE_REGISTER\r
311//\r
312typedef struct {\r
313 UINT8 Index; // defined as DEBUG_DEFINITION_REGISTER_XX\r
314 UINT8 Offset:4;\r
315 UINT8 Length:4;\r
316 UINT64 Value;\r
317} DEBUG_DATA_WRITE_REGISTER;\r
318\r
319//\r
320// Command data for DEBUG_COMMAND_READ_MSR\r
321//\r
322typedef struct {\r
323 UINT32 Index;\r
324} DEBUG_DATA_READ_MSR;\r
325\r
326//\r
327// Response data for DEBUG_COMMAND_READ_MSR\r
328//\r
329typedef struct {\r
330 UINT64 Value;\r
331} DEBUG_DATA_RESPONSE_READ_MSR;\r
332\r
333//\r
334// Command data for DEBUG_COMMAND_WRITE_MSR\r
335//\r
336typedef struct {\r
337 UINT32 Index;\r
338 UINT64 Value;\r
339} DEBUG_DATA_WRITE_MSR;\r
340\r
341//\r
342// Command data for DEBUG_COMMAND_READ_REGISTER_GROUP\r
343//\r
344typedef struct {\r
345 // For possible values, refer to the definition for DEBUG_DEFINITION_REGISTER_GROUP_XXX (in another .h file as it is architecture specific)\r
346 UINT8 Index;\r
347} DEBUG_DATA_READ_REGISTER_GROUP;\r
348\r
349//\r
350// Response data for DEBUG_COMMAND_GET_REVISION\r
351//\r
352typedef struct {\r
353 UINT32 Revision;\r
354 UINT32 Capabilities;\r
355} DEBUG_DATA_RESPONSE_GET_REVISION;\r
356\r
357//\r
358// Response data for DEBUG_COMMAND_GET_EXCEPTION\r
359//\r
360typedef struct {\r
361 UINT8 ExceptionNum;\r
362 UINT64 ExceptionData;\r
363} DEBUG_DATA_RESPONSE_GET_EXCEPTION;\r
364\r
365typedef struct {\r
366 UINT8 DRn; // The index of DR register which to be used as temporary breakpoint\r
367} DEBUG_DATA_STEP_OVER;\r
368\r
369//\r
370// Command data for DEBUG_COMMAND_SET_DEBUG_FLAG\r
371//\r
372typedef struct {\r
373 UINT32 DebugFlag; // The index of DR register which to be used as temporary breakpoint\r
374} DEBUG_DATA_SET_DEBUG_FLAG;\r
375\r
376//\r
377// Command data for DEBUG_COMMAND_SET_VIEWPOINT\r
378// If viewpoint is changed successfully, DEBUG_COMMAND_OK will be returned.\r
379// If viewpoint is not availabe, DEBUG_COMMAND_NOT_SUPPORTED will be returned.\r
380//\r
381typedef struct {\r
382 UINT32 ViewPoint; // The index of viewpoint will be set\r
383} DEBUG_DATA_SET_VIEWPOINT;\r
384\r
385//\r
386// Response data for DEBUG_COMMAND_GET_VIEWPOINT\r
387//\r
388typedef struct {\r
389 UINT32 ViewPoint; // The index of viewpoint will be returned\r
390} DEBUG_DATA_RESPONSE_GET_VIEWPOINT;\r
391\r
392#pragma pack()\r
393\r
394#define DEBUG_PACKET_CONSTRUCTOR_WITH_NO_DATA(DebugPacket,ShortCommandType) \\r
395 ((DEBUG_COMMAND_HEADER *)DebugPacket)->StartSymbol = DEBUG_STARTING_SYMBOL_NORMAL; \\r
396 ((DEBUG_COMMAND_HEADER *)DebugPacket)->Command = DEBUG_COMMAND_##ShortCommandType; \\r
397 ((DEBUG_COMMAND_HEADER *)DebugPacket)->DataLength = 0;\r
398\r
399#define DEBUG_PACKET_CONSTRUCTOR_WITH_DATA(DebugPacket,ShortCommandType, DebugPacketDataPointer, PacketLength) \\r
400 ((DEBUG_COMMAND_HEADER *)DebugPacket)->StartSymbol = DEBUG_STARTING_SYMBOL_NORMAL; \\r
401 ((DEBUG_COMMAND_HEADER *)DebugPacket)->Command = DEBUG_COMMAND_##ShortCommandType; \\r
402 ((DEBUG_COMMAND_HEADER *)DebugPacket)->DataLength = sizeof (DEBUG_DATA_##ShortCommandType); \\r
403 *DebugPacketDataPointer = (DEBUG_DATA_##ShortCommandType *)((DEBUG_COMMAND_HEADER *)DebugPacket+1); \\r
404 *PacketLength = sizeof (DEBUG_COMMAND_HEADER) + sizeof (DEBUG_DATA_##ShortCommandType);\r
405\r
406#endif\r
407\r