First import (compiles, seems to run correctly)
[games.git] / sys / contrib / dev / acpica-unix / debugger / dbinput.c
1 /*******************************************************************************
2  *
3  * Module Name: dbinput - user front-end to the AML debugger
4  *
5  ******************************************************************************/
6
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights.  You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code.  No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision.  In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change.  Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee.  Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution.  In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government.  In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************/
115
116
117 #include "acpi.h"
118 #include "accommon.h"
119 #include "acdebug.h"
120
121
122 #ifdef ACPI_DEBUGGER
123
124 #define _COMPONENT          ACPI_CA_DEBUGGER
125         ACPI_MODULE_NAME    ("dbinput")
126
127 /* Local prototypes */
128
129 static UINT32
130 AcpiDbGetLine (
131     char                    *InputBuffer);
132
133 static UINT32
134 AcpiDbMatchCommand (
135     char                    *UserCommand);
136
137 static void
138 AcpiDbSingleThread (
139     void);
140
141 static void
142 AcpiDbDisplayHelp (
143     void);
144
145
146 /*
147  * Top-level debugger commands.
148  *
149  * This list of commands must match the string table below it
150  */
151 enum AcpiExDebuggerCommands
152 {
153     CMD_NOT_FOUND = 0,
154     CMD_NULL,
155     CMD_ALLOCATIONS,
156     CMD_ARGS,
157     CMD_ARGUMENTS,
158     CMD_BATCH,
159     CMD_BREAKPOINT,
160     CMD_BUSINFO,
161     CMD_CALL,
162     CMD_CLOSE,
163     CMD_DEBUG,
164     CMD_DISASSEMBLE,
165     CMD_DUMP,
166     CMD_ENABLEACPI,
167     CMD_EVENT,
168     CMD_EXECUTE,
169     CMD_EXIT,
170     CMD_FIND,
171     CMD_GO,
172     CMD_GPE,
173     CMD_GPES,
174     CMD_HANDLERS,
175     CMD_HELP,
176     CMD_HELP2,
177     CMD_HISTORY,
178     CMD_HISTORY_EXE,
179     CMD_HISTORY_LAST,
180     CMD_INFORMATION,
181     CMD_INTEGRITY,
182     CMD_INTO,
183     CMD_LEVEL,
184     CMD_LIST,
185     CMD_LOAD,
186     CMD_LOCALS,
187     CMD_LOCKS,
188     CMD_METHODS,
189     CMD_NAMESPACE,
190     CMD_NOTIFY,
191     CMD_OBJECT,
192     CMD_OPEN,
193     CMD_OSI,
194     CMD_OWNER,
195     CMD_PREDEFINED,
196     CMD_PREFIX,
197     CMD_QUIT,
198     CMD_REFERENCES,
199     CMD_RESOURCES,
200     CMD_RESULTS,
201     CMD_SET,
202     CMD_SLEEP,
203     CMD_STATS,
204     CMD_STOP,
205     CMD_TABLES,
206     CMD_TERMINATE,
207     CMD_THREADS,
208     CMD_TRACE,
209     CMD_TREE,
210     CMD_TYPE,
211     CMD_UNLOAD
212 };
213
214 #define CMD_FIRST_VALID     2
215
216
217 /* Second parameter is the required argument count */
218
219 static const COMMAND_INFO       AcpiGbl_DbCommands[] =
220 {
221     {"<NOT FOUND>",  0},
222     {"<NULL>",       0},
223     {"ALLOCATIONS",  0},
224     {"ARGS",         0},
225     {"ARGUMENTS",    0},
226     {"BATCH",        0},
227     {"BREAKPOINT",   1},
228     {"BUSINFO",      0},
229     {"CALL",         0},
230     {"CLOSE",        0},
231     {"DEBUG",        1},
232     {"DISASSEMBLE",  1},
233     {"DUMP",         1},
234     {"ENABLEACPI",   0},
235     {"EVENT",        1},
236     {"EXECUTE",      1},
237     {"EXIT",         0},
238     {"FIND",         1},
239     {"GO",           0},
240     {"GPE",          2},
241     {"GPES",         0},
242     {"HANDLERS",     0},
243     {"HELP",         0},
244     {"?",            0},
245     {"HISTORY",      0},
246     {"!",            1},
247     {"!!",           0},
248     {"INFORMATION",  0},
249     {"INTEGRITY",    0},
250     {"INTO",         0},
251     {"LEVEL",        0},
252     {"LIST",         0},
253     {"LOAD",         1},
254     {"LOCALS",       0},
255     {"LOCKS",        0},
256     {"METHODS",      0},
257     {"NAMESPACE",    0},
258     {"NOTIFY",       2},
259     {"OBJECT",       1},
260     {"OPEN",         1},
261     {"OSI",          0},
262     {"OWNER",        1},
263     {"PREDEFINED",   0},
264     {"PREFIX",       0},
265     {"QUIT",         0},
266     {"REFERENCES",   1},
267     {"RESOURCES",    1},
268     {"RESULTS",      0},
269     {"SET",          3},
270     {"SLEEP",        1},
271     {"STATS",        0},
272     {"STOP",         0},
273     {"TABLES",       0},
274     {"TERMINATE",    0},
275     {"THREADS",      3},
276     {"TRACE",        1},
277     {"TREE",         0},
278     {"TYPE",         1},
279     {"UNLOAD",       1},
280     {NULL,           0}
281 };
282
283
284 /*******************************************************************************
285  *
286  * FUNCTION:    AcpiDbDisplayHelp
287  *
288  * PARAMETERS:  None
289  *
290  * RETURN:      None
291  *
292  * DESCRIPTION: Print a usage message.
293  *
294  ******************************************************************************/
295
296 static void
297 AcpiDbDisplayHelp (
298     void)
299 {
300
301     AcpiOsPrintf ("\nGeneral-Purpose Commands:\n");
302     AcpiOsPrintf ("  Allocations                         Display list of current memory allocations\n");
303     AcpiOsPrintf ("  Dump <Address>|<Namepath>\n");
304     AcpiOsPrintf ("       [Byte|Word|Dword|Qword]        Display ACPI objects or memory\n");
305     AcpiOsPrintf ("  EnableAcpi                          Enable ACPI (hardware) mode\n");
306     AcpiOsPrintf ("  Handlers                            Info about global handlers\n");
307     AcpiOsPrintf ("  Help                                This help screen\n");
308     AcpiOsPrintf ("  History                             Display command history buffer\n");
309     AcpiOsPrintf ("  Level [<DebugLevel>] [console]      Get/Set debug level for file or console\n");
310     AcpiOsPrintf ("  Locks                               Current status of internal mutexes\n");
311     AcpiOsPrintf ("  Osi [Install|Remove <name>]         Display or modify global _OSI list\n");
312     AcpiOsPrintf ("  Quit or Exit                        Exit this command\n");
313     AcpiOsPrintf ("  Stats [Allocations|Memory|Misc|\n");
314     AcpiOsPrintf ("        Objects|Sizes|Stack|Tables]   Display namespace and memory statistics\n");
315     AcpiOsPrintf ("     Allocations                      Display list of current memory allocations\n");
316     AcpiOsPrintf ("     Memory                           Dump internal memory lists\n");
317     AcpiOsPrintf ("     Misc                             Namespace search and mutex stats\n");
318     AcpiOsPrintf ("     Objects                          Summary of namespace objects\n");
319     AcpiOsPrintf ("     Sizes                            Sizes for each of the internal objects\n");
320     AcpiOsPrintf ("     Stack                            Display CPU stack usage\n");
321     AcpiOsPrintf ("     Tables                           Info about current ACPI table(s)\n");
322     AcpiOsPrintf ("  Tables                              Display info about loaded ACPI tables\n");
323     AcpiOsPrintf ("  Unload <TableSig> [Instance]        Unload an ACPI table\n");
324     AcpiOsPrintf ("  ! <CommandNumber>                   Execute command from history buffer\n");
325     AcpiOsPrintf ("  !!                                  Execute last command again\n");
326
327     AcpiOsPrintf ("\nNamespace Access Commands:\n");
328     AcpiOsPrintf ("  Businfo                             Display system bus info\n");
329     AcpiOsPrintf ("  Disassemble <Method>                Disassemble a control method\n");
330     AcpiOsPrintf ("  Event <F|G> <Value>                 Generate AcpiEvent (Fixed/GPE)\n");
331     AcpiOsPrintf ("  Find <AcpiName>  (? is wildcard)    Find ACPI name(s) with wildcards\n");
332     AcpiOsPrintf ("  Gpe <GpeNum> <GpeBlock>             Simulate a GPE\n");
333     AcpiOsPrintf ("  Gpes                                Display info on all GPEs\n");
334     AcpiOsPrintf ("  Integrity                           Validate namespace integrity\n");
335     AcpiOsPrintf ("  Methods                             Display list of loaded control methods\n");
336     AcpiOsPrintf ("  Namespace [Object] [Depth]          Display loaded namespace tree/subtree\n");
337     AcpiOsPrintf ("  Notify <Object> <Value>             Send a notification on Object\n");
338     AcpiOsPrintf ("  Objects <ObjectType>                Display all objects of the given type\n");
339     AcpiOsPrintf ("  Owner <OwnerId> [Depth]             Display loaded namespace by object owner\n");
340     AcpiOsPrintf ("  Predefined                          Check all predefined names\n");
341     AcpiOsPrintf ("  Prefix [<NamePath>]                 Set or Get current execution prefix\n");
342     AcpiOsPrintf ("  References <Addr>                   Find all references to object at addr\n");
343     AcpiOsPrintf ("  Resources <Device>                  Get and display Device resources\n");
344     AcpiOsPrintf ("  Set N <NamedObject> <Value>         Set value for named integer\n");
345     AcpiOsPrintf ("  Sleep <SleepState>                  Simulate sleep/wake sequence\n");
346     AcpiOsPrintf ("  Terminate                           Delete namespace and all internal objects\n");
347     AcpiOsPrintf ("  Type <Object>                       Display object type\n");
348
349     AcpiOsPrintf ("\nControl Method Execution Commands:\n");
350     AcpiOsPrintf ("  Arguments (or Args)                 Display method arguments\n");
351     AcpiOsPrintf ("  Breakpoint <AmlOffset>              Set an AML execution breakpoint\n");
352     AcpiOsPrintf ("  Call                                Run to next control method invocation\n");
353     AcpiOsPrintf ("  Debug <Namepath> [Arguments]        Single Step a control method\n");
354     AcpiOsPrintf ("  Execute <Namepath> [Arguments]      Execute control method\n");
355     AcpiOsPrintf ("     Hex Integer                      Integer method argument\n");
356     AcpiOsPrintf ("     \"Ascii String\"                   String method argument\n");
357     AcpiOsPrintf ("     (Byte List)                      Buffer method argument\n");
358     AcpiOsPrintf ("     [Package Element List]           Package method argument\n");
359     AcpiOsPrintf ("  Go                                  Allow method to run to completion\n");
360     AcpiOsPrintf ("  Information                         Display info about the current method\n");
361     AcpiOsPrintf ("  Into                                Step into (not over) a method call\n");
362     AcpiOsPrintf ("  List [# of Aml Opcodes]             Display method ASL statements\n");
363     AcpiOsPrintf ("  Locals                              Display method local variables\n");
364     AcpiOsPrintf ("  Results                             Display method result stack\n");
365     AcpiOsPrintf ("  Set <A|L> <#> <Value>               Set method data (Arguments/Locals)\n");
366     AcpiOsPrintf ("  Stop                                Terminate control method\n");
367     AcpiOsPrintf ("  Thread <Threads><Loops><NamePath>   Spawn threads to execute method(s)\n");
368     AcpiOsPrintf ("  Trace <method name>                 Trace method execution\n");
369     AcpiOsPrintf ("  Tree                                Display control method calling tree\n");
370     AcpiOsPrintf ("  <Enter>                             Single step next AML opcode (over calls)\n");
371
372     AcpiOsPrintf ("\nFile I/O Commands:\n");
373     AcpiOsPrintf ("  Close                               Close debug output file\n");
374     AcpiOsPrintf ("  Load <Input Filename>               Load ACPI table from a file\n");
375     AcpiOsPrintf ("  Open <Output Filename>              Open a file for debug output\n");
376 }
377
378
379 /*******************************************************************************
380  *
381  * FUNCTION:    AcpiDbGetNextToken
382  *
383  * PARAMETERS:  String          - Command buffer
384  *              Next            - Return value, end of next token
385  *
386  * RETURN:      Pointer to the start of the next token.
387  *
388  * DESCRIPTION: Command line parsing.  Get the next token on the command line
389  *
390  ******************************************************************************/
391
392 char *
393 AcpiDbGetNextToken (
394     char                    *String,
395     char                    **Next,
396     ACPI_OBJECT_TYPE        *ReturnType)
397 {
398     char                    *Start;
399     UINT32                  Depth;
400     ACPI_OBJECT_TYPE        Type = ACPI_TYPE_INTEGER;
401
402
403     /* At end of buffer? */
404
405     if (!String || !(*String))
406     {
407         return (NULL);
408     }
409
410     /* Remove any spaces at the beginning */
411
412     if (*String == ' ')
413     {
414         while (*String && (*String == ' '))
415         {
416             String++;
417         }
418
419         if (!(*String))
420         {
421             return (NULL);
422         }
423     }
424
425     switch (*String)
426     {
427     case '"':
428
429         /* This is a quoted string, scan until closing quote */
430
431         String++;
432         Start = String;
433         Type = ACPI_TYPE_STRING;
434
435         /* Find end of string */
436
437         while (*String && (*String != '"'))
438         {
439             String++;
440         }
441         break;
442
443     case '(':
444
445         /* This is the start of a buffer, scan until closing paren */
446
447         String++;
448         Start = String;
449         Type = ACPI_TYPE_BUFFER;
450
451         /* Find end of buffer */
452
453         while (*String && (*String != ')'))
454         {
455             String++;
456         }
457         break;
458
459     case '[':
460
461         /* This is the start of a package, scan until closing bracket */
462
463         String++;
464         Depth = 1;
465         Start = String;
466         Type = ACPI_TYPE_PACKAGE;
467
468         /* Find end of package (closing bracket) */
469
470         while (*String)
471         {
472             /* Handle String package elements */
473
474             if (*String == '"')
475             {
476                 /* Find end of string */
477
478                 String++;
479                 while (*String && (*String != '"'))
480                 {
481                     String++;
482                 }
483                 if (!(*String))
484                 {
485                     break;
486                 }
487             }
488             else if (*String == '[')
489             {
490                 Depth++;         /* A nested package declaration */
491             }
492             else if (*String == ']')
493             {
494                 Depth--;
495                 if (Depth == 0) /* Found final package closing bracket */
496                 {
497                     break;
498                 }
499             }
500
501             String++;
502         }
503         break;
504
505     default:
506
507         Start = String;
508
509         /* Find end of token */
510
511         while (*String && (*String != ' '))
512         {
513             String++;
514         }
515         break;
516     }
517
518     if (!(*String))
519     {
520         *Next = NULL;
521     }
522     else
523     {
524         *String = 0;
525         *Next = String + 1;
526     }
527
528     *ReturnType = Type;
529     return (Start);
530 }
531
532
533 /*******************************************************************************
534  *
535  * FUNCTION:    AcpiDbGetLine
536  *
537  * PARAMETERS:  InputBuffer         - Command line buffer
538  *
539  * RETURN:      Count of arguments to the command
540  *
541  * DESCRIPTION: Get the next command line from the user.  Gets entire line
542  *              up to the next newline
543  *
544  ******************************************************************************/
545
546 static UINT32
547 AcpiDbGetLine (
548     char                    *InputBuffer)
549 {
550     UINT32                  i;
551     UINT32                  Count;
552     char                    *Next;
553     char                    *This;
554
555
556     ACPI_STRCPY (AcpiGbl_DbParsedBuf, InputBuffer);
557
558     This = AcpiGbl_DbParsedBuf;
559     for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
560     {
561         AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next,
562             &AcpiGbl_DbArgTypes[i]);
563         if (!AcpiGbl_DbArgs[i])
564         {
565             break;
566         }
567
568         This = Next;
569     }
570
571     /* Uppercase the actual command */
572
573     if (AcpiGbl_DbArgs[0])
574     {
575         AcpiUtStrupr (AcpiGbl_DbArgs[0]);
576     }
577
578     Count = i;
579     if (Count)
580     {
581         Count--;  /* Number of args only */
582     }
583
584     return (Count);
585 }
586
587
588 /*******************************************************************************
589  *
590  * FUNCTION:    AcpiDbMatchCommand
591  *
592  * PARAMETERS:  UserCommand             - User command line
593  *
594  * RETURN:      Index into command array, -1 if not found
595  *
596  * DESCRIPTION: Search command array for a command match
597  *
598  ******************************************************************************/
599
600 static UINT32
601 AcpiDbMatchCommand (
602     char                    *UserCommand)
603 {
604     UINT32                  i;
605
606
607     if (!UserCommand || UserCommand[0] == 0)
608     {
609         return (CMD_NULL);
610     }
611
612     for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++)
613     {
614         if (ACPI_STRSTR (AcpiGbl_DbCommands[i].Name, UserCommand) ==
615                          AcpiGbl_DbCommands[i].Name)
616         {
617             return (i);
618         }
619     }
620
621     /* Command not recognized */
622
623     return (CMD_NOT_FOUND);
624 }
625
626
627 /*******************************************************************************
628  *
629  * FUNCTION:    AcpiDbCommandDispatch
630  *
631  * PARAMETERS:  InputBuffer         - Command line buffer
632  *              WalkState           - Current walk
633  *              Op                  - Current (executing) parse op
634  *
635  * RETURN:      Status
636  *
637  * DESCRIPTION: Command dispatcher.
638  *
639  ******************************************************************************/
640
641 ACPI_STATUS
642 AcpiDbCommandDispatch (
643     char                    *InputBuffer,
644     ACPI_WALK_STATE         *WalkState,
645     ACPI_PARSE_OBJECT       *Op)
646 {
647     UINT32                  Temp;
648     UINT32                  CommandIndex;
649     UINT32                  ParamCount;
650     char                    *CommandLine;
651     ACPI_STATUS             Status = AE_CTRL_TRUE;
652
653
654     /* If AcpiTerminate has been called, terminate this thread */
655
656     if (AcpiGbl_DbTerminateThreads)
657     {
658         return (AE_CTRL_TERMINATE);
659     }
660
661     ParamCount = AcpiDbGetLine (InputBuffer);
662     CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
663     Temp = 0;
664
665     /* Verify that we have the minimum number of params */
666
667     if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs)
668     {
669         AcpiOsPrintf ("%u parameters entered, [%s] requires %u parameters\n",
670             ParamCount, AcpiGbl_DbCommands[CommandIndex].Name,
671             AcpiGbl_DbCommands[CommandIndex].MinArgs);
672
673         return (AE_CTRL_TRUE);
674     }
675
676     /* Decode and dispatch the command */
677
678     switch (CommandIndex)
679     {
680     case CMD_NULL:
681         if (Op)
682         {
683             return (AE_OK);
684         }
685         break;
686
687     case CMD_ALLOCATIONS:
688
689 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
690         AcpiUtDumpAllocations ((UINT32) -1, NULL);
691 #endif
692         break;
693
694     case CMD_ARGS:
695     case CMD_ARGUMENTS:
696         AcpiDbDisplayArguments ();
697         break;
698
699     case CMD_BATCH:
700         AcpiDbBatchExecute (AcpiGbl_DbArgs[1]);
701         break;
702
703     case CMD_BREAKPOINT:
704         AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op);
705         break;
706
707     case CMD_BUSINFO:
708         AcpiDbGetBusInfo ();
709         break;
710
711     case CMD_CALL:
712         AcpiDbSetMethodCallBreakpoint (Op);
713         Status = AE_OK;
714         break;
715
716     case CMD_CLOSE:
717         AcpiDbCloseDebugFile ();
718         break;
719
720     case CMD_DEBUG:
721         AcpiDbExecute (AcpiGbl_DbArgs[1],
722             &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_SINGLE_STEP);
723         break;
724
725     case CMD_DISASSEMBLE:
726         (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
727         break;
728
729     case CMD_DUMP:
730         AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
731         break;
732
733     case CMD_ENABLEACPI:
734         Status = AcpiEnable();
735         if (ACPI_FAILURE(Status))
736         {
737             AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status);
738             return (Status);
739         }
740         break;
741
742     case CMD_EVENT:
743         AcpiOsPrintf ("Event command not implemented\n");
744         break;
745
746     case CMD_EXECUTE:
747         AcpiDbExecute (AcpiGbl_DbArgs[1],
748             &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP);
749         break;
750
751     case CMD_FIND:
752         Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]);
753         break;
754
755     case CMD_GO:
756         AcpiGbl_CmSingleStep = FALSE;
757         return (AE_OK);
758
759     case CMD_GPE:
760         AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
761         break;
762
763     case CMD_GPES:
764         AcpiDbDisplayGpes ();
765         break;
766
767     case CMD_HANDLERS:
768         AcpiDbDisplayHandlers ();
769         break;
770
771     case CMD_HELP:
772     case CMD_HELP2:
773         AcpiDbDisplayHelp ();
774         break;
775
776     case CMD_HISTORY:
777         AcpiDbDisplayHistory ();
778         break;
779
780     case CMD_HISTORY_EXE:
781         CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]);
782         if (!CommandLine)
783         {
784             return (AE_CTRL_TRUE);
785         }
786
787         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
788         return (Status);
789
790     case CMD_HISTORY_LAST:
791         CommandLine = AcpiDbGetFromHistory (NULL);
792         if (!CommandLine)
793         {
794             return (AE_CTRL_TRUE);
795         }
796
797         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
798         return (Status);
799
800     case CMD_INFORMATION:
801         AcpiDbDisplayMethodInfo (Op);
802         break;
803
804     case CMD_INTEGRITY:
805         AcpiDbCheckIntegrity ();
806         break;
807
808     case CMD_INTO:
809         if (Op)
810         {
811             AcpiGbl_CmSingleStep = TRUE;
812             return (AE_OK);
813         }
814         break;
815
816     case CMD_LEVEL:
817         if (ParamCount == 0)
818         {
819             AcpiOsPrintf ("Current debug level for file output is:    %8.8lX\n",
820                 AcpiGbl_DbDebugLevel);
821             AcpiOsPrintf ("Current debug level for console output is: %8.8lX\n",
822                 AcpiGbl_DbConsoleDebugLevel);
823         }
824         else if (ParamCount == 2)
825         {
826             Temp = AcpiGbl_DbConsoleDebugLevel;
827             AcpiGbl_DbConsoleDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1],
828                                             NULL, 16);
829             AcpiOsPrintf (
830                 "Debug Level for console output was %8.8lX, now %8.8lX\n",
831                 Temp, AcpiGbl_DbConsoleDebugLevel);
832         }
833         else
834         {
835             Temp = AcpiGbl_DbDebugLevel;
836             AcpiGbl_DbDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1], NULL, 16);
837             AcpiOsPrintf (
838                 "Debug Level for file output was %8.8lX, now %8.8lX\n",
839                 Temp, AcpiGbl_DbDebugLevel);
840         }
841         break;
842
843     case CMD_LIST:
844         AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
845         break;
846
847     case CMD_LOAD:
848         Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL);
849         break;
850
851     case CMD_LOCKS:
852         AcpiDbDisplayLocks ();
853         break;
854
855     case CMD_LOCALS:
856         AcpiDbDisplayLocals ();
857         break;
858
859     case CMD_METHODS:
860         Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]);
861         break;
862
863     case CMD_NAMESPACE:
864         AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
865         break;
866
867     case CMD_NOTIFY:
868         Temp = ACPI_STRTOUL (AcpiGbl_DbArgs[2], NULL, 0);
869         AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp);
870         break;
871
872     case CMD_OBJECT:
873         AcpiUtStrupr (AcpiGbl_DbArgs[1]);
874         Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
875         break;
876
877     case CMD_OPEN:
878         AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]);
879         break;
880
881     case CMD_OSI:
882         AcpiDbDisplayInterfaces (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
883         break;
884
885     case CMD_OWNER:
886         AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
887         break;
888
889     case CMD_PREDEFINED:
890         AcpiDbCheckPredefinedNames ();
891         break;
892
893     case CMD_PREFIX:
894         AcpiDbSetScope (AcpiGbl_DbArgs[1]);
895         break;
896
897     case CMD_REFERENCES:
898         AcpiDbFindReferences (AcpiGbl_DbArgs[1]);
899         break;
900
901     case CMD_RESOURCES:
902         AcpiDbDisplayResources (AcpiGbl_DbArgs[1]);
903         break;
904
905     case CMD_RESULTS:
906         AcpiDbDisplayResults ();
907         break;
908
909     case CMD_SET:
910         AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
911             AcpiGbl_DbArgs[3]);
912         break;
913
914     case CMD_SLEEP:
915         Status = AcpiDbSleep (AcpiGbl_DbArgs[1]);
916         break;
917
918     case CMD_STATS:
919         Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]);
920         break;
921
922     case CMD_STOP:
923         return (AE_NOT_IMPLEMENTED);
924
925     case CMD_TABLES:
926         AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]);
927         break;
928
929     case CMD_TERMINATE:
930         AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
931         AcpiUtSubsystemShutdown ();
932
933         /*
934          * TBD: [Restructure] Need some way to re-initialize without
935          * re-creating the semaphores!
936          */
937
938         /*  AcpiInitialize (NULL);  */
939         break;
940
941     case CMD_THREADS:
942         AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
943             AcpiGbl_DbArgs[3]);
944         break;
945
946     case CMD_TRACE:
947         (void) AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1);
948         break;
949
950     case CMD_TREE:
951         AcpiDbDisplayCallingTree ();
952         break;
953
954     case CMD_TYPE:
955         AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]);
956         break;
957
958     case CMD_UNLOAD:
959         AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
960         break;
961
962     case CMD_EXIT:
963     case CMD_QUIT:
964         if (Op)
965         {
966             AcpiOsPrintf ("Method execution terminated\n");
967             return (AE_CTRL_TERMINATE);
968         }
969
970         if (!AcpiGbl_DbOutputToFile)
971         {
972             AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
973         }
974
975         AcpiDbCloseDebugFile ();
976         AcpiGbl_DbTerminateThreads = TRUE;
977         return (AE_CTRL_TERMINATE);
978
979     case CMD_NOT_FOUND:
980     default:
981         AcpiOsPrintf ("Unknown Command\n");
982         return (AE_CTRL_TRUE);
983     }
984
985     if (ACPI_SUCCESS (Status))
986     {
987         Status = AE_CTRL_TRUE;
988     }
989
990     /* Add all commands that come here to the history buffer */
991
992     AcpiDbAddToHistory (InputBuffer);
993     return (Status);
994 }
995
996
997 /*******************************************************************************
998  *
999  * FUNCTION:    AcpiDbExecuteThread
1000  *
1001  * PARAMETERS:  Context         - Not used
1002  *
1003  * RETURN:      None
1004  *
1005  * DESCRIPTION: Debugger execute thread.  Waits for a command line, then
1006  *              simply dispatches it.
1007  *
1008  ******************************************************************************/
1009
1010 void ACPI_SYSTEM_XFACE
1011 AcpiDbExecuteThread (
1012     void                    *Context)
1013 {
1014     ACPI_STATUS             Status = AE_OK;
1015     ACPI_STATUS             MStatus;
1016
1017
1018     while (Status != AE_CTRL_TERMINATE)
1019     {
1020         AcpiGbl_MethodExecuting = FALSE;
1021         AcpiGbl_StepToNextCall = FALSE;
1022
1023         MStatus = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
1024         if (ACPI_FAILURE (MStatus))
1025         {
1026             return;
1027         }
1028
1029         Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
1030
1031         MStatus = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
1032         if (ACPI_FAILURE (MStatus))
1033         {
1034             return;
1035         }
1036     }
1037 }
1038
1039
1040 /*******************************************************************************
1041  *
1042  * FUNCTION:    AcpiDbSingleThread
1043  *
1044  * PARAMETERS:  None
1045  *
1046  * RETURN:      None
1047  *
1048  * DESCRIPTION: Debugger execute thread.  Waits for a command line, then
1049  *              simply dispatches it.
1050  *
1051  ******************************************************************************/
1052
1053 static void
1054 AcpiDbSingleThread (
1055     void)
1056 {
1057
1058     AcpiGbl_MethodExecuting = FALSE;
1059     AcpiGbl_StepToNextCall = FALSE;
1060
1061     (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
1062 }
1063
1064
1065 /*******************************************************************************
1066  *
1067  * FUNCTION:    AcpiDbUserCommands
1068  *
1069  * PARAMETERS:  Prompt              - User prompt (depends on mode)
1070  *              Op                  - Current executing parse op
1071  *
1072  * RETURN:      None
1073  *
1074  * DESCRIPTION: Command line execution for the AML debugger.  Commands are
1075  *              matched and dispatched here.
1076  *
1077  ******************************************************************************/
1078
1079 ACPI_STATUS
1080 AcpiDbUserCommands (
1081     char                    Prompt,
1082     ACPI_PARSE_OBJECT       *Op)
1083 {
1084     ACPI_STATUS             Status = AE_OK;
1085
1086
1087     /* TBD: [Restructure] Need a separate command line buffer for step mode */
1088
1089     while (!AcpiGbl_DbTerminateThreads)
1090     {
1091         /* Force output to console until a command is entered */
1092
1093         AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
1094
1095         /* Different prompt if method is executing */
1096
1097         if (!AcpiGbl_MethodExecuting)
1098         {
1099             AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
1100         }
1101         else
1102         {
1103             AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
1104         }
1105
1106         /* Get the user input line */
1107
1108         Status = AcpiOsGetLine (AcpiGbl_DbLineBuf,
1109             ACPI_DB_LINE_BUFFER_SIZE, NULL);
1110         if (ACPI_FAILURE (Status))
1111         {
1112             ACPI_EXCEPTION ((AE_INFO, Status, "While parsing command line"));
1113             return (Status);
1114         }
1115
1116         /* Check for single or multithreaded debug */
1117
1118         if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED)
1119         {
1120             /*
1121              * Signal the debug thread that we have a command to execute,
1122              * and wait for the command to complete.
1123              */
1124             Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY);
1125             if (ACPI_FAILURE (Status))
1126             {
1127                 return (Status);
1128             }
1129
1130             Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
1131             if (ACPI_FAILURE (Status))
1132             {
1133                 return (Status);
1134             }
1135         }
1136         else
1137         {
1138             /* Just call to the command line interpreter */
1139
1140             AcpiDbSingleThread ();
1141         }
1142     }
1143
1144     /*
1145      * Only this thread (the original thread) should actually terminate the
1146      * subsystem, because all the semaphores are deleted during termination
1147      */
1148     Status = AcpiTerminate ();
1149     return (Status);
1150 }
1151
1152 #endif  /* ACPI_DEBUGGER */
1153