]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/contrib/dev/acpica/debugger/dbinput.c
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / sys / contrib / dev / acpica / 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 - 2010, 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 <contrib/dev/acpica/include/acpi.h>
118 #include <contrib/dev/acpica/include/accommon.h>
119 #include <contrib/dev/acpica/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 char *
130 AcpiDbGetNextToken (
131     char                    *String,
132     char                    **Next);
133
134 static UINT32
135 AcpiDbGetLine (
136     char                    *InputBuffer);
137
138 static UINT32
139 AcpiDbMatchCommand (
140     char                    *UserCommand);
141
142 static void
143 AcpiDbSingleThread (
144     void);
145
146 static void
147 AcpiDbDisplayHelp (
148     char                    *HelpType);
149
150
151 /*
152  * Top-level debugger commands.
153  *
154  * This list of commands must match the string table below it
155  */
156 enum AcpiExDebuggerCommands
157 {
158     CMD_NOT_FOUND = 0,
159     CMD_NULL,
160     CMD_ALLOCATIONS,
161     CMD_ARGS,
162     CMD_ARGUMENTS,
163     CMD_BATCH,
164     CMD_BREAKPOINT,
165     CMD_BUSINFO,
166     CMD_CALL,
167     CMD_CLOSE,
168     CMD_DEBUG,
169     CMD_DISASSEMBLE,
170     CMD_DUMP,
171     CMD_ENABLEACPI,
172     CMD_EVENT,
173     CMD_EXECUTE,
174     CMD_EXIT,
175     CMD_FIND,
176     CMD_GO,
177     CMD_GPE,
178     CMD_GPES,
179     CMD_HELP,
180     CMD_HELP2,
181     CMD_HISTORY,
182     CMD_HISTORY_EXE,
183     CMD_HISTORY_LAST,
184     CMD_INFORMATION,
185     CMD_INTEGRITY,
186     CMD_INTO,
187     CMD_LEVEL,
188     CMD_LIST,
189     CMD_LOAD,
190     CMD_LOCALS,
191     CMD_LOCKS,
192     CMD_METHODS,
193     CMD_NAMESPACE,
194     CMD_NOTIFY,
195     CMD_OBJECT,
196     CMD_OPEN,
197     CMD_OWNER,
198     CMD_PREDEFINED,
199     CMD_PREFIX,
200     CMD_QUIT,
201     CMD_REFERENCES,
202     CMD_RESOURCES,
203     CMD_RESULTS,
204     CMD_SET,
205     CMD_SLEEP,
206     CMD_STATS,
207     CMD_STOP,
208     CMD_TABLES,
209     CMD_TERMINATE,
210     CMD_THREADS,
211     CMD_TRACE,
212     CMD_TREE,
213     CMD_TYPE,
214     CMD_UNLOAD
215 };
216
217 #define CMD_FIRST_VALID     2
218
219
220 /* Second parameter is the required argument count */
221
222 static const COMMAND_INFO       AcpiGbl_DbCommands[] =
223 {
224     {"<NOT FOUND>",  0},
225     {"<NULL>",       0},
226     {"ALLOCATIONS",  0},
227     {"ARGS",         0},
228     {"ARGUMENTS",    0},
229     {"BATCH",        0},
230     {"BREAKPOINT",   1},
231     {"BUSINFO",      0},
232     {"CALL",         0},
233     {"CLOSE",        0},
234     {"DEBUG",        1},
235     {"DISASSEMBLE",  1},
236     {"DUMP",         1},
237     {"ENABLEACPI",   0},
238     {"EVENT",        1},
239     {"EXECUTE",      1},
240     {"EXIT",         0},
241     {"FIND",         1},
242     {"GO",           0},
243     {"GPE",          2},
244     {"GPES",         0},
245     {"HELP",         0},
246     {"?",            0},
247     {"HISTORY",      0},
248     {"!",            1},
249     {"!!",           0},
250     {"INFORMATION",  0},
251     {"INTEGRITY",    0},
252     {"INTO",         0},
253     {"LEVEL",        0},
254     {"LIST",         0},
255     {"LOAD",         1},
256     {"LOCALS",       0},
257     {"LOCKS",        0},
258     {"METHODS",      0},
259     {"NAMESPACE",    0},
260     {"NOTIFY",       2},
261     {"OBJECT",       1},
262     {"OPEN",         1},
263     {"OWNER",        1},
264     {"PREDEFINED",   0},
265     {"PREFIX",       0},
266     {"QUIT",         0},
267     {"REFERENCES",   1},
268     {"RESOURCES",    1},
269     {"RESULTS",      0},
270     {"SET",          3},
271     {"SLEEP",        1},
272     {"STATS",        0},
273     {"STOP",         0},
274     {"TABLES",       0},
275     {"TERMINATE",    0},
276     {"THREADS",      3},
277     {"TRACE",        1},
278     {"TREE",         0},
279     {"TYPE",         1},
280     {"UNLOAD",       1},
281     {NULL,           0}
282 };
283
284
285 /*******************************************************************************
286  *
287  * FUNCTION:    AcpiDbDisplayHelp
288  *
289  * PARAMETERS:  HelpType        - Subcommand (optional)
290  *
291  * RETURN:      None
292  *
293  * DESCRIPTION: Print a usage message.
294  *
295  ******************************************************************************/
296
297 static void
298 AcpiDbDisplayHelp (
299     char                    *HelpType)
300 {
301
302     AcpiUtStrupr (HelpType);
303
304     /* No parameter, just give the overview */
305
306     if (!HelpType)
307     {
308         AcpiOsPrintf ("ACPI CA Debugger Commands\n\n");
309         AcpiOsPrintf ("The following classes of commands are available.  Help is available for\n");
310         AcpiOsPrintf ("each class by entering \"Help <ClassName>\"\n\n");
311         AcpiOsPrintf ("    [GENERAL]       General-Purpose Commands\n");
312         AcpiOsPrintf ("    [NAMESPACE]     Namespace Access Commands\n");
313         AcpiOsPrintf ("    [METHOD]        Control Method Execution Commands\n");
314         AcpiOsPrintf ("    [STATISTICS]    Statistical Information\n");
315         AcpiOsPrintf ("    [FILE]          File I/O Commands\n");
316         return;
317     }
318
319     /*
320      * Parameter is the command class
321      *
322      * The idea here is to keep each class of commands smaller than a screenful
323      */
324     switch (HelpType[0])
325     {
326     case 'G':
327         AcpiOsPrintf ("\nGeneral-Purpose Commands\n\n");
328         AcpiOsPrintf ("Allocations                         Display list of current memory allocations\n");
329         AcpiOsPrintf ("Dump <Address>|<Namepath>\n");
330         AcpiOsPrintf ("     [Byte|Word|Dword|Qword]        Display ACPI objects or memory\n");
331         AcpiOsPrintf ("EnableAcpi                          Enable ACPI (hardware) mode\n");
332         AcpiOsPrintf ("Help                                This help screen\n");
333         AcpiOsPrintf ("History                             Display command history buffer\n");
334         AcpiOsPrintf ("Level [<DebugLevel>] [console]      Get/Set debug level for file or console\n");
335         AcpiOsPrintf ("Locks                               Current status of internal mutexes\n");
336         AcpiOsPrintf ("Quit or Exit                        Exit this command\n");
337         AcpiOsPrintf ("Stats [Allocations|Memory|Misc\n");
338         AcpiOsPrintf ("      |Objects|Sizes|Stack|Tables]  Display namespace and memory statistics\n");
339         AcpiOsPrintf ("Tables                              Display info about loaded ACPI tables\n");
340         AcpiOsPrintf ("Unload <TableSig> [Instance]        Unload an ACPI table\n");
341         AcpiOsPrintf ("! <CommandNumber>                   Execute command from history buffer\n");
342         AcpiOsPrintf ("!!                                  Execute last command again\n");
343         return;
344
345     case 'S':
346         AcpiOsPrintf ("\nStats Subcommands\n\n");
347         AcpiOsPrintf ("Allocations                         Display list of current memory allocations\n");
348         AcpiOsPrintf ("Memory                              Dump internal memory lists\n");
349         AcpiOsPrintf ("Misc                                Namespace search and mutex stats\n");
350         AcpiOsPrintf ("Objects                             Summary of namespace objects\n");
351         AcpiOsPrintf ("Sizes                               Sizes for each of the internal objects\n");
352         AcpiOsPrintf ("Stack                               Display CPU stack usage\n");
353         AcpiOsPrintf ("Tables                              Info about current ACPI table(s)\n");
354         return;
355
356     case 'N':
357         AcpiOsPrintf ("\nNamespace Access Commands\n\n");
358         AcpiOsPrintf ("Businfo                             Display system bus info\n");
359         AcpiOsPrintf ("Disassemble <Method>                Disassemble a control method\n");
360         AcpiOsPrintf ("Event <F|G> <Value>                 Generate AcpiEvent (Fixed/GPE)\n");
361         AcpiOsPrintf ("Find <AcpiName>  (? is wildcard)    Find ACPI name(s) with wildcards\n");
362         AcpiOsPrintf ("Gpe <GpeNum> <GpeBlock>             Simulate a GPE\n");
363         AcpiOsPrintf ("Gpes                                Display info on all GPEs\n");
364         AcpiOsPrintf ("Integrity                           Validate namespace integrity\n");
365         AcpiOsPrintf ("Methods                             Display list of loaded control methods\n");
366         AcpiOsPrintf ("Namespace [Object] [Depth]          Display loaded namespace tree/subtree\n");
367         AcpiOsPrintf ("Notify <Object> <Value>             Send a notification on Object\n");
368         AcpiOsPrintf ("Objects <ObjectType>                Display all objects of the given type\n");
369         AcpiOsPrintf ("Owner <OwnerId> [Depth]             Display loaded namespace by object owner\n");
370         AcpiOsPrintf ("Predefined                          Check all predefined names\n");
371         AcpiOsPrintf ("Prefix [<NamePath>]                 Set or Get current execution prefix\n");
372         AcpiOsPrintf ("References <Addr>                   Find all references to object at addr\n");
373         AcpiOsPrintf ("Resources <Device>                  Get and display Device resources\n");
374         AcpiOsPrintf ("Set N <NamedObject> <Value>         Set value for named integer\n");
375         AcpiOsPrintf ("Sleep <SleepState>                  Simulate sleep/wake sequence\n");
376         AcpiOsPrintf ("Terminate                           Delete namespace and all internal objects\n");
377         AcpiOsPrintf ("Type <Object>                       Display object type\n");
378         return;
379
380     case 'M':
381         AcpiOsPrintf ("\nControl Method Execution Commands\n\n");
382         AcpiOsPrintf ("Arguments (or Args)                 Display method arguments\n");
383         AcpiOsPrintf ("Breakpoint <AmlOffset>              Set an AML execution breakpoint\n");
384         AcpiOsPrintf ("Call                                Run to next control method invocation\n");
385         AcpiOsPrintf ("Debug <Namepath> [Arguments]        Single Step a control method\n");
386         AcpiOsPrintf ("Execute <Namepath> [Arguments]      Execute control method\n");
387         AcpiOsPrintf ("Go                                  Allow method to run to completion\n");
388         AcpiOsPrintf ("Information                         Display info about the current method\n");
389         AcpiOsPrintf ("Into                                Step into (not over) a method call\n");
390         AcpiOsPrintf ("List [# of Aml Opcodes]             Display method ASL statements\n");
391         AcpiOsPrintf ("Locals                              Display method local variables\n");
392         AcpiOsPrintf ("Results                             Display method result stack\n");
393         AcpiOsPrintf ("Set <A|L> <#> <Value>               Set method data (Arguments/Locals)\n");
394         AcpiOsPrintf ("Stop                                Terminate control method\n");
395         AcpiOsPrintf ("Thread <Threads><Loops><NamePath>   Spawn threads to execute method(s)\n");
396         AcpiOsPrintf ("Trace <method name>                 Trace method execution\n");
397         AcpiOsPrintf ("Tree                                Display control method calling tree\n");
398         AcpiOsPrintf ("<Enter>                             Single step next AML opcode (over calls)\n");
399         return;
400
401     case 'F':
402         AcpiOsPrintf ("\nFile I/O Commands\n\n");
403         AcpiOsPrintf ("Close                               Close debug output file\n");
404         AcpiOsPrintf ("Open <Output Filename>              Open a file for debug output\n");
405         AcpiOsPrintf ("Load <Input Filename>               Load ACPI table from a file\n");
406         return;
407
408     default:
409         AcpiOsPrintf ("Unrecognized Command Class: %s\n", HelpType);
410         return;
411     }
412 }
413
414
415 /*******************************************************************************
416  *
417  * FUNCTION:    AcpiDbGetNextToken
418  *
419  * PARAMETERS:  String          - Command buffer
420  *              Next            - Return value, end of next token
421  *
422  * RETURN:      Pointer to the start of the next token.
423  *
424  * DESCRIPTION: Command line parsing.  Get the next token on the command line
425  *
426  ******************************************************************************/
427
428 static char *
429 AcpiDbGetNextToken (
430     char                    *String,
431     char                    **Next)
432 {
433     char                    *Start;
434
435
436     /* At end of buffer? */
437
438     if (!String || !(*String))
439     {
440         return (NULL);
441     }
442
443     /* Get rid of any spaces at the beginning */
444
445     if (*String == ' ')
446     {
447         while (*String && (*String == ' '))
448         {
449             String++;
450         }
451
452         if (!(*String))
453         {
454             return (NULL);
455         }
456     }
457
458     Start = String;
459
460     /* Find end of token */
461
462     while (*String && (*String != ' '))
463     {
464         String++;
465     }
466
467     if (!(*String))
468     {
469         *Next = NULL;
470     }
471     else
472     {
473         *String = 0;
474         *Next = String + 1;
475     }
476
477     return (Start);
478 }
479
480
481 /*******************************************************************************
482  *
483  * FUNCTION:    AcpiDbGetLine
484  *
485  * PARAMETERS:  InputBuffer         - Command line buffer
486  *
487  * RETURN:      Count of arguments to the command
488  *
489  * DESCRIPTION: Get the next command line from the user.  Gets entire line
490  *              up to the next newline
491  *
492  ******************************************************************************/
493
494 static UINT32
495 AcpiDbGetLine (
496     char                    *InputBuffer)
497 {
498     UINT32                  i;
499     UINT32                  Count;
500     char                    *Next;
501     char                    *This;
502
503
504     ACPI_STRCPY (AcpiGbl_DbParsedBuf, InputBuffer);
505
506     This = AcpiGbl_DbParsedBuf;
507     for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
508     {
509         AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next);
510         if (!AcpiGbl_DbArgs[i])
511         {
512             break;
513         }
514
515         This = Next;
516     }
517
518     /* Uppercase the actual command */
519
520     if (AcpiGbl_DbArgs[0])
521     {
522         AcpiUtStrupr (AcpiGbl_DbArgs[0]);
523     }
524
525     Count = i;
526     if (Count)
527     {
528         Count--;  /* Number of args only */
529     }
530
531     return (Count);
532 }
533
534
535 /*******************************************************************************
536  *
537  * FUNCTION:    AcpiDbMatchCommand
538  *
539  * PARAMETERS:  UserCommand             - User command line
540  *
541  * RETURN:      Index into command array, -1 if not found
542  *
543  * DESCRIPTION: Search command array for a command match
544  *
545  ******************************************************************************/
546
547 static UINT32
548 AcpiDbMatchCommand (
549     char                    *UserCommand)
550 {
551     UINT32                  i;
552
553
554     if (!UserCommand || UserCommand[0] == 0)
555     {
556         return (CMD_NULL);
557     }
558
559     for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++)
560     {
561         if (ACPI_STRSTR (AcpiGbl_DbCommands[i].Name, UserCommand) ==
562                          AcpiGbl_DbCommands[i].Name)
563         {
564             return (i);
565         }
566     }
567
568     /* Command not recognized */
569
570     return (CMD_NOT_FOUND);
571 }
572
573
574 /*******************************************************************************
575  *
576  * FUNCTION:    AcpiDbCommandDispatch
577  *
578  * PARAMETERS:  InputBuffer         - Command line buffer
579  *              WalkState           - Current walk
580  *              Op                  - Current (executing) parse op
581  *
582  * RETURN:      Status
583  *
584  * DESCRIPTION: Command dispatcher.
585  *
586  ******************************************************************************/
587
588 ACPI_STATUS
589 AcpiDbCommandDispatch (
590     char                    *InputBuffer,
591     ACPI_WALK_STATE         *WalkState,
592     ACPI_PARSE_OBJECT       *Op)
593 {
594     UINT32                  Temp;
595     UINT32                  CommandIndex;
596     UINT32                  ParamCount;
597     char                    *CommandLine;
598     ACPI_STATUS             Status = AE_CTRL_TRUE;
599
600
601     /* If AcpiTerminate has been called, terminate this thread */
602
603     if (AcpiGbl_DbTerminateThreads)
604     {
605         return (AE_CTRL_TERMINATE);
606     }
607
608     ParamCount = AcpiDbGetLine (InputBuffer);
609     CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
610     Temp = 0;
611
612     /* Verify that we have the minimum number of params */
613
614     if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs)
615     {
616         AcpiOsPrintf ("%d parameters entered, [%s] requires %d parameters\n",
617             ParamCount, AcpiGbl_DbCommands[CommandIndex].Name,
618             AcpiGbl_DbCommands[CommandIndex].MinArgs);
619
620         return (AE_CTRL_TRUE);
621     }
622
623     /* Decode and dispatch the command */
624
625     switch (CommandIndex)
626     {
627     case CMD_NULL:
628         if (Op)
629         {
630             return (AE_OK);
631         }
632         break;
633
634     case CMD_ALLOCATIONS:
635
636 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
637         AcpiUtDumpAllocations ((UINT32) -1, NULL);
638 #endif
639         break;
640
641     case CMD_ARGS:
642     case CMD_ARGUMENTS:
643         AcpiDbDisplayArguments ();
644         break;
645
646     case CMD_BATCH:
647         AcpiDbBatchExecute (AcpiGbl_DbArgs[1]);
648         break;
649
650     case CMD_BREAKPOINT:
651         AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op);
652         break;
653
654     case CMD_BUSINFO:
655         AcpiDbGetBusInfo ();
656         break;
657
658     case CMD_CALL:
659         AcpiDbSetMethodCallBreakpoint (Op);
660         Status = AE_OK;
661         break;
662
663     case CMD_CLOSE:
664         AcpiDbCloseDebugFile ();
665         break;
666
667     case CMD_DEBUG:
668         AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], EX_SINGLE_STEP);
669         break;
670
671     case CMD_DISASSEMBLE:
672         (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
673         break;
674
675     case CMD_DUMP:
676         AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
677         break;
678
679     case CMD_ENABLEACPI:
680         Status = AcpiEnable();
681         if (ACPI_FAILURE(Status))
682         {
683             AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status);
684             return (Status);
685         }
686         break;
687
688     case CMD_EVENT:
689         AcpiOsPrintf ("Event command not implemented\n");
690         break;
691
692     case CMD_EXECUTE:
693         AcpiDbExecute (AcpiGbl_DbArgs[1],
694             &AcpiGbl_DbArgs[2], EX_NO_SINGLE_STEP);
695         break;
696
697     case CMD_FIND:
698         Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]);
699         break;
700
701     case CMD_GO:
702         AcpiGbl_CmSingleStep = FALSE;
703         return (AE_OK);
704
705     case CMD_GPE:
706         AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
707         break;
708
709     case CMD_GPES:
710         AcpiDbDisplayGpes ();
711         break;
712
713     case CMD_HELP:
714     case CMD_HELP2:
715         AcpiDbDisplayHelp (AcpiGbl_DbArgs[1]);
716         break;
717
718     case CMD_HISTORY:
719         AcpiDbDisplayHistory ();
720         break;
721
722     case CMD_HISTORY_EXE:
723         CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]);
724         if (!CommandLine)
725         {
726             return (AE_CTRL_TRUE);
727         }
728
729         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
730         return (Status);
731
732     case CMD_HISTORY_LAST:
733         CommandLine = AcpiDbGetFromHistory (NULL);
734         if (!CommandLine)
735         {
736             return (AE_CTRL_TRUE);
737         }
738
739         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
740         return (Status);
741
742     case CMD_INFORMATION:
743         AcpiDbDisplayMethodInfo (Op);
744         break;
745
746     case CMD_INTEGRITY:
747         AcpiDbCheckIntegrity ();
748         break;
749
750     case CMD_INTO:
751         if (Op)
752         {
753             AcpiGbl_CmSingleStep = TRUE;
754             return (AE_OK);
755         }
756         break;
757
758     case CMD_LEVEL:
759         if (ParamCount == 0)
760         {
761             AcpiOsPrintf ("Current debug level for file output is:    %8.8lX\n",
762                 AcpiGbl_DbDebugLevel);
763             AcpiOsPrintf ("Current debug level for console output is: %8.8lX\n",
764                 AcpiGbl_DbConsoleDebugLevel);
765         }
766         else if (ParamCount == 2)
767         {
768             Temp = AcpiGbl_DbConsoleDebugLevel;
769             AcpiGbl_DbConsoleDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1],
770                                             NULL, 16);
771             AcpiOsPrintf (
772                 "Debug Level for console output was %8.8lX, now %8.8lX\n",
773                 Temp, AcpiGbl_DbConsoleDebugLevel);
774         }
775         else
776         {
777             Temp = AcpiGbl_DbDebugLevel;
778             AcpiGbl_DbDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1], NULL, 16);
779             AcpiOsPrintf (
780                 "Debug Level for file output was %8.8lX, now %8.8lX\n",
781                 Temp, AcpiGbl_DbDebugLevel);
782         }
783         break;
784
785     case CMD_LIST:
786         AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
787         break;
788
789     case CMD_LOAD:
790         Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL);
791         break;
792
793     case CMD_LOCKS:
794         AcpiDbDisplayLocks ();
795         break;
796
797     case CMD_LOCALS:
798         AcpiDbDisplayLocals ();
799         break;
800
801     case CMD_METHODS:
802         Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]);
803         break;
804
805     case CMD_NAMESPACE:
806         AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
807         break;
808
809     case CMD_NOTIFY:
810         Temp = ACPI_STRTOUL (AcpiGbl_DbArgs[2], NULL, 0);
811         AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp);
812         break;
813
814     case CMD_OBJECT:
815         AcpiUtStrupr (AcpiGbl_DbArgs[1]);
816         Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
817         break;
818
819     case CMD_OPEN:
820         AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]);
821         break;
822
823     case CMD_OWNER:
824         AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
825         break;
826
827     case CMD_PREDEFINED:
828         AcpiDbCheckPredefinedNames ();
829         break;
830
831     case CMD_PREFIX:
832         AcpiDbSetScope (AcpiGbl_DbArgs[1]);
833         break;
834
835     case CMD_REFERENCES:
836         AcpiDbFindReferences (AcpiGbl_DbArgs[1]);
837         break;
838
839     case CMD_RESOURCES:
840         AcpiDbDisplayResources (AcpiGbl_DbArgs[1]);
841         break;
842
843     case CMD_RESULTS:
844         AcpiDbDisplayResults ();
845         break;
846
847     case CMD_SET:
848         AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
849             AcpiGbl_DbArgs[3]);
850         break;
851
852     case CMD_SLEEP:
853         Status = AcpiDbSleep (AcpiGbl_DbArgs[1]);
854         break;
855
856     case CMD_STATS:
857         Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]);
858         break;
859
860     case CMD_STOP:
861         return (AE_NOT_IMPLEMENTED);
862
863     case CMD_TABLES:
864         AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]);
865         break;
866
867     case CMD_TERMINATE:
868         AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
869         AcpiUtSubsystemShutdown ();
870
871         /*
872          * TBD: [Restructure] Need some way to re-initialize without
873          * re-creating the semaphores!
874          */
875
876         /*  AcpiInitialize (NULL);  */
877         break;
878
879     case CMD_THREADS:
880         AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
881             AcpiGbl_DbArgs[3]);
882         break;
883
884     case CMD_TRACE:
885         (void) AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1);
886         break;
887
888     case CMD_TREE:
889         AcpiDbDisplayCallingTree ();
890         break;
891
892     case CMD_TYPE:
893         AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]);
894         break;
895
896     case CMD_UNLOAD:
897         AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
898         break;
899
900     case CMD_EXIT:
901     case CMD_QUIT:
902         if (Op)
903         {
904             AcpiOsPrintf ("Method execution terminated\n");
905             return (AE_CTRL_TERMINATE);
906         }
907
908         if (!AcpiGbl_DbOutputToFile)
909         {
910             AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
911         }
912
913         AcpiDbCloseDebugFile ();
914         AcpiGbl_DbTerminateThreads = TRUE;
915         return (AE_CTRL_TERMINATE);
916
917     case CMD_NOT_FOUND:
918     default:
919         AcpiOsPrintf ("Unknown Command\n");
920         return (AE_CTRL_TRUE);
921     }
922
923     if (ACPI_SUCCESS (Status))
924     {
925         Status = AE_CTRL_TRUE;
926     }
927
928     /* Add all commands that come here to the history buffer */
929
930     AcpiDbAddToHistory (InputBuffer);
931     return (Status);
932 }
933
934
935 /*******************************************************************************
936  *
937  * FUNCTION:    AcpiDbExecuteThread
938  *
939  * PARAMETERS:  Context         - Not used
940  *
941  * RETURN:      None
942  *
943  * DESCRIPTION: Debugger execute thread.  Waits for a command line, then
944  *              simply dispatches it.
945  *
946  ******************************************************************************/
947
948 void ACPI_SYSTEM_XFACE
949 AcpiDbExecuteThread (
950     void                    *Context)
951 {
952     ACPI_STATUS             Status = AE_OK;
953     ACPI_STATUS             MStatus;
954
955
956     while (Status != AE_CTRL_TERMINATE)
957     {
958         AcpiGbl_MethodExecuting = FALSE;
959         AcpiGbl_StepToNextCall = FALSE;
960
961         MStatus = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
962         if (ACPI_FAILURE (MStatus))
963         {
964             return;
965         }
966
967         Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
968
969         MStatus = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
970         if (ACPI_FAILURE (MStatus))
971         {
972             return;
973         }
974     }
975 }
976
977
978 /*******************************************************************************
979  *
980  * FUNCTION:    AcpiDbSingleThread
981  *
982  * PARAMETERS:  None
983  *
984  * RETURN:      None
985  *
986  * DESCRIPTION: Debugger execute thread.  Waits for a command line, then
987  *              simply dispatches it.
988  *
989  ******************************************************************************/
990
991 static void
992 AcpiDbSingleThread (
993     void)
994 {
995
996     AcpiGbl_MethodExecuting = FALSE;
997     AcpiGbl_StepToNextCall = FALSE;
998
999     (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
1000 }
1001
1002
1003 /*******************************************************************************
1004  *
1005  * FUNCTION:    AcpiDbUserCommands
1006  *
1007  * PARAMETERS:  Prompt              - User prompt (depends on mode)
1008  *              Op                  - Current executing parse op
1009  *
1010  * RETURN:      None
1011  *
1012  * DESCRIPTION: Command line execution for the AML debugger.  Commands are
1013  *              matched and dispatched here.
1014  *
1015  ******************************************************************************/
1016
1017 ACPI_STATUS
1018 AcpiDbUserCommands (
1019     char                    Prompt,
1020     ACPI_PARSE_OBJECT       *Op)
1021 {
1022     ACPI_STATUS             Status = AE_OK;
1023
1024
1025     /* TBD: [Restructure] Need a separate command line buffer for step mode */
1026
1027     while (!AcpiGbl_DbTerminateThreads)
1028     {
1029         /* Force output to console until a command is entered */
1030
1031         AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
1032
1033         /* Different prompt if method is executing */
1034
1035         if (!AcpiGbl_MethodExecuting)
1036         {
1037             AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
1038         }
1039         else
1040         {
1041             AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
1042         }
1043
1044         /* Get the user input line */
1045
1046         (void) AcpiOsGetLine (AcpiGbl_DbLineBuf);
1047
1048         /* Check for single or multithreaded debug */
1049
1050         if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED)
1051         {
1052             /*
1053              * Signal the debug thread that we have a command to execute,
1054              * and wait for the command to complete.
1055              */
1056             Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY);
1057             if (ACPI_FAILURE (Status))
1058             {
1059                 return (Status);
1060             }
1061
1062             Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
1063             if (ACPI_FAILURE (Status))
1064             {
1065                 return (Status);
1066             }
1067         }
1068         else
1069         {
1070             /* Just call to the command line interpreter */
1071
1072             AcpiDbSingleThread ();
1073         }
1074     }
1075
1076     /*
1077      * Only this thread (the original thread) should actually terminate the
1078      * subsystem, because all the semaphores are deleted during termination
1079      */
1080     Status = AcpiTerminate ();
1081     return (Status);
1082 }
1083
1084 #endif  /* ACPI_DEBUGGER */
1085