162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: dbinput - user front-end to the AML debugger
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci ******************************************************************************/
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <acpi/acpi.h>
962306a36Sopenharmony_ci#include "accommon.h"
1062306a36Sopenharmony_ci#include "acdebug.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
1362306a36Sopenharmony_ci#include "acapps.h"
1462306a36Sopenharmony_ci#endif
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define _COMPONENT          ACPI_CA_DEBUGGER
1762306a36Sopenharmony_ciACPI_MODULE_NAME("dbinput")
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* Local prototypes */
2062306a36Sopenharmony_cistatic u32 acpi_db_get_line(char *input_buffer);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic u32 acpi_db_match_command(char *user_command);
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic void acpi_db_display_command_info(const char *command, u8 display_all);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic void acpi_db_display_help(char *command);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic u8
2962306a36Sopenharmony_ciacpi_db_match_command_help(const char *command,
3062306a36Sopenharmony_ci			   const struct acpi_db_command_help *help);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/*
3362306a36Sopenharmony_ci * Top-level debugger commands.
3462306a36Sopenharmony_ci *
3562306a36Sopenharmony_ci * This list of commands must match the string table below it
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_cienum acpi_ex_debugger_commands {
3862306a36Sopenharmony_ci	CMD_NOT_FOUND = 0,
3962306a36Sopenharmony_ci	CMD_NULL,
4062306a36Sopenharmony_ci	CMD_ALL,
4162306a36Sopenharmony_ci	CMD_ALLOCATIONS,
4262306a36Sopenharmony_ci	CMD_ARGS,
4362306a36Sopenharmony_ci	CMD_ARGUMENTS,
4462306a36Sopenharmony_ci	CMD_BREAKPOINT,
4562306a36Sopenharmony_ci	CMD_BUSINFO,
4662306a36Sopenharmony_ci	CMD_CALL,
4762306a36Sopenharmony_ci	CMD_DEBUG,
4862306a36Sopenharmony_ci	CMD_DISASSEMBLE,
4962306a36Sopenharmony_ci	CMD_DISASM,
5062306a36Sopenharmony_ci	CMD_DUMP,
5162306a36Sopenharmony_ci	CMD_EVALUATE,
5262306a36Sopenharmony_ci	CMD_EXECUTE,
5362306a36Sopenharmony_ci	CMD_EXIT,
5462306a36Sopenharmony_ci	CMD_FIELDS,
5562306a36Sopenharmony_ci	CMD_FIND,
5662306a36Sopenharmony_ci	CMD_GO,
5762306a36Sopenharmony_ci	CMD_HANDLERS,
5862306a36Sopenharmony_ci	CMD_HELP,
5962306a36Sopenharmony_ci	CMD_HELP2,
6062306a36Sopenharmony_ci	CMD_HISTORY,
6162306a36Sopenharmony_ci	CMD_HISTORY_EXE,
6262306a36Sopenharmony_ci	CMD_HISTORY_LAST,
6362306a36Sopenharmony_ci	CMD_INFORMATION,
6462306a36Sopenharmony_ci	CMD_INTEGRITY,
6562306a36Sopenharmony_ci	CMD_INTO,
6662306a36Sopenharmony_ci	CMD_LEVEL,
6762306a36Sopenharmony_ci	CMD_LIST,
6862306a36Sopenharmony_ci	CMD_LOCALS,
6962306a36Sopenharmony_ci	CMD_LOCKS,
7062306a36Sopenharmony_ci	CMD_METHODS,
7162306a36Sopenharmony_ci	CMD_NAMESPACE,
7262306a36Sopenharmony_ci	CMD_NOTIFY,
7362306a36Sopenharmony_ci	CMD_OBJECTS,
7462306a36Sopenharmony_ci	CMD_OSI,
7562306a36Sopenharmony_ci	CMD_OWNER,
7662306a36Sopenharmony_ci	CMD_PATHS,
7762306a36Sopenharmony_ci	CMD_PREDEFINED,
7862306a36Sopenharmony_ci	CMD_PREFIX,
7962306a36Sopenharmony_ci	CMD_QUIT,
8062306a36Sopenharmony_ci	CMD_REFERENCES,
8162306a36Sopenharmony_ci	CMD_RESOURCES,
8262306a36Sopenharmony_ci	CMD_RESULTS,
8362306a36Sopenharmony_ci	CMD_SET,
8462306a36Sopenharmony_ci	CMD_STATS,
8562306a36Sopenharmony_ci	CMD_STOP,
8662306a36Sopenharmony_ci	CMD_TABLES,
8762306a36Sopenharmony_ci	CMD_TEMPLATE,
8862306a36Sopenharmony_ci	CMD_TRACE,
8962306a36Sopenharmony_ci	CMD_TREE,
9062306a36Sopenharmony_ci	CMD_TYPE,
9162306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
9262306a36Sopenharmony_ci	CMD_ENABLEACPI,
9362306a36Sopenharmony_ci	CMD_EVENT,
9462306a36Sopenharmony_ci	CMD_GPE,
9562306a36Sopenharmony_ci	CMD_GPES,
9662306a36Sopenharmony_ci	CMD_SCI,
9762306a36Sopenharmony_ci	CMD_SLEEP,
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	CMD_CLOSE,
10062306a36Sopenharmony_ci	CMD_LOAD,
10162306a36Sopenharmony_ci	CMD_OPEN,
10262306a36Sopenharmony_ci	CMD_UNLOAD,
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	CMD_TERMINATE,
10562306a36Sopenharmony_ci	CMD_BACKGROUND,
10662306a36Sopenharmony_ci	CMD_THREADS,
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	CMD_TEST,
10962306a36Sopenharmony_ci	CMD_INTERRUPT,
11062306a36Sopenharmony_ci#endif
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#define CMD_FIRST_VALID     2
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* Second parameter is the required argument count */
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic const struct acpi_db_command_info acpi_gbl_db_commands[] = {
11862306a36Sopenharmony_ci	{"<NOT FOUND>", 0},
11962306a36Sopenharmony_ci	{"<NULL>", 0},
12062306a36Sopenharmony_ci	{"ALL", 1},
12162306a36Sopenharmony_ci	{"ALLOCATIONS", 0},
12262306a36Sopenharmony_ci	{"ARGS", 0},
12362306a36Sopenharmony_ci	{"ARGUMENTS", 0},
12462306a36Sopenharmony_ci	{"BREAKPOINT", 1},
12562306a36Sopenharmony_ci	{"BUSINFO", 0},
12662306a36Sopenharmony_ci	{"CALL", 0},
12762306a36Sopenharmony_ci	{"DEBUG", 1},
12862306a36Sopenharmony_ci	{"DISASSEMBLE", 1},
12962306a36Sopenharmony_ci	{"DISASM", 1},
13062306a36Sopenharmony_ci	{"DUMP", 1},
13162306a36Sopenharmony_ci	{"EVALUATE", 1},
13262306a36Sopenharmony_ci	{"EXECUTE", 1},
13362306a36Sopenharmony_ci	{"EXIT", 0},
13462306a36Sopenharmony_ci	{"FIELDS", 1},
13562306a36Sopenharmony_ci	{"FIND", 1},
13662306a36Sopenharmony_ci	{"GO", 0},
13762306a36Sopenharmony_ci	{"HANDLERS", 0},
13862306a36Sopenharmony_ci	{"HELP", 0},
13962306a36Sopenharmony_ci	{"?", 0},
14062306a36Sopenharmony_ci	{"HISTORY", 0},
14162306a36Sopenharmony_ci	{"!", 1},
14262306a36Sopenharmony_ci	{"!!", 0},
14362306a36Sopenharmony_ci	{"INFORMATION", 0},
14462306a36Sopenharmony_ci	{"INTEGRITY", 0},
14562306a36Sopenharmony_ci	{"INTO", 0},
14662306a36Sopenharmony_ci	{"LEVEL", 0},
14762306a36Sopenharmony_ci	{"LIST", 0},
14862306a36Sopenharmony_ci	{"LOCALS", 0},
14962306a36Sopenharmony_ci	{"LOCKS", 0},
15062306a36Sopenharmony_ci	{"METHODS", 0},
15162306a36Sopenharmony_ci	{"NAMESPACE", 0},
15262306a36Sopenharmony_ci	{"NOTIFY", 2},
15362306a36Sopenharmony_ci	{"OBJECTS", 0},
15462306a36Sopenharmony_ci	{"OSI", 0},
15562306a36Sopenharmony_ci	{"OWNER", 1},
15662306a36Sopenharmony_ci	{"PATHS", 0},
15762306a36Sopenharmony_ci	{"PREDEFINED", 0},
15862306a36Sopenharmony_ci	{"PREFIX", 0},
15962306a36Sopenharmony_ci	{"QUIT", 0},
16062306a36Sopenharmony_ci	{"REFERENCES", 1},
16162306a36Sopenharmony_ci	{"RESOURCES", 0},
16262306a36Sopenharmony_ci	{"RESULTS", 0},
16362306a36Sopenharmony_ci	{"SET", 3},
16462306a36Sopenharmony_ci	{"STATS", 1},
16562306a36Sopenharmony_ci	{"STOP", 0},
16662306a36Sopenharmony_ci	{"TABLES", 0},
16762306a36Sopenharmony_ci	{"TEMPLATE", 1},
16862306a36Sopenharmony_ci	{"TRACE", 1},
16962306a36Sopenharmony_ci	{"TREE", 0},
17062306a36Sopenharmony_ci	{"TYPE", 1},
17162306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
17262306a36Sopenharmony_ci	{"ENABLEACPI", 0},
17362306a36Sopenharmony_ci	{"EVENT", 1},
17462306a36Sopenharmony_ci	{"GPE", 1},
17562306a36Sopenharmony_ci	{"GPES", 0},
17662306a36Sopenharmony_ci	{"SCI", 0},
17762306a36Sopenharmony_ci	{"SLEEP", 0},
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	{"CLOSE", 0},
18062306a36Sopenharmony_ci	{"LOAD", 1},
18162306a36Sopenharmony_ci	{"OPEN", 1},
18262306a36Sopenharmony_ci	{"UNLOAD", 1},
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	{"TERMINATE", 0},
18562306a36Sopenharmony_ci	{"BACKGROUND", 1},
18662306a36Sopenharmony_ci	{"THREADS", 3},
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci	{"TEST", 1},
18962306a36Sopenharmony_ci	{"INTERRUPT", 1},
19062306a36Sopenharmony_ci#endif
19162306a36Sopenharmony_ci	{NULL, 0}
19262306a36Sopenharmony_ci};
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci/*
19562306a36Sopenharmony_ci * Help for all debugger commands. First argument is the number of lines
19662306a36Sopenharmony_ci * of help to output for the command.
19762306a36Sopenharmony_ci *
19862306a36Sopenharmony_ci * Note: Some commands are not supported by the kernel-level version of
19962306a36Sopenharmony_ci * the debugger.
20062306a36Sopenharmony_ci */
20162306a36Sopenharmony_cistatic const struct acpi_db_command_help acpi_gbl_db_command_help[] = {
20262306a36Sopenharmony_ci	{0, "\nNamespace Access:", "\n"},
20362306a36Sopenharmony_ci	{1, "  Businfo", "Display system bus info\n"},
20462306a36Sopenharmony_ci	{1, "  Disassemble <Method>", "Disassemble a control method\n"},
20562306a36Sopenharmony_ci	{1, "  Find <AcpiName> (? is wildcard)",
20662306a36Sopenharmony_ci	 "Find ACPI name(s) with wildcards\n"},
20762306a36Sopenharmony_ci	{1, "  Integrity", "Validate namespace integrity\n"},
20862306a36Sopenharmony_ci	{1, "  Methods", "Display list of loaded control methods\n"},
20962306a36Sopenharmony_ci	{1, "  Fields <AddressSpaceId>",
21062306a36Sopenharmony_ci	 "Display list of loaded field units by space ID\n"},
21162306a36Sopenharmony_ci	{1, "  Namespace [Object] [Depth]",
21262306a36Sopenharmony_ci	 "Display loaded namespace tree/subtree\n"},
21362306a36Sopenharmony_ci	{1, "  Notify <Object> <Value>", "Send a notification on Object\n"},
21462306a36Sopenharmony_ci	{1, "  Objects [ObjectType]",
21562306a36Sopenharmony_ci	 "Display summary of all objects or just given type\n"},
21662306a36Sopenharmony_ci	{1, "  Owner <OwnerId> [Depth]",
21762306a36Sopenharmony_ci	 "Display loaded namespace by object owner\n"},
21862306a36Sopenharmony_ci	{1, "  Paths", "Display full pathnames of namespace objects\n"},
21962306a36Sopenharmony_ci	{1, "  Predefined", "Check all predefined names\n"},
22062306a36Sopenharmony_ci	{1, "  Prefix [<Namepath>]", "Set or Get current execution prefix\n"},
22162306a36Sopenharmony_ci	{1, "  References <Addr>", "Find all references to object at addr\n"},
22262306a36Sopenharmony_ci	{1, "  Resources [DeviceName]",
22362306a36Sopenharmony_ci	 "Display Device resources (no arg = all devices)\n"},
22462306a36Sopenharmony_ci	{1, "  Set N <NamedObject> <Value>", "Set value for named integer\n"},
22562306a36Sopenharmony_ci	{1, "  Template <Object>", "Format/dump a Buffer/ResourceTemplate\n"},
22662306a36Sopenharmony_ci	{1, "  Type <Object>", "Display object type\n"},
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	{0, "\nControl Method Execution:", "\n"},
22962306a36Sopenharmony_ci	{1, "  All <NameSeg>", "Evaluate all objects named NameSeg\n"},
23062306a36Sopenharmony_ci	{1, "  Evaluate <Namepath> [Arguments]",
23162306a36Sopenharmony_ci	 "Evaluate object or control method\n"},
23262306a36Sopenharmony_ci	{1, "  Execute <Namepath> [Arguments]", "Synonym for Evaluate\n"},
23362306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
23462306a36Sopenharmony_ci	{1, "  Background <Namepath> [Arguments]",
23562306a36Sopenharmony_ci	 "Evaluate object/method in a separate thread\n"},
23662306a36Sopenharmony_ci	{1, "  Thread <Threads><Loops><NamePath>",
23762306a36Sopenharmony_ci	 "Spawn threads to execute method(s)\n"},
23862306a36Sopenharmony_ci#endif
23962306a36Sopenharmony_ci	{1, "  Debug <Namepath> [Arguments]", "Single-Step a control method\n"},
24062306a36Sopenharmony_ci	{7, "  [Arguments] formats:", "Control method argument formats\n"},
24162306a36Sopenharmony_ci	{1, "     Hex Integer", "Integer\n"},
24262306a36Sopenharmony_ci	{1, "     \"Ascii String\"", "String\n"},
24362306a36Sopenharmony_ci	{1, "     (Hex Byte List)", "Buffer\n"},
24462306a36Sopenharmony_ci	{1, "         (01 42 7A BF)", "Buffer example (4 bytes)\n"},
24562306a36Sopenharmony_ci	{1, "     [Package Element List]", "Package\n"},
24662306a36Sopenharmony_ci	{1, "         [0x01 0x1234 \"string\"]",
24762306a36Sopenharmony_ci	 "Package example (3 elements)\n"},
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci	{0, "\nMiscellaneous:", "\n"},
25062306a36Sopenharmony_ci	{1, "  Allocations", "Display list of current memory allocations\n"},
25162306a36Sopenharmony_ci	{2, "  Dump <Address>|<Namepath>", "\n"},
25262306a36Sopenharmony_ci	{0, "       [Byte|Word|Dword|Qword]",
25362306a36Sopenharmony_ci	 "Display ACPI objects or memory\n"},
25462306a36Sopenharmony_ci	{1, "  Handlers", "Info about global handlers\n"},
25562306a36Sopenharmony_ci	{1, "  Help [Command]", "This help screen or individual command\n"},
25662306a36Sopenharmony_ci	{1, "  History", "Display command history buffer\n"},
25762306a36Sopenharmony_ci	{1, "  Level <DebugLevel>] [console]",
25862306a36Sopenharmony_ci	 "Get/Set debug level for file or console\n"},
25962306a36Sopenharmony_ci	{1, "  Locks", "Current status of internal mutexes\n"},
26062306a36Sopenharmony_ci	{1, "  Osi [Install|Remove <name>]",
26162306a36Sopenharmony_ci	 "Display or modify global _OSI list\n"},
26262306a36Sopenharmony_ci	{1, "  Quit or Exit", "Exit this command\n"},
26362306a36Sopenharmony_ci	{8, "  Stats <SubCommand>",
26462306a36Sopenharmony_ci	 "Display namespace and memory statistics\n"},
26562306a36Sopenharmony_ci	{1, "     Allocations", "Display list of current memory allocations\n"},
26662306a36Sopenharmony_ci	{1, "     Memory", "Dump internal memory lists\n"},
26762306a36Sopenharmony_ci	{1, "     Misc", "Namespace search and mutex stats\n"},
26862306a36Sopenharmony_ci	{1, "     Objects", "Summary of namespace objects\n"},
26962306a36Sopenharmony_ci	{1, "     Sizes", "Sizes for each of the internal objects\n"},
27062306a36Sopenharmony_ci	{1, "     Stack", "Display CPU stack usage\n"},
27162306a36Sopenharmony_ci	{1, "     Tables", "Info about current ACPI table(s)\n"},
27262306a36Sopenharmony_ci	{1, "  Tables", "Display info about loaded ACPI tables\n"},
27362306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
27462306a36Sopenharmony_ci	{1, "  Terminate", "Delete namespace and all internal objects\n"},
27562306a36Sopenharmony_ci#endif
27662306a36Sopenharmony_ci	{1, "  ! <CommandNumber>", "Execute command from history buffer\n"},
27762306a36Sopenharmony_ci	{1, "  !!", "Execute last command again\n"},
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	{0, "\nMethod and Namespace Debugging:", "\n"},
28062306a36Sopenharmony_ci	{5, "  Trace <State> [<Namepath>] [Once]",
28162306a36Sopenharmony_ci	 "Trace control method execution\n"},
28262306a36Sopenharmony_ci	{1, "     Enable", "Enable all messages\n"},
28362306a36Sopenharmony_ci	{1, "     Disable", "Disable tracing\n"},
28462306a36Sopenharmony_ci	{1, "     Method", "Enable method execution messages\n"},
28562306a36Sopenharmony_ci	{1, "     Opcode", "Enable opcode execution messages\n"},
28662306a36Sopenharmony_ci	{3, "  Test <TestName>", "Invoke a debug test\n"},
28762306a36Sopenharmony_ci	{1, "     Objects", "Read/write/compare all namespace data objects\n"},
28862306a36Sopenharmony_ci	{1, "     Predefined",
28962306a36Sopenharmony_ci	 "Validate all ACPI predefined names (_STA, etc.)\n"},
29062306a36Sopenharmony_ci	{1, "  Execute predefined",
29162306a36Sopenharmony_ci	 "Execute all predefined (public) methods\n"},
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci	{0, "\nControl Method Single-Step Execution:", "\n"},
29462306a36Sopenharmony_ci	{1, "  Arguments (or Args)", "Display method arguments\n"},
29562306a36Sopenharmony_ci	{1, "  Breakpoint <AmlOffset>", "Set an AML execution breakpoint\n"},
29662306a36Sopenharmony_ci	{1, "  Call", "Run to next control method invocation\n"},
29762306a36Sopenharmony_ci	{1, "  Go", "Allow method to run to completion\n"},
29862306a36Sopenharmony_ci	{1, "  Information", "Display info about the current method\n"},
29962306a36Sopenharmony_ci	{1, "  Into", "Step into (not over) a method call\n"},
30062306a36Sopenharmony_ci	{1, "  List [# of Aml Opcodes]", "Display method ASL statements\n"},
30162306a36Sopenharmony_ci	{1, "  Locals", "Display method local variables\n"},
30262306a36Sopenharmony_ci	{1, "  Results", "Display method result stack\n"},
30362306a36Sopenharmony_ci	{1, "  Set <A|L> <#> <Value>", "Set method data (Arguments/Locals)\n"},
30462306a36Sopenharmony_ci	{1, "  Stop", "Terminate control method\n"},
30562306a36Sopenharmony_ci	{1, "  Tree", "Display control method calling tree\n"},
30662306a36Sopenharmony_ci	{1, "  <Enter>", "Single step next AML opcode (over calls)\n"},
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
30962306a36Sopenharmony_ci	{0, "\nFile Operations:", "\n"},
31062306a36Sopenharmony_ci	{1, "  Close", "Close debug output file\n"},
31162306a36Sopenharmony_ci	{1, "  Load <Input Filename>", "Load ACPI table from a file\n"},
31262306a36Sopenharmony_ci	{1, "  Open <Output Filename>", "Open a file for debug output\n"},
31362306a36Sopenharmony_ci	{1, "  Unload <Namepath>",
31462306a36Sopenharmony_ci	 "Unload an ACPI table via namespace object\n"},
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci	{0, "\nHardware Simulation:", "\n"},
31762306a36Sopenharmony_ci	{1, "  EnableAcpi", "Enable ACPI (hardware) mode\n"},
31862306a36Sopenharmony_ci	{1, "  Event <F|G> <Value>", "Generate AcpiEvent (Fixed/GPE)\n"},
31962306a36Sopenharmony_ci	{1, "  Gpe <GpeNum> [GpeBlockDevice]", "Simulate a GPE\n"},
32062306a36Sopenharmony_ci	{1, "  Gpes", "Display info on all GPE devices\n"},
32162306a36Sopenharmony_ci	{1, "  Sci", "Generate an SCI\n"},
32262306a36Sopenharmony_ci	{1, "  Sleep [SleepState]", "Simulate sleep/wake sequence(s) (0-5)\n"},
32362306a36Sopenharmony_ci	{1, "  Interrupt <GSIV>", "Simulate an interrupt\n"},
32462306a36Sopenharmony_ci#endif
32562306a36Sopenharmony_ci	{0, NULL, NULL}
32662306a36Sopenharmony_ci};
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/*******************************************************************************
32962306a36Sopenharmony_ci *
33062306a36Sopenharmony_ci * FUNCTION:    acpi_db_match_command_help
33162306a36Sopenharmony_ci *
33262306a36Sopenharmony_ci * PARAMETERS:  command             - Command string to match
33362306a36Sopenharmony_ci *              help                - Help table entry to attempt match
33462306a36Sopenharmony_ci *
33562306a36Sopenharmony_ci * RETURN:      TRUE if command matched, FALSE otherwise
33662306a36Sopenharmony_ci *
33762306a36Sopenharmony_ci * DESCRIPTION: Attempt to match a command in the help table in order to
33862306a36Sopenharmony_ci *              print help information for a single command.
33962306a36Sopenharmony_ci *
34062306a36Sopenharmony_ci ******************************************************************************/
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_cistatic u8
34362306a36Sopenharmony_ciacpi_db_match_command_help(const char *command,
34462306a36Sopenharmony_ci			   const struct acpi_db_command_help *help)
34562306a36Sopenharmony_ci{
34662306a36Sopenharmony_ci	char *invocation = help->invocation;
34762306a36Sopenharmony_ci	u32 line_count;
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci	/* Valid commands in the help table begin with a couple of spaces */
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	if (*invocation != ' ') {
35262306a36Sopenharmony_ci		return (FALSE);
35362306a36Sopenharmony_ci	}
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci	while (*invocation == ' ') {
35662306a36Sopenharmony_ci		invocation++;
35762306a36Sopenharmony_ci	}
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	/* Match command name (full command or substring) */
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	while ((*command) && (*invocation) && (*invocation != ' ')) {
36262306a36Sopenharmony_ci		if (tolower((int)*command) != tolower((int)*invocation)) {
36362306a36Sopenharmony_ci			return (FALSE);
36462306a36Sopenharmony_ci		}
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci		invocation++;
36762306a36Sopenharmony_ci		command++;
36862306a36Sopenharmony_ci	}
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci	/* Print the appropriate number of help lines */
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci	line_count = help->line_count;
37362306a36Sopenharmony_ci	while (line_count) {
37462306a36Sopenharmony_ci		acpi_os_printf("%-38s : %s", help->invocation,
37562306a36Sopenharmony_ci			       help->description);
37662306a36Sopenharmony_ci		help++;
37762306a36Sopenharmony_ci		line_count--;
37862306a36Sopenharmony_ci	}
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	return (TRUE);
38162306a36Sopenharmony_ci}
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci/*******************************************************************************
38462306a36Sopenharmony_ci *
38562306a36Sopenharmony_ci * FUNCTION:    acpi_db_display_command_info
38662306a36Sopenharmony_ci *
38762306a36Sopenharmony_ci * PARAMETERS:  command             - Command string to match
38862306a36Sopenharmony_ci *              display_all         - Display all matching commands, or just
38962306a36Sopenharmony_ci *                                    the first one (substring match)
39062306a36Sopenharmony_ci *
39162306a36Sopenharmony_ci * RETURN:      None
39262306a36Sopenharmony_ci *
39362306a36Sopenharmony_ci * DESCRIPTION: Display help information for a Debugger command.
39462306a36Sopenharmony_ci *
39562306a36Sopenharmony_ci ******************************************************************************/
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_cistatic void acpi_db_display_command_info(const char *command, u8 display_all)
39862306a36Sopenharmony_ci{
39962306a36Sopenharmony_ci	const struct acpi_db_command_help *next;
40062306a36Sopenharmony_ci	u8 matched;
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci	next = acpi_gbl_db_command_help;
40362306a36Sopenharmony_ci	while (next->invocation) {
40462306a36Sopenharmony_ci		matched = acpi_db_match_command_help(command, next);
40562306a36Sopenharmony_ci		if (!display_all && matched) {
40662306a36Sopenharmony_ci			return;
40762306a36Sopenharmony_ci		}
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci		next++;
41062306a36Sopenharmony_ci	}
41162306a36Sopenharmony_ci}
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ci/*******************************************************************************
41462306a36Sopenharmony_ci *
41562306a36Sopenharmony_ci * FUNCTION:    acpi_db_display_help
41662306a36Sopenharmony_ci *
41762306a36Sopenharmony_ci * PARAMETERS:  command             - Optional command string to display help.
41862306a36Sopenharmony_ci *                                    if not specified, all debugger command
41962306a36Sopenharmony_ci *                                    help strings are displayed
42062306a36Sopenharmony_ci *
42162306a36Sopenharmony_ci * RETURN:      None
42262306a36Sopenharmony_ci *
42362306a36Sopenharmony_ci * DESCRIPTION: Display help for a single debugger command, or all of them.
42462306a36Sopenharmony_ci *
42562306a36Sopenharmony_ci ******************************************************************************/
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_cistatic void acpi_db_display_help(char *command)
42862306a36Sopenharmony_ci{
42962306a36Sopenharmony_ci	const struct acpi_db_command_help *next = acpi_gbl_db_command_help;
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci	if (!command) {
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ci		/* No argument to help, display help for all commands */
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci		acpi_os_printf("\nSummary of AML Debugger Commands\n\n");
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci		while (next->invocation) {
43862306a36Sopenharmony_ci			acpi_os_printf("%-38s%s", next->invocation,
43962306a36Sopenharmony_ci				       next->description);
44062306a36Sopenharmony_ci			next++;
44162306a36Sopenharmony_ci		}
44262306a36Sopenharmony_ci		acpi_os_printf("\n");
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci	} else {
44562306a36Sopenharmony_ci		/* Display help for all commands that match the substring */
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci		acpi_db_display_command_info(command, TRUE);
44862306a36Sopenharmony_ci	}
44962306a36Sopenharmony_ci}
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ci/*******************************************************************************
45262306a36Sopenharmony_ci *
45362306a36Sopenharmony_ci * FUNCTION:    acpi_db_get_next_token
45462306a36Sopenharmony_ci *
45562306a36Sopenharmony_ci * PARAMETERS:  string          - Command buffer
45662306a36Sopenharmony_ci *              next            - Return value, end of next token
45762306a36Sopenharmony_ci *
45862306a36Sopenharmony_ci * RETURN:      Pointer to the start of the next token.
45962306a36Sopenharmony_ci *
46062306a36Sopenharmony_ci * DESCRIPTION: Command line parsing. Get the next token on the command line
46162306a36Sopenharmony_ci *
46262306a36Sopenharmony_ci ******************************************************************************/
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_cichar *acpi_db_get_next_token(char *string,
46562306a36Sopenharmony_ci			     char **next, acpi_object_type *return_type)
46662306a36Sopenharmony_ci{
46762306a36Sopenharmony_ci	char *start;
46862306a36Sopenharmony_ci	u32 depth;
46962306a36Sopenharmony_ci	acpi_object_type type = ACPI_TYPE_INTEGER;
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	/* At end of buffer? */
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci	if (!string || !(*string)) {
47462306a36Sopenharmony_ci		return (NULL);
47562306a36Sopenharmony_ci	}
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci	/* Remove any spaces at the beginning, ignore blank lines */
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci	while (*string && isspace((int)*string)) {
48062306a36Sopenharmony_ci		string++;
48162306a36Sopenharmony_ci	}
48262306a36Sopenharmony_ci
48362306a36Sopenharmony_ci	if (!(*string)) {
48462306a36Sopenharmony_ci		return (NULL);
48562306a36Sopenharmony_ci	}
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci	switch (*string) {
48862306a36Sopenharmony_ci	case '"':
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_ci		/* This is a quoted string, scan until closing quote */
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci		string++;
49362306a36Sopenharmony_ci		start = string;
49462306a36Sopenharmony_ci		type = ACPI_TYPE_STRING;
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci		/* Find end of string */
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci		while (*string && (*string != '"')) {
49962306a36Sopenharmony_ci			string++;
50062306a36Sopenharmony_ci		}
50162306a36Sopenharmony_ci		break;
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_ci	case '(':
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci		/* This is the start of a buffer, scan until closing paren */
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci		string++;
50862306a36Sopenharmony_ci		start = string;
50962306a36Sopenharmony_ci		type = ACPI_TYPE_BUFFER;
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci		/* Find end of buffer */
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci		while (*string && (*string != ')')) {
51462306a36Sopenharmony_ci			string++;
51562306a36Sopenharmony_ci		}
51662306a36Sopenharmony_ci		break;
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci	case '{':
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci		/* This is the start of a field unit, scan until closing brace */
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci		string++;
52362306a36Sopenharmony_ci		start = string;
52462306a36Sopenharmony_ci		type = ACPI_TYPE_FIELD_UNIT;
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci		/* Find end of buffer */
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci		while (*string && (*string != '}')) {
52962306a36Sopenharmony_ci			string++;
53062306a36Sopenharmony_ci		}
53162306a36Sopenharmony_ci		break;
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci	case '[':
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_ci		/* This is the start of a package, scan until closing bracket */
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_ci		string++;
53862306a36Sopenharmony_ci		depth = 1;
53962306a36Sopenharmony_ci		start = string;
54062306a36Sopenharmony_ci		type = ACPI_TYPE_PACKAGE;
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_ci		/* Find end of package (closing bracket) */
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_ci		while (*string) {
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci			/* Handle String package elements */
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci			if (*string == '"') {
54962306a36Sopenharmony_ci				/* Find end of string */
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci				string++;
55262306a36Sopenharmony_ci				while (*string && (*string != '"')) {
55362306a36Sopenharmony_ci					string++;
55462306a36Sopenharmony_ci				}
55562306a36Sopenharmony_ci				if (!(*string)) {
55662306a36Sopenharmony_ci					break;
55762306a36Sopenharmony_ci				}
55862306a36Sopenharmony_ci			} else if (*string == '[') {
55962306a36Sopenharmony_ci				depth++;	/* A nested package declaration */
56062306a36Sopenharmony_ci			} else if (*string == ']') {
56162306a36Sopenharmony_ci				depth--;
56262306a36Sopenharmony_ci				if (depth == 0) {	/* Found final package closing bracket */
56362306a36Sopenharmony_ci					break;
56462306a36Sopenharmony_ci				}
56562306a36Sopenharmony_ci			}
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci			string++;
56862306a36Sopenharmony_ci		}
56962306a36Sopenharmony_ci		break;
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci	default:
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci		start = string;
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci		/* Find end of token */
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci		while (*string && !isspace((int)*string)) {
57862306a36Sopenharmony_ci			string++;
57962306a36Sopenharmony_ci		}
58062306a36Sopenharmony_ci		break;
58162306a36Sopenharmony_ci	}
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci	if (!(*string)) {
58462306a36Sopenharmony_ci		*next = NULL;
58562306a36Sopenharmony_ci	} else {
58662306a36Sopenharmony_ci		*string = 0;
58762306a36Sopenharmony_ci		*next = string + 1;
58862306a36Sopenharmony_ci	}
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci	*return_type = type;
59162306a36Sopenharmony_ci	return (start);
59262306a36Sopenharmony_ci}
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci/*******************************************************************************
59562306a36Sopenharmony_ci *
59662306a36Sopenharmony_ci * FUNCTION:    acpi_db_get_line
59762306a36Sopenharmony_ci *
59862306a36Sopenharmony_ci * PARAMETERS:  input_buffer        - Command line buffer
59962306a36Sopenharmony_ci *
60062306a36Sopenharmony_ci * RETURN:      Count of arguments to the command
60162306a36Sopenharmony_ci *
60262306a36Sopenharmony_ci * DESCRIPTION: Get the next command line from the user. Gets entire line
60362306a36Sopenharmony_ci *              up to the next newline
60462306a36Sopenharmony_ci *
60562306a36Sopenharmony_ci ******************************************************************************/
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_cistatic u32 acpi_db_get_line(char *input_buffer)
60862306a36Sopenharmony_ci{
60962306a36Sopenharmony_ci	u32 i;
61062306a36Sopenharmony_ci	u32 count;
61162306a36Sopenharmony_ci	char *next;
61262306a36Sopenharmony_ci	char *this;
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci	if (acpi_ut_safe_strcpy
61562306a36Sopenharmony_ci	    (acpi_gbl_db_parsed_buf, sizeof(acpi_gbl_db_parsed_buf),
61662306a36Sopenharmony_ci	     input_buffer)) {
61762306a36Sopenharmony_ci		acpi_os_printf
61862306a36Sopenharmony_ci		    ("Buffer overflow while parsing input line (max %u characters)\n",
61962306a36Sopenharmony_ci		     (u32)sizeof(acpi_gbl_db_parsed_buf));
62062306a36Sopenharmony_ci		return (0);
62162306a36Sopenharmony_ci	}
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ci	this = acpi_gbl_db_parsed_buf;
62462306a36Sopenharmony_ci	for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++) {
62562306a36Sopenharmony_ci		acpi_gbl_db_args[i] = acpi_db_get_next_token(this, &next,
62662306a36Sopenharmony_ci							     &acpi_gbl_db_arg_types
62762306a36Sopenharmony_ci							     [i]);
62862306a36Sopenharmony_ci		if (!acpi_gbl_db_args[i]) {
62962306a36Sopenharmony_ci			break;
63062306a36Sopenharmony_ci		}
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci		this = next;
63362306a36Sopenharmony_ci	}
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci	/* Uppercase the actual command */
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_ci	acpi_ut_strupr(acpi_gbl_db_args[0]);
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_ci	count = i;
64062306a36Sopenharmony_ci	if (count) {
64162306a36Sopenharmony_ci		count--;	/* Number of args only */
64262306a36Sopenharmony_ci	}
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci	return (count);
64562306a36Sopenharmony_ci}
64662306a36Sopenharmony_ci
64762306a36Sopenharmony_ci/*******************************************************************************
64862306a36Sopenharmony_ci *
64962306a36Sopenharmony_ci * FUNCTION:    acpi_db_match_command
65062306a36Sopenharmony_ci *
65162306a36Sopenharmony_ci * PARAMETERS:  user_command            - User command line
65262306a36Sopenharmony_ci *
65362306a36Sopenharmony_ci * RETURN:      Index into command array, -1 if not found
65462306a36Sopenharmony_ci *
65562306a36Sopenharmony_ci * DESCRIPTION: Search command array for a command match
65662306a36Sopenharmony_ci *
65762306a36Sopenharmony_ci ******************************************************************************/
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_cistatic u32 acpi_db_match_command(char *user_command)
66062306a36Sopenharmony_ci{
66162306a36Sopenharmony_ci	u32 i;
66262306a36Sopenharmony_ci
66362306a36Sopenharmony_ci	if (!user_command || user_command[0] == 0) {
66462306a36Sopenharmony_ci		return (CMD_NULL);
66562306a36Sopenharmony_ci	}
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci	for (i = CMD_FIRST_VALID; acpi_gbl_db_commands[i].name; i++) {
66862306a36Sopenharmony_ci		if (strstr
66962306a36Sopenharmony_ci		    (ACPI_CAST_PTR(char, acpi_gbl_db_commands[i].name),
67062306a36Sopenharmony_ci		     user_command) == acpi_gbl_db_commands[i].name) {
67162306a36Sopenharmony_ci			return (i);
67262306a36Sopenharmony_ci		}
67362306a36Sopenharmony_ci	}
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	/* Command not recognized */
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci	return (CMD_NOT_FOUND);
67862306a36Sopenharmony_ci}
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_ci/*******************************************************************************
68162306a36Sopenharmony_ci *
68262306a36Sopenharmony_ci * FUNCTION:    acpi_db_command_dispatch
68362306a36Sopenharmony_ci *
68462306a36Sopenharmony_ci * PARAMETERS:  input_buffer        - Command line buffer
68562306a36Sopenharmony_ci *              walk_state          - Current walk
68662306a36Sopenharmony_ci *              op                  - Current (executing) parse op
68762306a36Sopenharmony_ci *
68862306a36Sopenharmony_ci * RETURN:      Status
68962306a36Sopenharmony_ci *
69062306a36Sopenharmony_ci * DESCRIPTION: Command dispatcher.
69162306a36Sopenharmony_ci *
69262306a36Sopenharmony_ci ******************************************************************************/
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ciacpi_status
69562306a36Sopenharmony_ciacpi_db_command_dispatch(char *input_buffer,
69662306a36Sopenharmony_ci			 struct acpi_walk_state *walk_state,
69762306a36Sopenharmony_ci			 union acpi_parse_object *op)
69862306a36Sopenharmony_ci{
69962306a36Sopenharmony_ci	u32 temp;
70062306a36Sopenharmony_ci	u64 temp64;
70162306a36Sopenharmony_ci	u32 command_index;
70262306a36Sopenharmony_ci	u32 param_count;
70362306a36Sopenharmony_ci	char *command_line;
70462306a36Sopenharmony_ci	acpi_status status = AE_CTRL_TRUE;
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	/* If acpi_terminate has been called, terminate this thread */
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	if (acpi_gbl_db_terminate_loop) {
70962306a36Sopenharmony_ci		return (AE_CTRL_TERMINATE);
71062306a36Sopenharmony_ci	}
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci	/* Find command and add to the history buffer */
71362306a36Sopenharmony_ci
71462306a36Sopenharmony_ci	param_count = acpi_db_get_line(input_buffer);
71562306a36Sopenharmony_ci	command_index = acpi_db_match_command(acpi_gbl_db_args[0]);
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_ci	/*
71862306a36Sopenharmony_ci	 * We don't want to add the !! command to the history buffer. It
71962306a36Sopenharmony_ci	 * would cause an infinite loop because it would always be the
72062306a36Sopenharmony_ci	 * previous command.
72162306a36Sopenharmony_ci	 */
72262306a36Sopenharmony_ci	if (command_index != CMD_HISTORY_LAST) {
72362306a36Sopenharmony_ci		acpi_db_add_to_history(input_buffer);
72462306a36Sopenharmony_ci	}
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ci	/* Verify that we have the minimum number of params */
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci	if (param_count < acpi_gbl_db_commands[command_index].min_args) {
72962306a36Sopenharmony_ci		acpi_os_printf
73062306a36Sopenharmony_ci		    ("%u parameters entered, [%s] requires %u parameters\n",
73162306a36Sopenharmony_ci		     param_count, acpi_gbl_db_commands[command_index].name,
73262306a36Sopenharmony_ci		     acpi_gbl_db_commands[command_index].min_args);
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_ci		acpi_db_display_command_info(acpi_gbl_db_commands
73562306a36Sopenharmony_ci					     [command_index].name, FALSE);
73662306a36Sopenharmony_ci		return (AE_CTRL_TRUE);
73762306a36Sopenharmony_ci	}
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci	/* Decode and dispatch the command */
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_ci	switch (command_index) {
74262306a36Sopenharmony_ci	case CMD_NULL:
74362306a36Sopenharmony_ci
74462306a36Sopenharmony_ci		if (op) {
74562306a36Sopenharmony_ci			return (AE_OK);
74662306a36Sopenharmony_ci		}
74762306a36Sopenharmony_ci		break;
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	case CMD_ALL:
75062306a36Sopenharmony_ci
75162306a36Sopenharmony_ci		acpi_os_printf("Executing all objects with NameSeg: %s\n",
75262306a36Sopenharmony_ci			       acpi_gbl_db_args[1]);
75362306a36Sopenharmony_ci		acpi_db_execute(acpi_gbl_db_args[1], &acpi_gbl_db_args[2],
75462306a36Sopenharmony_ci				&acpi_gbl_db_arg_types[2],
75562306a36Sopenharmony_ci				EX_NO_SINGLE_STEP | EX_ALL);
75662306a36Sopenharmony_ci		break;
75762306a36Sopenharmony_ci
75862306a36Sopenharmony_ci	case CMD_ALLOCATIONS:
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_ci#ifdef ACPI_DBG_TRACK_ALLOCATIONS
76162306a36Sopenharmony_ci		acpi_ut_dump_allocations((u32)-1, NULL);
76262306a36Sopenharmony_ci#endif
76362306a36Sopenharmony_ci		break;
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_ci	case CMD_ARGS:
76662306a36Sopenharmony_ci	case CMD_ARGUMENTS:
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci		acpi_db_display_arguments();
76962306a36Sopenharmony_ci		break;
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci	case CMD_BREAKPOINT:
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci		acpi_db_set_method_breakpoint(acpi_gbl_db_args[1], walk_state,
77462306a36Sopenharmony_ci					      op);
77562306a36Sopenharmony_ci		break;
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_ci	case CMD_BUSINFO:
77862306a36Sopenharmony_ci
77962306a36Sopenharmony_ci		acpi_db_get_bus_info();
78062306a36Sopenharmony_ci		break;
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_ci	case CMD_CALL:
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ci		acpi_db_set_method_call_breakpoint(op);
78562306a36Sopenharmony_ci		status = AE_OK;
78662306a36Sopenharmony_ci		break;
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci	case CMD_DEBUG:
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_ci		acpi_db_execute(acpi_gbl_db_args[1],
79162306a36Sopenharmony_ci				&acpi_gbl_db_args[2], &acpi_gbl_db_arg_types[2],
79262306a36Sopenharmony_ci				EX_SINGLE_STEP);
79362306a36Sopenharmony_ci		break;
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_ci	case CMD_DISASSEMBLE:
79662306a36Sopenharmony_ci	case CMD_DISASM:
79762306a36Sopenharmony_ci
79862306a36Sopenharmony_ci#ifdef ACPI_DISASSEMBLER
79962306a36Sopenharmony_ci		(void)acpi_db_disassemble_method(acpi_gbl_db_args[1]);
80062306a36Sopenharmony_ci#else
80162306a36Sopenharmony_ci		acpi_os_printf
80262306a36Sopenharmony_ci		    ("The AML Disassembler is not configured/present\n");
80362306a36Sopenharmony_ci#endif
80462306a36Sopenharmony_ci		break;
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci	case CMD_DUMP:
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci		acpi_db_decode_and_display_object(acpi_gbl_db_args[1],
80962306a36Sopenharmony_ci						  acpi_gbl_db_args[2]);
81062306a36Sopenharmony_ci		break;
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	case CMD_EVALUATE:
81362306a36Sopenharmony_ci	case CMD_EXECUTE:
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci		acpi_db_execute(acpi_gbl_db_args[1],
81662306a36Sopenharmony_ci				&acpi_gbl_db_args[2], &acpi_gbl_db_arg_types[2],
81762306a36Sopenharmony_ci				EX_NO_SINGLE_STEP);
81862306a36Sopenharmony_ci		break;
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_ci	case CMD_FIND:
82162306a36Sopenharmony_ci
82262306a36Sopenharmony_ci		status = acpi_db_find_name_in_namespace(acpi_gbl_db_args[1]);
82362306a36Sopenharmony_ci		break;
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_ci	case CMD_FIELDS:
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci		status = acpi_ut_strtoul64(acpi_gbl_db_args[1], &temp64);
82862306a36Sopenharmony_ci
82962306a36Sopenharmony_ci		if (ACPI_FAILURE(status)
83062306a36Sopenharmony_ci		    || temp64 >= ACPI_NUM_PREDEFINED_REGIONS) {
83162306a36Sopenharmony_ci			acpi_os_printf
83262306a36Sopenharmony_ci			    ("Invalid address space ID: must be between 0 and %u inclusive\n",
83362306a36Sopenharmony_ci			     ACPI_NUM_PREDEFINED_REGIONS - 1);
83462306a36Sopenharmony_ci			return (AE_OK);
83562306a36Sopenharmony_ci		}
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_ci		status = acpi_db_display_fields((u32)temp64);
83862306a36Sopenharmony_ci		break;
83962306a36Sopenharmony_ci
84062306a36Sopenharmony_ci	case CMD_GO:
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_ci		acpi_gbl_cm_single_step = FALSE;
84362306a36Sopenharmony_ci		return (AE_OK);
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci	case CMD_HANDLERS:
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_ci		acpi_db_display_handlers();
84862306a36Sopenharmony_ci		break;
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_ci	case CMD_HELP:
85162306a36Sopenharmony_ci	case CMD_HELP2:
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci		acpi_db_display_help(acpi_gbl_db_args[1]);
85462306a36Sopenharmony_ci		break;
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ci	case CMD_HISTORY:
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci		acpi_db_display_history();
85962306a36Sopenharmony_ci		break;
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_ci	case CMD_HISTORY_EXE:	/* ! command */
86262306a36Sopenharmony_ci
86362306a36Sopenharmony_ci		command_line = acpi_db_get_from_history(acpi_gbl_db_args[1]);
86462306a36Sopenharmony_ci		if (!command_line) {
86562306a36Sopenharmony_ci			return (AE_CTRL_TRUE);
86662306a36Sopenharmony_ci		}
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_ci		status = acpi_db_command_dispatch(command_line, walk_state, op);
86962306a36Sopenharmony_ci		return (status);
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_ci	case CMD_HISTORY_LAST:	/* !! command */
87262306a36Sopenharmony_ci
87362306a36Sopenharmony_ci		command_line = acpi_db_get_from_history(NULL);
87462306a36Sopenharmony_ci		if (!command_line) {
87562306a36Sopenharmony_ci			return (AE_CTRL_TRUE);
87662306a36Sopenharmony_ci		}
87762306a36Sopenharmony_ci
87862306a36Sopenharmony_ci		status = acpi_db_command_dispatch(command_line, walk_state, op);
87962306a36Sopenharmony_ci		return (status);
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_ci	case CMD_INFORMATION:
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci		acpi_db_display_method_info(op);
88462306a36Sopenharmony_ci		break;
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_ci	case CMD_INTEGRITY:
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci		acpi_db_check_integrity();
88962306a36Sopenharmony_ci		break;
89062306a36Sopenharmony_ci
89162306a36Sopenharmony_ci	case CMD_INTO:
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci		if (op) {
89462306a36Sopenharmony_ci			acpi_gbl_cm_single_step = TRUE;
89562306a36Sopenharmony_ci			return (AE_OK);
89662306a36Sopenharmony_ci		}
89762306a36Sopenharmony_ci		break;
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_ci	case CMD_LEVEL:
90062306a36Sopenharmony_ci
90162306a36Sopenharmony_ci		if (param_count == 0) {
90262306a36Sopenharmony_ci			acpi_os_printf
90362306a36Sopenharmony_ci			    ("Current debug level for file output is:    %8.8X\n",
90462306a36Sopenharmony_ci			     acpi_gbl_db_debug_level);
90562306a36Sopenharmony_ci			acpi_os_printf
90662306a36Sopenharmony_ci			    ("Current debug level for console output is: %8.8X\n",
90762306a36Sopenharmony_ci			     acpi_gbl_db_console_debug_level);
90862306a36Sopenharmony_ci		} else if (param_count == 2) {
90962306a36Sopenharmony_ci			temp = acpi_gbl_db_console_debug_level;
91062306a36Sopenharmony_ci			acpi_gbl_db_console_debug_level =
91162306a36Sopenharmony_ci			    strtoul(acpi_gbl_db_args[1], NULL, 16);
91262306a36Sopenharmony_ci			acpi_os_printf
91362306a36Sopenharmony_ci			    ("Debug Level for console output was %8.8X, now %8.8X\n",
91462306a36Sopenharmony_ci			     temp, acpi_gbl_db_console_debug_level);
91562306a36Sopenharmony_ci		} else {
91662306a36Sopenharmony_ci			temp = acpi_gbl_db_debug_level;
91762306a36Sopenharmony_ci			acpi_gbl_db_debug_level =
91862306a36Sopenharmony_ci			    strtoul(acpi_gbl_db_args[1], NULL, 16);
91962306a36Sopenharmony_ci			acpi_os_printf
92062306a36Sopenharmony_ci			    ("Debug Level for file output was %8.8X, now %8.8X\n",
92162306a36Sopenharmony_ci			     temp, acpi_gbl_db_debug_level);
92262306a36Sopenharmony_ci		}
92362306a36Sopenharmony_ci		break;
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_ci	case CMD_LIST:
92662306a36Sopenharmony_ci
92762306a36Sopenharmony_ci#ifdef ACPI_DISASSEMBLER
92862306a36Sopenharmony_ci		acpi_db_disassemble_aml(acpi_gbl_db_args[1], op);
92962306a36Sopenharmony_ci#else
93062306a36Sopenharmony_ci		acpi_os_printf
93162306a36Sopenharmony_ci		    ("The AML Disassembler is not configured/present\n");
93262306a36Sopenharmony_ci#endif
93362306a36Sopenharmony_ci		break;
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci	case CMD_LOCKS:
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_ci		acpi_db_display_locks();
93862306a36Sopenharmony_ci		break;
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_ci	case CMD_LOCALS:
94162306a36Sopenharmony_ci
94262306a36Sopenharmony_ci		acpi_db_display_locals();
94362306a36Sopenharmony_ci		break;
94462306a36Sopenharmony_ci
94562306a36Sopenharmony_ci	case CMD_METHODS:
94662306a36Sopenharmony_ci
94762306a36Sopenharmony_ci		status = acpi_db_display_objects("METHOD", acpi_gbl_db_args[1]);
94862306a36Sopenharmony_ci		break;
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_ci	case CMD_NAMESPACE:
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_ci		acpi_db_dump_namespace(acpi_gbl_db_args[1],
95362306a36Sopenharmony_ci				       acpi_gbl_db_args[2]);
95462306a36Sopenharmony_ci		break;
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci	case CMD_NOTIFY:
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_ci		temp = strtoul(acpi_gbl_db_args[2], NULL, 0);
95962306a36Sopenharmony_ci		acpi_db_send_notify(acpi_gbl_db_args[1], temp);
96062306a36Sopenharmony_ci		break;
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_ci	case CMD_OBJECTS:
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_ci		acpi_ut_strupr(acpi_gbl_db_args[1]);
96562306a36Sopenharmony_ci		status =
96662306a36Sopenharmony_ci		    acpi_db_display_objects(acpi_gbl_db_args[1],
96762306a36Sopenharmony_ci					    acpi_gbl_db_args[2]);
96862306a36Sopenharmony_ci		break;
96962306a36Sopenharmony_ci
97062306a36Sopenharmony_ci	case CMD_OSI:
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci		acpi_db_display_interfaces(acpi_gbl_db_args[1],
97362306a36Sopenharmony_ci					   acpi_gbl_db_args[2]);
97462306a36Sopenharmony_ci		break;
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci	case CMD_OWNER:
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_ci		acpi_db_dump_namespace_by_owner(acpi_gbl_db_args[1],
97962306a36Sopenharmony_ci						acpi_gbl_db_args[2]);
98062306a36Sopenharmony_ci		break;
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_ci	case CMD_PATHS:
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_ci		acpi_db_dump_namespace_paths();
98562306a36Sopenharmony_ci		break;
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_ci	case CMD_PREFIX:
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_ci		acpi_db_set_scope(acpi_gbl_db_args[1]);
99062306a36Sopenharmony_ci		break;
99162306a36Sopenharmony_ci
99262306a36Sopenharmony_ci	case CMD_REFERENCES:
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci		acpi_db_find_references(acpi_gbl_db_args[1]);
99562306a36Sopenharmony_ci		break;
99662306a36Sopenharmony_ci
99762306a36Sopenharmony_ci	case CMD_RESOURCES:
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci		acpi_db_display_resources(acpi_gbl_db_args[1]);
100062306a36Sopenharmony_ci		break;
100162306a36Sopenharmony_ci
100262306a36Sopenharmony_ci	case CMD_RESULTS:
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_ci		acpi_db_display_results();
100562306a36Sopenharmony_ci		break;
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci	case CMD_SET:
100862306a36Sopenharmony_ci
100962306a36Sopenharmony_ci		acpi_db_set_method_data(acpi_gbl_db_args[1],
101062306a36Sopenharmony_ci					acpi_gbl_db_args[2],
101162306a36Sopenharmony_ci					acpi_gbl_db_args[3]);
101262306a36Sopenharmony_ci		break;
101362306a36Sopenharmony_ci
101462306a36Sopenharmony_ci	case CMD_STATS:
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_ci		status = acpi_db_display_statistics(acpi_gbl_db_args[1]);
101762306a36Sopenharmony_ci		break;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	case CMD_STOP:
102062306a36Sopenharmony_ci
102162306a36Sopenharmony_ci		return (AE_NOT_IMPLEMENTED);
102262306a36Sopenharmony_ci
102362306a36Sopenharmony_ci	case CMD_TABLES:
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_ci		acpi_db_display_table_info(acpi_gbl_db_args[1]);
102662306a36Sopenharmony_ci		break;
102762306a36Sopenharmony_ci
102862306a36Sopenharmony_ci	case CMD_TEMPLATE:
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci		acpi_db_display_template(acpi_gbl_db_args[1]);
103162306a36Sopenharmony_ci		break;
103262306a36Sopenharmony_ci
103362306a36Sopenharmony_ci	case CMD_TRACE:
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_ci		acpi_db_trace(acpi_gbl_db_args[1], acpi_gbl_db_args[2],
103662306a36Sopenharmony_ci			      acpi_gbl_db_args[3]);
103762306a36Sopenharmony_ci		break;
103862306a36Sopenharmony_ci
103962306a36Sopenharmony_ci	case CMD_TREE:
104062306a36Sopenharmony_ci
104162306a36Sopenharmony_ci		acpi_db_display_calling_tree();
104262306a36Sopenharmony_ci		break;
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_ci	case CMD_TYPE:
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_ci		acpi_db_display_object_type(acpi_gbl_db_args[1]);
104762306a36Sopenharmony_ci		break;
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
105062306a36Sopenharmony_ci
105162306a36Sopenharmony_ci		/* Hardware simulation commands. */
105262306a36Sopenharmony_ci
105362306a36Sopenharmony_ci	case CMD_ENABLEACPI:
105462306a36Sopenharmony_ci#if (!ACPI_REDUCED_HARDWARE)
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_ci		status = acpi_enable();
105762306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
105862306a36Sopenharmony_ci			acpi_os_printf("AcpiEnable failed (Status=%X)\n",
105962306a36Sopenharmony_ci				       status);
106062306a36Sopenharmony_ci			return (status);
106162306a36Sopenharmony_ci		}
106262306a36Sopenharmony_ci#endif				/* !ACPI_REDUCED_HARDWARE */
106362306a36Sopenharmony_ci		break;
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci	case CMD_EVENT:
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci		acpi_os_printf("Event command not implemented\n");
106862306a36Sopenharmony_ci		break;
106962306a36Sopenharmony_ci
107062306a36Sopenharmony_ci	case CMD_INTERRUPT:
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_ci		acpi_db_generate_interrupt(acpi_gbl_db_args[1]);
107362306a36Sopenharmony_ci		break;
107462306a36Sopenharmony_ci
107562306a36Sopenharmony_ci	case CMD_GPE:
107662306a36Sopenharmony_ci
107762306a36Sopenharmony_ci		acpi_db_generate_gpe(acpi_gbl_db_args[1], acpi_gbl_db_args[2]);
107862306a36Sopenharmony_ci		break;
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_ci	case CMD_GPES:
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci		acpi_db_display_gpes();
108362306a36Sopenharmony_ci		break;
108462306a36Sopenharmony_ci
108562306a36Sopenharmony_ci	case CMD_SCI:
108662306a36Sopenharmony_ci
108762306a36Sopenharmony_ci		acpi_db_generate_sci();
108862306a36Sopenharmony_ci		break;
108962306a36Sopenharmony_ci
109062306a36Sopenharmony_ci	case CMD_SLEEP:
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci		status = acpi_db_sleep(acpi_gbl_db_args[1]);
109362306a36Sopenharmony_ci		break;
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci		/* File I/O commands. */
109662306a36Sopenharmony_ci
109762306a36Sopenharmony_ci	case CMD_CLOSE:
109862306a36Sopenharmony_ci
109962306a36Sopenharmony_ci		acpi_db_close_debug_file();
110062306a36Sopenharmony_ci		break;
110162306a36Sopenharmony_ci
110262306a36Sopenharmony_ci	case CMD_LOAD:{
110362306a36Sopenharmony_ci			struct acpi_new_table_desc *list_head = NULL;
110462306a36Sopenharmony_ci
110562306a36Sopenharmony_ci			status =
110662306a36Sopenharmony_ci			    ac_get_all_tables_from_file(acpi_gbl_db_args[1],
110762306a36Sopenharmony_ci							ACPI_GET_ALL_TABLES,
110862306a36Sopenharmony_ci							&list_head);
110962306a36Sopenharmony_ci			if (ACPI_SUCCESS(status)) {
111062306a36Sopenharmony_ci				acpi_db_load_tables(list_head);
111162306a36Sopenharmony_ci			}
111262306a36Sopenharmony_ci		}
111362306a36Sopenharmony_ci		break;
111462306a36Sopenharmony_ci
111562306a36Sopenharmony_ci	case CMD_OPEN:
111662306a36Sopenharmony_ci
111762306a36Sopenharmony_ci		acpi_db_open_debug_file(acpi_gbl_db_args[1]);
111862306a36Sopenharmony_ci		break;
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ci		/* User space commands. */
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_ci	case CMD_TERMINATE:
112362306a36Sopenharmony_ci
112462306a36Sopenharmony_ci		acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
112562306a36Sopenharmony_ci		acpi_ut_subsystem_shutdown();
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci		/*
112862306a36Sopenharmony_ci		 * TBD: [Restructure] Need some way to re-initialize without
112962306a36Sopenharmony_ci		 * re-creating the semaphores!
113062306a36Sopenharmony_ci		 */
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci		acpi_gbl_db_terminate_loop = TRUE;
113362306a36Sopenharmony_ci		/*  acpi_initialize (NULL); */
113462306a36Sopenharmony_ci		break;
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_ci	case CMD_BACKGROUND:
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_ci		acpi_db_create_execution_thread(acpi_gbl_db_args[1],
113962306a36Sopenharmony_ci						&acpi_gbl_db_args[2],
114062306a36Sopenharmony_ci						&acpi_gbl_db_arg_types[2]);
114162306a36Sopenharmony_ci		break;
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_ci	case CMD_THREADS:
114462306a36Sopenharmony_ci
114562306a36Sopenharmony_ci		acpi_db_create_execution_threads(acpi_gbl_db_args[1],
114662306a36Sopenharmony_ci						 acpi_gbl_db_args[2],
114762306a36Sopenharmony_ci						 acpi_gbl_db_args[3]);
114862306a36Sopenharmony_ci		break;
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_ci		/* Debug test commands. */
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_ci	case CMD_PREDEFINED:
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_ci		acpi_db_check_predefined_names();
115562306a36Sopenharmony_ci		break;
115662306a36Sopenharmony_ci
115762306a36Sopenharmony_ci	case CMD_TEST:
115862306a36Sopenharmony_ci
115962306a36Sopenharmony_ci		acpi_db_execute_test(acpi_gbl_db_args[1]);
116062306a36Sopenharmony_ci		break;
116162306a36Sopenharmony_ci
116262306a36Sopenharmony_ci	case CMD_UNLOAD:
116362306a36Sopenharmony_ci
116462306a36Sopenharmony_ci		acpi_db_unload_acpi_table(acpi_gbl_db_args[1]);
116562306a36Sopenharmony_ci		break;
116662306a36Sopenharmony_ci#endif
116762306a36Sopenharmony_ci
116862306a36Sopenharmony_ci	case CMD_EXIT:
116962306a36Sopenharmony_ci	case CMD_QUIT:
117062306a36Sopenharmony_ci
117162306a36Sopenharmony_ci		if (op) {
117262306a36Sopenharmony_ci			acpi_os_printf("Method execution terminated\n");
117362306a36Sopenharmony_ci			return (AE_CTRL_TERMINATE);
117462306a36Sopenharmony_ci		}
117562306a36Sopenharmony_ci
117662306a36Sopenharmony_ci		if (!acpi_gbl_db_output_to_file) {
117762306a36Sopenharmony_ci			acpi_dbg_level = ACPI_DEBUG_DEFAULT;
117862306a36Sopenharmony_ci		}
117962306a36Sopenharmony_ci#ifdef ACPI_APPLICATION
118062306a36Sopenharmony_ci		acpi_db_close_debug_file();
118162306a36Sopenharmony_ci#endif
118262306a36Sopenharmony_ci		acpi_gbl_db_terminate_loop = TRUE;
118362306a36Sopenharmony_ci		return (AE_CTRL_TERMINATE);
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_ci	case CMD_NOT_FOUND:
118662306a36Sopenharmony_ci	default:
118762306a36Sopenharmony_ci
118862306a36Sopenharmony_ci		acpi_os_printf("%s: unknown command\n", acpi_gbl_db_args[0]);
118962306a36Sopenharmony_ci		return (AE_CTRL_TRUE);
119062306a36Sopenharmony_ci	}
119162306a36Sopenharmony_ci
119262306a36Sopenharmony_ci	if (ACPI_SUCCESS(status)) {
119362306a36Sopenharmony_ci		status = AE_CTRL_TRUE;
119462306a36Sopenharmony_ci	}
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci	return (status);
119762306a36Sopenharmony_ci}
119862306a36Sopenharmony_ci
119962306a36Sopenharmony_ci/*******************************************************************************
120062306a36Sopenharmony_ci *
120162306a36Sopenharmony_ci * FUNCTION:    acpi_db_execute_thread
120262306a36Sopenharmony_ci *
120362306a36Sopenharmony_ci * PARAMETERS:  context         - Not used
120462306a36Sopenharmony_ci *
120562306a36Sopenharmony_ci * RETURN:      None
120662306a36Sopenharmony_ci *
120762306a36Sopenharmony_ci * DESCRIPTION: Debugger execute thread. Waits for a command line, then
120862306a36Sopenharmony_ci *              simply dispatches it.
120962306a36Sopenharmony_ci *
121062306a36Sopenharmony_ci ******************************************************************************/
121162306a36Sopenharmony_ci
121262306a36Sopenharmony_civoid ACPI_SYSTEM_XFACE acpi_db_execute_thread(void *context)
121362306a36Sopenharmony_ci{
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci	(void)acpi_db_user_commands();
121662306a36Sopenharmony_ci	acpi_gbl_db_threads_terminated = TRUE;
121762306a36Sopenharmony_ci}
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_ci/*******************************************************************************
122062306a36Sopenharmony_ci *
122162306a36Sopenharmony_ci * FUNCTION:    acpi_db_user_commands
122262306a36Sopenharmony_ci *
122362306a36Sopenharmony_ci * PARAMETERS:  None
122462306a36Sopenharmony_ci *
122562306a36Sopenharmony_ci * RETURN:      None
122662306a36Sopenharmony_ci *
122762306a36Sopenharmony_ci * DESCRIPTION: Command line execution for the AML debugger. Commands are
122862306a36Sopenharmony_ci *              matched and dispatched here.
122962306a36Sopenharmony_ci *
123062306a36Sopenharmony_ci ******************************************************************************/
123162306a36Sopenharmony_ci
123262306a36Sopenharmony_ciacpi_status acpi_db_user_commands(void)
123362306a36Sopenharmony_ci{
123462306a36Sopenharmony_ci	acpi_status status = AE_OK;
123562306a36Sopenharmony_ci
123662306a36Sopenharmony_ci	acpi_os_printf("\n");
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_ci	/* TBD: [Restructure] Need a separate command line buffer for step mode */
123962306a36Sopenharmony_ci
124062306a36Sopenharmony_ci	while (!acpi_gbl_db_terminate_loop) {
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_ci		/* Wait the readiness of the command */
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_ci		status = acpi_os_wait_command_ready();
124562306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
124662306a36Sopenharmony_ci			break;
124762306a36Sopenharmony_ci		}
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci		/* Just call to the command line interpreter */
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci		acpi_gbl_method_executing = FALSE;
125262306a36Sopenharmony_ci		acpi_gbl_step_to_next_call = FALSE;
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_ci		(void)acpi_db_command_dispatch(acpi_gbl_db_line_buf, NULL,
125562306a36Sopenharmony_ci					       NULL);
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_ci		/* Notify the completion of the command */
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_ci		status = acpi_os_notify_command_complete();
126062306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
126162306a36Sopenharmony_ci			break;
126262306a36Sopenharmony_ci		}
126362306a36Sopenharmony_ci	}
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_ci	if (ACPI_FAILURE(status) && status != AE_CTRL_TERMINATE) {
126662306a36Sopenharmony_ci		ACPI_EXCEPTION((AE_INFO, status, "While parsing command line"));
126762306a36Sopenharmony_ci	}
126862306a36Sopenharmony_ci	return (status);
126962306a36Sopenharmony_ci}
1270