]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdMemory.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbCmdMemory.c
CommitLineData
e8a5ac7c 1/** @file\r
748edcd5 2\r
e8a5ac7c 3Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
9d510e61 4SPDX-License-Identifier: BSD-2-Clause-Patent\r
748edcd5 5\r
748edcd5 6\r
e8a5ac7c 7**/\r
748edcd5 8\r
e8a5ac7c 9#include "Edb.h"\r
748edcd5
PB
10\r
11\r
e8a5ac7c 12/**\r
748edcd5 13\r
e8a5ac7c
DB
14 Display memory unit.\r
15\r
16 @param Address - Memory Address\r
17 @param Width - Memory Width\r
748edcd5 18\r
e8a5ac7c
DB
19 @return Length of the memory unit\r
20\r
21**/\r
748edcd5
PB
22UINTN\r
23EdbDisplayMemoryUnit (\r
24 IN UINTN Address,\r
25 IN EDB_DATA_WIDTH Width\r
26 )\r
748edcd5
PB
27{\r
28 UINT8 Data8;\r
29 UINT16 Data16;\r
30 UINT32 Data32;\r
31 UINT64 Data64;\r
32\r
33 //\r
24648548 34 // Print according to width\r
748edcd5
PB
35 //\r
36 switch (Width) {\r
37 case EdbWidthUint8:\r
38 CopyMem (&Data8, (VOID *)Address, sizeof(UINT8));\r
39 EDBPrint (L"%02x ", Data8);\r
40 return sizeof(UINT8);\r
41 case EdbWidthUint16:\r
42 CopyMem (&Data16, (VOID *)Address, sizeof(UINT16));\r
43 EDBPrint (L"%04x ", Data16);\r
44 return sizeof(UINT16);\r
45 case EdbWidthUint32:\r
46 CopyMem (&Data32, (VOID *)Address, sizeof(UINT32));\r
47 EDBPrint (L"%08x ", Data32);\r
48 return sizeof(UINT32);\r
49 case EdbWidthUint64:\r
50 CopyMem (&Data64, (VOID *)Address, sizeof(UINT64));\r
51 EDBPrint (L"%016lx ", Data64);\r
52 return sizeof(UINT64);\r
53 default:\r
54 ASSERT (FALSE);\r
55 break;\r
56 }\r
57\r
58 //\r
59 // something wrong\r
60 //\r
61 return 0;\r
62}\r
63\r
e8a5ac7c
DB
64/**\r
65\r
66 Display memory.\r
67\r
68 @param Address - Memory Address\r
69 @param Count - Memory Count\r
70 @param Width - Memory Width\r
71\r
72**/\r
748edcd5
PB
73VOID\r
74EdbDisplayMemory (\r
75 IN UINTN Address,\r
76 IN UINTN Count,\r
77 IN EDB_DATA_WIDTH Width\r
78 )\r
748edcd5
PB
79{\r
80 UINTN LineNumber;\r
81 UINTN ByteNumber;\r
82 UINTN LineIndex;\r
83 UINTN ByteIndex;\r
84 UINTN NumberInLine;\r
85\r
86 if (Count == 0) {\r
87 return ;\r
88 }\r
89\r
90 //\r
91 // Get line number and byte number\r
92 //\r
93 switch (Width) {\r
94 case EdbWidthUint8:\r
95 NumberInLine = 16;\r
96 break;\r
97 case EdbWidthUint16:\r
98 NumberInLine = 8;\r
99 break;\r
100 case EdbWidthUint32:\r
101 NumberInLine = 4;\r
102 break;\r
103 case EdbWidthUint64:\r
104 NumberInLine = 2;\r
105 break;\r
106 default:\r
107 return;\r
108 }\r
109\r
110 LineNumber = Count / NumberInLine;\r
111 ByteNumber = Count % NumberInLine;\r
112 if (ByteNumber == 0) {\r
113 LineNumber -= 1;\r
114 ByteNumber = NumberInLine;\r
115 }\r
116\r
117 //\r
118 // Print each line\r
119 //\r
120 for (LineIndex = 0; LineIndex < LineNumber; LineIndex++) {\r
121\r
122 //\r
123 // Break check\r
124 //\r
125 if (((LineIndex % EFI_DEBUGGER_LINE_NUMBER_IN_PAGE) == 0) &&\r
126 (LineIndex != 0)) {\r
127 if (SetPageBreak ()) {\r
128 break;\r
129 }\r
130 }\r
131\r
132 EDBPrint (EDB_PRINT_ADDRESS_FORMAT, (UINTN)Address);\r
133 for (ByteIndex = 0; ByteIndex < NumberInLine; ByteIndex++) {\r
134 Address += EdbDisplayMemoryUnit (Address, Width);\r
135 }\r
136 EDBPrint (L"\n");\r
137 }\r
138\r
139 //\r
140 // Break check\r
141 //\r
142 if (((LineIndex % EFI_DEBUGGER_LINE_NUMBER_IN_PAGE) == 0) &&\r
143 (LineIndex != 0)) {\r
144 if (SetPageBreak ()) {\r
145 return;\r
146 }\r
147 }\r
148\r
149 //\r
150 // Print last line\r
151 //\r
152 EDBPrint (EDB_PRINT_ADDRESS_FORMAT, (UINTN)Address);\r
153 for (ByteIndex = 0; ByteIndex < ByteNumber; ByteIndex++) {\r
154 Address += EdbDisplayMemoryUnit (Address, Width);\r
155 }\r
156\r
157 return ;\r
158}\r
159\r
e8a5ac7c
DB
160/**\r
161\r
162 Entry memory.\r
163\r
164 @param Address - Memory Address\r
165 @param Value - Memory Value\r
166 @param Width - Memory Width\r
167\r
168**/\r
748edcd5
PB
169VOID\r
170EdbEnterMemory (\r
171 IN UINTN Address,\r
172 IN VOID *Value,\r
173 IN EDB_DATA_WIDTH Width\r
174 )\r
748edcd5
PB
175{\r
176 switch (Width) {\r
177 case EdbWidthUint8:\r
178 CopyMem ((VOID *)Address, Value, sizeof(UINT8));\r
179 break;\r
180 case EdbWidthUint16:\r
181 CopyMem ((VOID *)Address, Value, sizeof(UINT16));\r
182 break;\r
183 case EdbWidthUint32:\r
184 CopyMem ((VOID *)Address, Value, sizeof(UINT32));\r
185 break;\r
186 case EdbWidthUint64:\r
187 CopyMem ((VOID *)Address, Value, sizeof(UINT64));\r
188 break;\r
189 default:\r
190 break;\r
191 }\r
192\r
193 return ;\r
194}\r
195\r
e8a5ac7c
DB
196/**\r
197\r
198 Get memory address and count.\r
199\r
200 @param CommandArg - The argument for this command\r
201 @param Address - Memory Address\r
202 @param Count - Memory Count\r
203\r
204 @retval EFI_SUCCESS - memory address and count are got\r
205 @retval EFI_INVALID_PARAMETER - something wrong\r
206\r
207**/\r
748edcd5
PB
208EFI_STATUS\r
209EdbGetMemoryAddressCount (\r
210 IN CHAR16 *CommandArg,\r
211 IN UINTN *Address,\r
212 IN UINTN *Count\r
213 )\r
748edcd5
PB
214{\r
215 CHAR16 *CommandStr;\r
216 UINTN MemAddress;\r
217 EFI_STATUS Status;\r
218\r
219 //\r
220 // Get Address\r
221 //\r
222 CommandStr = CommandArg;\r
223 if (CommandStr == NULL) {\r
224 EDBPrint (L"Memory: Address error!\n");\r
225 return EFI_INVALID_PARAMETER;\r
226 }\r
227 Status = Symboltoi (CommandStr, &MemAddress);\r
228 if (EFI_ERROR (Status)) {\r
229 if (Status == EFI_NOT_FOUND) {\r
230 MemAddress = Xtoi(CommandStr);\r
231 } else {\r
232 //\r
233 // Something wrong, let Symboltoi print error info.\r
234 //\r
235 EDBPrint (L"Command Argument error!\n");\r
236 return EFI_INVALID_PARAMETER;\r
237 }\r
238 }\r
239 *Address = MemAddress;\r
240\r
241 //\r
242 // Get Count\r
243 //\r
244 CommandStr = StrGetNextTokenLine (L" ");\r
245 if (CommandStr == NULL) {\r
246 *Count = 1;\r
247 } else {\r
248 *Count = Xtoi(CommandStr);\r
249 }\r
250\r
251 //\r
252 // Done\r
253 //\r
254 return EFI_SUCCESS;\r
255}\r
256\r
e8a5ac7c
DB
257/**\r
258\r
259 Get memory address and value.\r
260\r
261 @param CommandArg - The argument for this command\r
262 @param Address - Memory Address\r
263 @param Value - Memory Value\r
264\r
265 @retval EFI_SUCCESS - memory address and value are got\r
266 @retval EFI_INVALID_PARAMETER - something wrong\r
267\r
268**/\r
748edcd5
PB
269EFI_STATUS\r
270EdbGetMemoryAddressValue (\r
271 IN CHAR16 *CommandArg,\r
272 IN UINTN *Address,\r
273 IN UINT64 *Value\r
274 )\r
748edcd5
PB
275{\r
276 CHAR16 *CommandStr;\r
277 UINTN MemAddress;\r
278 EFI_STATUS Status;\r
279\r
280 //\r
281 // Get Address\r
282 //\r
283 CommandStr = CommandArg;\r
284 if (CommandStr == NULL) {\r
285 EDBPrint (L"Memory: Address error!\n");\r
286 return EFI_INVALID_PARAMETER;\r
287 }\r
288 Status = Symboltoi (CommandStr, &MemAddress);\r
289 if (EFI_ERROR (Status)) {\r
290 if (Status == EFI_NOT_FOUND) {\r
291 MemAddress = Xtoi(CommandStr);\r
292 } else {\r
293 //\r
294 // Something wrong, let Symboltoi print error info.\r
295 //\r
296 EDBPrint (L"Command Argument error!\n");\r
297 return EFI_INVALID_PARAMETER;\r
298 }\r
299 }\r
300 *Address = MemAddress;\r
301\r
302 //\r
303 // Get Value\r
304 //\r
305 CommandStr = StrGetNextTokenLine (L" ");\r
306 if (CommandStr == NULL) {\r
307 EDBPrint (L"Memory: Value error!\n");\r
308 return EFI_INVALID_PARAMETER;\r
309 }\r
310 *Value = LXtoi(CommandStr);\r
311\r
312 //\r
313 // Done\r
314 //\r
315 return EFI_SUCCESS;\r
316}\r
317\r
e8a5ac7c
DB
318/**\r
319\r
320 Display memory.\r
321\r
322 @param CommandArg - The argument for this command\r
323 @param Width - Memory Width\r
324\r
325 @retval EFI_DEBUG_RETURN - formal return value\r
326\r
327**/\r
748edcd5
PB
328EFI_DEBUG_STATUS\r
329DebuggerMemoryDisplay (\r
330 IN CHAR16 *CommandArg,\r
331 IN EDB_DATA_WIDTH Width\r
332 )\r
748edcd5
PB
333{\r
334 EFI_STATUS Status;\r
335 UINTN Address;\r
336 UINTN Count;\r
337\r
338 //\r
339 // Get memory address and count\r
340 //\r
341 Status = EdbGetMemoryAddressCount (CommandArg, &Address, &Count);\r
342 if (EFI_ERROR(Status)) {\r
343 return EFI_DEBUG_CONTINUE;\r
344 }\r
345\r
346 //\r
347 // Display memory\r
348 //\r
349 EdbDisplayMemory (Address, Count, Width);\r
350\r
351 //\r
352 // Done\r
353 //\r
354 return EFI_DEBUG_CONTINUE;\r
355}\r
356\r
e8a5ac7c
DB
357/**\r
358\r
359 Enter memory.\r
360\r
361 @param CommandArg - The argument for this command\r
362 @param Width - Memory Width\r
363\r
364 @retval EFI_DEBUG_RETURN - formal return value\r
365\r
366**/\r
748edcd5
PB
367EFI_DEBUG_STATUS\r
368DebuggerMemoryEnter (\r
369 IN CHAR16 *CommandArg,\r
370 IN EDB_DATA_WIDTH Width\r
371 )\r
748edcd5
PB
372{\r
373 EFI_STATUS Status;\r
374 UINTN Address;\r
375 UINT64 Value;\r
376\r
377 //\r
378 // Get memory address and value\r
379 //\r
380 Status = EdbGetMemoryAddressValue (CommandArg, &Address, &Value);\r
381 if (EFI_ERROR(Status)) {\r
382 return EFI_DEBUG_CONTINUE;\r
383 }\r
384\r
385 //\r
386 // Enter memory\r
387 //\r
388 EdbEnterMemory (Address, &Value, Width);\r
389\r
390 //\r
391 // Done\r
392 //\r
393 return EFI_DEBUG_CONTINUE;\r
394}\r
395\r
e8a5ac7c
DB
396/**\r
397\r
398 DebuggerCommand - DB.\r
399\r
400 @param CommandArg - The argument for this command\r
401 @param DebuggerPrivate - EBC Debugger private data structure\r
402 @param ExceptionType - Interrupt type.\r
403 @param SystemContext - EBC system context.\r
404\r
405 @retval EFI_DEBUG_RETURN - formal return value\r
406\r
407**/\r
748edcd5
PB
408EFI_DEBUG_STATUS\r
409DebuggerMemoryDB (\r
410 IN CHAR16 *CommandArg,\r
411 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
412 IN EFI_EXCEPTION_TYPE ExceptionType,\r
413 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
414 )\r
e8a5ac7c
DB
415{\r
416 return DebuggerMemoryDisplay (CommandArg, EdbWidthUint8);\r
417}\r
748edcd5 418\r
e8a5ac7c 419/**\r
748edcd5 420\r
e8a5ac7c 421 DebuggerCommand - DW.\r
748edcd5 422\r
e8a5ac7c
DB
423 @param CommandArg - The argument for this command\r
424 @param DebuggerPrivate - EBC Debugger private data structure\r
425 @param ExceptionType - Interrupt type.\r
426 @param SystemContext - EBC system context.\r
748edcd5 427\r
e8a5ac7c 428 @retval EFI_DEBUG_RETURN - formal return value\r
748edcd5 429\r
e8a5ac7c 430**/\r
748edcd5
PB
431EFI_DEBUG_STATUS\r
432DebuggerMemoryDW (\r
433 IN CHAR16 *CommandArg,\r
434 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
435 IN EFI_EXCEPTION_TYPE ExceptionType,\r
436 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
437 )\r
e8a5ac7c
DB
438{\r
439 return DebuggerMemoryDisplay (CommandArg, EdbWidthUint16);\r
440}\r
748edcd5 441\r
e8a5ac7c 442/**\r
748edcd5 443\r
e8a5ac7c 444 DebuggerCommand - DD.\r
748edcd5 445\r
e8a5ac7c
DB
446 @param CommandArg - The argument for this command\r
447 @param DebuggerPrivate - EBC Debugger private data structure\r
448 @param ExceptionType - Interrupt type.\r
449 @param SystemContext - EBC system context.\r
748edcd5 450\r
e8a5ac7c 451 @retval EFI_DEBUG_RETURN - formal return value\r
748edcd5 452\r
e8a5ac7c 453**/\r
748edcd5
PB
454EFI_DEBUG_STATUS\r
455DebuggerMemoryDD (\r
456 IN CHAR16 *CommandArg,\r
457 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
458 IN EFI_EXCEPTION_TYPE ExceptionType,\r
459 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
460 )\r
e8a5ac7c
DB
461{\r
462 return DebuggerMemoryDisplay (CommandArg, EdbWidthUint32);\r
463}\r
748edcd5 464\r
e8a5ac7c 465/**\r
748edcd5 466\r
e8a5ac7c 467 DebuggerCommand - DQ.\r
748edcd5 468\r
e8a5ac7c
DB
469 @param CommandArg - The argument for this command\r
470 @param DebuggerPrivate - EBC Debugger private data structure\r
471 @param ExceptionType - Exception type.\r
472 @param SystemContext - EBC system context.\r
748edcd5 473\r
e8a5ac7c 474 @retval EFI_DEBUG_RETURN - formal return value\r
748edcd5 475\r
e8a5ac7c 476**/\r
748edcd5
PB
477EFI_DEBUG_STATUS\r
478DebuggerMemoryDQ (\r
479 IN CHAR16 *CommandArg,\r
480 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
481 IN EFI_EXCEPTION_TYPE ExceptionType,\r
482 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
483 )\r
e8a5ac7c
DB
484{\r
485 return DebuggerMemoryDisplay (CommandArg, EdbWidthUint64);\r
486}\r
748edcd5 487\r
e8a5ac7c 488/**\r
748edcd5 489\r
e8a5ac7c 490 DebuggerCommand - EB.\r
748edcd5 491\r
e8a5ac7c
DB
492 @param CommandArg - The argument for this command\r
493 @param DebuggerPrivate - EBC Debugger private data structure\r
494 @param ExceptionType - Exception type.\r
495 @param SystemContext - EBC system context.\r
748edcd5 496\r
e8a5ac7c 497 @retval EFI_DEBUG_RETURN - formal return value\r
748edcd5 498\r
e8a5ac7c 499**/\r
748edcd5
PB
500EFI_DEBUG_STATUS\r
501DebuggerMemoryEB (\r
502 IN CHAR16 *CommandArg,\r
503 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
504 IN EFI_EXCEPTION_TYPE ExceptionType,\r
505 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
506 )\r
e8a5ac7c
DB
507{\r
508 return DebuggerMemoryEnter (CommandArg, EdbWidthUint8);\r
509}\r
748edcd5 510\r
e8a5ac7c 511/**\r
748edcd5 512\r
e8a5ac7c 513 DebuggerCommand - EW.\r
748edcd5 514\r
e8a5ac7c
DB
515 @param CommandArg - The argument for this command\r
516 @param DebuggerPrivate - EBC Debugger private data structure\r
517 @param ExceptionType - Interrupt type.\r
518 @param SystemContext - EBC system context.\r
748edcd5 519\r
e8a5ac7c 520 @retval EFI_DEBUG_RETURN - formal return value\r
748edcd5 521\r
e8a5ac7c 522**/\r
748edcd5
PB
523EFI_DEBUG_STATUS\r
524DebuggerMemoryEW (\r
525 IN CHAR16 *CommandArg,\r
526 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
527 IN EFI_EXCEPTION_TYPE ExceptionType,\r
528 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
529 )\r
e8a5ac7c
DB
530{\r
531 return DebuggerMemoryEnter (CommandArg, EdbWidthUint16);\r
532}\r
748edcd5 533\r
e8a5ac7c 534/**\r
748edcd5 535\r
e8a5ac7c 536 DebuggerCommand - ED.\r
748edcd5 537\r
e8a5ac7c
DB
538 @param CommandArg - The argument for this command\r
539 @param DebuggerPrivate - EBC Debugger private data structure\r
540 @param ExceptionType - Exception type.\r
541 @param SystemContext - EBC system context.\r
748edcd5 542\r
e8a5ac7c 543 @retval EFI_DEBUG_RETURN - formal return value\r
748edcd5 544\r
e8a5ac7c 545**/\r
748edcd5
PB
546EFI_DEBUG_STATUS\r
547DebuggerMemoryED (\r
548 IN CHAR16 *CommandArg,\r
549 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
550 IN EFI_EXCEPTION_TYPE ExceptionType,\r
551 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
552 )\r
e8a5ac7c
DB
553{\r
554 return DebuggerMemoryEnter (CommandArg, EdbWidthUint32);\r
555}\r
748edcd5 556\r
e8a5ac7c 557/**\r
748edcd5 558\r
e8a5ac7c 559 DebuggerCommand - EQ.\r
748edcd5 560\r
e8a5ac7c
DB
561 @param CommandArg - The argument for this command\r
562 @param DebuggerPrivate - EBC Debugger private data structure\r
563 @param ExceptionType - Exception type.\r
564 @param SystemContext - EBC system context.\r
748edcd5 565\r
e8a5ac7c 566 @retval EFI_DEBUG_RETURN - formal return value\r
748edcd5 567\r
e8a5ac7c 568**/\r
748edcd5
PB
569EFI_DEBUG_STATUS\r
570DebuggerMemoryEQ (\r
571 IN CHAR16 *CommandArg,\r
572 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
573 IN EFI_EXCEPTION_TYPE ExceptionType,\r
574 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
575 )\r
748edcd5
PB
576{\r
577 return DebuggerMemoryEnter (CommandArg, EdbWidthUint64);\r
578}\r