]> git.proxmox.com Git - mirror_edk2.git/blame - SourceLevelDebugPkg/Include/TransferProtocol.h
Fix port retry behavior during connect - All port error paths exit through ConnectCom...
[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
b4ebbaff 5 Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>\r
18b144ea 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
e2104834 105#define DEBUG_COMMAND_GET_REVISION (DEBUG_COMMAND_REQUEST | 39) // 39\r
18b144ea 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
b4ebbaff 144#define DEBUG_COMMAND_TIMEOUT (DEBUG_COMMAND_RESPONSE | 7)\r
18b144ea 145#define DEBUG_COMMAND_NOT_SUPPORTED (DEBUG_COMMAND_RESPONSE | 15)\r
146\r
147//\r
148// Definition for data field for debug packets\r
149//\r
150#define DEBUG_DATA_MAXIMUM_LENGTH_FOR_SMALL_COMMANDS 20\r
151\r
152#define DEBUG_DATA_UPPER_LIMIT 0xff // This is the upper limit for the data size, by the limit of the packet header definition.\r
153\r
154#define DEBUG_DATA_MAXIMUM_REAL_DATA 0xf8\r
155\r
156#define DEBUG_DEFINITION_MAX_IO_LENGTH 4\r
157\r
158//\r
159// Response data for DEBUG_COMMAND_BREAK_CAUSE\r
160//\r
161typedef struct {\r
162 UINT8 Cause;\r
163 UINT64 StopAddress;\r
164} DEBUG_DATA_RESPONSE_BREAK_CAUSE;\r
165\r
166//\r
167// Break type defintions for DEBUG_DATA_BREAK_CAUSE\r
168//\r
169#define DEBUG_DATA_BREAK_CAUSE_UNKNOWN 0\r
170#define DEBUG_DATA_BREAK_CAUSE_HW_BREAKPOINT 1\r
171#define DEBUG_DATA_BREAK_CAUSE_STEPPING 2\r
172#define DEBUG_DATA_BREAK_CAUSE_SW_BREAKPOINT 3\r
173#define DEBUG_DATA_BREAK_CAUSE_USER_HALT 4\r
174#define DEBUG_DATA_BREAK_CAUSE_IMAGE_LOAD 5\r
175#define DEBUG_DATA_BREAK_CAUSE_IMAGE_UNLOAD 6\r
176#define DEBUG_DATA_BREAK_CAUSE_SYSTEM_RESET 7\r
177#define DEBUG_DATA_BREAK_CAUSE_EXCEPTION 8\r
178#define DEBUG_DATA_BREAK_CAUSE_MEMORY_READY 9\r
179\r
180//\r
181// Response data for DEBUG_COMMAND_ARCH_MODE, defined as SOFT_DEBUGGER_PROCESSOR_...\r
182//\r
183typedef struct {\r
184 UINT8 CpuMode;\r
185} DEBUG_DATA_RESPONSE_ARCH_MODE;\r
186\r
187//\r
188// Cpu architecture defintions for DEBUG_DATA_RESPONSE_ARCH_MODE\r
189//\r
190#define DEBUG_DATA_BREAK_CPU_ARCH_IA16 0\r
191#define DEBUG_DATA_BREAK_CPU_ARCH_IA32 1\r
192#define DEBUG_DATA_BREAK_CPU_ARCH_X64 2\r
193\r
194//\r
195// Command and response data for DEBUG_COMMAND_XX_YY_BREAKPOINT\r
196//\r
197typedef struct {\r
198 UINT8 Length:2; // Refer to below DEBUG_DATA_BREAKPOINT_LENGTH_XX macros\r
199 UINT8 Access:2; // Refer to below DEBUG_DATA_BREAKPOINT_ACCESS_XX macros\r
200 UINT8 Index:2; // Index of debug register\r
201 UINT8 Reserved:2;\r
202} DEBUG_DATA_BREAKPOINT_TYPE;\r
203\r
204#define DEBUG_DATA_BREAKPOINT_MEMORY_ACCESS (0x11)\r
205#define DEBUG_DATA_BREAKPOINT_IO_ACCESS (0x10)\r
206#define DEBUG_DATA_BREAKPOINT_MEMORY_WRITE (0x01)\r
207#define DEBUG_DATA_BREAKPOINT_MEMORY_EXECUTE (0x00)\r
208\r
209#define DEBUG_DATA_BREAKPOINT_LENGTH_64 (0x11)\r
210#define DEBUG_DATA_BREAKPOINT_LENGTH_32 (0x10)\r
211#define DEBUG_DATA_BREAKPOINT_LENGTH_16 (0x01)\r
212#define DEBUG_DATA_BREAKPOINT_LENGTH_8 (0x00)\r
213\r
214//\r
215// Command data for DEBUG_COMMAND_SET_HW_BREAKPOINT\r
216//\r
217typedef struct {\r
218 DEBUG_DATA_BREAKPOINT_TYPE Type;\r
219 UINT64 Address;\r
220} DEBUG_DATA_SET_HW_BREAKPOINT;\r
221\r
222//\r
223// Command data for DEBUG_COMMAND_CLEAR_HW_BREAKPOINT\r
224//\r
225typedef struct {\r
226 UINT8 IndexMask; // 0x0f will clear all hw breakpoints\r
227} DEBUG_DATA_CLEAR_HW_BREAKPOINT;\r
228\r
229//\r
230// Command data for DEBUG_COMMAND_SET_SW_BREAKPOINT\r
231//\r
232typedef struct {\r
233 UINT64 Address;\r
234} DEBUG_DATA_SET_SW_BREAKPOINT;\r
235\r
236//\r
237// Response data for DEBUG_COMMAND_SET_SW_BREAKPOINT\r
238//\r
239typedef struct {\r
240 UINT8 OriginalData;\r
241} DEBUG_DATA_RESPONSE_SET_SW_BREAKPOINT;\r
242\r
243//\r
244// Command data for DEBUG_COMMAND_CLEAR_SW_BREAKPOINT\r
245//\r
246typedef DEBUG_DATA_SET_SW_BREAKPOINT DEBUG_DATA_CLEAR_SW_BREAKPOINT;\r
247\r
248//\r
249// Command data for DEBUG_COMMAND_READ_MEMORY_XX\r
250//\r
251typedef struct {\r
252 UINT64 Address;\r
253 UINT16 Count;\r
254} DEBUG_DATA_READ_MEMORY_8;\r
255\r
256typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_16;\r
257\r
258typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_32;\r
259\r
260typedef DEBUG_DATA_READ_MEMORY_8 DEBUG_DATA_READ_MEMORY_64;\r
261\r
262//\r
263// Command data for DEBUG_COMMAND_WRITE_MEMORY_XX\r
264//\r
265typedef struct {\r
266 UINT64 Address;\r
267 UINT16 Count;\r
268 UINT8 Data; // The actual length for this field is decided by Width x Count\r
269} DEBUG_DATA_WRITE_MEMORY_8;\r
270\r
271typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_16;\r
272\r
273typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_32;\r
274\r
275typedef DEBUG_DATA_WRITE_MEMORY_8 DEBUG_DATA_WRITE_MEMORY_64;\r
276\r
277//\r
278// Command data for DEBUG_COMMAND_READ_IO\r
279//\r
280typedef struct {\r
281 UINT16 Port;\r
282 UINT8 Width;\r
283} DEBUG_DATA_READ_IO;\r
284\r
285//\r
286// Response data for DEBUG_COMMAND_READ_IO\r
287//\r
288typedef struct {\r
289 UINT8 Data; // The actual length of this structure will be adjusted according to the Width field\r
290} DEBUG_DATA_RESPONSE_READ_IO;\r
291\r
292//\r
293// Command data for DEBUG_COMMAND_WRITE_IO\r
294//\r
295typedef struct {\r
296 UINT16 Port;\r
297 UINT8 Width;\r
298 UINT8 Data; // The actual length of this structure will be adjusted according to the Width field\r
299} DEBUG_DATA_WRITE_IO;\r
300\r
301//\r
302// Command data for DEBUG_COMMAND_READ_REGISTER\r
303//\r
304typedef struct {\r
305 UINT8 Index; // defined as DEBUG_DEFINITION_REGISTER_XX\r
306 UINT8 Offset:4;\r
307 UINT8 Length:4;\r
308} DEBUG_DATA_READ_REGISTER;\r
309\r
310//\r
311// Command data for DEBUG_COMMAND_WRITE_REGISTER\r
312//\r
313typedef struct {\r
314 UINT8 Index; // defined as DEBUG_DEFINITION_REGISTER_XX\r
315 UINT8 Offset:4;\r
316 UINT8 Length:4;\r
317 UINT64 Value;\r
318} DEBUG_DATA_WRITE_REGISTER;\r
319\r
320//\r
321// Command data for DEBUG_COMMAND_READ_MSR\r
322//\r
323typedef struct {\r
324 UINT32 Index;\r
325} DEBUG_DATA_READ_MSR;\r
326\r
327//\r
328// Response data for DEBUG_COMMAND_READ_MSR\r
329//\r
330typedef struct {\r
331 UINT64 Value;\r
332} DEBUG_DATA_RESPONSE_READ_MSR;\r
333\r
334//\r
335// Command data for DEBUG_COMMAND_WRITE_MSR\r
336//\r
337typedef struct {\r
338 UINT32 Index;\r
339 UINT64 Value;\r
340} DEBUG_DATA_WRITE_MSR;\r
341\r
342//\r
343// Command data for DEBUG_COMMAND_READ_REGISTER_GROUP\r
344//\r
345typedef struct {\r
346 // For possible values, refer to the definition for DEBUG_DEFINITION_REGISTER_GROUP_XXX (in another .h file as it is architecture specific)\r
347 UINT8 Index;\r
348} DEBUG_DATA_READ_REGISTER_GROUP;\r
349\r
350//\r
351// Response data for DEBUG_COMMAND_GET_REVISION\r
352//\r
353typedef struct {\r
354 UINT32 Revision;\r
355 UINT32 Capabilities;\r
356} DEBUG_DATA_RESPONSE_GET_REVISION;\r
357\r
358//\r
359// Response data for DEBUG_COMMAND_GET_EXCEPTION\r
360//\r
361typedef struct {\r
362 UINT8 ExceptionNum;\r
363 UINT64 ExceptionData;\r
364} DEBUG_DATA_RESPONSE_GET_EXCEPTION;\r
365\r
366typedef struct {\r
367 UINT8 DRn; // The index of DR register which to be used as temporary breakpoint\r
368} DEBUG_DATA_STEP_OVER;\r
369\r
370//\r
371// Command data for DEBUG_COMMAND_SET_DEBUG_FLAG\r
372//\r
373typedef struct {\r
374 UINT32 DebugFlag; // The index of DR register which to be used as temporary breakpoint\r
375} DEBUG_DATA_SET_DEBUG_FLAG;\r
376\r
377//\r
378// Command data for DEBUG_COMMAND_SET_VIEWPOINT\r
379// If viewpoint is changed successfully, DEBUG_COMMAND_OK will be returned.\r
380// If viewpoint is not availabe, DEBUG_COMMAND_NOT_SUPPORTED will be returned.\r
381//\r
382typedef struct {\r
383 UINT32 ViewPoint; // The index of viewpoint will be set\r
384} DEBUG_DATA_SET_VIEWPOINT;\r
385\r
386//\r
387// Response data for DEBUG_COMMAND_GET_VIEWPOINT\r
388//\r
389typedef struct {\r
390 UINT32 ViewPoint; // The index of viewpoint will be returned\r
391} DEBUG_DATA_RESPONSE_GET_VIEWPOINT;\r
392\r
393#pragma pack()\r
394\r
395#define DEBUG_PACKET_CONSTRUCTOR_WITH_NO_DATA(DebugPacket,ShortCommandType) \\r
396 ((DEBUG_COMMAND_HEADER *)DebugPacket)->StartSymbol = DEBUG_STARTING_SYMBOL_NORMAL; \\r
397 ((DEBUG_COMMAND_HEADER *)DebugPacket)->Command = DEBUG_COMMAND_##ShortCommandType; \\r
398 ((DEBUG_COMMAND_HEADER *)DebugPacket)->DataLength = 0;\r
399\r
400#define DEBUG_PACKET_CONSTRUCTOR_WITH_DATA(DebugPacket,ShortCommandType, DebugPacketDataPointer, PacketLength) \\r
401 ((DEBUG_COMMAND_HEADER *)DebugPacket)->StartSymbol = DEBUG_STARTING_SYMBOL_NORMAL; \\r
402 ((DEBUG_COMMAND_HEADER *)DebugPacket)->Command = DEBUG_COMMAND_##ShortCommandType; \\r
403 ((DEBUG_COMMAND_HEADER *)DebugPacket)->DataLength = sizeof (DEBUG_DATA_##ShortCommandType); \\r
404 *DebugPacketDataPointer = (DEBUG_DATA_##ShortCommandType *)((DEBUG_COMMAND_HEADER *)DebugPacket+1); \\r
405 *PacketLength = sizeof (DEBUG_COMMAND_HEADER) + sizeof (DEBUG_DATA_##ShortCommandType);\r
406\r
407#endif\r
408\r