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