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