]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdBreakpoint.c
ShellPkg: Add error prompt message in Ifconfig6 command.
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbCmdBreakpoint.c
CommitLineData
748edcd5
PB
1/*++\r
2\r
12f49354 3Copyright (c) 2007 - 2016, Intel Corporation\r
748edcd5
PB
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 EdbCmdBreakpoint.c\r
15\r
16Abstract:\r
17\r
18\r
19--*/\r
20\r
21#include "Edb.h"\r
22\r
23BOOLEAN\r
24IsEBCBREAK3 (\r
25 IN UINTN Address\r
26 )\r
27/*++\r
28\r
29Routine Description:\r
30\r
31 Check whether current IP is EBC BREAK3 instruction\r
32\r
33Arguments:\r
34\r
35 Address - EBC IP address.\r
36\r
37Returns:\r
38\r
39 TRUE - Current IP is EBC BREAK3 instruction\r
40 FALSE - Current IP is not EBC BREAK3 instruction\r
41\r
42--*/\r
43{\r
44 if (GET_OPCODE(Address) != OPCODE_BREAK) {\r
45 return FALSE;\r
46 }\r
47\r
48 if (GET_OPERANDS (Address) != 3) {\r
49 return FALSE;\r
50 } else {\r
51 return TRUE;\r
52 }\r
53}\r
54\r
55BOOLEAN\r
56DebuggerBreakpointIsDuplicated (\r
57 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
58 IN UINTN Address\r
59 )\r
60/*++\r
61\r
62Routine Description:\r
63\r
64 Check whether the Address is already set in breakpoint\r
65\r
66Arguments:\r
67\r
68 DebuggerPrivate - EBC Debugger private data structure\r
69 Address - Breakpoint Address\r
70\r
71Returns:\r
72\r
73 TRUE - breakpoint is found\r
74 FALSE - breakpoint is not found\r
75\r
76--*/\r
77{\r
78 UINTN Index;\r
79\r
80 //\r
81 // Go through each breakpoint context\r
82 //\r
83 for (Index = 0; Index < DebuggerPrivate->DebuggerBreakpointCount; Index++) {\r
84 if (DebuggerPrivate->DebuggerBreakpointContext[Index].BreakpointAddress == Address) {\r
85 //\r
86 // Found it\r
87 //\r
88 return TRUE;\r
89 }\r
90 }\r
91\r
92 //\r
93 // Not found\r
94 //\r
95 return FALSE;\r
96}\r
97\r
98EFI_STATUS\r
99DebuggerBreakpointAdd (\r
100 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
101 IN UINTN Address\r
102 )\r
103/*++\r
104\r
105Routine Description:\r
106\r
107 Add this breakpoint\r
108\r
109Arguments:\r
110\r
111 DebuggerPrivate - EBC Debugger private data structure\r
112 Address - Breakpoint Address\r
113\r
114Returns:\r
115\r
116 EFI_SUCCESS - breakpoint added successfully\r
117 EFI_ALREADY_STARTED - breakpoint is already added\r
118 EFI_OUT_OF_RESOURCES - all the breakpoint entries are used\r
119\r
120--*/\r
121{\r
122 //\r
123 // Check duplicated breakpoint\r
124 //\r
125 if (DebuggerBreakpointIsDuplicated (DebuggerPrivate, Address)) {\r
126 EDBPrint (L"Breakpoint duplicated!\n");\r
127 return EFI_ALREADY_STARTED;\r
128 }\r
129\r
130 //\r
131 // Check whether the address is a breakpoint 3 instruction\r
132 //\r
133 if (IsEBCBREAK3 (Address)) {\r
134 EDBPrint (L"Breakpoint can not be set on BREAK 3 instruction!\n");\r
135 return EFI_ALREADY_STARTED;\r
136 }\r
137\r
138 if (DebuggerPrivate->DebuggerBreakpointCount >= EFI_DEBUGGER_BREAKPOINT_MAX) {\r
139 EDBPrint (L"Breakpoint out of resource!\n");\r
140 return EFI_OUT_OF_RESOURCES;\r
141 }\r
142\r
143 //\r
144 // Set the breakpoint\r
145 //\r
146 DebuggerPrivate->DebuggerBreakpointContext[DebuggerPrivate->DebuggerBreakpointCount].BreakpointAddress = Address;\r
147 DebuggerPrivate->DebuggerBreakpointContext[DebuggerPrivate->DebuggerBreakpointCount].State = TRUE;\r
148 DebuggerPrivate->DebuggerBreakpointContext[DebuggerPrivate->DebuggerBreakpointCount].OldInstruction = 0;\r
149 CopyMem (\r
150 &DebuggerPrivate->DebuggerBreakpointContext[DebuggerPrivate->DebuggerBreakpointCount].OldInstruction,\r
151 (VOID *)Address,\r
152 sizeof(UINT16)\r
153 );\r
154\r
155 DebuggerPrivate->DebuggerBreakpointCount ++;\r
156\r
157 //\r
158 // Done\r
159 //\r
160 return EFI_SUCCESS;\r
161}\r
162\r
163EFI_STATUS\r
164DebuggerBreakpointDel (\r
165 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
166 IN UINTN Index\r
167 )\r
168/*++\r
169\r
170Routine Description:\r
171\r
172 Delete this breakpoint\r
173\r
174Arguments:\r
175\r
176 DebuggerPrivate - EBC Debugger private data structure\r
177 Index - Breakpoint Index\r
178\r
179Returns:\r
180\r
181 EFI_SUCCESS - breakpoint deleted successfully\r
182 EFI_NOT_FOUND - breakpoint not found\r
183\r
184--*/\r
185{\r
186 UINTN BpIndex;\r
187\r
188 if ((Index >= EFI_DEBUGGER_BREAKPOINT_MAX) ||\r
189 (Index >= DebuggerPrivate->DebuggerBreakpointCount)) {\r
190 return EFI_NOT_FOUND;\r
191 }\r
192\r
193 //\r
194 // Delete this breakpoint\r
195 //\r
196 for (BpIndex = Index; BpIndex < DebuggerPrivate->DebuggerBreakpointCount - 1; BpIndex++) {\r
197 DebuggerPrivate->DebuggerBreakpointContext[BpIndex] = DebuggerPrivate->DebuggerBreakpointContext[BpIndex + 1];\r
198 }\r
199 ZeroMem (\r
200 &DebuggerPrivate->DebuggerBreakpointContext[BpIndex],\r
201 sizeof(DebuggerPrivate->DebuggerBreakpointContext[BpIndex])\r
202 );\r
203\r
204 DebuggerPrivate->DebuggerBreakpointCount --;\r
205\r
206 //\r
207 // Done\r
208 //\r
209 return EFI_SUCCESS;\r
210}\r
211\r
212EFI_STATUS\r
213DebuggerBreakpointDis (\r
214 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
215 IN UINTN Index\r
216 )\r
217/*++\r
218\r
219Routine Description:\r
220\r
221 Disable this breakpoint\r
222\r
223Arguments:\r
224\r
225 DebuggerPrivate - EBC Debugger private data structure\r
226 Index - Breakpoint Index\r
227\r
228Returns:\r
229\r
230 EFI_SUCCESS - breakpoint disabled successfully\r
231 EFI_NOT_FOUND - breakpoint not found\r
232\r
233--*/\r
234{\r
235 if ((Index >= EFI_DEBUGGER_BREAKPOINT_MAX) ||\r
236 (Index >= DebuggerPrivate->DebuggerBreakpointCount)) {\r
237 return EFI_NOT_FOUND;\r
238 }\r
239\r
240 //\r
241 // Disable this breakpoint\r
242 //\r
243 DebuggerPrivate->DebuggerBreakpointContext[Index].State = FALSE;\r
244\r
245 return EFI_SUCCESS;\r
246}\r
247\r
248EFI_STATUS\r
249DebuggerBreakpointEn (\r
250 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
251 IN UINTN Index\r
252 )\r
253/*++\r
254\r
255Routine Description:\r
256\r
257 Enable this breakpoint\r
258\r
259Arguments:\r
260\r
261 DebuggerPrivate - EBC Debugger private data structure\r
262 Index - Breakpoint Index\r
263\r
264Returns:\r
265\r
266 EFI_SUCCESS - breakpoint enabled successfully\r
267 EFI_NOT_FOUND - breakpoint not found\r
268\r
269--*/\r
270{\r
271 if ((Index >= EFI_DEBUGGER_BREAKPOINT_MAX) ||\r
272 (Index >= DebuggerPrivate->DebuggerBreakpointCount)) {\r
273 return EFI_NOT_FOUND;\r
274 }\r
275\r
276 //\r
277 // Enable this breakpoint\r
278 //\r
279 DebuggerPrivate->DebuggerBreakpointContext[Index].State = TRUE;\r
280\r
281 return EFI_SUCCESS;\r
282}\r
283\r
284EFI_DEBUG_STATUS\r
285DebuggerBreakpointList (\r
286 IN CHAR16 *CommandArg,\r
287 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
288 IN EFI_EXCEPTION_TYPE ExceptionType,\r
289 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
290 )\r
291/*++\r
292\r
293Routine Description:\r
294\r
295 DebuggerCommand - BreakpointList\r
296\r
297Arguments:\r
298\r
299 CommandArg - The argument for this command\r
300 DebuggerPrivate - EBC Debugger private data structure\r
301 InterruptType - Interrupt type.\r
302 SystemContext - EBC system context.\r
303\r
304Returns:\r
305\r
306 EFI_DEBUG_CONTINUE - formal return value\r
307\r
308--*/\r
309{\r
310 UINTN Index;\r
311\r
312 //\r
313 // Check breakpoint cound\r
314 //\r
315 if (DebuggerPrivate->DebuggerBreakpointCount == 0) {\r
316 EDBPrint (L"No Breakpoint\n");\r
317 return EFI_DEBUG_CONTINUE;\r
318 } else if (DebuggerPrivate->DebuggerBreakpointCount > EFI_DEBUGGER_BREAKPOINT_MAX) {\r
319 EDBPrint (L"Breakpoint too many!\n");\r
320 DebuggerPrivate->DebuggerBreakpointCount = 0;\r
321 return EFI_DEBUG_CONTINUE;\r
322 }\r
323\r
324 //\r
325 // Go through each breakpoint\r
326 //\r
327 EDBPrint (L"Breakpoint :\n");\r
328 EDBPrint (L" Index Address Status\n");\r
329 EDBPrint (L"======= ================== ========\n");\r
330//EDBPrint (L" 1 0xFFFFFFFF00000000 *\n");\r
331//EDBPrint (L" 12 0x00000000FFFFFFFF\n");\r
332 for (Index = 0; Index < DebuggerPrivate->DebuggerBreakpointCount; Index++) {\r
333 //\r
334 // Print the breakpoint\r
335 //\r
336 EDBPrint (L" %2d 0x%016lx", Index, DebuggerPrivate->DebuggerBreakpointContext[Index].BreakpointAddress);\r
337 if (DebuggerPrivate->DebuggerBreakpointContext[Index].State) {\r
338 EDBPrint (L" *\n");\r
339 } else {\r
340 EDBPrint (L"\n");\r
341 }\r
342 }\r
343\r
344 //\r
345 // Done\r
346 //\r
347 return EFI_DEBUG_CONTINUE;\r
348}\r
349\r
350EFI_DEBUG_STATUS\r
351DebuggerBreakpointSet (\r
352 IN CHAR16 *CommandArg,\r
353 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
354 IN EFI_EXCEPTION_TYPE ExceptionType,\r
355 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
356 )\r
357/*++\r
358\r
359Routine Description:\r
360\r
361 DebuggerCommand - BreakpointSet\r
362\r
363Arguments:\r
364\r
365 CommandArg - The argument for this command\r
366 DebuggerPrivate - EBC Debugger private data structure\r
367 InterruptType - Interrupt type.\r
368 SystemContext - EBC system context.\r
369\r
370Returns:\r
371\r
372 EFI_DEBUG_CONTINUE - formal return value\r
373\r
374--*/\r
375{\r
376 UINTN Address;\r
377 EFI_STATUS Status;\r
378\r
379 if (CommandArg == NULL) {\r
380 EDBPrint (L"BreakpointSet Argument error!\n");\r
381 return EFI_DEBUG_CONTINUE;\r
382 }\r
383\r
384 //\r
385 // Get breakpoint address\r
386 //\r
387 Status = Symboltoi (CommandArg, &Address);\r
388 if (EFI_ERROR (Status)) {\r
389 if (Status == EFI_NOT_FOUND) {\r
390 Address = Xtoi(CommandArg);\r
391 } else {\r
392 //\r
393 // Something wrong, let Symboltoi print error info.\r
394 //\r
395 EDBPrint (L"Command Argument error!\n");\r
396 return EFI_DEBUG_CONTINUE;\r
397 }\r
398 }\r
399\r
400 //\r
401 // Add breakpoint\r
402 //\r
403 Status = DebuggerBreakpointAdd (DebuggerPrivate, Address);\r
404 if (EFI_ERROR(Status)) {\r
405 EDBPrint (L"BreakpointSet error!\n");\r
406 }\r
407\r
408 //\r
409 // Done\r
410 //\r
411 return EFI_DEBUG_CONTINUE;\r
412}\r
413\r
414EFI_DEBUG_STATUS\r
415DebuggerBreakpointClear (\r
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
420 )\r
421/*++\r
422\r
423Routine Description:\r
424\r
425 DebuggerCommand - BreakpointClear\r
426\r
427Arguments:\r
428\r
429 CommandArg - The argument for this command\r
430 DebuggerPrivate - EBC Debugger private data structure\r
431 InterruptType - Interrupt type.\r
432 SystemContext - EBC system context.\r
433\r
434Returns:\r
435\r
436 EFI_DEBUG_CONTINUE - formal return value\r
437\r
438--*/\r
439{\r
440 UINTN Index;\r
441 EFI_STATUS Status;\r
748edcd5
PB
442\r
443 if (CommandArg == NULL) {\r
444 EDBPrint (L"BreakpointClear Argument error!\n");\r
445 return EFI_DEBUG_CONTINUE;\r
446 }\r
447\r
448 if (StriCmp (CommandArg, L"*") == 0) {\r
449 //\r
450 // delete all breakpoint\r
451 //\r
452 DebuggerPrivate->DebuggerBreakpointCount = 0;\r
453 ZeroMem (DebuggerPrivate->DebuggerBreakpointContext, sizeof(DebuggerPrivate->DebuggerBreakpointContext));\r
454 EDBPrint (L"All the Breakpoint is cleared\n");\r
455 return EFI_DEBUG_CONTINUE;\r
456 }\r
457\r
458 //\r
459 // Get breakpoint index\r
460 //\r
461 Index = Atoi(CommandArg);\r
12f49354
HW
462 if (Index == (UINTN) -1) {\r
463 EDBPrint (L"BreakpointClear Argument error!\n");\r
464 return EFI_DEBUG_CONTINUE;\r
465 }\r
748edcd5
PB
466\r
467 if ((Index >= EFI_DEBUGGER_BREAKPOINT_MAX) ||\r
468 (Index >= DebuggerPrivate->DebuggerBreakpointCount)) {\r
469 EDBPrint (L"BreakpointClear error!\n");\r
470 return EFI_DEBUG_CONTINUE;\r
748edcd5
PB
471 }\r
472\r
473 //\r
474 // Delete breakpoint\r
475 //\r
476 Status = DebuggerBreakpointDel (DebuggerPrivate, Index);\r
477 if (EFI_ERROR(Status)) {\r
478 EDBPrint (L"BreakpointClear error!\n");\r
479 }\r
480\r
481 //\r
482 // Done\r
483 //\r
484 return EFI_DEBUG_CONTINUE;\r
485}\r
486\r
487EFI_DEBUG_STATUS\r
488DebuggerBreakpointDisable (\r
489 IN CHAR16 *CommandArg,\r
490 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
491 IN EFI_EXCEPTION_TYPE ExceptionType,\r
492 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
493 )\r
494/*++\r
495\r
496Routine Description:\r
497\r
498 DebuggerCommand - BreakpointDisable\r
499\r
500Arguments:\r
501\r
502 CommandArg - The argument for this command\r
503 DebuggerPrivate - EBC Debugger private data structure\r
504 InterruptType - Interrupt type.\r
505 SystemContext - EBC system context.\r
506\r
507Returns:\r
508\r
509 EFI_DEBUG_CONTINUE - formal return value\r
510\r
511--*/\r
512{\r
513 UINTN Index;\r
514 EFI_STATUS Status;\r
515\r
516 if (CommandArg == NULL) {\r
517 EDBPrint (L"BreakpointDisable Argument error!\n");\r
518 return EFI_DEBUG_CONTINUE;\r
519 }\r
520\r
521 if (StriCmp (CommandArg, L"*") == 0) {\r
522 //\r
523 // disable all breakpoint\r
524 //\r
525 for (Index = 0; Index < DebuggerPrivate->DebuggerBreakpointCount; Index++) {\r
526 Status = DebuggerBreakpointDis (DebuggerPrivate, Index);\r
527 }\r
528 EDBPrint (L"All the Breakpoint is disabled\n");\r
529 return EFI_DEBUG_CONTINUE;\r
530 }\r
531\r
532 //\r
533 // Get breakpoint index\r
534 //\r
535 Index = Atoi(CommandArg);\r
12f49354
HW
536 if (Index == (UINTN) -1) {\r
537 EDBPrint (L"BreakpointDisable Argument error!\n");\r
538 return EFI_DEBUG_CONTINUE;\r
539 }\r
748edcd5
PB
540\r
541 //\r
542 // Disable breakpoint\r
543 //\r
544 Status = DebuggerBreakpointDis (DebuggerPrivate, Index);\r
545 if (EFI_ERROR(Status)) {\r
546 EDBPrint (L"BreakpointDisable error!\n");\r
547 }\r
548\r
549 //\r
550 // Done\r
551 //\r
552 return EFI_DEBUG_CONTINUE;\r
553}\r
554\r
555EFI_DEBUG_STATUS\r
556DebuggerBreakpointEnable (\r
557 IN CHAR16 *CommandArg,\r
558 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
559 IN EFI_EXCEPTION_TYPE ExceptionType,\r
560 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
561 )\r
562/*++\r
563\r
564Routine Description:\r
565\r
566 DebuggerCommand - BreakpointEnable\r
567\r
568Arguments:\r
569\r
570 CommandArg - The argument for this command\r
571 DebuggerPrivate - EBC Debugger private data structure\r
572 InterruptType - Interrupt type.\r
573 SystemContext - EBC system context.\r
574\r
575Returns:\r
576\r
577 EFI_DEBUG_CONTINUE - formal return value\r
578\r
579--*/\r
580{\r
581 UINTN Index;\r
582 EFI_STATUS Status;\r
583\r
584 if (CommandArg == NULL) {\r
585 EDBPrint (L"BreakpointEnable Argument error!\n");\r
586 return EFI_DEBUG_CONTINUE;\r
587 }\r
588\r
589 if (StriCmp (CommandArg, L"*") == 0) {\r
590 //\r
591 // enable all breakpoint\r
592 //\r
593 for (Index = 0; Index < DebuggerPrivate->DebuggerBreakpointCount; Index++) {\r
594 Status = DebuggerBreakpointEn (DebuggerPrivate, Index);\r
595 }\r
596 EDBPrint (L"All the Breakpoint is enabled\n");\r
597 return EFI_DEBUG_CONTINUE;\r
598 }\r
599\r
600 //\r
601 // Get breakpoint index\r
602 //\r
603 Index = Atoi(CommandArg);\r
12f49354
HW
604 if (Index == (UINTN) -1) {\r
605 EDBPrint (L"BreakpointEnable Argument error!\n");\r
606 return EFI_DEBUG_CONTINUE;\r
607 }\r
748edcd5
PB
608\r
609 //\r
610 // Enable breakpoint\r
611 //\r
612 Status = DebuggerBreakpointEn (DebuggerPrivate, Index);\r
613 if (EFI_ERROR(Status)) {\r
614 EDBPrint (L"BreakpointEnable error!\n");\r
615 }\r
616\r
617 //\r
618 // Done\r
619 //\r
620 return EFI_DEBUG_CONTINUE;\r
621}\r