xref: /freebsd-src/sys/contrib/dev/acpica/components/debugger/dbinput.c (revision a9d8d09c46ec699e45f3fd46ca9abcf02e5baca9)
1a159c266SJung-uk Kim /*******************************************************************************
2a159c266SJung-uk Kim  *
3a159c266SJung-uk Kim  * Module Name: dbinput - user front-end to the AML debugger
4a159c266SJung-uk Kim  *
5a159c266SJung-uk Kim  ******************************************************************************/
6a159c266SJung-uk Kim 
7a159c266SJung-uk Kim /*
8efcc2a30SJung-uk Kim  * Copyright (C) 2000 - 2013, Intel Corp.
9a159c266SJung-uk Kim  * All rights reserved.
10a159c266SJung-uk Kim  *
11a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
13a159c266SJung-uk Kim  * are met:
14a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16a159c266SJung-uk Kim  *    without modification.
17a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21a159c266SJung-uk Kim  *    binary redistribution.
22a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24a159c266SJung-uk Kim  *    from this software without specific prior written permission.
25a159c266SJung-uk Kim  *
26a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28a159c266SJung-uk Kim  * Software Foundation.
29a159c266SJung-uk Kim  *
30a159c266SJung-uk Kim  * NO WARRANTY
31a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42a159c266SJung-uk Kim  */
43a159c266SJung-uk Kim 
44a159c266SJung-uk Kim 
45a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
46a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
47a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
48a159c266SJung-uk Kim 
49a159c266SJung-uk Kim 
50a159c266SJung-uk Kim #ifdef ACPI_DEBUGGER
51a159c266SJung-uk Kim 
52a159c266SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
53a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dbinput")
54a159c266SJung-uk Kim 
55a159c266SJung-uk Kim /* Local prototypes */
56a159c266SJung-uk Kim 
57a159c266SJung-uk Kim static UINT32
58a159c266SJung-uk Kim AcpiDbGetLine (
59a159c266SJung-uk Kim     char                    *InputBuffer);
60a159c266SJung-uk Kim 
61a159c266SJung-uk Kim static UINT32
62a159c266SJung-uk Kim AcpiDbMatchCommand (
63a159c266SJung-uk Kim     char                    *UserCommand);
64a159c266SJung-uk Kim 
65a159c266SJung-uk Kim static void
66a159c266SJung-uk Kim AcpiDbSingleThread (
67a159c266SJung-uk Kim     void);
68a159c266SJung-uk Kim 
69a159c266SJung-uk Kim static void
70042ff955SJung-uk Kim AcpiDbDisplayCommandInfo (
71042ff955SJung-uk Kim     char                    *Command,
72042ff955SJung-uk Kim     BOOLEAN                 DisplayAll);
73042ff955SJung-uk Kim 
74042ff955SJung-uk Kim static void
75a159c266SJung-uk Kim AcpiDbDisplayHelp (
76042ff955SJung-uk Kim     char                    *Command);
77042ff955SJung-uk Kim 
78042ff955SJung-uk Kim static BOOLEAN
79042ff955SJung-uk Kim AcpiDbMatchCommandHelp (
80042ff955SJung-uk Kim     char                        *Command,
81042ff955SJung-uk Kim     const ACPI_DB_COMMAND_HELP  *Help);
82a159c266SJung-uk Kim 
83a159c266SJung-uk Kim 
84a159c266SJung-uk Kim /*
85a159c266SJung-uk Kim  * Top-level debugger commands.
86a159c266SJung-uk Kim  *
87a159c266SJung-uk Kim  * This list of commands must match the string table below it
88a159c266SJung-uk Kim  */
89a159c266SJung-uk Kim enum AcpiExDebuggerCommands
90a159c266SJung-uk Kim {
91a159c266SJung-uk Kim     CMD_NOT_FOUND = 0,
92a159c266SJung-uk Kim     CMD_NULL,
93a159c266SJung-uk Kim     CMD_ALLOCATIONS,
94a159c266SJung-uk Kim     CMD_ARGS,
95a159c266SJung-uk Kim     CMD_ARGUMENTS,
96a159c266SJung-uk Kim     CMD_BATCH,
97a159c266SJung-uk Kim     CMD_BREAKPOINT,
98a159c266SJung-uk Kim     CMD_BUSINFO,
99a159c266SJung-uk Kim     CMD_CALL,
100a159c266SJung-uk Kim     CMD_CLOSE,
101a159c266SJung-uk Kim     CMD_DEBUG,
102a159c266SJung-uk Kim     CMD_DISASSEMBLE,
103ed17e06eSJung-uk Kim     CMD_DISASM,
104a159c266SJung-uk Kim     CMD_DUMP,
105a159c266SJung-uk Kim     CMD_ENABLEACPI,
106042ff955SJung-uk Kim     CMD_EVALUATE,
107a159c266SJung-uk Kim     CMD_EVENT,
108a159c266SJung-uk Kim     CMD_EXECUTE,
109a159c266SJung-uk Kim     CMD_EXIT,
110a159c266SJung-uk Kim     CMD_FIND,
111a159c266SJung-uk Kim     CMD_GO,
112a159c266SJung-uk Kim     CMD_GPE,
113a159c266SJung-uk Kim     CMD_GPES,
114a159c266SJung-uk Kim     CMD_HANDLERS,
115a159c266SJung-uk Kim     CMD_HELP,
116a159c266SJung-uk Kim     CMD_HELP2,
117a159c266SJung-uk Kim     CMD_HISTORY,
118a159c266SJung-uk Kim     CMD_HISTORY_EXE,
119a159c266SJung-uk Kim     CMD_HISTORY_LAST,
120a159c266SJung-uk Kim     CMD_INFORMATION,
121a159c266SJung-uk Kim     CMD_INTEGRITY,
122a159c266SJung-uk Kim     CMD_INTO,
123a159c266SJung-uk Kim     CMD_LEVEL,
124a159c266SJung-uk Kim     CMD_LIST,
125a159c266SJung-uk Kim     CMD_LOAD,
126a159c266SJung-uk Kim     CMD_LOCALS,
127a159c266SJung-uk Kim     CMD_LOCKS,
128a159c266SJung-uk Kim     CMD_METHODS,
129a159c266SJung-uk Kim     CMD_NAMESPACE,
130a159c266SJung-uk Kim     CMD_NOTIFY,
131a159c266SJung-uk Kim     CMD_OBJECT,
132a159c266SJung-uk Kim     CMD_OPEN,
133a159c266SJung-uk Kim     CMD_OSI,
134a159c266SJung-uk Kim     CMD_OWNER,
135a159c266SJung-uk Kim     CMD_PREDEFINED,
136a159c266SJung-uk Kim     CMD_PREFIX,
137a159c266SJung-uk Kim     CMD_QUIT,
138a159c266SJung-uk Kim     CMD_REFERENCES,
139a159c266SJung-uk Kim     CMD_RESOURCES,
140a159c266SJung-uk Kim     CMD_RESULTS,
141a159c266SJung-uk Kim     CMD_SET,
142a159c266SJung-uk Kim     CMD_SLEEP,
143a159c266SJung-uk Kim     CMD_STATS,
144a159c266SJung-uk Kim     CMD_STOP,
145a159c266SJung-uk Kim     CMD_TABLES,
146a159c266SJung-uk Kim     CMD_TEMPLATE,
147a159c266SJung-uk Kim     CMD_TERMINATE,
148a159c266SJung-uk Kim     CMD_THREADS,
149a159c266SJung-uk Kim     CMD_TRACE,
150a159c266SJung-uk Kim     CMD_TREE,
151a159c266SJung-uk Kim     CMD_TYPE,
152a159c266SJung-uk Kim     CMD_UNLOAD
153a159c266SJung-uk Kim };
154a159c266SJung-uk Kim 
155a159c266SJung-uk Kim #define CMD_FIRST_VALID     2
156a159c266SJung-uk Kim 
157a159c266SJung-uk Kim 
158a159c266SJung-uk Kim /* Second parameter is the required argument count */
159a159c266SJung-uk Kim 
160042ff955SJung-uk Kim static const ACPI_DB_COMMAND_INFO   AcpiGbl_DbCommands[] =
161a159c266SJung-uk Kim {
162a159c266SJung-uk Kim     {"<NOT FOUND>",  0},
163a159c266SJung-uk Kim     {"<NULL>",       0},
164a159c266SJung-uk Kim     {"ALLOCATIONS",  0},
165a159c266SJung-uk Kim     {"ARGS",         0},
166a159c266SJung-uk Kim     {"ARGUMENTS",    0},
167a159c266SJung-uk Kim     {"BATCH",        0},
168a159c266SJung-uk Kim     {"BREAKPOINT",   1},
169a159c266SJung-uk Kim     {"BUSINFO",      0},
170a159c266SJung-uk Kim     {"CALL",         0},
171a159c266SJung-uk Kim     {"CLOSE",        0},
172a159c266SJung-uk Kim     {"DEBUG",        1},
173a159c266SJung-uk Kim     {"DISASSEMBLE",  1},
174ed17e06eSJung-uk Kim     {"DISASM",       1},
175a159c266SJung-uk Kim     {"DUMP",         1},
176a159c266SJung-uk Kim     {"ENABLEACPI",   0},
177042ff955SJung-uk Kim     {"EVALUATE",     1},
178a159c266SJung-uk Kim     {"EVENT",        1},
179a159c266SJung-uk Kim     {"EXECUTE",      1},
180a159c266SJung-uk Kim     {"EXIT",         0},
181a159c266SJung-uk Kim     {"FIND",         1},
182a159c266SJung-uk Kim     {"GO",           0},
183a159c266SJung-uk Kim     {"GPE",          2},
184a159c266SJung-uk Kim     {"GPES",         0},
185a159c266SJung-uk Kim     {"HANDLERS",     0},
186a159c266SJung-uk Kim     {"HELP",         0},
187a159c266SJung-uk Kim     {"?",            0},
188a159c266SJung-uk Kim     {"HISTORY",      0},
189a159c266SJung-uk Kim     {"!",            1},
190a159c266SJung-uk Kim     {"!!",           0},
191a159c266SJung-uk Kim     {"INFORMATION",  0},
192a159c266SJung-uk Kim     {"INTEGRITY",    0},
193a159c266SJung-uk Kim     {"INTO",         0},
194a159c266SJung-uk Kim     {"LEVEL",        0},
195a159c266SJung-uk Kim     {"LIST",         0},
196a159c266SJung-uk Kim     {"LOAD",         1},
197a159c266SJung-uk Kim     {"LOCALS",       0},
198a159c266SJung-uk Kim     {"LOCKS",        0},
199a159c266SJung-uk Kim     {"METHODS",      0},
200a159c266SJung-uk Kim     {"NAMESPACE",    0},
201a159c266SJung-uk Kim     {"NOTIFY",       2},
202a159c266SJung-uk Kim     {"OBJECT",       1},
203a159c266SJung-uk Kim     {"OPEN",         1},
204a159c266SJung-uk Kim     {"OSI",          0},
205a159c266SJung-uk Kim     {"OWNER",        1},
206a159c266SJung-uk Kim     {"PREDEFINED",   0},
207a159c266SJung-uk Kim     {"PREFIX",       0},
208a159c266SJung-uk Kim     {"QUIT",         0},
209a159c266SJung-uk Kim     {"REFERENCES",   1},
2109c48c75eSJung-uk Kim     {"RESOURCES",    0},
211a159c266SJung-uk Kim     {"RESULTS",      0},
212a159c266SJung-uk Kim     {"SET",          3},
213efcc2a30SJung-uk Kim     {"SLEEP",        0},
214042ff955SJung-uk Kim     {"STATS",        1},
215a159c266SJung-uk Kim     {"STOP",         0},
216a159c266SJung-uk Kim     {"TABLES",       0},
217a159c266SJung-uk Kim     {"TEMPLATE",     1},
218a159c266SJung-uk Kim     {"TERMINATE",    0},
219a159c266SJung-uk Kim     {"THREADS",      3},
220a159c266SJung-uk Kim     {"TRACE",        1},
221a159c266SJung-uk Kim     {"TREE",         0},
222a159c266SJung-uk Kim     {"TYPE",         1},
223a159c266SJung-uk Kim     {"UNLOAD",       1},
224a159c266SJung-uk Kim     {NULL,           0}
225a159c266SJung-uk Kim };
226a159c266SJung-uk Kim 
227042ff955SJung-uk Kim /*
228042ff955SJung-uk Kim  * Help for all debugger commands. First argument is the number of lines
229042ff955SJung-uk Kim  * of help to output for the command.
230042ff955SJung-uk Kim  */
231042ff955SJung-uk Kim static const ACPI_DB_COMMAND_HELP   AcpiGbl_DbCommandHelp[] =
232042ff955SJung-uk Kim {
233042ff955SJung-uk Kim     {0, "\nGeneral-Purpose Commands:",         "\n"},
234042ff955SJung-uk Kim     {1, "  Allocations",                       "Display list of current memory allocations\n"},
235042ff955SJung-uk Kim     {2, "  Dump <Address>|<Namepath>",         "\n"},
236042ff955SJung-uk Kim     {0, "       [Byte|Word|Dword|Qword]",      "Display ACPI objects or memory\n"},
237042ff955SJung-uk Kim     {1, "  EnableAcpi",                        "Enable ACPI (hardware) mode\n"},
238042ff955SJung-uk Kim     {1, "  Handlers",                          "Info about global handlers\n"},
239042ff955SJung-uk Kim     {1, "  Help [Command]",                    "This help screen or individual command\n"},
240042ff955SJung-uk Kim     {1, "  History",                           "Display command history buffer\n"},
241042ff955SJung-uk Kim     {1, "  Level <DebugLevel>] [console]",     "Get/Set debug level for file or console\n"},
242042ff955SJung-uk Kim     {1, "  Locks",                             "Current status of internal mutexes\n"},
243042ff955SJung-uk Kim     {1, "  Osi [Install|Remove <name>]",       "Display or modify global _OSI list\n"},
244042ff955SJung-uk Kim     {1, "  Quit or Exit",                      "Exit this command\n"},
245042ff955SJung-uk Kim     {9, "  Stats [Allocations|Memory|Misc|",   "\n"},
246042ff955SJung-uk Kim     {1, "      Objects|Sizes|Stack|Tables]",   "Display namespace and memory statistics\n"},
247042ff955SJung-uk Kim     {1, "     Allocations",                    "Display list of current memory allocations\n"},
248042ff955SJung-uk Kim     {1, "     Memory",                         "Dump internal memory lists\n"},
249042ff955SJung-uk Kim     {1, "     Misc",                           "Namespace search and mutex stats\n"},
250042ff955SJung-uk Kim     {1, "     Objects",                        "Summary of namespace objects\n"},
251042ff955SJung-uk Kim     {1, "     Sizes",                          "Sizes for each of the internal objects\n"},
252042ff955SJung-uk Kim     {1, "     Stack",                          "Display CPU stack usage\n"},
253042ff955SJung-uk Kim     {1, "     Tables",                         "Info about current ACPI table(s)\n"},
254042ff955SJung-uk Kim     {1, "  Tables",                            "Display info about loaded ACPI tables\n"},
255042ff955SJung-uk Kim     {1, "  Unload <Namepath>",                 "Unload an ACPI table via namespace object\n"},
256042ff955SJung-uk Kim     {1, "  ! <CommandNumber>",                 "Execute command from history buffer\n"},
257042ff955SJung-uk Kim     {1, "  !!",                                "Execute last command again\n"},
258042ff955SJung-uk Kim 
259042ff955SJung-uk Kim     {0, "\nNamespace Access Commands:",        "\n"},
260042ff955SJung-uk Kim     {1, "  Businfo",                           "Display system bus info\n"},
261042ff955SJung-uk Kim     {1, "  Disassemble <Method>",              "Disassemble a control method\n"},
262042ff955SJung-uk Kim     {1, "  Event <F|G> <Value>",               "Generate AcpiEvent (Fixed/GPE)\n"},
263042ff955SJung-uk Kim     {1, "  Find <AcpiName> (? is wildcard)",   "Find ACPI name(s) with wildcards\n"},
264042ff955SJung-uk Kim     {1, "  Gpe <GpeNum> <GpeBlock>",           "Simulate a GPE\n"},
265042ff955SJung-uk Kim     {1, "  Gpes",                              "Display info on all GPEs\n"},
266042ff955SJung-uk Kim     {1, "  Integrity",                         "Validate namespace integrity\n"},
267042ff955SJung-uk Kim     {1, "  Methods",                           "Display list of loaded control methods\n"},
268042ff955SJung-uk Kim     {1, "  Namespace [Object] [Depth]",        "Display loaded namespace tree/subtree\n"},
269042ff955SJung-uk Kim     {1, "  Notify <Object> <Value>",           "Send a notification on Object\n"},
270042ff955SJung-uk Kim     {1, "  Objects <ObjectType>",              "Display all objects of the given type\n"},
271042ff955SJung-uk Kim     {1, "  Owner <OwnerId> [Depth]",           "Display loaded namespace by object owner\n"},
272042ff955SJung-uk Kim     {1, "  Predefined",                        "Check all predefined names\n"},
273042ff955SJung-uk Kim     {1, "  Prefix [<NamePath>]",               "Set or Get current execution prefix\n"},
274042ff955SJung-uk Kim     {1, "  References <Addr>",                 "Find all references to object at addr\n"},
2759c48c75eSJung-uk Kim     {1, "  Resources [DeviceName]",            "Display Device resources (no arg = all devices)\n"},
276042ff955SJung-uk Kim     {1, "  Set N <NamedObject> <Value>",       "Set value for named integer\n"},
277efcc2a30SJung-uk Kim     {1, "  Sleep [SleepState]",                "Simulate sleep/wake sequence(s) (0-5)\n"},
278042ff955SJung-uk Kim     {1, "  Template <Object>",                 "Format/dump a Buffer/ResourceTemplate\n"},
279042ff955SJung-uk Kim     {1, "  Terminate",                         "Delete namespace and all internal objects\n"},
280042ff955SJung-uk Kim     {1, "  Type <Object>",                     "Display object type\n"},
281042ff955SJung-uk Kim 
282042ff955SJung-uk Kim     {0, "\nControl Method Execution Commands:","\n"},
283042ff955SJung-uk Kim     {1, "  Arguments (or Args)",               "Display method arguments\n"},
284042ff955SJung-uk Kim     {1, "  Breakpoint <AmlOffset>",            "Set an AML execution breakpoint\n"},
285042ff955SJung-uk Kim     {1, "  Call",                              "Run to next control method invocation\n"},
286042ff955SJung-uk Kim     {1, "  Debug <Namepath> [Arguments]",      "Single Step a control method\n"},
287042ff955SJung-uk Kim     {6, "  Evaluate",                          "Synonym for Execute\n"},
288042ff955SJung-uk Kim     {5, "  Execute <Namepath> [Arguments]",    "Execute control method\n"},
289042ff955SJung-uk Kim     {1, "     Hex Integer",                    "Integer method argument\n"},
290042ff955SJung-uk Kim     {1, "     \"Ascii String\"",               "String method argument\n"},
291042ff955SJung-uk Kim     {1, "     (Byte List)",                    "Buffer method argument\n"},
292042ff955SJung-uk Kim     {1, "     [Package Element List]",         "Package method argument\n"},
293042ff955SJung-uk Kim     {1, "  Go",                                "Allow method to run to completion\n"},
294042ff955SJung-uk Kim     {1, "  Information",                       "Display info about the current method\n"},
295042ff955SJung-uk Kim     {1, "  Into",                              "Step into (not over) a method call\n"},
296042ff955SJung-uk Kim     {1, "  List [# of Aml Opcodes]",           "Display method ASL statements\n"},
297042ff955SJung-uk Kim     {1, "  Locals",                            "Display method local variables\n"},
298042ff955SJung-uk Kim     {1, "  Results",                           "Display method result stack\n"},
299042ff955SJung-uk Kim     {1, "  Set <A|L> <#> <Value>",             "Set method data (Arguments/Locals)\n"},
300042ff955SJung-uk Kim     {1, "  Stop",                              "Terminate control method\n"},
301042ff955SJung-uk Kim     {1, "  Thread <Threads><Loops><NamePath>", "Spawn threads to execute method(s)\n"},
302042ff955SJung-uk Kim     {1, "  Trace <method name>",               "Trace method execution\n"},
303042ff955SJung-uk Kim     {1, "  Tree",                              "Display control method calling tree\n"},
304042ff955SJung-uk Kim     {1, "  <Enter>",                           "Single step next AML opcode (over calls)\n"},
305042ff955SJung-uk Kim 
306042ff955SJung-uk Kim     {0, "\nFile I/O Commands:",                "\n"},
307042ff955SJung-uk Kim     {1, "  Close",                             "Close debug output file\n"},
308042ff955SJung-uk Kim     {1, "  Load <Input Filename>",             "Load ACPI table from a file\n"},
309042ff955SJung-uk Kim     {1, "  Open <Output Filename>",            "Open a file for debug output\n"},
310042ff955SJung-uk Kim     {0, NULL, NULL}
311042ff955SJung-uk Kim };
312042ff955SJung-uk Kim 
313042ff955SJung-uk Kim 
314042ff955SJung-uk Kim /*******************************************************************************
315042ff955SJung-uk Kim  *
316042ff955SJung-uk Kim  * FUNCTION:    AcpiDbMatchCommandHelp
317042ff955SJung-uk Kim  *
318042ff955SJung-uk Kim  * PARAMETERS:  Command             - Command string to match
319042ff955SJung-uk Kim  *              Help                - Help table entry to attempt match
320042ff955SJung-uk Kim  *
321042ff955SJung-uk Kim  * RETURN:      TRUE if command matched, FALSE otherwise
322042ff955SJung-uk Kim  *
323042ff955SJung-uk Kim  * DESCRIPTION: Attempt to match a command in the help table in order to
324042ff955SJung-uk Kim  *              print help information for a single command.
325042ff955SJung-uk Kim  *
326042ff955SJung-uk Kim  ******************************************************************************/
327042ff955SJung-uk Kim 
328042ff955SJung-uk Kim static BOOLEAN
329042ff955SJung-uk Kim AcpiDbMatchCommandHelp (
330042ff955SJung-uk Kim     char                        *Command,
331042ff955SJung-uk Kim     const ACPI_DB_COMMAND_HELP  *Help)
332042ff955SJung-uk Kim {
333042ff955SJung-uk Kim     char                    *Invocation = Help->Invocation;
334042ff955SJung-uk Kim     UINT32                  LineCount;
335042ff955SJung-uk Kim 
336042ff955SJung-uk Kim 
337042ff955SJung-uk Kim     /* Valid commands in the help table begin with a couple of spaces */
338042ff955SJung-uk Kim 
339042ff955SJung-uk Kim     if (*Invocation != ' ')
340042ff955SJung-uk Kim     {
341042ff955SJung-uk Kim         return (FALSE);
342042ff955SJung-uk Kim     }
343042ff955SJung-uk Kim 
344042ff955SJung-uk Kim     while (*Invocation == ' ')
345042ff955SJung-uk Kim     {
346042ff955SJung-uk Kim         Invocation++;
347042ff955SJung-uk Kim     }
348042ff955SJung-uk Kim 
349042ff955SJung-uk Kim     /* Match command name (full command or substring) */
350042ff955SJung-uk Kim 
351042ff955SJung-uk Kim     while ((*Command) && (*Invocation) && (*Invocation != ' '))
352042ff955SJung-uk Kim     {
353042ff955SJung-uk Kim         if (ACPI_TOLOWER (*Command) != ACPI_TOLOWER (*Invocation))
354042ff955SJung-uk Kim         {
355042ff955SJung-uk Kim             return (FALSE);
356042ff955SJung-uk Kim         }
357042ff955SJung-uk Kim 
358042ff955SJung-uk Kim         Invocation++;
359042ff955SJung-uk Kim         Command++;
360042ff955SJung-uk Kim     }
361042ff955SJung-uk Kim 
362042ff955SJung-uk Kim     /* Print the appropriate number of help lines */
363042ff955SJung-uk Kim 
364042ff955SJung-uk Kim     LineCount = Help->LineCount;
365042ff955SJung-uk Kim     while (LineCount)
366042ff955SJung-uk Kim     {
367042ff955SJung-uk Kim         AcpiOsPrintf ("%-38s : %s", Help->Invocation, Help->Description);
368042ff955SJung-uk Kim         Help++;
369042ff955SJung-uk Kim         LineCount--;
370042ff955SJung-uk Kim     }
371042ff955SJung-uk Kim 
372042ff955SJung-uk Kim     return (TRUE);
373042ff955SJung-uk Kim }
374042ff955SJung-uk Kim 
375042ff955SJung-uk Kim 
376042ff955SJung-uk Kim /*******************************************************************************
377042ff955SJung-uk Kim  *
378042ff955SJung-uk Kim  * FUNCTION:    AcpiDbDisplayCommandInfo
379042ff955SJung-uk Kim  *
380042ff955SJung-uk Kim  * PARAMETERS:  Command             - Command string to match
381042ff955SJung-uk Kim  *              DisplayAll          - Display all matching commands, or just
382042ff955SJung-uk Kim  *                                    the first one (substring match)
383042ff955SJung-uk Kim  *
384042ff955SJung-uk Kim  * RETURN:      None
385042ff955SJung-uk Kim  *
386042ff955SJung-uk Kim  * DESCRIPTION: Display help information for a Debugger command.
387042ff955SJung-uk Kim  *
388042ff955SJung-uk Kim  ******************************************************************************/
389042ff955SJung-uk Kim 
390042ff955SJung-uk Kim static void
391042ff955SJung-uk Kim AcpiDbDisplayCommandInfo (
392042ff955SJung-uk Kim     char                    *Command,
393042ff955SJung-uk Kim     BOOLEAN                 DisplayAll)
394042ff955SJung-uk Kim {
395042ff955SJung-uk Kim     const ACPI_DB_COMMAND_HELP  *Next;
396042ff955SJung-uk Kim     BOOLEAN                     Matched;
397042ff955SJung-uk Kim 
398042ff955SJung-uk Kim 
399042ff955SJung-uk Kim     Next = AcpiGbl_DbCommandHelp;
400042ff955SJung-uk Kim     while (Next->Invocation)
401042ff955SJung-uk Kim     {
402042ff955SJung-uk Kim         Matched = AcpiDbMatchCommandHelp (Command, Next);
403042ff955SJung-uk Kim         if (!DisplayAll && Matched)
404042ff955SJung-uk Kim         {
405042ff955SJung-uk Kim             return;
406042ff955SJung-uk Kim         }
407042ff955SJung-uk Kim 
408042ff955SJung-uk Kim         Next++;
409042ff955SJung-uk Kim     }
410042ff955SJung-uk Kim }
411042ff955SJung-uk Kim 
412a159c266SJung-uk Kim 
413a159c266SJung-uk Kim /*******************************************************************************
414a159c266SJung-uk Kim  *
415a159c266SJung-uk Kim  * FUNCTION:    AcpiDbDisplayHelp
416a159c266SJung-uk Kim  *
417042ff955SJung-uk Kim  * PARAMETERS:  Command             - Optional command string to display help.
418042ff955SJung-uk Kim  *                                    if not specified, all debugger command
419042ff955SJung-uk Kim  *                                    help strings are displayed
420a159c266SJung-uk Kim  *
421a159c266SJung-uk Kim  * RETURN:      None
422a159c266SJung-uk Kim  *
423042ff955SJung-uk Kim  * DESCRIPTION: Display help for a single debugger command, or all of them.
424a159c266SJung-uk Kim  *
425a159c266SJung-uk Kim  ******************************************************************************/
426a159c266SJung-uk Kim 
427a159c266SJung-uk Kim static void
428a159c266SJung-uk Kim AcpiDbDisplayHelp (
429042ff955SJung-uk Kim     char                    *Command)
430a159c266SJung-uk Kim {
431042ff955SJung-uk Kim     const ACPI_DB_COMMAND_HELP  *Next = AcpiGbl_DbCommandHelp;
432a159c266SJung-uk Kim 
433a159c266SJung-uk Kim 
434042ff955SJung-uk Kim     if (!Command)
435042ff955SJung-uk Kim     {
436042ff955SJung-uk Kim         /* No argument to help, display help for all commands */
437a159c266SJung-uk Kim 
438042ff955SJung-uk Kim         while (Next->Invocation)
439042ff955SJung-uk Kim         {
440042ff955SJung-uk Kim             AcpiOsPrintf ("%-38s%s", Next->Invocation, Next->Description);
441042ff955SJung-uk Kim             Next++;
442042ff955SJung-uk Kim         }
443042ff955SJung-uk Kim     }
444042ff955SJung-uk Kim     else
445042ff955SJung-uk Kim     {
446042ff955SJung-uk Kim         /* Display help for all commands that match the subtring */
447a159c266SJung-uk Kim 
448042ff955SJung-uk Kim         AcpiDbDisplayCommandInfo (Command, TRUE);
449042ff955SJung-uk Kim     }
450a159c266SJung-uk Kim }
451a159c266SJung-uk Kim 
452a159c266SJung-uk Kim 
453a159c266SJung-uk Kim /*******************************************************************************
454a159c266SJung-uk Kim  *
455a159c266SJung-uk Kim  * FUNCTION:    AcpiDbGetNextToken
456a159c266SJung-uk Kim  *
457a159c266SJung-uk Kim  * PARAMETERS:  String          - Command buffer
458a159c266SJung-uk Kim  *              Next            - Return value, end of next token
459a159c266SJung-uk Kim  *
460a159c266SJung-uk Kim  * RETURN:      Pointer to the start of the next token.
461a159c266SJung-uk Kim  *
462a159c266SJung-uk Kim  * DESCRIPTION: Command line parsing. Get the next token on the command line
463a159c266SJung-uk Kim  *
464a159c266SJung-uk Kim  ******************************************************************************/
465a159c266SJung-uk Kim 
466a159c266SJung-uk Kim char *
467a159c266SJung-uk Kim AcpiDbGetNextToken (
468a159c266SJung-uk Kim     char                    *String,
469a159c266SJung-uk Kim     char                    **Next,
470a159c266SJung-uk Kim     ACPI_OBJECT_TYPE        *ReturnType)
471a159c266SJung-uk Kim {
472a159c266SJung-uk Kim     char                    *Start;
473a159c266SJung-uk Kim     UINT32                  Depth;
474a159c266SJung-uk Kim     ACPI_OBJECT_TYPE        Type = ACPI_TYPE_INTEGER;
475a159c266SJung-uk Kim 
476a159c266SJung-uk Kim 
477a159c266SJung-uk Kim     /* At end of buffer? */
478a159c266SJung-uk Kim 
479a159c266SJung-uk Kim     if (!String || !(*String))
480a159c266SJung-uk Kim     {
481a159c266SJung-uk Kim         return (NULL);
482a159c266SJung-uk Kim     }
483a159c266SJung-uk Kim 
484a159c266SJung-uk Kim     /* Remove any spaces at the beginning */
485a159c266SJung-uk Kim 
486a159c266SJung-uk Kim     if (*String == ' ')
487a159c266SJung-uk Kim     {
488a159c266SJung-uk Kim         while (*String && (*String == ' '))
489a159c266SJung-uk Kim         {
490a159c266SJung-uk Kim             String++;
491a159c266SJung-uk Kim         }
492a159c266SJung-uk Kim 
493a159c266SJung-uk Kim         if (!(*String))
494a159c266SJung-uk Kim         {
495a159c266SJung-uk Kim             return (NULL);
496a159c266SJung-uk Kim         }
497a159c266SJung-uk Kim     }
498a159c266SJung-uk Kim 
499a159c266SJung-uk Kim     switch (*String)
500a159c266SJung-uk Kim     {
501a159c266SJung-uk Kim     case '"':
502a159c266SJung-uk Kim 
503a159c266SJung-uk Kim         /* This is a quoted string, scan until closing quote */
504a159c266SJung-uk Kim 
505a159c266SJung-uk Kim         String++;
506a159c266SJung-uk Kim         Start = String;
507a159c266SJung-uk Kim         Type = ACPI_TYPE_STRING;
508a159c266SJung-uk Kim 
509a159c266SJung-uk Kim         /* Find end of string */
510a159c266SJung-uk Kim 
511a159c266SJung-uk Kim         while (*String && (*String != '"'))
512a159c266SJung-uk Kim         {
513a159c266SJung-uk Kim             String++;
514a159c266SJung-uk Kim         }
515a159c266SJung-uk Kim         break;
516a159c266SJung-uk Kim 
517a159c266SJung-uk Kim     case '(':
518a159c266SJung-uk Kim 
519a159c266SJung-uk Kim         /* This is the start of a buffer, scan until closing paren */
520a159c266SJung-uk Kim 
521a159c266SJung-uk Kim         String++;
522a159c266SJung-uk Kim         Start = String;
523a159c266SJung-uk Kim         Type = ACPI_TYPE_BUFFER;
524a159c266SJung-uk Kim 
525a159c266SJung-uk Kim         /* Find end of buffer */
526a159c266SJung-uk Kim 
527a159c266SJung-uk Kim         while (*String && (*String != ')'))
528a159c266SJung-uk Kim         {
529a159c266SJung-uk Kim             String++;
530a159c266SJung-uk Kim         }
531a159c266SJung-uk Kim         break;
532a159c266SJung-uk Kim 
533a159c266SJung-uk Kim     case '[':
534a159c266SJung-uk Kim 
535a159c266SJung-uk Kim         /* This is the start of a package, scan until closing bracket */
536a159c266SJung-uk Kim 
537a159c266SJung-uk Kim         String++;
538a159c266SJung-uk Kim         Depth = 1;
539a159c266SJung-uk Kim         Start = String;
540a159c266SJung-uk Kim         Type = ACPI_TYPE_PACKAGE;
541a159c266SJung-uk Kim 
542a159c266SJung-uk Kim         /* Find end of package (closing bracket) */
543a159c266SJung-uk Kim 
544a159c266SJung-uk Kim         while (*String)
545a159c266SJung-uk Kim         {
546a159c266SJung-uk Kim             /* Handle String package elements */
547a159c266SJung-uk Kim 
548a159c266SJung-uk Kim             if (*String == '"')
549a159c266SJung-uk Kim             {
550a159c266SJung-uk Kim                 /* Find end of string */
551a159c266SJung-uk Kim 
552a159c266SJung-uk Kim                 String++;
553a159c266SJung-uk Kim                 while (*String && (*String != '"'))
554a159c266SJung-uk Kim                 {
555a159c266SJung-uk Kim                     String++;
556a159c266SJung-uk Kim                 }
557a159c266SJung-uk Kim                 if (!(*String))
558a159c266SJung-uk Kim                 {
559a159c266SJung-uk Kim                     break;
560a159c266SJung-uk Kim                 }
561a159c266SJung-uk Kim             }
562a159c266SJung-uk Kim             else if (*String == '[')
563a159c266SJung-uk Kim             {
564a159c266SJung-uk Kim                 Depth++;         /* A nested package declaration */
565a159c266SJung-uk Kim             }
566a159c266SJung-uk Kim             else if (*String == ']')
567a159c266SJung-uk Kim             {
568a159c266SJung-uk Kim                 Depth--;
569a159c266SJung-uk Kim                 if (Depth == 0) /* Found final package closing bracket */
570a159c266SJung-uk Kim                 {
571a159c266SJung-uk Kim                     break;
572a159c266SJung-uk Kim                 }
573a159c266SJung-uk Kim             }
574a159c266SJung-uk Kim 
575a159c266SJung-uk Kim             String++;
576a159c266SJung-uk Kim         }
577a159c266SJung-uk Kim         break;
578a159c266SJung-uk Kim 
579a159c266SJung-uk Kim     default:
580a159c266SJung-uk Kim 
581a159c266SJung-uk Kim         Start = String;
582a159c266SJung-uk Kim 
583a159c266SJung-uk Kim         /* Find end of token */
584a159c266SJung-uk Kim 
585a159c266SJung-uk Kim         while (*String && (*String != ' '))
586a159c266SJung-uk Kim         {
587a159c266SJung-uk Kim             String++;
588a159c266SJung-uk Kim         }
589a159c266SJung-uk Kim         break;
590a159c266SJung-uk Kim     }
591a159c266SJung-uk Kim 
592a159c266SJung-uk Kim     if (!(*String))
593a159c266SJung-uk Kim     {
594a159c266SJung-uk Kim         *Next = NULL;
595a159c266SJung-uk Kim     }
596a159c266SJung-uk Kim     else
597a159c266SJung-uk Kim     {
598a159c266SJung-uk Kim         *String = 0;
599a159c266SJung-uk Kim         *Next = String + 1;
600a159c266SJung-uk Kim     }
601a159c266SJung-uk Kim 
602a159c266SJung-uk Kim     *ReturnType = Type;
603a159c266SJung-uk Kim     return (Start);
604a159c266SJung-uk Kim }
605a159c266SJung-uk Kim 
606a159c266SJung-uk Kim 
607a159c266SJung-uk Kim /*******************************************************************************
608a159c266SJung-uk Kim  *
609a159c266SJung-uk Kim  * FUNCTION:    AcpiDbGetLine
610a159c266SJung-uk Kim  *
611a159c266SJung-uk Kim  * PARAMETERS:  InputBuffer         - Command line buffer
612a159c266SJung-uk Kim  *
613a159c266SJung-uk Kim  * RETURN:      Count of arguments to the command
614a159c266SJung-uk Kim  *
615a159c266SJung-uk Kim  * DESCRIPTION: Get the next command line from the user. Gets entire line
616a159c266SJung-uk Kim  *              up to the next newline
617a159c266SJung-uk Kim  *
618a159c266SJung-uk Kim  ******************************************************************************/
619a159c266SJung-uk Kim 
620a159c266SJung-uk Kim static UINT32
621a159c266SJung-uk Kim AcpiDbGetLine (
622a159c266SJung-uk Kim     char                    *InputBuffer)
623a159c266SJung-uk Kim {
624a159c266SJung-uk Kim     UINT32                  i;
625a159c266SJung-uk Kim     UINT32                  Count;
626a159c266SJung-uk Kim     char                    *Next;
627a159c266SJung-uk Kim     char                    *This;
628a159c266SJung-uk Kim 
629a159c266SJung-uk Kim 
630a159c266SJung-uk Kim     ACPI_STRCPY (AcpiGbl_DbParsedBuf, InputBuffer);
631a159c266SJung-uk Kim 
632a159c266SJung-uk Kim     This = AcpiGbl_DbParsedBuf;
633a159c266SJung-uk Kim     for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
634a159c266SJung-uk Kim     {
635a159c266SJung-uk Kim         AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next,
636a159c266SJung-uk Kim             &AcpiGbl_DbArgTypes[i]);
637a159c266SJung-uk Kim         if (!AcpiGbl_DbArgs[i])
638a159c266SJung-uk Kim         {
639a159c266SJung-uk Kim             break;
640a159c266SJung-uk Kim         }
641a159c266SJung-uk Kim 
642a159c266SJung-uk Kim         This = Next;
643a159c266SJung-uk Kim     }
644a159c266SJung-uk Kim 
645a159c266SJung-uk Kim     /* Uppercase the actual command */
646a159c266SJung-uk Kim 
647a159c266SJung-uk Kim     if (AcpiGbl_DbArgs[0])
648a159c266SJung-uk Kim     {
649a159c266SJung-uk Kim         AcpiUtStrupr (AcpiGbl_DbArgs[0]);
650a159c266SJung-uk Kim     }
651a159c266SJung-uk Kim 
652a159c266SJung-uk Kim     Count = i;
653a159c266SJung-uk Kim     if (Count)
654a159c266SJung-uk Kim     {
655a159c266SJung-uk Kim         Count--;  /* Number of args only */
656a159c266SJung-uk Kim     }
657a159c266SJung-uk Kim 
658a159c266SJung-uk Kim     return (Count);
659a159c266SJung-uk Kim }
660a159c266SJung-uk Kim 
661a159c266SJung-uk Kim 
662a159c266SJung-uk Kim /*******************************************************************************
663a159c266SJung-uk Kim  *
664a159c266SJung-uk Kim  * FUNCTION:    AcpiDbMatchCommand
665a159c266SJung-uk Kim  *
666a159c266SJung-uk Kim  * PARAMETERS:  UserCommand             - User command line
667a159c266SJung-uk Kim  *
668a159c266SJung-uk Kim  * RETURN:      Index into command array, -1 if not found
669a159c266SJung-uk Kim  *
670a159c266SJung-uk Kim  * DESCRIPTION: Search command array for a command match
671a159c266SJung-uk Kim  *
672a159c266SJung-uk Kim  ******************************************************************************/
673a159c266SJung-uk Kim 
674a159c266SJung-uk Kim static UINT32
675a159c266SJung-uk Kim AcpiDbMatchCommand (
676a159c266SJung-uk Kim     char                    *UserCommand)
677a159c266SJung-uk Kim {
678a159c266SJung-uk Kim     UINT32                  i;
679a159c266SJung-uk Kim 
680a159c266SJung-uk Kim 
681a159c266SJung-uk Kim     if (!UserCommand || UserCommand[0] == 0)
682a159c266SJung-uk Kim     {
683a159c266SJung-uk Kim         return (CMD_NULL);
684a159c266SJung-uk Kim     }
685a159c266SJung-uk Kim 
686a159c266SJung-uk Kim     for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++)
687a159c266SJung-uk Kim     {
688a159c266SJung-uk Kim         if (ACPI_STRSTR (AcpiGbl_DbCommands[i].Name, UserCommand) ==
689a159c266SJung-uk Kim                          AcpiGbl_DbCommands[i].Name)
690a159c266SJung-uk Kim         {
691a159c266SJung-uk Kim             return (i);
692a159c266SJung-uk Kim         }
693a159c266SJung-uk Kim     }
694a159c266SJung-uk Kim 
695a159c266SJung-uk Kim     /* Command not recognized */
696a159c266SJung-uk Kim 
697a159c266SJung-uk Kim     return (CMD_NOT_FOUND);
698a159c266SJung-uk Kim }
699a159c266SJung-uk Kim 
700a159c266SJung-uk Kim 
701a159c266SJung-uk Kim /*******************************************************************************
702a159c266SJung-uk Kim  *
703a159c266SJung-uk Kim  * FUNCTION:    AcpiDbCommandDispatch
704a159c266SJung-uk Kim  *
705a159c266SJung-uk Kim  * PARAMETERS:  InputBuffer         - Command line buffer
706a159c266SJung-uk Kim  *              WalkState           - Current walk
707a159c266SJung-uk Kim  *              Op                  - Current (executing) parse op
708a159c266SJung-uk Kim  *
709a159c266SJung-uk Kim  * RETURN:      Status
710a159c266SJung-uk Kim  *
711a159c266SJung-uk Kim  * DESCRIPTION: Command dispatcher.
712a159c266SJung-uk Kim  *
713a159c266SJung-uk Kim  ******************************************************************************/
714a159c266SJung-uk Kim 
715a159c266SJung-uk Kim ACPI_STATUS
716a159c266SJung-uk Kim AcpiDbCommandDispatch (
717a159c266SJung-uk Kim     char                    *InputBuffer,
718a159c266SJung-uk Kim     ACPI_WALK_STATE         *WalkState,
719a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
720a159c266SJung-uk Kim {
721a159c266SJung-uk Kim     UINT32                  Temp;
722a159c266SJung-uk Kim     UINT32                  CommandIndex;
723a159c266SJung-uk Kim     UINT32                  ParamCount;
724a159c266SJung-uk Kim     char                    *CommandLine;
725a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_CTRL_TRUE;
726a159c266SJung-uk Kim 
727a159c266SJung-uk Kim 
728a159c266SJung-uk Kim     /* If AcpiTerminate has been called, terminate this thread */
729a159c266SJung-uk Kim 
730a159c266SJung-uk Kim     if (AcpiGbl_DbTerminateThreads)
731a159c266SJung-uk Kim     {
732a159c266SJung-uk Kim         return (AE_CTRL_TERMINATE);
733a159c266SJung-uk Kim     }
734a159c266SJung-uk Kim 
735a159c266SJung-uk Kim     ParamCount = AcpiDbGetLine (InputBuffer);
736a159c266SJung-uk Kim     CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
737a159c266SJung-uk Kim     Temp = 0;
738a159c266SJung-uk Kim 
739a159c266SJung-uk Kim     /* Verify that we have the minimum number of params */
740a159c266SJung-uk Kim 
741a159c266SJung-uk Kim     if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs)
742a159c266SJung-uk Kim     {
743a159c266SJung-uk Kim         AcpiOsPrintf ("%u parameters entered, [%s] requires %u parameters\n",
744a159c266SJung-uk Kim             ParamCount, AcpiGbl_DbCommands[CommandIndex].Name,
745a159c266SJung-uk Kim             AcpiGbl_DbCommands[CommandIndex].MinArgs);
746a159c266SJung-uk Kim 
747042ff955SJung-uk Kim         AcpiDbDisplayCommandInfo (AcpiGbl_DbCommands[CommandIndex].Name, FALSE);
748a159c266SJung-uk Kim         return (AE_CTRL_TRUE);
749a159c266SJung-uk Kim     }
750a159c266SJung-uk Kim 
751a159c266SJung-uk Kim     /* Decode and dispatch the command */
752a159c266SJung-uk Kim 
753a159c266SJung-uk Kim     switch (CommandIndex)
754a159c266SJung-uk Kim     {
755a159c266SJung-uk Kim     case CMD_NULL:
756*a9d8d09cSJung-uk Kim 
757a159c266SJung-uk Kim         if (Op)
758a159c266SJung-uk Kim         {
759a159c266SJung-uk Kim             return (AE_OK);
760a159c266SJung-uk Kim         }
761a159c266SJung-uk Kim         break;
762a159c266SJung-uk Kim 
763a159c266SJung-uk Kim     case CMD_ALLOCATIONS:
764a159c266SJung-uk Kim 
765a159c266SJung-uk Kim #ifdef ACPI_DBG_TRACK_ALLOCATIONS
766a159c266SJung-uk Kim         AcpiUtDumpAllocations ((UINT32) -1, NULL);
767a159c266SJung-uk Kim #endif
768a159c266SJung-uk Kim         break;
769a159c266SJung-uk Kim 
770a159c266SJung-uk Kim     case CMD_ARGS:
771a159c266SJung-uk Kim     case CMD_ARGUMENTS:
772*a9d8d09cSJung-uk Kim 
773a159c266SJung-uk Kim         AcpiDbDisplayArguments ();
774a159c266SJung-uk Kim         break;
775a159c266SJung-uk Kim 
776a159c266SJung-uk Kim     case CMD_BATCH:
777*a9d8d09cSJung-uk Kim 
778a159c266SJung-uk Kim         AcpiDbBatchExecute (AcpiGbl_DbArgs[1]);
779a159c266SJung-uk Kim         break;
780a159c266SJung-uk Kim 
781a159c266SJung-uk Kim     case CMD_BREAKPOINT:
782*a9d8d09cSJung-uk Kim 
783a159c266SJung-uk Kim         AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op);
784a159c266SJung-uk Kim         break;
785a159c266SJung-uk Kim 
786a159c266SJung-uk Kim     case CMD_BUSINFO:
787*a9d8d09cSJung-uk Kim 
788a159c266SJung-uk Kim         AcpiDbGetBusInfo ();
789a159c266SJung-uk Kim         break;
790a159c266SJung-uk Kim 
791a159c266SJung-uk Kim     case CMD_CALL:
792*a9d8d09cSJung-uk Kim 
793a159c266SJung-uk Kim         AcpiDbSetMethodCallBreakpoint (Op);
794a159c266SJung-uk Kim         Status = AE_OK;
795a159c266SJung-uk Kim         break;
796a159c266SJung-uk Kim 
797a159c266SJung-uk Kim     case CMD_CLOSE:
798*a9d8d09cSJung-uk Kim 
799a159c266SJung-uk Kim         AcpiDbCloseDebugFile ();
800a159c266SJung-uk Kim         break;
801a159c266SJung-uk Kim 
802a159c266SJung-uk Kim     case CMD_DEBUG:
803*a9d8d09cSJung-uk Kim 
804a159c266SJung-uk Kim         AcpiDbExecute (AcpiGbl_DbArgs[1],
805a159c266SJung-uk Kim             &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_SINGLE_STEP);
806a159c266SJung-uk Kim         break;
807a159c266SJung-uk Kim 
808a159c266SJung-uk Kim     case CMD_DISASSEMBLE:
809ed17e06eSJung-uk Kim     case CMD_DISASM:
810*a9d8d09cSJung-uk Kim 
811a159c266SJung-uk Kim         (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
812a159c266SJung-uk Kim         break;
813a159c266SJung-uk Kim 
814a159c266SJung-uk Kim     case CMD_DUMP:
815*a9d8d09cSJung-uk Kim 
816a159c266SJung-uk Kim         AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
817a159c266SJung-uk Kim         break;
818a159c266SJung-uk Kim 
819a159c266SJung-uk Kim     case CMD_ENABLEACPI:
820a159c266SJung-uk Kim #if (!ACPI_REDUCED_HARDWARE)
821a159c266SJung-uk Kim 
822a159c266SJung-uk Kim         Status = AcpiEnable();
823a159c266SJung-uk Kim         if (ACPI_FAILURE(Status))
824a159c266SJung-uk Kim         {
825a159c266SJung-uk Kim             AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status);
826a159c266SJung-uk Kim             return (Status);
827a159c266SJung-uk Kim         }
828a159c266SJung-uk Kim #endif /* !ACPI_REDUCED_HARDWARE */
829a159c266SJung-uk Kim         break;
830a159c266SJung-uk Kim 
831a159c266SJung-uk Kim     case CMD_EVENT:
832*a9d8d09cSJung-uk Kim 
833a159c266SJung-uk Kim         AcpiOsPrintf ("Event command not implemented\n");
834a159c266SJung-uk Kim         break;
835a159c266SJung-uk Kim 
836042ff955SJung-uk Kim     case CMD_EVALUATE:
837a159c266SJung-uk Kim     case CMD_EXECUTE:
838*a9d8d09cSJung-uk Kim 
839a159c266SJung-uk Kim         AcpiDbExecute (AcpiGbl_DbArgs[1],
840a159c266SJung-uk Kim             &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP);
841a159c266SJung-uk Kim         break;
842a159c266SJung-uk Kim 
843a159c266SJung-uk Kim     case CMD_FIND:
844*a9d8d09cSJung-uk Kim 
845a159c266SJung-uk Kim         Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]);
846a159c266SJung-uk Kim         break;
847a159c266SJung-uk Kim 
848a159c266SJung-uk Kim     case CMD_GO:
849*a9d8d09cSJung-uk Kim 
850a159c266SJung-uk Kim         AcpiGbl_CmSingleStep = FALSE;
851a159c266SJung-uk Kim         return (AE_OK);
852a159c266SJung-uk Kim 
853a159c266SJung-uk Kim     case CMD_GPE:
854*a9d8d09cSJung-uk Kim 
855a159c266SJung-uk Kim         AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
856a159c266SJung-uk Kim         break;
857a159c266SJung-uk Kim 
858a159c266SJung-uk Kim     case CMD_GPES:
859*a9d8d09cSJung-uk Kim 
860a159c266SJung-uk Kim         AcpiDbDisplayGpes ();
861a159c266SJung-uk Kim         break;
862a159c266SJung-uk Kim 
863a159c266SJung-uk Kim     case CMD_HANDLERS:
864*a9d8d09cSJung-uk Kim 
865a159c266SJung-uk Kim         AcpiDbDisplayHandlers ();
866a159c266SJung-uk Kim         break;
867a159c266SJung-uk Kim 
868a159c266SJung-uk Kim     case CMD_HELP:
869a159c266SJung-uk Kim     case CMD_HELP2:
870*a9d8d09cSJung-uk Kim 
871042ff955SJung-uk Kim         AcpiDbDisplayHelp (AcpiGbl_DbArgs[1]);
872a159c266SJung-uk Kim         break;
873a159c266SJung-uk Kim 
874a159c266SJung-uk Kim     case CMD_HISTORY:
875*a9d8d09cSJung-uk Kim 
876a159c266SJung-uk Kim         AcpiDbDisplayHistory ();
877a159c266SJung-uk Kim         break;
878a159c266SJung-uk Kim 
879*a9d8d09cSJung-uk Kim     case CMD_HISTORY_EXE: /* ! command */
880*a9d8d09cSJung-uk Kim 
881a159c266SJung-uk Kim         CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]);
882a159c266SJung-uk Kim         if (!CommandLine)
883a159c266SJung-uk Kim         {
884a159c266SJung-uk Kim             return (AE_CTRL_TRUE);
885a159c266SJung-uk Kim         }
886a159c266SJung-uk Kim 
887a159c266SJung-uk Kim         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
888a159c266SJung-uk Kim         return (Status);
889a159c266SJung-uk Kim 
890*a9d8d09cSJung-uk Kim     case CMD_HISTORY_LAST: /* !! command */
891*a9d8d09cSJung-uk Kim 
892a159c266SJung-uk Kim         CommandLine = AcpiDbGetFromHistory (NULL);
893a159c266SJung-uk Kim         if (!CommandLine)
894a159c266SJung-uk Kim         {
895a159c266SJung-uk Kim             return (AE_CTRL_TRUE);
896a159c266SJung-uk Kim         }
897a159c266SJung-uk Kim 
898a159c266SJung-uk Kim         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
899a159c266SJung-uk Kim         return (Status);
900a159c266SJung-uk Kim 
901a159c266SJung-uk Kim     case CMD_INFORMATION:
902*a9d8d09cSJung-uk Kim 
903a159c266SJung-uk Kim         AcpiDbDisplayMethodInfo (Op);
904a159c266SJung-uk Kim         break;
905a159c266SJung-uk Kim 
906a159c266SJung-uk Kim     case CMD_INTEGRITY:
907*a9d8d09cSJung-uk Kim 
908a159c266SJung-uk Kim         AcpiDbCheckIntegrity ();
909a159c266SJung-uk Kim         break;
910a159c266SJung-uk Kim 
911a159c266SJung-uk Kim     case CMD_INTO:
912*a9d8d09cSJung-uk Kim 
913a159c266SJung-uk Kim         if (Op)
914a159c266SJung-uk Kim         {
915a159c266SJung-uk Kim             AcpiGbl_CmSingleStep = TRUE;
916a159c266SJung-uk Kim             return (AE_OK);
917a159c266SJung-uk Kim         }
918a159c266SJung-uk Kim         break;
919a159c266SJung-uk Kim 
920a159c266SJung-uk Kim     case CMD_LEVEL:
921*a9d8d09cSJung-uk Kim 
922a159c266SJung-uk Kim         if (ParamCount == 0)
923a159c266SJung-uk Kim         {
924a159c266SJung-uk Kim             AcpiOsPrintf ("Current debug level for file output is:    %8.8lX\n",
925a159c266SJung-uk Kim                 AcpiGbl_DbDebugLevel);
926a159c266SJung-uk Kim             AcpiOsPrintf ("Current debug level for console output is: %8.8lX\n",
927a159c266SJung-uk Kim                 AcpiGbl_DbConsoleDebugLevel);
928a159c266SJung-uk Kim         }
929a159c266SJung-uk Kim         else if (ParamCount == 2)
930a159c266SJung-uk Kim         {
931a159c266SJung-uk Kim             Temp = AcpiGbl_DbConsoleDebugLevel;
932a159c266SJung-uk Kim             AcpiGbl_DbConsoleDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1],
933a159c266SJung-uk Kim                                             NULL, 16);
934a159c266SJung-uk Kim             AcpiOsPrintf (
935a159c266SJung-uk Kim                 "Debug Level for console output was %8.8lX, now %8.8lX\n",
936a159c266SJung-uk Kim                 Temp, AcpiGbl_DbConsoleDebugLevel);
937a159c266SJung-uk Kim         }
938a159c266SJung-uk Kim         else
939a159c266SJung-uk Kim         {
940a159c266SJung-uk Kim             Temp = AcpiGbl_DbDebugLevel;
941a159c266SJung-uk Kim             AcpiGbl_DbDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1], NULL, 16);
942a159c266SJung-uk Kim             AcpiOsPrintf (
943a159c266SJung-uk Kim                 "Debug Level for file output was %8.8lX, now %8.8lX\n",
944a159c266SJung-uk Kim                 Temp, AcpiGbl_DbDebugLevel);
945a159c266SJung-uk Kim         }
946a159c266SJung-uk Kim         break;
947a159c266SJung-uk Kim 
948a159c266SJung-uk Kim     case CMD_LIST:
949*a9d8d09cSJung-uk Kim 
950a159c266SJung-uk Kim         AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
951a159c266SJung-uk Kim         break;
952a159c266SJung-uk Kim 
953a159c266SJung-uk Kim     case CMD_LOAD:
954*a9d8d09cSJung-uk Kim 
955a159c266SJung-uk Kim         Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL);
956a159c266SJung-uk Kim         break;
957a159c266SJung-uk Kim 
958a159c266SJung-uk Kim     case CMD_LOCKS:
959*a9d8d09cSJung-uk Kim 
960a159c266SJung-uk Kim         AcpiDbDisplayLocks ();
961a159c266SJung-uk Kim         break;
962a159c266SJung-uk Kim 
963a159c266SJung-uk Kim     case CMD_LOCALS:
964*a9d8d09cSJung-uk Kim 
965a159c266SJung-uk Kim         AcpiDbDisplayLocals ();
966a159c266SJung-uk Kim         break;
967a159c266SJung-uk Kim 
968a159c266SJung-uk Kim     case CMD_METHODS:
969*a9d8d09cSJung-uk Kim 
970a159c266SJung-uk Kim         Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]);
971a159c266SJung-uk Kim         break;
972a159c266SJung-uk Kim 
973a159c266SJung-uk Kim     case CMD_NAMESPACE:
974*a9d8d09cSJung-uk Kim 
975a159c266SJung-uk Kim         AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
976a159c266SJung-uk Kim         break;
977a159c266SJung-uk Kim 
978a159c266SJung-uk Kim     case CMD_NOTIFY:
979*a9d8d09cSJung-uk Kim 
980a159c266SJung-uk Kim         Temp = ACPI_STRTOUL (AcpiGbl_DbArgs[2], NULL, 0);
981a159c266SJung-uk Kim         AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp);
982a159c266SJung-uk Kim         break;
983a159c266SJung-uk Kim 
984a159c266SJung-uk Kim     case CMD_OBJECT:
985*a9d8d09cSJung-uk Kim 
986a159c266SJung-uk Kim         AcpiUtStrupr (AcpiGbl_DbArgs[1]);
987a159c266SJung-uk Kim         Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
988a159c266SJung-uk Kim         break;
989a159c266SJung-uk Kim 
990a159c266SJung-uk Kim     case CMD_OPEN:
991*a9d8d09cSJung-uk Kim 
992a159c266SJung-uk Kim         AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]);
993a159c266SJung-uk Kim         break;
994a159c266SJung-uk Kim 
995a159c266SJung-uk Kim     case CMD_OSI:
996*a9d8d09cSJung-uk Kim 
997a159c266SJung-uk Kim         AcpiDbDisplayInterfaces (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
998a159c266SJung-uk Kim         break;
999a159c266SJung-uk Kim 
1000a159c266SJung-uk Kim     case CMD_OWNER:
1001*a9d8d09cSJung-uk Kim 
1002a159c266SJung-uk Kim         AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
1003a159c266SJung-uk Kim         break;
1004a159c266SJung-uk Kim 
1005a159c266SJung-uk Kim     case CMD_PREDEFINED:
1006*a9d8d09cSJung-uk Kim 
1007a159c266SJung-uk Kim         AcpiDbCheckPredefinedNames ();
1008a159c266SJung-uk Kim         break;
1009a159c266SJung-uk Kim 
1010a159c266SJung-uk Kim     case CMD_PREFIX:
1011*a9d8d09cSJung-uk Kim 
1012a159c266SJung-uk Kim         AcpiDbSetScope (AcpiGbl_DbArgs[1]);
1013a159c266SJung-uk Kim         break;
1014a159c266SJung-uk Kim 
1015a159c266SJung-uk Kim     case CMD_REFERENCES:
1016*a9d8d09cSJung-uk Kim 
1017a159c266SJung-uk Kim         AcpiDbFindReferences (AcpiGbl_DbArgs[1]);
1018a159c266SJung-uk Kim         break;
1019a159c266SJung-uk Kim 
1020a159c266SJung-uk Kim     case CMD_RESOURCES:
1021*a9d8d09cSJung-uk Kim 
1022a159c266SJung-uk Kim         AcpiDbDisplayResources (AcpiGbl_DbArgs[1]);
1023a159c266SJung-uk Kim         break;
1024a159c266SJung-uk Kim 
1025a159c266SJung-uk Kim     case CMD_RESULTS:
1026*a9d8d09cSJung-uk Kim 
1027a159c266SJung-uk Kim         AcpiDbDisplayResults ();
1028a159c266SJung-uk Kim         break;
1029a159c266SJung-uk Kim 
1030a159c266SJung-uk Kim     case CMD_SET:
1031*a9d8d09cSJung-uk Kim 
1032a159c266SJung-uk Kim         AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
1033a159c266SJung-uk Kim             AcpiGbl_DbArgs[3]);
1034a159c266SJung-uk Kim         break;
1035a159c266SJung-uk Kim 
1036a159c266SJung-uk Kim     case CMD_SLEEP:
1037*a9d8d09cSJung-uk Kim 
1038a159c266SJung-uk Kim         Status = AcpiDbSleep (AcpiGbl_DbArgs[1]);
1039a159c266SJung-uk Kim         break;
1040a159c266SJung-uk Kim 
1041a159c266SJung-uk Kim     case CMD_STATS:
1042*a9d8d09cSJung-uk Kim 
1043a159c266SJung-uk Kim         Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]);
1044a159c266SJung-uk Kim         break;
1045a159c266SJung-uk Kim 
1046a159c266SJung-uk Kim     case CMD_STOP:
1047*a9d8d09cSJung-uk Kim 
1048a159c266SJung-uk Kim         return (AE_NOT_IMPLEMENTED);
1049a159c266SJung-uk Kim 
1050a159c266SJung-uk Kim     case CMD_TABLES:
1051*a9d8d09cSJung-uk Kim 
1052a159c266SJung-uk Kim         AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]);
1053a159c266SJung-uk Kim         break;
1054a159c266SJung-uk Kim 
1055a159c266SJung-uk Kim     case CMD_TEMPLATE:
1056*a9d8d09cSJung-uk Kim 
1057a159c266SJung-uk Kim         AcpiDbDisplayTemplate (AcpiGbl_DbArgs[1]);
1058a159c266SJung-uk Kim         break;
1059a159c266SJung-uk Kim 
1060a159c266SJung-uk Kim     case CMD_TERMINATE:
1061*a9d8d09cSJung-uk Kim 
1062a159c266SJung-uk Kim         AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
1063a159c266SJung-uk Kim         AcpiUtSubsystemShutdown ();
1064a159c266SJung-uk Kim 
1065a159c266SJung-uk Kim         /*
1066a159c266SJung-uk Kim          * TBD: [Restructure] Need some way to re-initialize without
1067a159c266SJung-uk Kim          * re-creating the semaphores!
1068a159c266SJung-uk Kim          */
1069a159c266SJung-uk Kim 
1070a159c266SJung-uk Kim         /*  AcpiInitialize (NULL);  */
1071a159c266SJung-uk Kim         break;
1072a159c266SJung-uk Kim 
1073a159c266SJung-uk Kim     case CMD_THREADS:
1074*a9d8d09cSJung-uk Kim 
1075a159c266SJung-uk Kim         AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
1076a159c266SJung-uk Kim             AcpiGbl_DbArgs[3]);
1077a159c266SJung-uk Kim         break;
1078a159c266SJung-uk Kim 
1079a159c266SJung-uk Kim     case CMD_TRACE:
1080*a9d8d09cSJung-uk Kim 
1081a159c266SJung-uk Kim         (void) AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1);
1082a159c266SJung-uk Kim         break;
1083a159c266SJung-uk Kim 
1084a159c266SJung-uk Kim     case CMD_TREE:
1085*a9d8d09cSJung-uk Kim 
1086a159c266SJung-uk Kim         AcpiDbDisplayCallingTree ();
1087a159c266SJung-uk Kim         break;
1088a159c266SJung-uk Kim 
1089a159c266SJung-uk Kim     case CMD_TYPE:
1090*a9d8d09cSJung-uk Kim 
1091a159c266SJung-uk Kim         AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]);
1092a159c266SJung-uk Kim         break;
1093a159c266SJung-uk Kim 
1094a159c266SJung-uk Kim     case CMD_UNLOAD:
1095*a9d8d09cSJung-uk Kim 
1096e8241eabSJung-uk Kim         AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1]);
1097a159c266SJung-uk Kim         break;
1098a159c266SJung-uk Kim 
1099a159c266SJung-uk Kim     case CMD_EXIT:
1100a159c266SJung-uk Kim     case CMD_QUIT:
1101*a9d8d09cSJung-uk Kim 
1102a159c266SJung-uk Kim         if (Op)
1103a159c266SJung-uk Kim         {
1104a159c266SJung-uk Kim             AcpiOsPrintf ("Method execution terminated\n");
1105a159c266SJung-uk Kim             return (AE_CTRL_TERMINATE);
1106a159c266SJung-uk Kim         }
1107a159c266SJung-uk Kim 
1108a159c266SJung-uk Kim         if (!AcpiGbl_DbOutputToFile)
1109a159c266SJung-uk Kim         {
1110a159c266SJung-uk Kim             AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
1111a159c266SJung-uk Kim         }
1112a159c266SJung-uk Kim 
1113a159c266SJung-uk Kim         AcpiDbCloseDebugFile ();
1114a159c266SJung-uk Kim         AcpiGbl_DbTerminateThreads = TRUE;
1115a159c266SJung-uk Kim         return (AE_CTRL_TERMINATE);
1116a159c266SJung-uk Kim 
1117a159c266SJung-uk Kim     case CMD_NOT_FOUND:
1118a159c266SJung-uk Kim     default:
1119*a9d8d09cSJung-uk Kim 
1120a159c266SJung-uk Kim         AcpiOsPrintf ("Unknown Command\n");
1121a159c266SJung-uk Kim         return (AE_CTRL_TRUE);
1122a159c266SJung-uk Kim     }
1123a159c266SJung-uk Kim 
1124a159c266SJung-uk Kim     if (ACPI_SUCCESS (Status))
1125a159c266SJung-uk Kim     {
1126a159c266SJung-uk Kim         Status = AE_CTRL_TRUE;
1127a159c266SJung-uk Kim     }
1128a159c266SJung-uk Kim 
1129a159c266SJung-uk Kim     /* Add all commands that come here to the history buffer */
1130a159c266SJung-uk Kim 
1131a159c266SJung-uk Kim     AcpiDbAddToHistory (InputBuffer);
1132a159c266SJung-uk Kim     return (Status);
1133a159c266SJung-uk Kim }
1134a159c266SJung-uk Kim 
1135a159c266SJung-uk Kim 
1136a159c266SJung-uk Kim /*******************************************************************************
1137a159c266SJung-uk Kim  *
1138a159c266SJung-uk Kim  * FUNCTION:    AcpiDbExecuteThread
1139a159c266SJung-uk Kim  *
1140a159c266SJung-uk Kim  * PARAMETERS:  Context         - Not used
1141a159c266SJung-uk Kim  *
1142a159c266SJung-uk Kim  * RETURN:      None
1143a159c266SJung-uk Kim  *
1144a159c266SJung-uk Kim  * DESCRIPTION: Debugger execute thread. Waits for a command line, then
1145a159c266SJung-uk Kim  *              simply dispatches it.
1146a159c266SJung-uk Kim  *
1147a159c266SJung-uk Kim  ******************************************************************************/
1148a159c266SJung-uk Kim 
1149a159c266SJung-uk Kim void ACPI_SYSTEM_XFACE
1150a159c266SJung-uk Kim AcpiDbExecuteThread (
1151a159c266SJung-uk Kim     void                    *Context)
1152a159c266SJung-uk Kim {
1153a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
1154a159c266SJung-uk Kim     ACPI_STATUS             MStatus;
1155a159c266SJung-uk Kim 
1156a159c266SJung-uk Kim 
1157a159c266SJung-uk Kim     while (Status != AE_CTRL_TERMINATE)
1158a159c266SJung-uk Kim     {
1159a159c266SJung-uk Kim         AcpiGbl_MethodExecuting = FALSE;
1160a159c266SJung-uk Kim         AcpiGbl_StepToNextCall = FALSE;
1161a159c266SJung-uk Kim 
1162a159c266SJung-uk Kim         MStatus = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
1163a159c266SJung-uk Kim         if (ACPI_FAILURE (MStatus))
1164a159c266SJung-uk Kim         {
1165a159c266SJung-uk Kim             return;
1166a159c266SJung-uk Kim         }
1167a159c266SJung-uk Kim 
1168a159c266SJung-uk Kim         Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
1169a159c266SJung-uk Kim 
1170a159c266SJung-uk Kim         MStatus = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
1171a159c266SJung-uk Kim         if (ACPI_FAILURE (MStatus))
1172a159c266SJung-uk Kim         {
1173a159c266SJung-uk Kim             return;
1174a159c266SJung-uk Kim         }
1175a159c266SJung-uk Kim     }
1176a159c266SJung-uk Kim }
1177a159c266SJung-uk Kim 
1178a159c266SJung-uk Kim 
1179a159c266SJung-uk Kim /*******************************************************************************
1180a159c266SJung-uk Kim  *
1181a159c266SJung-uk Kim  * FUNCTION:    AcpiDbSingleThread
1182a159c266SJung-uk Kim  *
1183a159c266SJung-uk Kim  * PARAMETERS:  None
1184a159c266SJung-uk Kim  *
1185a159c266SJung-uk Kim  * RETURN:      None
1186a159c266SJung-uk Kim  *
1187a159c266SJung-uk Kim  * DESCRIPTION: Debugger execute thread. Waits for a command line, then
1188a159c266SJung-uk Kim  *              simply dispatches it.
1189a159c266SJung-uk Kim  *
1190a159c266SJung-uk Kim  ******************************************************************************/
1191a159c266SJung-uk Kim 
1192a159c266SJung-uk Kim static void
1193a159c266SJung-uk Kim AcpiDbSingleThread (
1194a159c266SJung-uk Kim     void)
1195a159c266SJung-uk Kim {
1196a159c266SJung-uk Kim 
1197a159c266SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
1198a159c266SJung-uk Kim     AcpiGbl_StepToNextCall = FALSE;
1199a159c266SJung-uk Kim 
1200a159c266SJung-uk Kim     (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
1201a159c266SJung-uk Kim }
1202a159c266SJung-uk Kim 
1203a159c266SJung-uk Kim 
1204a159c266SJung-uk Kim /*******************************************************************************
1205a159c266SJung-uk Kim  *
1206a159c266SJung-uk Kim  * FUNCTION:    AcpiDbUserCommands
1207a159c266SJung-uk Kim  *
1208a159c266SJung-uk Kim  * PARAMETERS:  Prompt              - User prompt (depends on mode)
1209a159c266SJung-uk Kim  *              Op                  - Current executing parse op
1210a159c266SJung-uk Kim  *
1211a159c266SJung-uk Kim  * RETURN:      None
1212a159c266SJung-uk Kim  *
1213a159c266SJung-uk Kim  * DESCRIPTION: Command line execution for the AML debugger. Commands are
1214a159c266SJung-uk Kim  *              matched and dispatched here.
1215a159c266SJung-uk Kim  *
1216a159c266SJung-uk Kim  ******************************************************************************/
1217a159c266SJung-uk Kim 
1218a159c266SJung-uk Kim ACPI_STATUS
1219a159c266SJung-uk Kim AcpiDbUserCommands (
1220a159c266SJung-uk Kim     char                    Prompt,
1221a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
1222a159c266SJung-uk Kim {
1223a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
1224a159c266SJung-uk Kim 
1225a159c266SJung-uk Kim 
1226efcc2a30SJung-uk Kim     AcpiOsPrintf ("\n");
1227efcc2a30SJung-uk Kim 
1228a159c266SJung-uk Kim     /* TBD: [Restructure] Need a separate command line buffer for step mode */
1229a159c266SJung-uk Kim 
1230a159c266SJung-uk Kim     while (!AcpiGbl_DbTerminateThreads)
1231a159c266SJung-uk Kim     {
1232a159c266SJung-uk Kim         /* Force output to console until a command is entered */
1233a159c266SJung-uk Kim 
1234a159c266SJung-uk Kim         AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
1235a159c266SJung-uk Kim 
1236a159c266SJung-uk Kim         /* Different prompt if method is executing */
1237a159c266SJung-uk Kim 
1238a159c266SJung-uk Kim         if (!AcpiGbl_MethodExecuting)
1239a159c266SJung-uk Kim         {
1240a159c266SJung-uk Kim             AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
1241a159c266SJung-uk Kim         }
1242a159c266SJung-uk Kim         else
1243a159c266SJung-uk Kim         {
1244a159c266SJung-uk Kim             AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
1245a159c266SJung-uk Kim         }
1246a159c266SJung-uk Kim 
1247a159c266SJung-uk Kim         /* Get the user input line */
1248a159c266SJung-uk Kim 
1249a159c266SJung-uk Kim         Status = AcpiOsGetLine (AcpiGbl_DbLineBuf,
1250a159c266SJung-uk Kim             ACPI_DB_LINE_BUFFER_SIZE, NULL);
1251a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
1252a159c266SJung-uk Kim         {
1253a159c266SJung-uk Kim             ACPI_EXCEPTION ((AE_INFO, Status, "While parsing command line"));
1254a159c266SJung-uk Kim             return (Status);
1255a159c266SJung-uk Kim         }
1256a159c266SJung-uk Kim 
1257a159c266SJung-uk Kim         /* Check for single or multithreaded debug */
1258a159c266SJung-uk Kim 
1259a159c266SJung-uk Kim         if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED)
1260a159c266SJung-uk Kim         {
1261a159c266SJung-uk Kim             /*
1262a159c266SJung-uk Kim              * Signal the debug thread that we have a command to execute,
1263a159c266SJung-uk Kim              * and wait for the command to complete.
1264a159c266SJung-uk Kim              */
1265a159c266SJung-uk Kim             Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY);
1266a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
1267a159c266SJung-uk Kim             {
1268a159c266SJung-uk Kim                 return (Status);
1269a159c266SJung-uk Kim             }
1270a159c266SJung-uk Kim 
1271a159c266SJung-uk Kim             Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
1272a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
1273a159c266SJung-uk Kim             {
1274a159c266SJung-uk Kim                 return (Status);
1275a159c266SJung-uk Kim             }
1276a159c266SJung-uk Kim         }
1277a159c266SJung-uk Kim         else
1278a159c266SJung-uk Kim         {
1279a159c266SJung-uk Kim             /* Just call to the command line interpreter */
1280a159c266SJung-uk Kim 
1281a159c266SJung-uk Kim             AcpiDbSingleThread ();
1282a159c266SJung-uk Kim         }
1283a159c266SJung-uk Kim     }
1284a159c266SJung-uk Kim 
1285a159c266SJung-uk Kim     /*
1286a159c266SJung-uk Kim      * Only this thread (the original thread) should actually terminate the
1287a159c266SJung-uk Kim      * subsystem, because all the semaphores are deleted during termination
1288a159c266SJung-uk Kim      */
1289a159c266SJung-uk Kim     Status = AcpiTerminate ();
1290a159c266SJung-uk Kim     return (Status);
1291a159c266SJung-uk Kim }
1292a159c266SJung-uk Kim 
1293a159c266SJung-uk Kim #endif  /* ACPI_DEBUGGER */
1294