dbinput.c revision 1.1.1.2 1 /*******************************************************************************
2 *
3 * Module Name: dbinput - user front-end to the AML debugger
4 *
5 ******************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2011, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44
45 #include "acpi.h"
46 #include "accommon.h"
47 #include "acdebug.h"
48
49
50 #ifdef ACPI_DEBUGGER
51
52 #define _COMPONENT ACPI_CA_DEBUGGER
53 ACPI_MODULE_NAME ("dbinput")
54
55 /* Local prototypes */
56
57 static char *
58 AcpiDbGetNextToken (
59 char *String,
60 char **Next);
61
62 static UINT32
63 AcpiDbGetLine (
64 char *InputBuffer);
65
66 static UINT32
67 AcpiDbMatchCommand (
68 char *UserCommand);
69
70 static void
71 AcpiDbSingleThread (
72 void);
73
74 static void
75 AcpiDbDisplayHelp (
76 void);
77
78
79 /*
80 * Top-level debugger commands.
81 *
82 * This list of commands must match the string table below it
83 */
84 enum AcpiExDebuggerCommands
85 {
86 CMD_NOT_FOUND = 0,
87 CMD_NULL,
88 CMD_ALLOCATIONS,
89 CMD_ARGS,
90 CMD_ARGUMENTS,
91 CMD_BATCH,
92 CMD_BREAKPOINT,
93 CMD_BUSINFO,
94 CMD_CALL,
95 CMD_CLOSE,
96 CMD_DEBUG,
97 CMD_DISASSEMBLE,
98 CMD_DUMP,
99 CMD_ENABLEACPI,
100 CMD_EVENT,
101 CMD_EXECUTE,
102 CMD_EXIT,
103 CMD_FIND,
104 CMD_GO,
105 CMD_GPE,
106 CMD_GPES,
107 CMD_HANDLERS,
108 CMD_HELP,
109 CMD_HELP2,
110 CMD_HISTORY,
111 CMD_HISTORY_EXE,
112 CMD_HISTORY_LAST,
113 CMD_INFORMATION,
114 CMD_INTEGRITY,
115 CMD_INTO,
116 CMD_LEVEL,
117 CMD_LIST,
118 CMD_LOAD,
119 CMD_LOCALS,
120 CMD_LOCKS,
121 CMD_METHODS,
122 CMD_NAMESPACE,
123 CMD_NOTIFY,
124 CMD_OBJECT,
125 CMD_OPEN,
126 CMD_OSI,
127 CMD_OWNER,
128 CMD_PREDEFINED,
129 CMD_PREFIX,
130 CMD_QUIT,
131 CMD_REFERENCES,
132 CMD_RESOURCES,
133 CMD_RESULTS,
134 CMD_SET,
135 CMD_SLEEP,
136 CMD_STATS,
137 CMD_STOP,
138 CMD_TABLES,
139 CMD_TERMINATE,
140 CMD_THREADS,
141 CMD_TRACE,
142 CMD_TREE,
143 CMD_TYPE,
144 CMD_UNLOAD
145 };
146
147 #define CMD_FIRST_VALID 2
148
149
150 /* Second parameter is the required argument count */
151
152 static const COMMAND_INFO AcpiGbl_DbCommands[] =
153 {
154 {"<NOT FOUND>", 0},
155 {"<NULL>", 0},
156 {"ALLOCATIONS", 0},
157 {"ARGS", 0},
158 {"ARGUMENTS", 0},
159 {"BATCH", 0},
160 {"BREAKPOINT", 1},
161 {"BUSINFO", 0},
162 {"CALL", 0},
163 {"CLOSE", 0},
164 {"DEBUG", 1},
165 {"DISASSEMBLE", 1},
166 {"DUMP", 1},
167 {"ENABLEACPI", 0},
168 {"EVENT", 1},
169 {"EXECUTE", 1},
170 {"EXIT", 0},
171 {"FIND", 1},
172 {"GO", 0},
173 {"GPE", 2},
174 {"GPES", 0},
175 {"HANDLERS", 0},
176 {"HELP", 0},
177 {"?", 0},
178 {"HISTORY", 0},
179 {"!", 1},
180 {"!!", 0},
181 {"INFORMATION", 0},
182 {"INTEGRITY", 0},
183 {"INTO", 0},
184 {"LEVEL", 0},
185 {"LIST", 0},
186 {"LOAD", 1},
187 {"LOCALS", 0},
188 {"LOCKS", 0},
189 {"METHODS", 0},
190 {"NAMESPACE", 0},
191 {"NOTIFY", 2},
192 {"OBJECT", 1},
193 {"OPEN", 1},
194 {"OSI", 0},
195 {"OWNER", 1},
196 {"PREDEFINED", 0},
197 {"PREFIX", 0},
198 {"QUIT", 0},
199 {"REFERENCES", 1},
200 {"RESOURCES", 1},
201 {"RESULTS", 0},
202 {"SET", 3},
203 {"SLEEP", 1},
204 {"STATS", 0},
205 {"STOP", 0},
206 {"TABLES", 0},
207 {"TERMINATE", 0},
208 {"THREADS", 3},
209 {"TRACE", 1},
210 {"TREE", 0},
211 {"TYPE", 1},
212 {"UNLOAD", 1},
213 {NULL, 0}
214 };
215
216
217 /*******************************************************************************
218 *
219 * FUNCTION: AcpiDbDisplayHelp
220 *
221 * PARAMETERS: None
222 *
223 * RETURN: None
224 *
225 * DESCRIPTION: Print a usage message.
226 *
227 ******************************************************************************/
228
229 static void
230 AcpiDbDisplayHelp (
231 void)
232 {
233
234 AcpiOsPrintf ("\nGeneral-Purpose Commands:\n");
235 AcpiOsPrintf (" Allocations Display list of current memory allocations\n");
236 AcpiOsPrintf (" Dump <Address>|<Namepath>\n");
237 AcpiOsPrintf (" [Byte|Word|Dword|Qword] Display ACPI objects or memory\n");
238 AcpiOsPrintf (" EnableAcpi Enable ACPI (hardware) mode\n");
239 AcpiOsPrintf (" Handlers Info about global handlers\n");
240 AcpiOsPrintf (" Help This help screen\n");
241 AcpiOsPrintf (" History Display command history buffer\n");
242 AcpiOsPrintf (" Level [<DebugLevel>] [console] Get/Set debug level for file or console\n");
243 AcpiOsPrintf (" Locks Current status of internal mutexes\n");
244 AcpiOsPrintf (" Osi [Install|Remove <name>] Display or modify global _OSI list\n");
245 AcpiOsPrintf (" Quit or Exit Exit this command\n");
246 AcpiOsPrintf (" Stats [Allocations|Memory|Misc|\n");
247 AcpiOsPrintf (" Objects|Sizes|Stack|Tables] Display namespace and memory statistics\n");
248 AcpiOsPrintf (" Allocations Display list of current memory allocations\n");
249 AcpiOsPrintf (" Memory Dump internal memory lists\n");
250 AcpiOsPrintf (" Misc Namespace search and mutex stats\n");
251 AcpiOsPrintf (" Objects Summary of namespace objects\n");
252 AcpiOsPrintf (" Sizes Sizes for each of the internal objects\n");
253 AcpiOsPrintf (" Stack Display CPU stack usage\n");
254 AcpiOsPrintf (" Tables Info about current ACPI table(s)\n");
255 AcpiOsPrintf (" Tables Display info about loaded ACPI tables\n");
256 AcpiOsPrintf (" Unload <TableSig> [Instance] Unload an ACPI table\n");
257 AcpiOsPrintf (" ! <CommandNumber> Execute command from history buffer\n");
258 AcpiOsPrintf (" !! Execute last command again\n");
259
260 AcpiOsPrintf ("\nNamespace Access Commands:\n");
261 AcpiOsPrintf (" Businfo Display system bus info\n");
262 AcpiOsPrintf (" Disassemble <Method> Disassemble a control method\n");
263 AcpiOsPrintf (" Event <F|G> <Value> Generate AcpiEvent (Fixed/GPE)\n");
264 AcpiOsPrintf (" Find <AcpiName> (? is wildcard) Find ACPI name(s) with wildcards\n");
265 AcpiOsPrintf (" Gpe <GpeNum> <GpeBlock> Simulate a GPE\n");
266 AcpiOsPrintf (" Gpes Display info on all GPEs\n");
267 AcpiOsPrintf (" Integrity Validate namespace integrity\n");
268 AcpiOsPrintf (" Methods Display list of loaded control methods\n");
269 AcpiOsPrintf (" Namespace [Object] [Depth] Display loaded namespace tree/subtree\n");
270 AcpiOsPrintf (" Notify <Object> <Value> Send a notification on Object\n");
271 AcpiOsPrintf (" Objects <ObjectType> Display all objects of the given type\n");
272 AcpiOsPrintf (" Owner <OwnerId> [Depth] Display loaded namespace by object owner\n");
273 AcpiOsPrintf (" Predefined Check all predefined names\n");
274 AcpiOsPrintf (" Prefix [<NamePath>] Set or Get current execution prefix\n");
275 AcpiOsPrintf (" References <Addr> Find all references to object at addr\n");
276 AcpiOsPrintf (" Resources <Device> Get and display Device resources\n");
277 AcpiOsPrintf (" Set N <NamedObject> <Value> Set value for named integer\n");
278 AcpiOsPrintf (" Sleep <SleepState> Simulate sleep/wake sequence\n");
279 AcpiOsPrintf (" Terminate Delete namespace and all internal objects\n");
280 AcpiOsPrintf (" Type <Object> Display object type\n");
281
282 AcpiOsPrintf ("\nControl Method Execution Commands:\n");
283 AcpiOsPrintf (" Arguments (or Args) Display method arguments\n");
284 AcpiOsPrintf (" Breakpoint <AmlOffset> Set an AML execution breakpoint\n");
285 AcpiOsPrintf (" Call Run to next control method invocation\n");
286 AcpiOsPrintf (" Debug <Namepath> [Arguments] Single Step a control method\n");
287 AcpiOsPrintf (" Execute <Namepath> [Arguments] Execute control method\n");
288 AcpiOsPrintf (" Go Allow method to run to completion\n");
289 AcpiOsPrintf (" Information Display info about the current method\n");
290 AcpiOsPrintf (" Into Step into (not over) a method call\n");
291 AcpiOsPrintf (" List [# of Aml Opcodes] Display method ASL statements\n");
292 AcpiOsPrintf (" Locals Display method local variables\n");
293 AcpiOsPrintf (" Results Display method result stack\n");
294 AcpiOsPrintf (" Set <A|L> <#> <Value> Set method data (Arguments/Locals)\n");
295 AcpiOsPrintf (" Stop Terminate control method\n");
296 AcpiOsPrintf (" Thread <Threads><Loops><NamePath> Spawn threads to execute method(s)\n");
297 AcpiOsPrintf (" Trace <method name> Trace method execution\n");
298 AcpiOsPrintf (" Tree Display control method calling tree\n");
299 AcpiOsPrintf (" <Enter> Single step next AML opcode (over calls)\n");
300
301 AcpiOsPrintf ("\nFile I/O Commands:\n");
302 AcpiOsPrintf (" Close Close debug output file\n");
303 AcpiOsPrintf (" Load <Input Filename> Load ACPI table from a file\n");
304 AcpiOsPrintf (" Open <Output Filename> Open a file for debug output\n");
305 }
306
307
308 /*******************************************************************************
309 *
310 * FUNCTION: AcpiDbGetNextToken
311 *
312 * PARAMETERS: String - Command buffer
313 * Next - Return value, end of next token
314 *
315 * RETURN: Pointer to the start of the next token.
316 *
317 * DESCRIPTION: Command line parsing. Get the next token on the command line
318 *
319 ******************************************************************************/
320
321 static char *
322 AcpiDbGetNextToken (
323 char *String,
324 char **Next)
325 {
326 char *Start;
327
328
329 /* At end of buffer? */
330
331 if (!String || !(*String))
332 {
333 return (NULL);
334 }
335
336 /* Get rid of any spaces at the beginning */
337
338 if (*String == ' ')
339 {
340 while (*String && (*String == ' '))
341 {
342 String++;
343 }
344
345 if (!(*String))
346 {
347 return (NULL);
348 }
349 }
350
351 if (*String == '"')
352 {
353 /* This is a quoted string, scan until closing quote */
354
355 String++;
356 Start = String;
357
358 /* Find end of token */
359
360 while (*String && (*String != '"'))
361 {
362 String++;
363 }
364 }
365 else
366 {
367 Start = String;
368
369 /* Find end of token */
370
371 while (*String && (*String != ' '))
372 {
373 String++;
374 }
375 }
376
377 if (!(*String))
378 {
379 *Next = NULL;
380 }
381 else
382 {
383 *String = 0;
384 *Next = String + 1;
385 }
386
387 return (Start);
388 }
389
390
391 /*******************************************************************************
392 *
393 * FUNCTION: AcpiDbGetLine
394 *
395 * PARAMETERS: InputBuffer - Command line buffer
396 *
397 * RETURN: Count of arguments to the command
398 *
399 * DESCRIPTION: Get the next command line from the user. Gets entire line
400 * up to the next newline
401 *
402 ******************************************************************************/
403
404 static UINT32
405 AcpiDbGetLine (
406 char *InputBuffer)
407 {
408 UINT32 i;
409 UINT32 Count;
410 char *Next;
411 char *This;
412
413
414 ACPI_STRCPY (AcpiGbl_DbParsedBuf, InputBuffer);
415
416 This = AcpiGbl_DbParsedBuf;
417 for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
418 {
419 AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next);
420 if (!AcpiGbl_DbArgs[i])
421 {
422 break;
423 }
424
425 This = Next;
426 }
427
428 /* Uppercase the actual command */
429
430 if (AcpiGbl_DbArgs[0])
431 {
432 AcpiUtStrupr (AcpiGbl_DbArgs[0]);
433 }
434
435 Count = i;
436 if (Count)
437 {
438 Count--; /* Number of args only */
439 }
440
441 return (Count);
442 }
443
444
445 /*******************************************************************************
446 *
447 * FUNCTION: AcpiDbMatchCommand
448 *
449 * PARAMETERS: UserCommand - User command line
450 *
451 * RETURN: Index into command array, -1 if not found
452 *
453 * DESCRIPTION: Search command array for a command match
454 *
455 ******************************************************************************/
456
457 static UINT32
458 AcpiDbMatchCommand (
459 char *UserCommand)
460 {
461 UINT32 i;
462
463
464 if (!UserCommand || UserCommand[0] == 0)
465 {
466 return (CMD_NULL);
467 }
468
469 for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++)
470 {
471 if (ACPI_STRSTR (AcpiGbl_DbCommands[i].Name, UserCommand) ==
472 AcpiGbl_DbCommands[i].Name)
473 {
474 return (i);
475 }
476 }
477
478 /* Command not recognized */
479
480 return (CMD_NOT_FOUND);
481 }
482
483
484 /*******************************************************************************
485 *
486 * FUNCTION: AcpiDbCommandDispatch
487 *
488 * PARAMETERS: InputBuffer - Command line buffer
489 * WalkState - Current walk
490 * Op - Current (executing) parse op
491 *
492 * RETURN: Status
493 *
494 * DESCRIPTION: Command dispatcher.
495 *
496 ******************************************************************************/
497
498 ACPI_STATUS
499 AcpiDbCommandDispatch (
500 char *InputBuffer,
501 ACPI_WALK_STATE *WalkState,
502 ACPI_PARSE_OBJECT *Op)
503 {
504 UINT32 Temp;
505 UINT32 CommandIndex;
506 UINT32 ParamCount;
507 char *CommandLine;
508 ACPI_STATUS Status = AE_CTRL_TRUE;
509
510
511 /* If AcpiTerminate has been called, terminate this thread */
512
513 if (AcpiGbl_DbTerminateThreads)
514 {
515 return (AE_CTRL_TERMINATE);
516 }
517
518 ParamCount = AcpiDbGetLine (InputBuffer);
519 CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
520 Temp = 0;
521
522 /* Verify that we have the minimum number of params */
523
524 if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs)
525 {
526 AcpiOsPrintf ("%u parameters entered, [%s] requires %u parameters\n",
527 ParamCount, AcpiGbl_DbCommands[CommandIndex].Name,
528 AcpiGbl_DbCommands[CommandIndex].MinArgs);
529
530 return (AE_CTRL_TRUE);
531 }
532
533 /* Decode and dispatch the command */
534
535 switch (CommandIndex)
536 {
537 case CMD_NULL:
538 if (Op)
539 {
540 return (AE_OK);
541 }
542 break;
543
544 case CMD_ALLOCATIONS:
545
546 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
547 AcpiUtDumpAllocations ((UINT32) -1, NULL);
548 #endif
549 break;
550
551 case CMD_ARGS:
552 case CMD_ARGUMENTS:
553 AcpiDbDisplayArguments ();
554 break;
555
556 case CMD_BATCH:
557 AcpiDbBatchExecute (AcpiGbl_DbArgs[1]);
558 break;
559
560 case CMD_BREAKPOINT:
561 AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op);
562 break;
563
564 case CMD_BUSINFO:
565 AcpiDbGetBusInfo ();
566 break;
567
568 case CMD_CALL:
569 AcpiDbSetMethodCallBreakpoint (Op);
570 Status = AE_OK;
571 break;
572
573 case CMD_CLOSE:
574 AcpiDbCloseDebugFile ();
575 break;
576
577 case CMD_DEBUG:
578 AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], EX_SINGLE_STEP);
579 break;
580
581 case CMD_DISASSEMBLE:
582 (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
583 break;
584
585 case CMD_DUMP:
586 AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
587 break;
588
589 case CMD_ENABLEACPI:
590 Status = AcpiEnable();
591 if (ACPI_FAILURE(Status))
592 {
593 AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status);
594 return (Status);
595 }
596 break;
597
598 case CMD_EVENT:
599 AcpiOsPrintf ("Event command not implemented\n");
600 break;
601
602 case CMD_EXECUTE:
603 AcpiDbExecute (AcpiGbl_DbArgs[1],
604 &AcpiGbl_DbArgs[2], EX_NO_SINGLE_STEP);
605 break;
606
607 case CMD_FIND:
608 Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]);
609 break;
610
611 case CMD_GO:
612 AcpiGbl_CmSingleStep = FALSE;
613 return (AE_OK);
614
615 case CMD_GPE:
616 AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
617 break;
618
619 case CMD_GPES:
620 AcpiDbDisplayGpes ();
621 break;
622
623 case CMD_HANDLERS:
624 AcpiDbDisplayHandlers ();
625 break;
626
627 case CMD_HELP:
628 case CMD_HELP2:
629 AcpiDbDisplayHelp ();
630 break;
631
632 case CMD_HISTORY:
633 AcpiDbDisplayHistory ();
634 break;
635
636 case CMD_HISTORY_EXE:
637 CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]);
638 if (!CommandLine)
639 {
640 return (AE_CTRL_TRUE);
641 }
642
643 Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
644 return (Status);
645
646 case CMD_HISTORY_LAST:
647 CommandLine = AcpiDbGetFromHistory (NULL);
648 if (!CommandLine)
649 {
650 return (AE_CTRL_TRUE);
651 }
652
653 Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
654 return (Status);
655
656 case CMD_INFORMATION:
657 AcpiDbDisplayMethodInfo (Op);
658 break;
659
660 case CMD_INTEGRITY:
661 AcpiDbCheckIntegrity ();
662 break;
663
664 case CMD_INTO:
665 if (Op)
666 {
667 AcpiGbl_CmSingleStep = TRUE;
668 return (AE_OK);
669 }
670 break;
671
672 case CMD_LEVEL:
673 if (ParamCount == 0)
674 {
675 AcpiOsPrintf ("Current debug level for file output is: %8.8lX\n",
676 AcpiGbl_DbDebugLevel);
677 AcpiOsPrintf ("Current debug level for console output is: %8.8lX\n",
678 AcpiGbl_DbConsoleDebugLevel);
679 }
680 else if (ParamCount == 2)
681 {
682 Temp = AcpiGbl_DbConsoleDebugLevel;
683 AcpiGbl_DbConsoleDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1],
684 NULL, 16);
685 AcpiOsPrintf (
686 "Debug Level for console output was %8.8lX, now %8.8lX\n",
687 Temp, AcpiGbl_DbConsoleDebugLevel);
688 }
689 else
690 {
691 Temp = AcpiGbl_DbDebugLevel;
692 AcpiGbl_DbDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1], NULL, 16);
693 AcpiOsPrintf (
694 "Debug Level for file output was %8.8lX, now %8.8lX\n",
695 Temp, AcpiGbl_DbDebugLevel);
696 }
697 break;
698
699 case CMD_LIST:
700 AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
701 break;
702
703 case CMD_LOAD:
704 Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL);
705 break;
706
707 case CMD_LOCKS:
708 AcpiDbDisplayLocks ();
709 break;
710
711 case CMD_LOCALS:
712 AcpiDbDisplayLocals ();
713 break;
714
715 case CMD_METHODS:
716 Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]);
717 break;
718
719 case CMD_NAMESPACE:
720 AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
721 break;
722
723 case CMD_NOTIFY:
724 Temp = ACPI_STRTOUL (AcpiGbl_DbArgs[2], NULL, 0);
725 AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp);
726 break;
727
728 case CMD_OBJECT:
729 AcpiUtStrupr (AcpiGbl_DbArgs[1]);
730 Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
731 break;
732
733 case CMD_OPEN:
734 AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]);
735 break;
736
737 case CMD_OSI:
738 AcpiDbDisplayInterfaces (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
739 break;
740
741 case CMD_OWNER:
742 AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
743 break;
744
745 case CMD_PREDEFINED:
746 AcpiDbCheckPredefinedNames ();
747 break;
748
749 case CMD_PREFIX:
750 AcpiDbSetScope (AcpiGbl_DbArgs[1]);
751 break;
752
753 case CMD_REFERENCES:
754 AcpiDbFindReferences (AcpiGbl_DbArgs[1]);
755 break;
756
757 case CMD_RESOURCES:
758 AcpiDbDisplayResources (AcpiGbl_DbArgs[1]);
759 break;
760
761 case CMD_RESULTS:
762 AcpiDbDisplayResults ();
763 break;
764
765 case CMD_SET:
766 AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
767 AcpiGbl_DbArgs[3]);
768 break;
769
770 case CMD_SLEEP:
771 Status = AcpiDbSleep (AcpiGbl_DbArgs[1]);
772 break;
773
774 case CMD_STATS:
775 Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]);
776 break;
777
778 case CMD_STOP:
779 return (AE_NOT_IMPLEMENTED);
780
781 case CMD_TABLES:
782 AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]);
783 break;
784
785 case CMD_TERMINATE:
786 AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
787 AcpiUtSubsystemShutdown ();
788
789 /*
790 * TBD: [Restructure] Need some way to re-initialize without
791 * re-creating the semaphores!
792 */
793
794 /* AcpiInitialize (NULL); */
795 break;
796
797 case CMD_THREADS:
798 AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
799 AcpiGbl_DbArgs[3]);
800 break;
801
802 case CMD_TRACE:
803 (void) AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1);
804 break;
805
806 case CMD_TREE:
807 AcpiDbDisplayCallingTree ();
808 break;
809
810 case CMD_TYPE:
811 AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]);
812 break;
813
814 case CMD_UNLOAD:
815 AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
816 break;
817
818 case CMD_EXIT:
819 case CMD_QUIT:
820 if (Op)
821 {
822 AcpiOsPrintf ("Method execution terminated\n");
823 return (AE_CTRL_TERMINATE);
824 }
825
826 if (!AcpiGbl_DbOutputToFile)
827 {
828 AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
829 }
830
831 AcpiDbCloseDebugFile ();
832 AcpiGbl_DbTerminateThreads = TRUE;
833 return (AE_CTRL_TERMINATE);
834
835 case CMD_NOT_FOUND:
836 default:
837 AcpiOsPrintf ("Unknown Command\n");
838 return (AE_CTRL_TRUE);
839 }
840
841 if (ACPI_SUCCESS (Status))
842 {
843 Status = AE_CTRL_TRUE;
844 }
845
846 /* Add all commands that come here to the history buffer */
847
848 AcpiDbAddToHistory (InputBuffer);
849 return (Status);
850 }
851
852
853 /*******************************************************************************
854 *
855 * FUNCTION: AcpiDbExecuteThread
856 *
857 * PARAMETERS: Context - Not used
858 *
859 * RETURN: None
860 *
861 * DESCRIPTION: Debugger execute thread. Waits for a command line, then
862 * simply dispatches it.
863 *
864 ******************************************************************************/
865
866 void ACPI_SYSTEM_XFACE
867 AcpiDbExecuteThread (
868 void *Context)
869 {
870 ACPI_STATUS Status = AE_OK;
871 ACPI_STATUS MStatus;
872
873
874 while (Status != AE_CTRL_TERMINATE)
875 {
876 AcpiGbl_MethodExecuting = FALSE;
877 AcpiGbl_StepToNextCall = FALSE;
878
879 MStatus = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
880 if (ACPI_FAILURE (MStatus))
881 {
882 return;
883 }
884
885 Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
886
887 MStatus = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
888 if (ACPI_FAILURE (MStatus))
889 {
890 return;
891 }
892 }
893 }
894
895
896 /*******************************************************************************
897 *
898 * FUNCTION: AcpiDbSingleThread
899 *
900 * PARAMETERS: None
901 *
902 * RETURN: None
903 *
904 * DESCRIPTION: Debugger execute thread. Waits for a command line, then
905 * simply dispatches it.
906 *
907 ******************************************************************************/
908
909 static void
910 AcpiDbSingleThread (
911 void)
912 {
913
914 AcpiGbl_MethodExecuting = FALSE;
915 AcpiGbl_StepToNextCall = FALSE;
916
917 (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
918 }
919
920
921 /*******************************************************************************
922 *
923 * FUNCTION: AcpiDbUserCommands
924 *
925 * PARAMETERS: Prompt - User prompt (depends on mode)
926 * Op - Current executing parse op
927 *
928 * RETURN: None
929 *
930 * DESCRIPTION: Command line execution for the AML debugger. Commands are
931 * matched and dispatched here.
932 *
933 ******************************************************************************/
934
935 ACPI_STATUS
936 AcpiDbUserCommands (
937 char Prompt,
938 ACPI_PARSE_OBJECT *Op)
939 {
940 ACPI_STATUS Status = AE_OK;
941
942
943 /* TBD: [Restructure] Need a separate command line buffer for step mode */
944
945 while (!AcpiGbl_DbTerminateThreads)
946 {
947 /* Force output to console until a command is entered */
948
949 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
950
951 /* Different prompt if method is executing */
952
953 if (!AcpiGbl_MethodExecuting)
954 {
955 AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
956 }
957 else
958 {
959 AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
960 }
961
962 /* Get the user input line */
963
964 (void) AcpiOsGetLine (AcpiGbl_DbLineBuf);
965
966 /* Check for single or multithreaded debug */
967
968 if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED)
969 {
970 /*
971 * Signal the debug thread that we have a command to execute,
972 * and wait for the command to complete.
973 */
974 Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY);
975 if (ACPI_FAILURE (Status))
976 {
977 return (Status);
978 }
979
980 Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
981 if (ACPI_FAILURE (Status))
982 {
983 return (Status);
984 }
985 }
986 else
987 {
988 /* Just call to the command line interpreter */
989
990 AcpiDbSingleThread ();
991 }
992 }
993
994 /*
995 * Only this thread (the original thread) should actually terminate the
996 * subsystem, because all the semaphores are deleted during termination
997 */
998 Status = AcpiTerminate ();
999 return (Status);
1000 }
1001
1002 #endif /* ACPI_DEBUGGER */
1003
1004