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