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