xref: /dflybsd-src/sys/contrib/dev/acpica/source/components/debugger/dbinput.c (revision 383048aca08c2de51d27aa8638a36982a0d74550)
10d02842fSSascha Wildner /*******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: dbinput - user front-end to the AML debugger
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  ******************************************************************************/
60d02842fSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11*383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
120d02842fSSascha Wildner  * All rights reserved.
130d02842fSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
1190d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
1200d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
1210d02842fSSascha Wildner  * are met:
1220d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1230d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
1240d02842fSSascha Wildner  *    without modification.
1250d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1260d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
1270d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
1280d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
1290d02842fSSascha Wildner  *    binary redistribution.
1300d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
1310d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
1320d02842fSSascha Wildner  *    from this software without specific prior written permission.
1330d02842fSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
1470d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
1480d02842fSSascha Wildner  * Software Foundation.
1490d02842fSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
1510d02842fSSascha Wildner 
1520d02842fSSascha Wildner #include "acpi.h"
1530d02842fSSascha Wildner #include "accommon.h"
1540d02842fSSascha Wildner #include "acdebug.h"
1550d02842fSSascha Wildner 
156820c5b08SSascha Wildner #ifdef ACPI_APPLICATION
157820c5b08SSascha Wildner #include "acapps.h"
158820c5b08SSascha Wildner #endif
1590d02842fSSascha Wildner 
1600d02842fSSascha Wildner #ifdef ACPI_DEBUGGER
1610d02842fSSascha Wildner 
1620d02842fSSascha Wildner #define _COMPONENT          ACPI_CA_DEBUGGER
1630d02842fSSascha Wildner         ACPI_MODULE_NAME    ("dbinput")
1640d02842fSSascha Wildner 
1653cc0afc6SSascha Wildner 
1660d02842fSSascha Wildner /* Local prototypes */
1670d02842fSSascha Wildner 
1680d02842fSSascha Wildner static UINT32
1690d02842fSSascha Wildner AcpiDbGetLine (
1700d02842fSSascha Wildner     char                    *InputBuffer);
1710d02842fSSascha Wildner 
1720d02842fSSascha Wildner static UINT32
1730d02842fSSascha Wildner AcpiDbMatchCommand (
1740d02842fSSascha Wildner     char                    *UserCommand);
1750d02842fSSascha Wildner 
1760d02842fSSascha Wildner static void
1770d02842fSSascha Wildner AcpiDbDisplayCommandInfo (
1782ffe9f16SSascha Wildner     const char              *Command,
1790d02842fSSascha Wildner     BOOLEAN                 DisplayAll);
1800d02842fSSascha Wildner 
1810d02842fSSascha Wildner static void
1820d02842fSSascha Wildner AcpiDbDisplayHelp (
1830d02842fSSascha Wildner     char                    *Command);
1840d02842fSSascha Wildner 
1850d02842fSSascha Wildner static BOOLEAN
1860d02842fSSascha Wildner AcpiDbMatchCommandHelp (
1872ffe9f16SSascha Wildner     const char                  *Command,
1880d02842fSSascha Wildner     const ACPI_DB_COMMAND_HELP  *Help);
1890d02842fSSascha Wildner 
1900d02842fSSascha Wildner 
1910d02842fSSascha Wildner /*
1920d02842fSSascha Wildner  * Top-level debugger commands.
1930d02842fSSascha Wildner  *
1940d02842fSSascha Wildner  * This list of commands must match the string table below it
1950d02842fSSascha Wildner  */
1960d02842fSSascha Wildner enum AcpiExDebuggerCommands
1970d02842fSSascha Wildner {
1980d02842fSSascha Wildner     CMD_NOT_FOUND = 0,
1990d02842fSSascha Wildner     CMD_NULL,
200c5a52fd3SSascha Wildner     CMD_ALL,
2010d02842fSSascha Wildner     CMD_ALLOCATIONS,
2020d02842fSSascha Wildner     CMD_ARGS,
2030d02842fSSascha Wildner     CMD_ARGUMENTS,
2040d02842fSSascha Wildner     CMD_BREAKPOINT,
2050d02842fSSascha Wildner     CMD_BUSINFO,
2060d02842fSSascha Wildner     CMD_CALL,
2070d02842fSSascha Wildner     CMD_DEBUG,
2080d02842fSSascha Wildner     CMD_DISASSEMBLE,
2090d02842fSSascha Wildner     CMD_DISASM,
2100d02842fSSascha Wildner     CMD_DUMP,
2110d02842fSSascha Wildner     CMD_EVALUATE,
2120d02842fSSascha Wildner     CMD_EXECUTE,
2130d02842fSSascha Wildner     CMD_EXIT,
214e5412f1eSSascha Wildner     CMD_FIELDS,
2150d02842fSSascha Wildner     CMD_FIND,
2160d02842fSSascha Wildner     CMD_GO,
2170d02842fSSascha Wildner     CMD_HANDLERS,
2180d02842fSSascha Wildner     CMD_HELP,
2190d02842fSSascha Wildner     CMD_HELP2,
2200d02842fSSascha Wildner     CMD_HISTORY,
2210d02842fSSascha Wildner     CMD_HISTORY_EXE,
2220d02842fSSascha Wildner     CMD_HISTORY_LAST,
2230d02842fSSascha Wildner     CMD_INFORMATION,
2240d02842fSSascha Wildner     CMD_INTEGRITY,
2250d02842fSSascha Wildner     CMD_INTO,
2260d02842fSSascha Wildner     CMD_LEVEL,
2270d02842fSSascha Wildner     CMD_LIST,
2280d02842fSSascha Wildner     CMD_LOCALS,
2290d02842fSSascha Wildner     CMD_LOCKS,
2300d02842fSSascha Wildner     CMD_METHODS,
2310d02842fSSascha Wildner     CMD_NAMESPACE,
2320d02842fSSascha Wildner     CMD_NOTIFY,
2330d02842fSSascha Wildner     CMD_OBJECTS,
2340d02842fSSascha Wildner     CMD_OSI,
2350d02842fSSascha Wildner     CMD_OWNER,
2360d02842fSSascha Wildner     CMD_PATHS,
237c6400d37SSascha Wildner     CMD_PREDEFINED,
2380d02842fSSascha Wildner     CMD_PREFIX,
2390d02842fSSascha Wildner     CMD_QUIT,
2400d02842fSSascha Wildner     CMD_REFERENCES,
2410d02842fSSascha Wildner     CMD_RESOURCES,
2420d02842fSSascha Wildner     CMD_RESULTS,
2430d02842fSSascha Wildner     CMD_SET,
2440d02842fSSascha Wildner     CMD_STATS,
2450d02842fSSascha Wildner     CMD_STOP,
2460d02842fSSascha Wildner     CMD_TABLES,
2470d02842fSSascha Wildner     CMD_TEMPLATE,
2480d02842fSSascha Wildner     CMD_TRACE,
2490d02842fSSascha Wildner     CMD_TREE,
2500d02842fSSascha Wildner     CMD_TYPE,
2513cc0afc6SSascha Wildner #ifdef ACPI_APPLICATION
2523cc0afc6SSascha Wildner     CMD_ENABLEACPI,
2533cc0afc6SSascha Wildner     CMD_EVENT,
2543cc0afc6SSascha Wildner     CMD_GPE,
2553cc0afc6SSascha Wildner     CMD_GPES,
2563cc0afc6SSascha Wildner     CMD_SCI,
2573cc0afc6SSascha Wildner     CMD_SLEEP,
2583cc0afc6SSascha Wildner 
2593cc0afc6SSascha Wildner     CMD_CLOSE,
2603cc0afc6SSascha Wildner     CMD_LOAD,
2613cc0afc6SSascha Wildner     CMD_OPEN,
2623cc0afc6SSascha Wildner     CMD_UNLOAD,
2633cc0afc6SSascha Wildner 
2643cc0afc6SSascha Wildner     CMD_TERMINATE,
2657bcb6cafSSascha Wildner     CMD_BACKGROUND,
2663cc0afc6SSascha Wildner     CMD_THREADS,
2673cc0afc6SSascha Wildner 
2683cc0afc6SSascha Wildner     CMD_TEST,
2693cc0afc6SSascha Wildner #endif
2700d02842fSSascha Wildner };
2710d02842fSSascha Wildner 
2720d02842fSSascha Wildner #define CMD_FIRST_VALID     2
2730d02842fSSascha Wildner 
2740d02842fSSascha Wildner 
2750d02842fSSascha Wildner /* Second parameter is the required argument count */
2760d02842fSSascha Wildner 
2770d02842fSSascha Wildner static const ACPI_DB_COMMAND_INFO   AcpiGbl_DbCommands[] =
2780d02842fSSascha Wildner {
2790d02842fSSascha Wildner     {"<NOT FOUND>",  0},
2800d02842fSSascha Wildner     {"<NULL>",       0},
281c5a52fd3SSascha Wildner     {"ALL",          1},
2820d02842fSSascha Wildner     {"ALLOCATIONS",  0},
2830d02842fSSascha Wildner     {"ARGS",         0},
2840d02842fSSascha Wildner     {"ARGUMENTS",    0},
2850d02842fSSascha Wildner     {"BREAKPOINT",   1},
2860d02842fSSascha Wildner     {"BUSINFO",      0},
2870d02842fSSascha Wildner     {"CALL",         0},
2880d02842fSSascha Wildner     {"DEBUG",        1},
2890d02842fSSascha Wildner     {"DISASSEMBLE",  1},
2900d02842fSSascha Wildner     {"DISASM",       1},
2910d02842fSSascha Wildner     {"DUMP",         1},
2920d02842fSSascha Wildner     {"EVALUATE",     1},
2930d02842fSSascha Wildner     {"EXECUTE",      1},
2940d02842fSSascha Wildner     {"EXIT",         0},
295e5412f1eSSascha Wildner     {"FIELDS",       1},
2960d02842fSSascha Wildner     {"FIND",         1},
2970d02842fSSascha Wildner     {"GO",           0},
2980d02842fSSascha Wildner     {"HANDLERS",     0},
2990d02842fSSascha Wildner     {"HELP",         0},
3000d02842fSSascha Wildner     {"?",            0},
3010d02842fSSascha Wildner     {"HISTORY",      0},
3020d02842fSSascha Wildner     {"!",            1},
3030d02842fSSascha Wildner     {"!!",           0},
3040d02842fSSascha Wildner     {"INFORMATION",  0},
3050d02842fSSascha Wildner     {"INTEGRITY",    0},
3060d02842fSSascha Wildner     {"INTO",         0},
3070d02842fSSascha Wildner     {"LEVEL",        0},
3080d02842fSSascha Wildner     {"LIST",         0},
3090d02842fSSascha Wildner     {"LOCALS",       0},
3100d02842fSSascha Wildner     {"LOCKS",        0},
3110d02842fSSascha Wildner     {"METHODS",      0},
3120d02842fSSascha Wildner     {"NAMESPACE",    0},
3130d02842fSSascha Wildner     {"NOTIFY",       2},
3143cc0afc6SSascha Wildner     {"OBJECTS",      0},
3150d02842fSSascha Wildner     {"OSI",          0},
3160d02842fSSascha Wildner     {"OWNER",        1},
3170d02842fSSascha Wildner     {"PATHS",        0},
318c6400d37SSascha Wildner     {"PREDEFINED",   0},
3190d02842fSSascha Wildner     {"PREFIX",       0},
3200d02842fSSascha Wildner     {"QUIT",         0},
3210d02842fSSascha Wildner     {"REFERENCES",   1},
3220d02842fSSascha Wildner     {"RESOURCES",    0},
3230d02842fSSascha Wildner     {"RESULTS",      0},
3240d02842fSSascha Wildner     {"SET",          3},
3250d02842fSSascha Wildner     {"STATS",        1},
3260d02842fSSascha Wildner     {"STOP",         0},
3270d02842fSSascha Wildner     {"TABLES",       0},
3280d02842fSSascha Wildner     {"TEMPLATE",     1},
3290d02842fSSascha Wildner     {"TRACE",        1},
3300d02842fSSascha Wildner     {"TREE",         0},
3310d02842fSSascha Wildner     {"TYPE",         1},
3323cc0afc6SSascha Wildner #ifdef ACPI_APPLICATION
3333cc0afc6SSascha Wildner     {"ENABLEACPI",   0},
3343cc0afc6SSascha Wildner     {"EVENT",        1},
3353cc0afc6SSascha Wildner     {"GPE",          1},
3363cc0afc6SSascha Wildner     {"GPES",         0},
3373cc0afc6SSascha Wildner     {"SCI",          0},
3383cc0afc6SSascha Wildner     {"SLEEP",        0},
3393cc0afc6SSascha Wildner 
3403cc0afc6SSascha Wildner     {"CLOSE",        0},
3413cc0afc6SSascha Wildner     {"LOAD",         1},
3423cc0afc6SSascha Wildner     {"OPEN",         1},
3430d02842fSSascha Wildner     {"UNLOAD",       1},
3443cc0afc6SSascha Wildner 
3453cc0afc6SSascha Wildner     {"TERMINATE",    0},
3467bcb6cafSSascha Wildner     {"BACKGROUND",   1},
3473cc0afc6SSascha Wildner     {"THREADS",      3},
3483cc0afc6SSascha Wildner 
3493cc0afc6SSascha Wildner     {"TEST",         1},
3503cc0afc6SSascha Wildner #endif
3510d02842fSSascha Wildner     {NULL,           0}
3520d02842fSSascha Wildner };
3530d02842fSSascha Wildner 
3540d02842fSSascha Wildner /*
3550d02842fSSascha Wildner  * Help for all debugger commands. First argument is the number of lines
3560d02842fSSascha Wildner  * of help to output for the command.
3577bcb6cafSSascha Wildner  *
3587bcb6cafSSascha Wildner  * Note: Some commands are not supported by the kernel-level version of
3597bcb6cafSSascha Wildner  * the debugger.
3600d02842fSSascha Wildner  */
3610d02842fSSascha Wildner static const ACPI_DB_COMMAND_HELP   AcpiGbl_DbCommandHelp[] =
3620d02842fSSascha Wildner {
3637bcb6cafSSascha Wildner     {0, "\nNamespace Access:",                  "\n"},
3647bcb6cafSSascha Wildner     {1, "  Businfo",                            "Display system bus info\n"},
3657bcb6cafSSascha Wildner     {1, "  Disassemble <Method>",               "Disassemble a control method\n"},
3667bcb6cafSSascha Wildner     {1, "  Find <AcpiName> (? is wildcard)",    "Find ACPI name(s) with wildcards\n"},
3677bcb6cafSSascha Wildner     {1, "  Integrity",                          "Validate namespace integrity\n"},
3687bcb6cafSSascha Wildner     {1, "  Methods",                            "Display list of loaded control methods\n"},
369e5412f1eSSascha Wildner     {1, "  Fields <AddressSpaceId>",            "Display list of loaded field units by space ID\n"},
3707bcb6cafSSascha Wildner     {1, "  Namespace [Object] [Depth]",         "Display loaded namespace tree/subtree\n"},
3717bcb6cafSSascha Wildner     {1, "  Notify <Object> <Value>",            "Send a notification on Object\n"},
3727bcb6cafSSascha Wildner     {1, "  Objects [ObjectType]",               "Display summary of all objects or just given type\n"},
3737bcb6cafSSascha Wildner     {1, "  Owner <OwnerId> [Depth]",            "Display loaded namespace by object owner\n"},
3747bcb6cafSSascha Wildner     {1, "  Paths",                              "Display full pathnames of namespace objects\n"},
3757bcb6cafSSascha Wildner     {1, "  Predefined",                         "Check all predefined names\n"},
3767bcb6cafSSascha Wildner     {1, "  Prefix [<Namepath>]",                "Set or Get current execution prefix\n"},
3777bcb6cafSSascha Wildner     {1, "  References <Addr>",                  "Find all references to object at addr\n"},
3787bcb6cafSSascha Wildner     {1, "  Resources [DeviceName]",             "Display Device resources (no arg = all devices)\n"},
3797bcb6cafSSascha Wildner     {1, "  Set N <NamedObject> <Value>",        "Set value for named integer\n"},
3807bcb6cafSSascha Wildner     {1, "  Template <Object>",                  "Format/dump a Buffer/ResourceTemplate\n"},
3817bcb6cafSSascha Wildner     {1, "  Type <Object>",                      "Display object type\n"},
3827bcb6cafSSascha Wildner 
3837bcb6cafSSascha Wildner     {0, "\nControl Method Execution:",          "\n"},
384c5a52fd3SSascha Wildner     {1, "  All <NameSeg>",                      "Evaluate all objects named NameSeg\n"},
3857bcb6cafSSascha Wildner     {1, "  Evaluate <Namepath> [Arguments]",    "Evaluate object or control method\n"},
3867bcb6cafSSascha Wildner     {1, "  Execute <Namepath> [Arguments]",     "Synonym for Evaluate\n"},
3877bcb6cafSSascha Wildner #ifdef ACPI_APPLICATION
3887bcb6cafSSascha Wildner     {1, "  Background <Namepath> [Arguments]",  "Evaluate object/method in a separate thread\n"},
3897bcb6cafSSascha Wildner     {1, "  Thread <Threads><Loops><NamePath>",  "Spawn threads to execute method(s)\n"},
3907bcb6cafSSascha Wildner #endif
3917bcb6cafSSascha Wildner     {1, "  Debug <Namepath> [Arguments]",       "Single-Step a control method\n"},
3927bcb6cafSSascha Wildner     {7, "  [Arguments] formats:",               "Control method argument formats\n"},
3937bcb6cafSSascha Wildner     {1, "     Hex Integer",                     "Integer\n"},
3947bcb6cafSSascha Wildner     {1, "     \"Ascii String\"",                "String\n"},
3957bcb6cafSSascha Wildner     {1, "     (Hex Byte List)",                 "Buffer\n"},
3967bcb6cafSSascha Wildner     {1, "         (01 42 7A BF)",               "Buffer example (4 bytes)\n"},
3977bcb6cafSSascha Wildner     {1, "     [Package Element List]",          "Package\n"},
3987bcb6cafSSascha Wildner     {1, "         [0x01 0x1234 \"string\"]",    "Package example (3 elements)\n"},
3997bcb6cafSSascha Wildner 
4007bcb6cafSSascha Wildner     {0, "\nMiscellaneous:",                     "\n"},
4010d02842fSSascha Wildner     {1, "  Allocations",                        "Display list of current memory allocations\n"},
4020d02842fSSascha Wildner     {2, "  Dump <Address>|<Namepath>",          "\n"},
4030d02842fSSascha Wildner     {0, "       [Byte|Word|Dword|Qword]",       "Display ACPI objects or memory\n"},
4040d02842fSSascha Wildner     {1, "  Handlers",                           "Info about global handlers\n"},
4050d02842fSSascha Wildner     {1, "  Help [Command]",                     "This help screen or individual command\n"},
4060d02842fSSascha Wildner     {1, "  History",                            "Display command history buffer\n"},
4070d02842fSSascha Wildner     {1, "  Level <DebugLevel>] [console]",      "Get/Set debug level for file or console\n"},
4080d02842fSSascha Wildner     {1, "  Locks",                              "Current status of internal mutexes\n"},
4090d02842fSSascha Wildner     {1, "  Osi [Install|Remove <name>]",        "Display or modify global _OSI list\n"},
4100d02842fSSascha Wildner     {1, "  Quit or Exit",                       "Exit this command\n"},
41120294b7eSSascha Wildner     {8, "  Stats <SubCommand>",                 "Display namespace and memory statistics\n"},
4120d02842fSSascha Wildner     {1, "     Allocations",                     "Display list of current memory allocations\n"},
4130d02842fSSascha Wildner     {1, "     Memory",                          "Dump internal memory lists\n"},
4140d02842fSSascha Wildner     {1, "     Misc",                            "Namespace search and mutex stats\n"},
4150d02842fSSascha Wildner     {1, "     Objects",                         "Summary of namespace objects\n"},
4160d02842fSSascha Wildner     {1, "     Sizes",                           "Sizes for each of the internal objects\n"},
4170d02842fSSascha Wildner     {1, "     Stack",                           "Display CPU stack usage\n"},
4180d02842fSSascha Wildner     {1, "     Tables",                          "Info about current ACPI table(s)\n"},
4190d02842fSSascha Wildner     {1, "  Tables",                             "Display info about loaded ACPI tables\n"},
4207bcb6cafSSascha Wildner #ifdef ACPI_APPLICATION
4217bcb6cafSSascha Wildner     {1, "  Terminate",                          "Delete namespace and all internal objects\n"},
4227bcb6cafSSascha Wildner #endif
4230d02842fSSascha Wildner     {1, "  ! <CommandNumber>",                  "Execute command from history buffer\n"},
4240d02842fSSascha Wildner     {1, "  !!",                                 "Execute last command again\n"},
4250d02842fSSascha Wildner 
4267bcb6cafSSascha Wildner     {0, "\nMethod and Namespace Debugging:",    "\n"},
4277bcb6cafSSascha Wildner     {5, "  Trace <State> [<Namepath>] [Once]",  "Trace control method execution\n"},
4287bcb6cafSSascha Wildner     {1, "     Enable",                          "Enable all messages\n"},
4297bcb6cafSSascha Wildner     {1, "     Disable",                         "Disable tracing\n"},
4307bcb6cafSSascha Wildner     {1, "     Method",                          "Enable method execution messages\n"},
4317bcb6cafSSascha Wildner     {1, "     Opcode",                          "Enable opcode execution messages\n"},
4327bcb6cafSSascha Wildner     {3, "  Test <TestName>",                    "Invoke a debug test\n"},
4337bcb6cafSSascha Wildner     {1, "     Objects",                         "Read/write/compare all namespace data objects\n"},
4347bcb6cafSSascha Wildner     {1, "     Predefined",                      "Validate all ACPI predefined names (_STA, etc.)\n"},
4357bcb6cafSSascha Wildner     {1, "  Execute predefined",                 "Execute all predefined (public) methods\n"},
4360d02842fSSascha Wildner 
4377bcb6cafSSascha Wildner     {0, "\nControl Method Single-Step Execution:","\n"},
4380d02842fSSascha Wildner     {1, "  Arguments (or Args)",                "Display method arguments\n"},
4390d02842fSSascha Wildner     {1, "  Breakpoint <AmlOffset>",             "Set an AML execution breakpoint\n"},
4400d02842fSSascha Wildner     {1, "  Call",                               "Run to next control method invocation\n"},
4410d02842fSSascha Wildner     {1, "  Go",                                 "Allow method to run to completion\n"},
4420d02842fSSascha Wildner     {1, "  Information",                        "Display info about the current method\n"},
4430d02842fSSascha Wildner     {1, "  Into",                               "Step into (not over) a method call\n"},
4440d02842fSSascha Wildner     {1, "  List [# of Aml Opcodes]",            "Display method ASL statements\n"},
4450d02842fSSascha Wildner     {1, "  Locals",                             "Display method local variables\n"},
4460d02842fSSascha Wildner     {1, "  Results",                            "Display method result stack\n"},
4470d02842fSSascha Wildner     {1, "  Set <A|L> <#> <Value>",              "Set method data (Arguments/Locals)\n"},
4480d02842fSSascha Wildner     {1, "  Stop",                               "Terminate control method\n"},
4490d02842fSSascha Wildner     {1, "  Tree",                               "Display control method calling tree\n"},
4500d02842fSSascha Wildner     {1, "  <Enter>",                            "Single step next AML opcode (over calls)\n"},
4510d02842fSSascha Wildner 
4523cc0afc6SSascha Wildner #ifdef ACPI_APPLICATION
4537bcb6cafSSascha Wildner     {0, "\nFile Operations:",                   "\n"},
4547bcb6cafSSascha Wildner     {1, "  Close",                              "Close debug output file\n"},
4557bcb6cafSSascha Wildner     {1, "  Load <Input Filename>",              "Load ACPI table from a file\n"},
4567bcb6cafSSascha Wildner     {1, "  Open <Output Filename>",             "Open a file for debug output\n"},
4577bcb6cafSSascha Wildner     {1, "  Unload <Namepath>",                  "Unload an ACPI table via namespace object\n"},
4587bcb6cafSSascha Wildner 
4597bcb6cafSSascha Wildner     {0, "\nHardware Simulation:",               "\n"},
4603cc0afc6SSascha Wildner     {1, "  EnableAcpi",                         "Enable ACPI (hardware) mode\n"},
4610d02842fSSascha Wildner     {1, "  Event <F|G> <Value>",                "Generate AcpiEvent (Fixed/GPE)\n"},
4629e1c0880SSascha Wildner     {1, "  Gpe <GpeNum> [GpeBlockDevice]",      "Simulate a GPE\n"},
4633cc0afc6SSascha Wildner     {1, "  Gpes",                               "Display info on all GPE devices\n"},
4640d02842fSSascha Wildner     {1, "  Sci",                                "Generate an SCI\n"},
4650d02842fSSascha Wildner     {1, "  Sleep [SleepState]",                 "Simulate sleep/wake sequence(s) (0-5)\n"},
4663cc0afc6SSascha Wildner #endif
4670d02842fSSascha Wildner     {0, NULL, NULL}
4680d02842fSSascha Wildner };
4690d02842fSSascha Wildner 
4700d02842fSSascha Wildner 
4710d02842fSSascha Wildner /*******************************************************************************
4720d02842fSSascha Wildner  *
4730d02842fSSascha Wildner  * FUNCTION:    AcpiDbMatchCommandHelp
4740d02842fSSascha Wildner  *
4750d02842fSSascha Wildner  * PARAMETERS:  Command             - Command string to match
4760d02842fSSascha Wildner  *              Help                - Help table entry to attempt match
4770d02842fSSascha Wildner  *
4780d02842fSSascha Wildner  * RETURN:      TRUE if command matched, FALSE otherwise
4790d02842fSSascha Wildner  *
4800d02842fSSascha Wildner  * DESCRIPTION: Attempt to match a command in the help table in order to
4810d02842fSSascha Wildner  *              print help information for a single command.
4820d02842fSSascha Wildner  *
4830d02842fSSascha Wildner  ******************************************************************************/
4840d02842fSSascha Wildner 
4850d02842fSSascha Wildner static BOOLEAN
AcpiDbMatchCommandHelp(const char * Command,const ACPI_DB_COMMAND_HELP * Help)4860d02842fSSascha Wildner AcpiDbMatchCommandHelp (
4872ffe9f16SSascha Wildner     const char                  *Command,
4880d02842fSSascha Wildner     const ACPI_DB_COMMAND_HELP  *Help)
4890d02842fSSascha Wildner {
4900d02842fSSascha Wildner     char                    *Invocation = Help->Invocation;
4910d02842fSSascha Wildner     UINT32                  LineCount;
4920d02842fSSascha Wildner 
4930d02842fSSascha Wildner 
4940d02842fSSascha Wildner     /* Valid commands in the help table begin with a couple of spaces */
4950d02842fSSascha Wildner 
4960d02842fSSascha Wildner     if (*Invocation != ' ')
4970d02842fSSascha Wildner     {
4980d02842fSSascha Wildner         return (FALSE);
4990d02842fSSascha Wildner     }
5000d02842fSSascha Wildner 
5010d02842fSSascha Wildner     while (*Invocation == ' ')
5020d02842fSSascha Wildner     {
5030d02842fSSascha Wildner         Invocation++;
5040d02842fSSascha Wildner     }
5050d02842fSSascha Wildner 
5060d02842fSSascha Wildner     /* Match command name (full command or substring) */
5070d02842fSSascha Wildner 
5080d02842fSSascha Wildner     while ((*Command) && (*Invocation) && (*Invocation != ' '))
5090d02842fSSascha Wildner     {
51025ca8c79SSascha Wildner         if (tolower ((int) *Command) != tolower ((int) *Invocation))
5110d02842fSSascha Wildner         {
5120d02842fSSascha Wildner             return (FALSE);
5130d02842fSSascha Wildner         }
5140d02842fSSascha Wildner 
5150d02842fSSascha Wildner         Invocation++;
5160d02842fSSascha Wildner         Command++;
5170d02842fSSascha Wildner     }
5180d02842fSSascha Wildner 
5190d02842fSSascha Wildner     /* Print the appropriate number of help lines */
5200d02842fSSascha Wildner 
5210d02842fSSascha Wildner     LineCount = Help->LineCount;
5220d02842fSSascha Wildner     while (LineCount)
5230d02842fSSascha Wildner     {
5240d02842fSSascha Wildner         AcpiOsPrintf ("%-38s : %s", Help->Invocation, Help->Description);
5250d02842fSSascha Wildner         Help++;
5260d02842fSSascha Wildner         LineCount--;
5270d02842fSSascha Wildner     }
5280d02842fSSascha Wildner 
5290d02842fSSascha Wildner     return (TRUE);
5300d02842fSSascha Wildner }
5310d02842fSSascha Wildner 
5320d02842fSSascha Wildner 
5330d02842fSSascha Wildner /*******************************************************************************
5340d02842fSSascha Wildner  *
5350d02842fSSascha Wildner  * FUNCTION:    AcpiDbDisplayCommandInfo
5360d02842fSSascha Wildner  *
5370d02842fSSascha Wildner  * PARAMETERS:  Command             - Command string to match
5380d02842fSSascha Wildner  *              DisplayAll          - Display all matching commands, or just
5390d02842fSSascha Wildner  *                                    the first one (substring match)
5400d02842fSSascha Wildner  *
5410d02842fSSascha Wildner  * RETURN:      None
5420d02842fSSascha Wildner  *
5430d02842fSSascha Wildner  * DESCRIPTION: Display help information for a Debugger command.
5440d02842fSSascha Wildner  *
5450d02842fSSascha Wildner  ******************************************************************************/
5460d02842fSSascha Wildner 
5470d02842fSSascha Wildner static void
AcpiDbDisplayCommandInfo(const char * Command,BOOLEAN DisplayAll)5480d02842fSSascha Wildner AcpiDbDisplayCommandInfo (
5492ffe9f16SSascha Wildner     const char              *Command,
5500d02842fSSascha Wildner     BOOLEAN                 DisplayAll)
5510d02842fSSascha Wildner {
5520d02842fSSascha Wildner     const ACPI_DB_COMMAND_HELP  *Next;
5530d02842fSSascha Wildner     BOOLEAN                     Matched;
5540d02842fSSascha Wildner 
5550d02842fSSascha Wildner 
5560d02842fSSascha Wildner     Next = AcpiGbl_DbCommandHelp;
5570d02842fSSascha Wildner     while (Next->Invocation)
5580d02842fSSascha Wildner     {
5590d02842fSSascha Wildner         Matched = AcpiDbMatchCommandHelp (Command, Next);
5600d02842fSSascha Wildner         if (!DisplayAll && Matched)
5610d02842fSSascha Wildner         {
5620d02842fSSascha Wildner             return;
5630d02842fSSascha Wildner         }
5640d02842fSSascha Wildner 
5650d02842fSSascha Wildner         Next++;
5660d02842fSSascha Wildner     }
5670d02842fSSascha Wildner }
5680d02842fSSascha Wildner 
5690d02842fSSascha Wildner 
5700d02842fSSascha Wildner /*******************************************************************************
5710d02842fSSascha Wildner  *
5720d02842fSSascha Wildner  * FUNCTION:    AcpiDbDisplayHelp
5730d02842fSSascha Wildner  *
5740d02842fSSascha Wildner  * PARAMETERS:  Command             - Optional command string to display help.
5750d02842fSSascha Wildner  *                                    if not specified, all debugger command
5760d02842fSSascha Wildner  *                                    help strings are displayed
5770d02842fSSascha Wildner  *
5780d02842fSSascha Wildner  * RETURN:      None
5790d02842fSSascha Wildner  *
5800d02842fSSascha Wildner  * DESCRIPTION: Display help for a single debugger command, or all of them.
5810d02842fSSascha Wildner  *
5820d02842fSSascha Wildner  ******************************************************************************/
5830d02842fSSascha Wildner 
5840d02842fSSascha Wildner static void
AcpiDbDisplayHelp(char * Command)5850d02842fSSascha Wildner AcpiDbDisplayHelp (
5860d02842fSSascha Wildner     char                    *Command)
5870d02842fSSascha Wildner {
5880d02842fSSascha Wildner     const ACPI_DB_COMMAND_HELP  *Next = AcpiGbl_DbCommandHelp;
5890d02842fSSascha Wildner 
5900d02842fSSascha Wildner 
5910d02842fSSascha Wildner     if (!Command)
5920d02842fSSascha Wildner     {
5930d02842fSSascha Wildner         /* No argument to help, display help for all commands */
5940d02842fSSascha Wildner 
5957bcb6cafSSascha Wildner         AcpiOsPrintf ("\nSummary of AML Debugger Commands\n\n");
5967bcb6cafSSascha Wildner 
5970d02842fSSascha Wildner         while (Next->Invocation)
5980d02842fSSascha Wildner         {
5990d02842fSSascha Wildner             AcpiOsPrintf ("%-38s%s", Next->Invocation, Next->Description);
6000d02842fSSascha Wildner             Next++;
6010d02842fSSascha Wildner         }
6027bcb6cafSSascha Wildner         AcpiOsPrintf ("\n");
6037bcb6cafSSascha Wildner 
6040d02842fSSascha Wildner     }
6050d02842fSSascha Wildner     else
6060d02842fSSascha Wildner     {
607c5a52fd3SSascha Wildner         /* Display help for all commands that match the substring */
6080d02842fSSascha Wildner 
6090d02842fSSascha Wildner         AcpiDbDisplayCommandInfo (Command, TRUE);
6100d02842fSSascha Wildner     }
6110d02842fSSascha Wildner }
6120d02842fSSascha Wildner 
6130d02842fSSascha Wildner 
6140d02842fSSascha Wildner /*******************************************************************************
6150d02842fSSascha Wildner  *
6160d02842fSSascha Wildner  * FUNCTION:    AcpiDbGetNextToken
6170d02842fSSascha Wildner  *
6180d02842fSSascha Wildner  * PARAMETERS:  String          - Command buffer
6190d02842fSSascha Wildner  *              Next            - Return value, end of next token
6200d02842fSSascha Wildner  *
6210d02842fSSascha Wildner  * RETURN:      Pointer to the start of the next token.
6220d02842fSSascha Wildner  *
6230d02842fSSascha Wildner  * DESCRIPTION: Command line parsing. Get the next token on the command line
6240d02842fSSascha Wildner  *
6250d02842fSSascha Wildner  ******************************************************************************/
6260d02842fSSascha Wildner 
6270d02842fSSascha Wildner char *
AcpiDbGetNextToken(char * String,char ** Next,ACPI_OBJECT_TYPE * ReturnType)6280d02842fSSascha Wildner AcpiDbGetNextToken (
6290d02842fSSascha Wildner     char                    *String,
6300d02842fSSascha Wildner     char                    **Next,
6310d02842fSSascha Wildner     ACPI_OBJECT_TYPE        *ReturnType)
6320d02842fSSascha Wildner {
6330d02842fSSascha Wildner     char                    *Start;
6340d02842fSSascha Wildner     UINT32                  Depth;
6350d02842fSSascha Wildner     ACPI_OBJECT_TYPE        Type = ACPI_TYPE_INTEGER;
6360d02842fSSascha Wildner 
6370d02842fSSascha Wildner 
6380d02842fSSascha Wildner     /* At end of buffer? */
6390d02842fSSascha Wildner 
6400d02842fSSascha Wildner     if (!String || !(*String))
6410d02842fSSascha Wildner     {
6420d02842fSSascha Wildner         return (NULL);
6430d02842fSSascha Wildner     }
6440d02842fSSascha Wildner 
64571c97a3cSSascha Wildner     /* Remove any spaces at the beginning, ignore blank lines */
6460d02842fSSascha Wildner 
64708343eafSSascha Wildner     while (*String && isspace ((int) *String))
6480d02842fSSascha Wildner     {
6490d02842fSSascha Wildner         String++;
6500d02842fSSascha Wildner     }
6510d02842fSSascha Wildner 
6520d02842fSSascha Wildner     if (!(*String))
6530d02842fSSascha Wildner     {
6540d02842fSSascha Wildner         return (NULL);
6550d02842fSSascha Wildner     }
6560d02842fSSascha Wildner 
6570d02842fSSascha Wildner     switch (*String)
6580d02842fSSascha Wildner     {
6590d02842fSSascha Wildner     case '"':
6600d02842fSSascha Wildner 
6610d02842fSSascha Wildner         /* This is a quoted string, scan until closing quote */
6620d02842fSSascha Wildner 
6630d02842fSSascha Wildner         String++;
6640d02842fSSascha Wildner         Start = String;
6650d02842fSSascha Wildner         Type = ACPI_TYPE_STRING;
6660d02842fSSascha Wildner 
6670d02842fSSascha Wildner         /* Find end of string */
6680d02842fSSascha Wildner 
6690d02842fSSascha Wildner         while (*String && (*String != '"'))
6700d02842fSSascha Wildner         {
6710d02842fSSascha Wildner             String++;
6720d02842fSSascha Wildner         }
6730d02842fSSascha Wildner         break;
6740d02842fSSascha Wildner 
6750d02842fSSascha Wildner     case '(':
6760d02842fSSascha Wildner 
6770d02842fSSascha Wildner         /* This is the start of a buffer, scan until closing paren */
6780d02842fSSascha Wildner 
6790d02842fSSascha Wildner         String++;
6800d02842fSSascha Wildner         Start = String;
6810d02842fSSascha Wildner         Type = ACPI_TYPE_BUFFER;
6820d02842fSSascha Wildner 
6830d02842fSSascha Wildner         /* Find end of buffer */
6840d02842fSSascha Wildner 
6850d02842fSSascha Wildner         while (*String && (*String != ')'))
6860d02842fSSascha Wildner         {
6870d02842fSSascha Wildner             String++;
6880d02842fSSascha Wildner         }
6890d02842fSSascha Wildner         break;
6900d02842fSSascha Wildner 
691e5412f1eSSascha Wildner     case '{':
692e5412f1eSSascha Wildner 
693e5412f1eSSascha Wildner         /* This is the start of a field unit, scan until closing brace */
694e5412f1eSSascha Wildner 
695e5412f1eSSascha Wildner         String++;
696e5412f1eSSascha Wildner         Start = String;
697e5412f1eSSascha Wildner         Type = ACPI_TYPE_FIELD_UNIT;
698e5412f1eSSascha Wildner 
699e5412f1eSSascha Wildner         /* Find end of buffer */
700e5412f1eSSascha Wildner 
701e5412f1eSSascha Wildner         while (*String && (*String != '}'))
702e5412f1eSSascha Wildner         {
703e5412f1eSSascha Wildner             String++;
704e5412f1eSSascha Wildner         }
705e5412f1eSSascha Wildner         break;
706e5412f1eSSascha Wildner 
7070d02842fSSascha Wildner     case '[':
7080d02842fSSascha Wildner 
7090d02842fSSascha Wildner         /* This is the start of a package, scan until closing bracket */
7100d02842fSSascha Wildner 
7110d02842fSSascha Wildner         String++;
7120d02842fSSascha Wildner         Depth = 1;
7130d02842fSSascha Wildner         Start = String;
7140d02842fSSascha Wildner         Type = ACPI_TYPE_PACKAGE;
7150d02842fSSascha Wildner 
7160d02842fSSascha Wildner         /* Find end of package (closing bracket) */
7170d02842fSSascha Wildner 
7180d02842fSSascha Wildner         while (*String)
7190d02842fSSascha Wildner         {
7200d02842fSSascha Wildner             /* Handle String package elements */
7210d02842fSSascha Wildner 
7220d02842fSSascha Wildner             if (*String == '"')
7230d02842fSSascha Wildner             {
7240d02842fSSascha Wildner                 /* Find end of string */
7250d02842fSSascha Wildner 
7260d02842fSSascha Wildner                 String++;
7270d02842fSSascha Wildner                 while (*String && (*String != '"'))
7280d02842fSSascha Wildner                 {
7290d02842fSSascha Wildner                     String++;
7300d02842fSSascha Wildner                 }
7310d02842fSSascha Wildner                 if (!(*String))
7320d02842fSSascha Wildner                 {
7330d02842fSSascha Wildner                     break;
7340d02842fSSascha Wildner                 }
7350d02842fSSascha Wildner             }
7360d02842fSSascha Wildner             else if (*String == '[')
7370d02842fSSascha Wildner             {
7380d02842fSSascha Wildner                 Depth++;         /* A nested package declaration */
7390d02842fSSascha Wildner             }
7400d02842fSSascha Wildner             else if (*String == ']')
7410d02842fSSascha Wildner             {
7420d02842fSSascha Wildner                 Depth--;
7430d02842fSSascha Wildner                 if (Depth == 0) /* Found final package closing bracket */
7440d02842fSSascha Wildner                 {
7450d02842fSSascha Wildner                     break;
7460d02842fSSascha Wildner                 }
7470d02842fSSascha Wildner             }
7480d02842fSSascha Wildner 
7490d02842fSSascha Wildner             String++;
7500d02842fSSascha Wildner         }
7510d02842fSSascha Wildner         break;
7520d02842fSSascha Wildner 
7530d02842fSSascha Wildner     default:
7540d02842fSSascha Wildner 
7550d02842fSSascha Wildner         Start = String;
7560d02842fSSascha Wildner 
7570d02842fSSascha Wildner         /* Find end of token */
7580d02842fSSascha Wildner 
75908343eafSSascha Wildner         while (*String && !isspace ((int) *String))
7600d02842fSSascha Wildner         {
7610d02842fSSascha Wildner             String++;
7620d02842fSSascha Wildner         }
7630d02842fSSascha Wildner         break;
7640d02842fSSascha Wildner     }
7650d02842fSSascha Wildner 
7660d02842fSSascha Wildner     if (!(*String))
7670d02842fSSascha Wildner     {
7680d02842fSSascha Wildner         *Next = NULL;
7690d02842fSSascha Wildner     }
7700d02842fSSascha Wildner     else
7710d02842fSSascha Wildner     {
7720d02842fSSascha Wildner         *String = 0;
7730d02842fSSascha Wildner         *Next = String + 1;
7740d02842fSSascha Wildner     }
7750d02842fSSascha Wildner 
7760d02842fSSascha Wildner     *ReturnType = Type;
7770d02842fSSascha Wildner     return (Start);
7780d02842fSSascha Wildner }
7790d02842fSSascha Wildner 
7800d02842fSSascha Wildner 
7810d02842fSSascha Wildner /*******************************************************************************
7820d02842fSSascha Wildner  *
7830d02842fSSascha Wildner  * FUNCTION:    AcpiDbGetLine
7840d02842fSSascha Wildner  *
7850d02842fSSascha Wildner  * PARAMETERS:  InputBuffer         - Command line buffer
7860d02842fSSascha Wildner  *
7870d02842fSSascha Wildner  * RETURN:      Count of arguments to the command
7880d02842fSSascha Wildner  *
7890d02842fSSascha Wildner  * DESCRIPTION: Get the next command line from the user. Gets entire line
7900d02842fSSascha Wildner  *              up to the next newline
7910d02842fSSascha Wildner  *
7920d02842fSSascha Wildner  ******************************************************************************/
7930d02842fSSascha Wildner 
7940d02842fSSascha Wildner static UINT32
AcpiDbGetLine(char * InputBuffer)7950d02842fSSascha Wildner AcpiDbGetLine (
7960d02842fSSascha Wildner     char                    *InputBuffer)
7970d02842fSSascha Wildner {
7980d02842fSSascha Wildner     UINT32                  i;
7990d02842fSSascha Wildner     UINT32                  Count;
8000d02842fSSascha Wildner     char                    *Next;
8010d02842fSSascha Wildner     char                    *This;
8020d02842fSSascha Wildner 
8030d02842fSSascha Wildner 
8040d02842fSSascha Wildner     if (AcpiUtSafeStrcpy (AcpiGbl_DbParsedBuf, sizeof (AcpiGbl_DbParsedBuf),
8050d02842fSSascha Wildner         InputBuffer))
8060d02842fSSascha Wildner     {
8073cc0afc6SSascha Wildner         AcpiOsPrintf (
8083cc0afc6SSascha Wildner             "Buffer overflow while parsing input line (max %u characters)\n",
809e5412f1eSSascha Wildner             (UINT32) sizeof (AcpiGbl_DbParsedBuf));
8100d02842fSSascha Wildner         return (0);
8110d02842fSSascha Wildner     }
8120d02842fSSascha Wildner 
8130d02842fSSascha Wildner     This = AcpiGbl_DbParsedBuf;
8140d02842fSSascha Wildner     for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
8150d02842fSSascha Wildner     {
8160d02842fSSascha Wildner         AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next,
8170d02842fSSascha Wildner             &AcpiGbl_DbArgTypes[i]);
8180d02842fSSascha Wildner         if (!AcpiGbl_DbArgs[i])
8190d02842fSSascha Wildner         {
8200d02842fSSascha Wildner             break;
8210d02842fSSascha Wildner         }
8220d02842fSSascha Wildner 
8230d02842fSSascha Wildner         This = Next;
8240d02842fSSascha Wildner     }
8250d02842fSSascha Wildner 
8260d02842fSSascha Wildner     /* Uppercase the actual command */
8270d02842fSSascha Wildner 
8280d02842fSSascha Wildner     AcpiUtStrupr (AcpiGbl_DbArgs[0]);
8290d02842fSSascha Wildner 
8300d02842fSSascha Wildner     Count = i;
8310d02842fSSascha Wildner     if (Count)
8320d02842fSSascha Wildner     {
8330d02842fSSascha Wildner         Count--;  /* Number of args only */
8340d02842fSSascha Wildner     }
8350d02842fSSascha Wildner 
8360d02842fSSascha Wildner     return (Count);
8370d02842fSSascha Wildner }
8380d02842fSSascha Wildner 
8390d02842fSSascha Wildner 
8400d02842fSSascha Wildner /*******************************************************************************
8410d02842fSSascha Wildner  *
8420d02842fSSascha Wildner  * FUNCTION:    AcpiDbMatchCommand
8430d02842fSSascha Wildner  *
8440d02842fSSascha Wildner  * PARAMETERS:  UserCommand             - User command line
8450d02842fSSascha Wildner  *
8460d02842fSSascha Wildner  * RETURN:      Index into command array, -1 if not found
8470d02842fSSascha Wildner  *
8480d02842fSSascha Wildner  * DESCRIPTION: Search command array for a command match
8490d02842fSSascha Wildner  *
8500d02842fSSascha Wildner  ******************************************************************************/
8510d02842fSSascha Wildner 
8520d02842fSSascha Wildner static UINT32
AcpiDbMatchCommand(char * UserCommand)8530d02842fSSascha Wildner AcpiDbMatchCommand (
8540d02842fSSascha Wildner     char                    *UserCommand)
8550d02842fSSascha Wildner {
8560d02842fSSascha Wildner     UINT32                  i;
8570d02842fSSascha Wildner 
8580d02842fSSascha Wildner 
8590d02842fSSascha Wildner     if (!UserCommand || UserCommand[0] == 0)
8600d02842fSSascha Wildner     {
8610d02842fSSascha Wildner         return (CMD_NULL);
8620d02842fSSascha Wildner     }
8630d02842fSSascha Wildner 
8640d02842fSSascha Wildner     for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++)
8650d02842fSSascha Wildner     {
8662ffe9f16SSascha Wildner         if (strstr (
8672ffe9f16SSascha Wildner             ACPI_CAST_PTR (char, AcpiGbl_DbCommands[i].Name), UserCommand) ==
8680d02842fSSascha Wildner             AcpiGbl_DbCommands[i].Name)
8690d02842fSSascha Wildner         {
8700d02842fSSascha Wildner             return (i);
8710d02842fSSascha Wildner         }
8720d02842fSSascha Wildner     }
8730d02842fSSascha Wildner 
8740d02842fSSascha Wildner     /* Command not recognized */
8750d02842fSSascha Wildner 
8760d02842fSSascha Wildner     return (CMD_NOT_FOUND);
8770d02842fSSascha Wildner }
8780d02842fSSascha Wildner 
8790d02842fSSascha Wildner 
8800d02842fSSascha Wildner /*******************************************************************************
8810d02842fSSascha Wildner  *
8820d02842fSSascha Wildner  * FUNCTION:    AcpiDbCommandDispatch
8830d02842fSSascha Wildner  *
8840d02842fSSascha Wildner  * PARAMETERS:  InputBuffer         - Command line buffer
8850d02842fSSascha Wildner  *              WalkState           - Current walk
8860d02842fSSascha Wildner  *              Op                  - Current (executing) parse op
8870d02842fSSascha Wildner  *
8880d02842fSSascha Wildner  * RETURN:      Status
8890d02842fSSascha Wildner  *
8900d02842fSSascha Wildner  * DESCRIPTION: Command dispatcher.
8910d02842fSSascha Wildner  *
8920d02842fSSascha Wildner  ******************************************************************************/
8930d02842fSSascha Wildner 
8940d02842fSSascha Wildner ACPI_STATUS
AcpiDbCommandDispatch(char * InputBuffer,ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op)8950d02842fSSascha Wildner AcpiDbCommandDispatch (
8960d02842fSSascha Wildner     char                    *InputBuffer,
8970d02842fSSascha Wildner     ACPI_WALK_STATE         *WalkState,
8980d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
8990d02842fSSascha Wildner {
9000d02842fSSascha Wildner     UINT32                  Temp;
901e5412f1eSSascha Wildner     UINT64                  Temp64;
9020d02842fSSascha Wildner     UINT32                  CommandIndex;
9030d02842fSSascha Wildner     UINT32                  ParamCount;
9040d02842fSSascha Wildner     char                    *CommandLine;
9050d02842fSSascha Wildner     ACPI_STATUS             Status = AE_CTRL_TRUE;
9060d02842fSSascha Wildner 
9070d02842fSSascha Wildner 
9080d02842fSSascha Wildner     /* If AcpiTerminate has been called, terminate this thread */
9090d02842fSSascha Wildner 
910820c5b08SSascha Wildner     if (AcpiGbl_DbTerminateLoop)
9110d02842fSSascha Wildner     {
9120d02842fSSascha Wildner         return (AE_CTRL_TERMINATE);
9130d02842fSSascha Wildner     }
9140d02842fSSascha Wildner 
915d63676ccSSascha Wildner     /* Find command and add to the history buffer */
9160d02842fSSascha Wildner 
9170d02842fSSascha Wildner     ParamCount = AcpiDbGetLine (InputBuffer);
9180d02842fSSascha Wildner     CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
9190d02842fSSascha Wildner 
920d63676ccSSascha Wildner     /*
921d63676ccSSascha Wildner      * We don't want to add the !! command to the history buffer. It
922d63676ccSSascha Wildner      * would cause an infinite loop because it would always be the
923d63676ccSSascha Wildner      * previous command.
924d63676ccSSascha Wildner      */
925d63676ccSSascha Wildner     if (CommandIndex != CMD_HISTORY_LAST)
926d63676ccSSascha Wildner     {
927d63676ccSSascha Wildner         AcpiDbAddToHistory (InputBuffer);
928d63676ccSSascha Wildner     }
929d63676ccSSascha Wildner 
9300d02842fSSascha Wildner     /* Verify that we have the minimum number of params */
9310d02842fSSascha Wildner 
9320d02842fSSascha Wildner     if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs)
9330d02842fSSascha Wildner     {
9340d02842fSSascha Wildner         AcpiOsPrintf ("%u parameters entered, [%s] requires %u parameters\n",
9350d02842fSSascha Wildner             ParamCount, AcpiGbl_DbCommands[CommandIndex].Name,
9360d02842fSSascha Wildner             AcpiGbl_DbCommands[CommandIndex].MinArgs);
9370d02842fSSascha Wildner 
9383cc0afc6SSascha Wildner         AcpiDbDisplayCommandInfo (
9393cc0afc6SSascha Wildner             AcpiGbl_DbCommands[CommandIndex].Name, FALSE);
9400d02842fSSascha Wildner         return (AE_CTRL_TRUE);
9410d02842fSSascha Wildner     }
9420d02842fSSascha Wildner 
9430d02842fSSascha Wildner     /* Decode and dispatch the command */
9440d02842fSSascha Wildner 
9450d02842fSSascha Wildner     switch (CommandIndex)
9460d02842fSSascha Wildner     {
9470d02842fSSascha Wildner     case CMD_NULL:
9480d02842fSSascha Wildner 
9490d02842fSSascha Wildner         if (Op)
9500d02842fSSascha Wildner         {
9510d02842fSSascha Wildner             return (AE_OK);
9520d02842fSSascha Wildner         }
9530d02842fSSascha Wildner         break;
9540d02842fSSascha Wildner 
955c5a52fd3SSascha Wildner     case CMD_ALL:
956c5a52fd3SSascha Wildner 
957c5a52fd3SSascha Wildner         AcpiOsPrintf ("Executing all objects with NameSeg: %s\n", AcpiGbl_DbArgs[1]);
958c5a52fd3SSascha Wildner         AcpiDbExecute (AcpiGbl_DbArgs[1],
959c5a52fd3SSascha Wildner             &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP | EX_ALL);
960c5a52fd3SSascha Wildner         break;
961c5a52fd3SSascha Wildner 
9620d02842fSSascha Wildner     case CMD_ALLOCATIONS:
9630d02842fSSascha Wildner 
9640d02842fSSascha Wildner #ifdef ACPI_DBG_TRACK_ALLOCATIONS
9650d02842fSSascha Wildner         AcpiUtDumpAllocations ((UINT32) -1, NULL);
9660d02842fSSascha Wildner #endif
9670d02842fSSascha Wildner         break;
9680d02842fSSascha Wildner 
9690d02842fSSascha Wildner     case CMD_ARGS:
9700d02842fSSascha Wildner     case CMD_ARGUMENTS:
9710d02842fSSascha Wildner 
9720d02842fSSascha Wildner         AcpiDbDisplayArguments ();
9730d02842fSSascha Wildner         break;
9740d02842fSSascha Wildner 
9750d02842fSSascha Wildner     case CMD_BREAKPOINT:
9760d02842fSSascha Wildner 
9770d02842fSSascha Wildner         AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op);
9780d02842fSSascha Wildner         break;
9790d02842fSSascha Wildner 
9800d02842fSSascha Wildner     case CMD_BUSINFO:
9810d02842fSSascha Wildner 
9820d02842fSSascha Wildner         AcpiDbGetBusInfo ();
9830d02842fSSascha Wildner         break;
9840d02842fSSascha Wildner 
9850d02842fSSascha Wildner     case CMD_CALL:
9860d02842fSSascha Wildner 
9870d02842fSSascha Wildner         AcpiDbSetMethodCallBreakpoint (Op);
9880d02842fSSascha Wildner         Status = AE_OK;
9890d02842fSSascha Wildner         break;
9900d02842fSSascha Wildner 
9910d02842fSSascha Wildner     case CMD_DEBUG:
9920d02842fSSascha Wildner 
9930d02842fSSascha Wildner         AcpiDbExecute (AcpiGbl_DbArgs[1],
9940d02842fSSascha Wildner             &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_SINGLE_STEP);
9950d02842fSSascha Wildner         break;
9960d02842fSSascha Wildner 
9970d02842fSSascha Wildner     case CMD_DISASSEMBLE:
9980d02842fSSascha Wildner     case CMD_DISASM:
9990d02842fSSascha Wildner 
10002afeb59bSSascha Wildner #ifdef ACPI_DISASSEMBLER
10010d02842fSSascha Wildner         (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
10022afeb59bSSascha Wildner #else
10032afeb59bSSascha Wildner         AcpiOsPrintf ("The AML Disassembler is not configured/present\n");
10042afeb59bSSascha Wildner #endif
10050d02842fSSascha Wildner         break;
10060d02842fSSascha Wildner 
10070d02842fSSascha Wildner     case CMD_DUMP:
10080d02842fSSascha Wildner 
10090d02842fSSascha Wildner         AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
10100d02842fSSascha Wildner         break;
10110d02842fSSascha Wildner 
10120d02842fSSascha Wildner     case CMD_EVALUATE:
10130d02842fSSascha Wildner     case CMD_EXECUTE:
10140d02842fSSascha Wildner 
10150d02842fSSascha Wildner         AcpiDbExecute (AcpiGbl_DbArgs[1],
10160d02842fSSascha Wildner             &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP);
10170d02842fSSascha Wildner         break;
10180d02842fSSascha Wildner 
10190d02842fSSascha Wildner     case CMD_FIND:
10200d02842fSSascha Wildner 
10210d02842fSSascha Wildner         Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]);
10220d02842fSSascha Wildner         break;
10230d02842fSSascha Wildner 
1024e5412f1eSSascha Wildner     case CMD_FIELDS:
1025e5412f1eSSascha Wildner 
1026e5412f1eSSascha Wildner         Status = AcpiUtStrtoul64 (AcpiGbl_DbArgs[1], &Temp64);
1027e5412f1eSSascha Wildner 
1028e5412f1eSSascha Wildner         if (ACPI_FAILURE (Status) || Temp64 >= ACPI_NUM_PREDEFINED_REGIONS)
1029e5412f1eSSascha Wildner         {
1030e5412f1eSSascha Wildner             AcpiOsPrintf (
1031e5412f1eSSascha Wildner                 "Invalid address space ID: must be between 0 and %u inclusive\n",
1032e5412f1eSSascha Wildner                 ACPI_NUM_PREDEFINED_REGIONS - 1);
1033e5412f1eSSascha Wildner             return (AE_OK);
1034e5412f1eSSascha Wildner         }
1035e5412f1eSSascha Wildner 
1036e5412f1eSSascha Wildner         Status = AcpiDbDisplayFields ((UINT32) Temp64);
1037e5412f1eSSascha Wildner         break;
1038e5412f1eSSascha Wildner 
10390d02842fSSascha Wildner     case CMD_GO:
10400d02842fSSascha Wildner 
10410d02842fSSascha Wildner         AcpiGbl_CmSingleStep = FALSE;
10420d02842fSSascha Wildner         return (AE_OK);
10430d02842fSSascha Wildner 
10440d02842fSSascha Wildner     case CMD_HANDLERS:
10450d02842fSSascha Wildner 
10460d02842fSSascha Wildner         AcpiDbDisplayHandlers ();
10470d02842fSSascha Wildner         break;
10480d02842fSSascha Wildner 
10490d02842fSSascha Wildner     case CMD_HELP:
10500d02842fSSascha Wildner     case CMD_HELP2:
10510d02842fSSascha Wildner 
10520d02842fSSascha Wildner         AcpiDbDisplayHelp (AcpiGbl_DbArgs[1]);
10530d02842fSSascha Wildner         break;
10540d02842fSSascha Wildner 
10550d02842fSSascha Wildner     case CMD_HISTORY:
10560d02842fSSascha Wildner 
10570d02842fSSascha Wildner         AcpiDbDisplayHistory ();
10580d02842fSSascha Wildner         break;
10590d02842fSSascha Wildner 
10600d02842fSSascha Wildner     case CMD_HISTORY_EXE: /* ! command */
10610d02842fSSascha Wildner 
10620d02842fSSascha Wildner         CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]);
10630d02842fSSascha Wildner         if (!CommandLine)
10640d02842fSSascha Wildner         {
10650d02842fSSascha Wildner             return (AE_CTRL_TRUE);
10660d02842fSSascha Wildner         }
10670d02842fSSascha Wildner 
10680d02842fSSascha Wildner         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
10690d02842fSSascha Wildner         return (Status);
10700d02842fSSascha Wildner 
10710d02842fSSascha Wildner     case CMD_HISTORY_LAST: /* !! command */
10720d02842fSSascha Wildner 
10730d02842fSSascha Wildner         CommandLine = AcpiDbGetFromHistory (NULL);
10740d02842fSSascha Wildner         if (!CommandLine)
10750d02842fSSascha Wildner         {
10760d02842fSSascha Wildner             return (AE_CTRL_TRUE);
10770d02842fSSascha Wildner         }
10780d02842fSSascha Wildner 
10790d02842fSSascha Wildner         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
10800d02842fSSascha Wildner         return (Status);
10810d02842fSSascha Wildner 
10820d02842fSSascha Wildner     case CMD_INFORMATION:
10830d02842fSSascha Wildner 
10840d02842fSSascha Wildner         AcpiDbDisplayMethodInfo (Op);
10850d02842fSSascha Wildner         break;
10860d02842fSSascha Wildner 
10870d02842fSSascha Wildner     case CMD_INTEGRITY:
10880d02842fSSascha Wildner 
10890d02842fSSascha Wildner         AcpiDbCheckIntegrity ();
10900d02842fSSascha Wildner         break;
10910d02842fSSascha Wildner 
10920d02842fSSascha Wildner     case CMD_INTO:
10930d02842fSSascha Wildner 
10940d02842fSSascha Wildner         if (Op)
10950d02842fSSascha Wildner         {
10960d02842fSSascha Wildner             AcpiGbl_CmSingleStep = TRUE;
10970d02842fSSascha Wildner             return (AE_OK);
10980d02842fSSascha Wildner         }
10990d02842fSSascha Wildner         break;
11000d02842fSSascha Wildner 
11010d02842fSSascha Wildner     case CMD_LEVEL:
11020d02842fSSascha Wildner 
11030d02842fSSascha Wildner         if (ParamCount == 0)
11040d02842fSSascha Wildner         {
11053cc0afc6SSascha Wildner             AcpiOsPrintf (
1106e5412f1eSSascha Wildner                 "Current debug level for file output is:    %8.8X\n",
11070d02842fSSascha Wildner                 AcpiGbl_DbDebugLevel);
11083cc0afc6SSascha Wildner             AcpiOsPrintf (
1109e5412f1eSSascha Wildner                 "Current debug level for console output is: %8.8X\n",
11100d02842fSSascha Wildner                 AcpiGbl_DbConsoleDebugLevel);
11110d02842fSSascha Wildner         }
11120d02842fSSascha Wildner         else if (ParamCount == 2)
11130d02842fSSascha Wildner         {
11140d02842fSSascha Wildner             Temp = AcpiGbl_DbConsoleDebugLevel;
1115820c5b08SSascha Wildner             AcpiGbl_DbConsoleDebugLevel =
1116820c5b08SSascha Wildner                 strtoul (AcpiGbl_DbArgs[1], NULL, 16);
11170d02842fSSascha Wildner             AcpiOsPrintf (
1118e5412f1eSSascha Wildner                 "Debug Level for console output was %8.8X, now %8.8X\n",
11190d02842fSSascha Wildner                 Temp, AcpiGbl_DbConsoleDebugLevel);
11200d02842fSSascha Wildner         }
11210d02842fSSascha Wildner         else
11220d02842fSSascha Wildner         {
11230d02842fSSascha Wildner             Temp = AcpiGbl_DbDebugLevel;
112425ca8c79SSascha Wildner             AcpiGbl_DbDebugLevel = strtoul (AcpiGbl_DbArgs[1], NULL, 16);
11250d02842fSSascha Wildner             AcpiOsPrintf (
1126e5412f1eSSascha Wildner                 "Debug Level for file output was %8.8X, now %8.8X\n",
11270d02842fSSascha Wildner                 Temp, AcpiGbl_DbDebugLevel);
11280d02842fSSascha Wildner         }
11290d02842fSSascha Wildner         break;
11300d02842fSSascha Wildner 
11310d02842fSSascha Wildner     case CMD_LIST:
11320d02842fSSascha Wildner 
11332afeb59bSSascha Wildner #ifdef ACPI_DISASSEMBLER
1134806343b9SSascha Wildner         AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
11352afeb59bSSascha Wildner #else
11362afeb59bSSascha Wildner         AcpiOsPrintf ("The AML Disassembler is not configured/present\n");
11372afeb59bSSascha Wildner #endif
11380d02842fSSascha Wildner         break;
11390d02842fSSascha Wildner 
11400d02842fSSascha Wildner     case CMD_LOCKS:
11410d02842fSSascha Wildner 
11420d02842fSSascha Wildner         AcpiDbDisplayLocks ();
11430d02842fSSascha Wildner         break;
11440d02842fSSascha Wildner 
11450d02842fSSascha Wildner     case CMD_LOCALS:
11460d02842fSSascha Wildner 
11470d02842fSSascha Wildner         AcpiDbDisplayLocals ();
11480d02842fSSascha Wildner         break;
11490d02842fSSascha Wildner 
11500d02842fSSascha Wildner     case CMD_METHODS:
11510d02842fSSascha Wildner 
11520d02842fSSascha Wildner         Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]);
11530d02842fSSascha Wildner         break;
11540d02842fSSascha Wildner 
11550d02842fSSascha Wildner     case CMD_NAMESPACE:
11560d02842fSSascha Wildner 
11570d02842fSSascha Wildner         AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
11580d02842fSSascha Wildner         break;
11590d02842fSSascha Wildner 
11600d02842fSSascha Wildner     case CMD_NOTIFY:
11610d02842fSSascha Wildner 
116225ca8c79SSascha Wildner         Temp = strtoul (AcpiGbl_DbArgs[2], NULL, 0);
11630d02842fSSascha Wildner         AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp);
11640d02842fSSascha Wildner         break;
11650d02842fSSascha Wildner 
11660d02842fSSascha Wildner     case CMD_OBJECTS:
11670d02842fSSascha Wildner 
11680d02842fSSascha Wildner         AcpiUtStrupr (AcpiGbl_DbArgs[1]);
11690d02842fSSascha Wildner         Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
11700d02842fSSascha Wildner         break;
11710d02842fSSascha Wildner 
11720d02842fSSascha Wildner     case CMD_OSI:
11730d02842fSSascha Wildner 
11740d02842fSSascha Wildner         AcpiDbDisplayInterfaces (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
11750d02842fSSascha Wildner         break;
11760d02842fSSascha Wildner 
11770d02842fSSascha Wildner     case CMD_OWNER:
11780d02842fSSascha Wildner 
11790d02842fSSascha Wildner         AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
11800d02842fSSascha Wildner         break;
11810d02842fSSascha Wildner 
11820d02842fSSascha Wildner     case CMD_PATHS:
11830d02842fSSascha Wildner 
11840d02842fSSascha Wildner         AcpiDbDumpNamespacePaths ();
11850d02842fSSascha Wildner         break;
11860d02842fSSascha Wildner 
11870d02842fSSascha Wildner     case CMD_PREFIX:
11880d02842fSSascha Wildner 
11890d02842fSSascha Wildner         AcpiDbSetScope (AcpiGbl_DbArgs[1]);
11900d02842fSSascha Wildner         break;
11910d02842fSSascha Wildner 
11920d02842fSSascha Wildner     case CMD_REFERENCES:
11930d02842fSSascha Wildner 
11940d02842fSSascha Wildner         AcpiDbFindReferences (AcpiGbl_DbArgs[1]);
11950d02842fSSascha Wildner         break;
11960d02842fSSascha Wildner 
11970d02842fSSascha Wildner     case CMD_RESOURCES:
11980d02842fSSascha Wildner 
11990d02842fSSascha Wildner         AcpiDbDisplayResources (AcpiGbl_DbArgs[1]);
12000d02842fSSascha Wildner         break;
12010d02842fSSascha Wildner 
12020d02842fSSascha Wildner     case CMD_RESULTS:
12030d02842fSSascha Wildner 
12040d02842fSSascha Wildner         AcpiDbDisplayResults ();
12050d02842fSSascha Wildner         break;
12060d02842fSSascha Wildner 
12070d02842fSSascha Wildner     case CMD_SET:
12080d02842fSSascha Wildner 
12090d02842fSSascha Wildner         AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
12100d02842fSSascha Wildner             AcpiGbl_DbArgs[3]);
12110d02842fSSascha Wildner         break;
12120d02842fSSascha Wildner 
12130d02842fSSascha Wildner     case CMD_STATS:
12140d02842fSSascha Wildner 
12150d02842fSSascha Wildner         Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]);
12160d02842fSSascha Wildner         break;
12170d02842fSSascha Wildner 
12180d02842fSSascha Wildner     case CMD_STOP:
12190d02842fSSascha Wildner 
12200d02842fSSascha Wildner         return (AE_NOT_IMPLEMENTED);
12210d02842fSSascha Wildner 
12220d02842fSSascha Wildner     case CMD_TABLES:
12230d02842fSSascha Wildner 
12240d02842fSSascha Wildner         AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]);
12250d02842fSSascha Wildner         break;
12260d02842fSSascha Wildner 
12270d02842fSSascha Wildner     case CMD_TEMPLATE:
12280d02842fSSascha Wildner 
12290d02842fSSascha Wildner         AcpiDbDisplayTemplate (AcpiGbl_DbArgs[1]);
12300d02842fSSascha Wildner         break;
12310d02842fSSascha Wildner 
12320d02842fSSascha Wildner     case CMD_TRACE:
12330d02842fSSascha Wildner 
1234267c04fdSSascha Wildner         AcpiDbTrace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2], AcpiGbl_DbArgs[3]);
12350d02842fSSascha Wildner         break;
12360d02842fSSascha Wildner 
12370d02842fSSascha Wildner     case CMD_TREE:
12380d02842fSSascha Wildner 
12390d02842fSSascha Wildner         AcpiDbDisplayCallingTree ();
12400d02842fSSascha Wildner         break;
12410d02842fSSascha Wildner 
12420d02842fSSascha Wildner     case CMD_TYPE:
12430d02842fSSascha Wildner 
12440d02842fSSascha Wildner         AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]);
12450d02842fSSascha Wildner         break;
12460d02842fSSascha Wildner 
12473cc0afc6SSascha Wildner #ifdef ACPI_APPLICATION
12483cc0afc6SSascha Wildner 
12493cc0afc6SSascha Wildner     /* Hardware simulation commands. */
12503cc0afc6SSascha Wildner 
12513cc0afc6SSascha Wildner     case CMD_ENABLEACPI:
12523cc0afc6SSascha Wildner #if (!ACPI_REDUCED_HARDWARE)
12533cc0afc6SSascha Wildner 
12543cc0afc6SSascha Wildner         Status = AcpiEnable();
12553cc0afc6SSascha Wildner         if (ACPI_FAILURE(Status))
12563cc0afc6SSascha Wildner         {
12573cc0afc6SSascha Wildner             AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status);
12583cc0afc6SSascha Wildner             return (Status);
12593cc0afc6SSascha Wildner         }
12603cc0afc6SSascha Wildner #endif /* !ACPI_REDUCED_HARDWARE */
12613cc0afc6SSascha Wildner         break;
12623cc0afc6SSascha Wildner 
12633cc0afc6SSascha Wildner     case CMD_EVENT:
12643cc0afc6SSascha Wildner 
12653cc0afc6SSascha Wildner         AcpiOsPrintf ("Event command not implemented\n");
12663cc0afc6SSascha Wildner         break;
12673cc0afc6SSascha Wildner 
12683cc0afc6SSascha Wildner     case CMD_GPE:
12693cc0afc6SSascha Wildner 
12703cc0afc6SSascha Wildner         AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
12713cc0afc6SSascha Wildner         break;
12723cc0afc6SSascha Wildner 
12733cc0afc6SSascha Wildner     case CMD_GPES:
12743cc0afc6SSascha Wildner 
12753cc0afc6SSascha Wildner         AcpiDbDisplayGpes ();
12763cc0afc6SSascha Wildner         break;
12773cc0afc6SSascha Wildner 
12783cc0afc6SSascha Wildner     case CMD_SCI:
12793cc0afc6SSascha Wildner 
12803cc0afc6SSascha Wildner         AcpiDbGenerateSci ();
12813cc0afc6SSascha Wildner         break;
12823cc0afc6SSascha Wildner 
12833cc0afc6SSascha Wildner     case CMD_SLEEP:
12843cc0afc6SSascha Wildner 
12853cc0afc6SSascha Wildner         Status = AcpiDbSleep (AcpiGbl_DbArgs[1]);
12863cc0afc6SSascha Wildner         break;
12873cc0afc6SSascha Wildner 
12883cc0afc6SSascha Wildner     /* File I/O commands. */
12893cc0afc6SSascha Wildner 
12903cc0afc6SSascha Wildner     case CMD_CLOSE:
12913cc0afc6SSascha Wildner 
12923cc0afc6SSascha Wildner         AcpiDbCloseDebugFile ();
12933cc0afc6SSascha Wildner         break;
12943cc0afc6SSascha Wildner 
12953cc0afc6SSascha Wildner     case CMD_LOAD:
1296820c5b08SSascha Wildner         {
1297820c5b08SSascha Wildner             ACPI_NEW_TABLE_DESC     *ListHead = NULL;
12983cc0afc6SSascha Wildner 
1299f5f76cf2SSascha Wildner             Status = AcGetAllTablesFromFile (AcpiGbl_DbArgs[1],
1300820c5b08SSascha Wildner                 ACPI_GET_ALL_TABLES, &ListHead);
1301820c5b08SSascha Wildner             if (ACPI_SUCCESS (Status))
1302820c5b08SSascha Wildner             {
1303820c5b08SSascha Wildner                 AcpiDbLoadTables (ListHead);
1304820c5b08SSascha Wildner             }
1305820c5b08SSascha Wildner         }
13063cc0afc6SSascha Wildner         break;
13073cc0afc6SSascha Wildner 
13083cc0afc6SSascha Wildner     case CMD_OPEN:
13093cc0afc6SSascha Wildner 
13103cc0afc6SSascha Wildner         AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]);
13113cc0afc6SSascha Wildner         break;
13123cc0afc6SSascha Wildner 
13133cc0afc6SSascha Wildner     /* User space commands. */
13143cc0afc6SSascha Wildner 
13153cc0afc6SSascha Wildner     case CMD_TERMINATE:
13163cc0afc6SSascha Wildner 
13173cc0afc6SSascha Wildner         AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
13183cc0afc6SSascha Wildner         AcpiUtSubsystemShutdown ();
13193cc0afc6SSascha Wildner 
13203cc0afc6SSascha Wildner         /*
13213cc0afc6SSascha Wildner          * TBD: [Restructure] Need some way to re-initialize without
13223cc0afc6SSascha Wildner          * re-creating the semaphores!
13233cc0afc6SSascha Wildner          */
13243cc0afc6SSascha Wildner 
1325820c5b08SSascha Wildner         AcpiGbl_DbTerminateLoop = TRUE;
13263cc0afc6SSascha Wildner         /*  AcpiInitialize (NULL);  */
13273cc0afc6SSascha Wildner         break;
13283cc0afc6SSascha Wildner 
13297bcb6cafSSascha Wildner     case CMD_BACKGROUND:
13307bcb6cafSSascha Wildner 
13317bcb6cafSSascha Wildner         AcpiDbCreateExecutionThread (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2],
13327bcb6cafSSascha Wildner             &AcpiGbl_DbArgTypes[2]);
13337bcb6cafSSascha Wildner         break;
13347bcb6cafSSascha Wildner 
13353cc0afc6SSascha Wildner     case CMD_THREADS:
13363cc0afc6SSascha Wildner 
13373cc0afc6SSascha Wildner         AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
13383cc0afc6SSascha Wildner             AcpiGbl_DbArgs[3]);
13393cc0afc6SSascha Wildner         break;
13403cc0afc6SSascha Wildner 
13413cc0afc6SSascha Wildner     /* Debug test commands. */
13423cc0afc6SSascha Wildner 
13433cc0afc6SSascha Wildner     case CMD_PREDEFINED:
13443cc0afc6SSascha Wildner 
13453cc0afc6SSascha Wildner         AcpiDbCheckPredefinedNames ();
13463cc0afc6SSascha Wildner         break;
13473cc0afc6SSascha Wildner 
13483cc0afc6SSascha Wildner     case CMD_TEST:
13493cc0afc6SSascha Wildner 
13503cc0afc6SSascha Wildner         AcpiDbExecuteTest (AcpiGbl_DbArgs[1]);
13513cc0afc6SSascha Wildner         break;
13523cc0afc6SSascha Wildner 
13530d02842fSSascha Wildner     case CMD_UNLOAD:
13540d02842fSSascha Wildner 
13550d02842fSSascha Wildner         AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1]);
13560d02842fSSascha Wildner         break;
13573cc0afc6SSascha Wildner #endif
13580d02842fSSascha Wildner 
13590d02842fSSascha Wildner     case CMD_EXIT:
13600d02842fSSascha Wildner     case CMD_QUIT:
13610d02842fSSascha Wildner 
13620d02842fSSascha Wildner         if (Op)
13630d02842fSSascha Wildner         {
13640d02842fSSascha Wildner             AcpiOsPrintf ("Method execution terminated\n");
13650d02842fSSascha Wildner             return (AE_CTRL_TERMINATE);
13660d02842fSSascha Wildner         }
13670d02842fSSascha Wildner 
13680d02842fSSascha Wildner         if (!AcpiGbl_DbOutputToFile)
13690d02842fSSascha Wildner         {
13700d02842fSSascha Wildner             AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
13710d02842fSSascha Wildner         }
13720d02842fSSascha Wildner 
13733cc0afc6SSascha Wildner #ifdef ACPI_APPLICATION
13740d02842fSSascha Wildner         AcpiDbCloseDebugFile ();
13753cc0afc6SSascha Wildner #endif
1376820c5b08SSascha Wildner         AcpiGbl_DbTerminateLoop = TRUE;
13770d02842fSSascha Wildner         return (AE_CTRL_TERMINATE);
13780d02842fSSascha Wildner 
13790d02842fSSascha Wildner     case CMD_NOT_FOUND:
13800d02842fSSascha Wildner     default:
13810d02842fSSascha Wildner 
13820d02842fSSascha Wildner         AcpiOsPrintf ("%s: unknown command\n", AcpiGbl_DbArgs[0]);
13830d02842fSSascha Wildner         return (AE_CTRL_TRUE);
13840d02842fSSascha Wildner     }
13850d02842fSSascha Wildner 
13860d02842fSSascha Wildner     if (ACPI_SUCCESS (Status))
13870d02842fSSascha Wildner     {
13880d02842fSSascha Wildner         Status = AE_CTRL_TRUE;
13890d02842fSSascha Wildner     }
13900d02842fSSascha Wildner 
13910d02842fSSascha Wildner     return (Status);
13920d02842fSSascha Wildner }
13930d02842fSSascha Wildner 
13940d02842fSSascha Wildner 
13950d02842fSSascha Wildner /*******************************************************************************
13960d02842fSSascha Wildner  *
13970d02842fSSascha Wildner  * FUNCTION:    AcpiDbExecuteThread
13980d02842fSSascha Wildner  *
13990d02842fSSascha Wildner  * PARAMETERS:  Context         - Not used
14000d02842fSSascha Wildner  *
14010d02842fSSascha Wildner  * RETURN:      None
14020d02842fSSascha Wildner  *
14030d02842fSSascha Wildner  * DESCRIPTION: Debugger execute thread. Waits for a command line, then
14040d02842fSSascha Wildner  *              simply dispatches it.
14050d02842fSSascha Wildner  *
14060d02842fSSascha Wildner  ******************************************************************************/
14070d02842fSSascha Wildner 
14080d02842fSSascha Wildner void ACPI_SYSTEM_XFACE
AcpiDbExecuteThread(void * Context)14090d02842fSSascha Wildner AcpiDbExecuteThread (
14100d02842fSSascha Wildner     void                    *Context)
14110d02842fSSascha Wildner {
14120d02842fSSascha Wildner 
141338b5d46cSSascha Wildner     (void) AcpiDbUserCommands ();
1414820c5b08SSascha Wildner     AcpiGbl_DbThreadsTerminated = TRUE;
14150d02842fSSascha Wildner }
14160d02842fSSascha Wildner 
14170d02842fSSascha Wildner 
14180d02842fSSascha Wildner /*******************************************************************************
14190d02842fSSascha Wildner  *
14200d02842fSSascha Wildner  * FUNCTION:    AcpiDbUserCommands
14210d02842fSSascha Wildner  *
142238b5d46cSSascha Wildner  * PARAMETERS:  None
14230d02842fSSascha Wildner  *
14240d02842fSSascha Wildner  * RETURN:      None
14250d02842fSSascha Wildner  *
14260d02842fSSascha Wildner  * DESCRIPTION: Command line execution for the AML debugger. Commands are
14270d02842fSSascha Wildner  *              matched and dispatched here.
14280d02842fSSascha Wildner  *
14290d02842fSSascha Wildner  ******************************************************************************/
14300d02842fSSascha Wildner 
14310d02842fSSascha Wildner ACPI_STATUS
AcpiDbUserCommands(void)14320d02842fSSascha Wildner AcpiDbUserCommands (
143338b5d46cSSascha Wildner     void)
14340d02842fSSascha Wildner {
14350d02842fSSascha Wildner     ACPI_STATUS             Status = AE_OK;
14360d02842fSSascha Wildner 
14370d02842fSSascha Wildner 
14380d02842fSSascha Wildner     AcpiOsPrintf ("\n");
14390d02842fSSascha Wildner 
14400d02842fSSascha Wildner     /* TBD: [Restructure] Need a separate command line buffer for step mode */
14410d02842fSSascha Wildner 
1442820c5b08SSascha Wildner     while (!AcpiGbl_DbTerminateLoop)
14430d02842fSSascha Wildner     {
144438b5d46cSSascha Wildner         /* Wait the readiness of the command */
14450d02842fSSascha Wildner 
144638b5d46cSSascha Wildner         Status = AcpiOsWaitCommandReady ();
14470d02842fSSascha Wildner         if (ACPI_FAILURE (Status))
14480d02842fSSascha Wildner         {
144938b5d46cSSascha Wildner             break;
14500d02842fSSascha Wildner         }
14510d02842fSSascha Wildner 
14520d02842fSSascha Wildner         /* Just call to the command line interpreter */
14530d02842fSSascha Wildner 
145438b5d46cSSascha Wildner         AcpiGbl_MethodExecuting = FALSE;
145538b5d46cSSascha Wildner         AcpiGbl_StepToNextCall = FALSE;
145638b5d46cSSascha Wildner 
145738b5d46cSSascha Wildner         (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
145838b5d46cSSascha Wildner 
145938b5d46cSSascha Wildner         /* Notify the completion of the command */
146038b5d46cSSascha Wildner 
146138b5d46cSSascha Wildner         Status = AcpiOsNotifyCommandComplete ();
146238b5d46cSSascha Wildner         if (ACPI_FAILURE (Status))
146338b5d46cSSascha Wildner         {
146438b5d46cSSascha Wildner             break;
14650d02842fSSascha Wildner         }
14660d02842fSSascha Wildner     }
14670d02842fSSascha Wildner 
146838b5d46cSSascha Wildner     if (ACPI_FAILURE (Status) && Status != AE_CTRL_TERMINATE)
146938b5d46cSSascha Wildner     {
147038b5d46cSSascha Wildner         ACPI_EXCEPTION ((AE_INFO, Status, "While parsing command line"));
147138b5d46cSSascha Wildner     }
14720d02842fSSascha Wildner     return (Status);
14730d02842fSSascha Wildner }
14740d02842fSSascha Wildner 
14750d02842fSSascha Wildner #endif  /* ACPI_DEBUGGER */
1476