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