Home | History | Annotate | Line # | Download | only in debugger
dbinput.c revision 1.1.1.2
      1 /*******************************************************************************
      2  *
      3  * Module Name: dbinput - user front-end to the AML debugger
      4  *
      5  ******************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2011, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 
     45 #include "acpi.h"
     46 #include "accommon.h"
     47 #include "acdebug.h"
     48 
     49 
     50 #ifdef ACPI_DEBUGGER
     51 
     52 #define _COMPONENT          ACPI_CA_DEBUGGER
     53         ACPI_MODULE_NAME    ("dbinput")
     54 
     55 /* Local prototypes */
     56 
     57 static char *
     58 AcpiDbGetNextToken (
     59     char                    *String,
     60     char                    **Next);
     61 
     62 static UINT32
     63 AcpiDbGetLine (
     64     char                    *InputBuffer);
     65 
     66 static UINT32
     67 AcpiDbMatchCommand (
     68     char                    *UserCommand);
     69 
     70 static void
     71 AcpiDbSingleThread (
     72     void);
     73 
     74 static void
     75 AcpiDbDisplayHelp (
     76     void);
     77 
     78 
     79 /*
     80  * Top-level debugger commands.
     81  *
     82  * This list of commands must match the string table below it
     83  */
     84 enum AcpiExDebuggerCommands
     85 {
     86     CMD_NOT_FOUND = 0,
     87     CMD_NULL,
     88     CMD_ALLOCATIONS,
     89     CMD_ARGS,
     90     CMD_ARGUMENTS,
     91     CMD_BATCH,
     92     CMD_BREAKPOINT,
     93     CMD_BUSINFO,
     94     CMD_CALL,
     95     CMD_CLOSE,
     96     CMD_DEBUG,
     97     CMD_DISASSEMBLE,
     98     CMD_DUMP,
     99     CMD_ENABLEACPI,
    100     CMD_EVENT,
    101     CMD_EXECUTE,
    102     CMD_EXIT,
    103     CMD_FIND,
    104     CMD_GO,
    105     CMD_GPE,
    106     CMD_GPES,
    107     CMD_HANDLERS,
    108     CMD_HELP,
    109     CMD_HELP2,
    110     CMD_HISTORY,
    111     CMD_HISTORY_EXE,
    112     CMD_HISTORY_LAST,
    113     CMD_INFORMATION,
    114     CMD_INTEGRITY,
    115     CMD_INTO,
    116     CMD_LEVEL,
    117     CMD_LIST,
    118     CMD_LOAD,
    119     CMD_LOCALS,
    120     CMD_LOCKS,
    121     CMD_METHODS,
    122     CMD_NAMESPACE,
    123     CMD_NOTIFY,
    124     CMD_OBJECT,
    125     CMD_OPEN,
    126     CMD_OSI,
    127     CMD_OWNER,
    128     CMD_PREDEFINED,
    129     CMD_PREFIX,
    130     CMD_QUIT,
    131     CMD_REFERENCES,
    132     CMD_RESOURCES,
    133     CMD_RESULTS,
    134     CMD_SET,
    135     CMD_SLEEP,
    136     CMD_STATS,
    137     CMD_STOP,
    138     CMD_TABLES,
    139     CMD_TERMINATE,
    140     CMD_THREADS,
    141     CMD_TRACE,
    142     CMD_TREE,
    143     CMD_TYPE,
    144     CMD_UNLOAD
    145 };
    146 
    147 #define CMD_FIRST_VALID     2
    148 
    149 
    150 /* Second parameter is the required argument count */
    151 
    152 static const COMMAND_INFO       AcpiGbl_DbCommands[] =
    153 {
    154     {"<NOT FOUND>",  0},
    155     {"<NULL>",       0},
    156     {"ALLOCATIONS",  0},
    157     {"ARGS",         0},
    158     {"ARGUMENTS",    0},
    159     {"BATCH",        0},
    160     {"BREAKPOINT",   1},
    161     {"BUSINFO",      0},
    162     {"CALL",         0},
    163     {"CLOSE",        0},
    164     {"DEBUG",        1},
    165     {"DISASSEMBLE",  1},
    166     {"DUMP",         1},
    167     {"ENABLEACPI",   0},
    168     {"EVENT",        1},
    169     {"EXECUTE",      1},
    170     {"EXIT",         0},
    171     {"FIND",         1},
    172     {"GO",           0},
    173     {"GPE",          2},
    174     {"GPES",         0},
    175     {"HANDLERS",     0},
    176     {"HELP",         0},
    177     {"?",            0},
    178     {"HISTORY",      0},
    179     {"!",            1},
    180     {"!!",           0},
    181     {"INFORMATION",  0},
    182     {"INTEGRITY",    0},
    183     {"INTO",         0},
    184     {"LEVEL",        0},
    185     {"LIST",         0},
    186     {"LOAD",         1},
    187     {"LOCALS",       0},
    188     {"LOCKS",        0},
    189     {"METHODS",      0},
    190     {"NAMESPACE",    0},
    191     {"NOTIFY",       2},
    192     {"OBJECT",       1},
    193     {"OPEN",         1},
    194     {"OSI",          0},
    195     {"OWNER",        1},
    196     {"PREDEFINED",   0},
    197     {"PREFIX",       0},
    198     {"QUIT",         0},
    199     {"REFERENCES",   1},
    200     {"RESOURCES",    1},
    201     {"RESULTS",      0},
    202     {"SET",          3},
    203     {"SLEEP",        1},
    204     {"STATS",        0},
    205     {"STOP",         0},
    206     {"TABLES",       0},
    207     {"TERMINATE",    0},
    208     {"THREADS",      3},
    209     {"TRACE",        1},
    210     {"TREE",         0},
    211     {"TYPE",         1},
    212     {"UNLOAD",       1},
    213     {NULL,           0}
    214 };
    215 
    216 
    217 /*******************************************************************************
    218  *
    219  * FUNCTION:    AcpiDbDisplayHelp
    220  *
    221  * PARAMETERS:  None
    222  *
    223  * RETURN:      None
    224  *
    225  * DESCRIPTION: Print a usage message.
    226  *
    227  ******************************************************************************/
    228 
    229 static void
    230 AcpiDbDisplayHelp (
    231     void)
    232 {
    233 
    234     AcpiOsPrintf ("\nGeneral-Purpose Commands:\n");
    235     AcpiOsPrintf ("  Allocations                         Display list of current memory allocations\n");
    236     AcpiOsPrintf ("  Dump <Address>|<Namepath>\n");
    237     AcpiOsPrintf ("       [Byte|Word|Dword|Qword]        Display ACPI objects or memory\n");
    238     AcpiOsPrintf ("  EnableAcpi                          Enable ACPI (hardware) mode\n");
    239     AcpiOsPrintf ("  Handlers                            Info about global handlers\n");
    240     AcpiOsPrintf ("  Help                                This help screen\n");
    241     AcpiOsPrintf ("  History                             Display command history buffer\n");
    242     AcpiOsPrintf ("  Level [<DebugLevel>] [console]      Get/Set debug level for file or console\n");
    243     AcpiOsPrintf ("  Locks                               Current status of internal mutexes\n");
    244     AcpiOsPrintf ("  Osi [Install|Remove <name>]         Display or modify global _OSI list\n");
    245     AcpiOsPrintf ("  Quit or Exit                        Exit this command\n");
    246     AcpiOsPrintf ("  Stats [Allocations|Memory|Misc|\n");
    247     AcpiOsPrintf ("        Objects|Sizes|Stack|Tables]   Display namespace and memory statistics\n");
    248     AcpiOsPrintf ("     Allocations                      Display list of current memory allocations\n");
    249     AcpiOsPrintf ("     Memory                           Dump internal memory lists\n");
    250     AcpiOsPrintf ("     Misc                             Namespace search and mutex stats\n");
    251     AcpiOsPrintf ("     Objects                          Summary of namespace objects\n");
    252     AcpiOsPrintf ("     Sizes                            Sizes for each of the internal objects\n");
    253     AcpiOsPrintf ("     Stack                            Display CPU stack usage\n");
    254     AcpiOsPrintf ("     Tables                           Info about current ACPI table(s)\n");
    255     AcpiOsPrintf ("  Tables                              Display info about loaded ACPI tables\n");
    256     AcpiOsPrintf ("  Unload <TableSig> [Instance]        Unload an ACPI table\n");
    257     AcpiOsPrintf ("  ! <CommandNumber>                   Execute command from history buffer\n");
    258     AcpiOsPrintf ("  !!                                  Execute last command again\n");
    259 
    260     AcpiOsPrintf ("\nNamespace Access Commands:\n");
    261     AcpiOsPrintf ("  Businfo                             Display system bus info\n");
    262     AcpiOsPrintf ("  Disassemble <Method>                Disassemble a control method\n");
    263     AcpiOsPrintf ("  Event <F|G> <Value>                 Generate AcpiEvent (Fixed/GPE)\n");
    264     AcpiOsPrintf ("  Find <AcpiName>  (? is wildcard)    Find ACPI name(s) with wildcards\n");
    265     AcpiOsPrintf ("  Gpe <GpeNum> <GpeBlock>             Simulate a GPE\n");
    266     AcpiOsPrintf ("  Gpes                                Display info on all GPEs\n");
    267     AcpiOsPrintf ("  Integrity                           Validate namespace integrity\n");
    268     AcpiOsPrintf ("  Methods                             Display list of loaded control methods\n");
    269     AcpiOsPrintf ("  Namespace [Object] [Depth]          Display loaded namespace tree/subtree\n");
    270     AcpiOsPrintf ("  Notify <Object> <Value>             Send a notification on Object\n");
    271     AcpiOsPrintf ("  Objects <ObjectType>                Display all objects of the given type\n");
    272     AcpiOsPrintf ("  Owner <OwnerId> [Depth]             Display loaded namespace by object owner\n");
    273     AcpiOsPrintf ("  Predefined                          Check all predefined names\n");
    274     AcpiOsPrintf ("  Prefix [<NamePath>]                 Set or Get current execution prefix\n");
    275     AcpiOsPrintf ("  References <Addr>                   Find all references to object at addr\n");
    276     AcpiOsPrintf ("  Resources <Device>                  Get and display Device resources\n");
    277     AcpiOsPrintf ("  Set N <NamedObject> <Value>         Set value for named integer\n");
    278     AcpiOsPrintf ("  Sleep <SleepState>                  Simulate sleep/wake sequence\n");
    279     AcpiOsPrintf ("  Terminate                           Delete namespace and all internal objects\n");
    280     AcpiOsPrintf ("  Type <Object>                       Display object type\n");
    281 
    282     AcpiOsPrintf ("\nControl Method Execution Commands:\n");
    283     AcpiOsPrintf ("  Arguments (or Args)                 Display method arguments\n");
    284     AcpiOsPrintf ("  Breakpoint <AmlOffset>              Set an AML execution breakpoint\n");
    285     AcpiOsPrintf ("  Call                                Run to next control method invocation\n");
    286     AcpiOsPrintf ("  Debug <Namepath> [Arguments]        Single Step a control method\n");
    287     AcpiOsPrintf ("  Execute <Namepath> [Arguments]      Execute control method\n");
    288     AcpiOsPrintf ("  Go                                  Allow method to run to completion\n");
    289     AcpiOsPrintf ("  Information                         Display info about the current method\n");
    290     AcpiOsPrintf ("  Into                                Step into (not over) a method call\n");
    291     AcpiOsPrintf ("  List [# of Aml Opcodes]             Display method ASL statements\n");
    292     AcpiOsPrintf ("  Locals                              Display method local variables\n");
    293     AcpiOsPrintf ("  Results                             Display method result stack\n");
    294     AcpiOsPrintf ("  Set <A|L> <#> <Value>               Set method data (Arguments/Locals)\n");
    295     AcpiOsPrintf ("  Stop                                Terminate control method\n");
    296     AcpiOsPrintf ("  Thread <Threads><Loops><NamePath>   Spawn threads to execute method(s)\n");
    297     AcpiOsPrintf ("  Trace <method name>                 Trace method execution\n");
    298     AcpiOsPrintf ("  Tree                                Display control method calling tree\n");
    299     AcpiOsPrintf ("  <Enter>                             Single step next AML opcode (over calls)\n");
    300 
    301     AcpiOsPrintf ("\nFile I/O Commands:\n");
    302     AcpiOsPrintf ("  Close                               Close debug output file\n");
    303     AcpiOsPrintf ("  Load <Input Filename>               Load ACPI table from a file\n");
    304     AcpiOsPrintf ("  Open <Output Filename>              Open a file for debug output\n");
    305 }
    306 
    307 
    308 /*******************************************************************************
    309  *
    310  * FUNCTION:    AcpiDbGetNextToken
    311  *
    312  * PARAMETERS:  String          - Command buffer
    313  *              Next            - Return value, end of next token
    314  *
    315  * RETURN:      Pointer to the start of the next token.
    316  *
    317  * DESCRIPTION: Command line parsing.  Get the next token on the command line
    318  *
    319  ******************************************************************************/
    320 
    321 static char *
    322 AcpiDbGetNextToken (
    323     char                    *String,
    324     char                    **Next)
    325 {
    326     char                    *Start;
    327 
    328 
    329     /* At end of buffer? */
    330 
    331     if (!String || !(*String))
    332     {
    333         return (NULL);
    334     }
    335 
    336     /* Get rid of any spaces at the beginning */
    337 
    338     if (*String == ' ')
    339     {
    340         while (*String && (*String == ' '))
    341         {
    342             String++;
    343         }
    344 
    345         if (!(*String))
    346         {
    347             return (NULL);
    348         }
    349     }
    350 
    351     if (*String == '"')
    352     {
    353         /* This is a quoted string, scan until closing quote */
    354 
    355         String++;
    356         Start = String;
    357 
    358         /* Find end of token */
    359 
    360         while (*String && (*String != '"'))
    361         {
    362             String++;
    363         }
    364     }
    365     else
    366     {
    367         Start = String;
    368 
    369         /* Find end of token */
    370 
    371         while (*String && (*String != ' '))
    372         {
    373             String++;
    374         }
    375     }
    376 
    377     if (!(*String))
    378     {
    379         *Next = NULL;
    380     }
    381     else
    382     {
    383         *String = 0;
    384         *Next = String + 1;
    385     }
    386 
    387     return (Start);
    388 }
    389 
    390 
    391 /*******************************************************************************
    392  *
    393  * FUNCTION:    AcpiDbGetLine
    394  *
    395  * PARAMETERS:  InputBuffer         - Command line buffer
    396  *
    397  * RETURN:      Count of arguments to the command
    398  *
    399  * DESCRIPTION: Get the next command line from the user.  Gets entire line
    400  *              up to the next newline
    401  *
    402  ******************************************************************************/
    403 
    404 static UINT32
    405 AcpiDbGetLine (
    406     char                    *InputBuffer)
    407 {
    408     UINT32                  i;
    409     UINT32                  Count;
    410     char                    *Next;
    411     char                    *This;
    412 
    413 
    414     ACPI_STRCPY (AcpiGbl_DbParsedBuf, InputBuffer);
    415 
    416     This = AcpiGbl_DbParsedBuf;
    417     for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
    418     {
    419         AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next);
    420         if (!AcpiGbl_DbArgs[i])
    421         {
    422             break;
    423         }
    424 
    425         This = Next;
    426     }
    427 
    428     /* Uppercase the actual command */
    429 
    430     if (AcpiGbl_DbArgs[0])
    431     {
    432         AcpiUtStrupr (AcpiGbl_DbArgs[0]);
    433     }
    434 
    435     Count = i;
    436     if (Count)
    437     {
    438         Count--;  /* Number of args only */
    439     }
    440 
    441     return (Count);
    442 }
    443 
    444 
    445 /*******************************************************************************
    446  *
    447  * FUNCTION:    AcpiDbMatchCommand
    448  *
    449  * PARAMETERS:  UserCommand             - User command line
    450  *
    451  * RETURN:      Index into command array, -1 if not found
    452  *
    453  * DESCRIPTION: Search command array for a command match
    454  *
    455  ******************************************************************************/
    456 
    457 static UINT32
    458 AcpiDbMatchCommand (
    459     char                    *UserCommand)
    460 {
    461     UINT32                  i;
    462 
    463 
    464     if (!UserCommand || UserCommand[0] == 0)
    465     {
    466         return (CMD_NULL);
    467     }
    468 
    469     for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++)
    470     {
    471         if (ACPI_STRSTR (AcpiGbl_DbCommands[i].Name, UserCommand) ==
    472                          AcpiGbl_DbCommands[i].Name)
    473         {
    474             return (i);
    475         }
    476     }
    477 
    478     /* Command not recognized */
    479 
    480     return (CMD_NOT_FOUND);
    481 }
    482 
    483 
    484 /*******************************************************************************
    485  *
    486  * FUNCTION:    AcpiDbCommandDispatch
    487  *
    488  * PARAMETERS:  InputBuffer         - Command line buffer
    489  *              WalkState           - Current walk
    490  *              Op                  - Current (executing) parse op
    491  *
    492  * RETURN:      Status
    493  *
    494  * DESCRIPTION: Command dispatcher.
    495  *
    496  ******************************************************************************/
    497 
    498 ACPI_STATUS
    499 AcpiDbCommandDispatch (
    500     char                    *InputBuffer,
    501     ACPI_WALK_STATE         *WalkState,
    502     ACPI_PARSE_OBJECT       *Op)
    503 {
    504     UINT32                  Temp;
    505     UINT32                  CommandIndex;
    506     UINT32                  ParamCount;
    507     char                    *CommandLine;
    508     ACPI_STATUS             Status = AE_CTRL_TRUE;
    509 
    510 
    511     /* If AcpiTerminate has been called, terminate this thread */
    512 
    513     if (AcpiGbl_DbTerminateThreads)
    514     {
    515         return (AE_CTRL_TERMINATE);
    516     }
    517 
    518     ParamCount = AcpiDbGetLine (InputBuffer);
    519     CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
    520     Temp = 0;
    521 
    522     /* Verify that we have the minimum number of params */
    523 
    524     if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs)
    525     {
    526         AcpiOsPrintf ("%u parameters entered, [%s] requires %u parameters\n",
    527             ParamCount, AcpiGbl_DbCommands[CommandIndex].Name,
    528             AcpiGbl_DbCommands[CommandIndex].MinArgs);
    529 
    530         return (AE_CTRL_TRUE);
    531     }
    532 
    533     /* Decode and dispatch the command */
    534 
    535     switch (CommandIndex)
    536     {
    537     case CMD_NULL:
    538         if (Op)
    539         {
    540             return (AE_OK);
    541         }
    542         break;
    543 
    544     case CMD_ALLOCATIONS:
    545 
    546 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
    547         AcpiUtDumpAllocations ((UINT32) -1, NULL);
    548 #endif
    549         break;
    550 
    551     case CMD_ARGS:
    552     case CMD_ARGUMENTS:
    553         AcpiDbDisplayArguments ();
    554         break;
    555 
    556     case CMD_BATCH:
    557         AcpiDbBatchExecute (AcpiGbl_DbArgs[1]);
    558         break;
    559 
    560     case CMD_BREAKPOINT:
    561         AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op);
    562         break;
    563 
    564     case CMD_BUSINFO:
    565         AcpiDbGetBusInfo ();
    566         break;
    567 
    568     case CMD_CALL:
    569         AcpiDbSetMethodCallBreakpoint (Op);
    570         Status = AE_OK;
    571         break;
    572 
    573     case CMD_CLOSE:
    574         AcpiDbCloseDebugFile ();
    575         break;
    576 
    577     case CMD_DEBUG:
    578         AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], EX_SINGLE_STEP);
    579         break;
    580 
    581     case CMD_DISASSEMBLE:
    582         (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
    583         break;
    584 
    585     case CMD_DUMP:
    586         AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
    587         break;
    588 
    589     case CMD_ENABLEACPI:
    590         Status = AcpiEnable();
    591         if (ACPI_FAILURE(Status))
    592         {
    593             AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status);
    594             return (Status);
    595         }
    596         break;
    597 
    598     case CMD_EVENT:
    599         AcpiOsPrintf ("Event command not implemented\n");
    600         break;
    601 
    602     case CMD_EXECUTE:
    603         AcpiDbExecute (AcpiGbl_DbArgs[1],
    604             &AcpiGbl_DbArgs[2], EX_NO_SINGLE_STEP);
    605         break;
    606 
    607     case CMD_FIND:
    608         Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]);
    609         break;
    610 
    611     case CMD_GO:
    612         AcpiGbl_CmSingleStep = FALSE;
    613         return (AE_OK);
    614 
    615     case CMD_GPE:
    616         AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
    617         break;
    618 
    619     case CMD_GPES:
    620         AcpiDbDisplayGpes ();
    621         break;
    622 
    623     case CMD_HANDLERS:
    624         AcpiDbDisplayHandlers ();
    625         break;
    626 
    627     case CMD_HELP:
    628     case CMD_HELP2:
    629         AcpiDbDisplayHelp ();
    630         break;
    631 
    632     case CMD_HISTORY:
    633         AcpiDbDisplayHistory ();
    634         break;
    635 
    636     case CMD_HISTORY_EXE:
    637         CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]);
    638         if (!CommandLine)
    639         {
    640             return (AE_CTRL_TRUE);
    641         }
    642 
    643         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
    644         return (Status);
    645 
    646     case CMD_HISTORY_LAST:
    647         CommandLine = AcpiDbGetFromHistory (NULL);
    648         if (!CommandLine)
    649         {
    650             return (AE_CTRL_TRUE);
    651         }
    652 
    653         Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
    654         return (Status);
    655 
    656     case CMD_INFORMATION:
    657         AcpiDbDisplayMethodInfo (Op);
    658         break;
    659 
    660     case CMD_INTEGRITY:
    661         AcpiDbCheckIntegrity ();
    662         break;
    663 
    664     case CMD_INTO:
    665         if (Op)
    666         {
    667             AcpiGbl_CmSingleStep = TRUE;
    668             return (AE_OK);
    669         }
    670         break;
    671 
    672     case CMD_LEVEL:
    673         if (ParamCount == 0)
    674         {
    675             AcpiOsPrintf ("Current debug level for file output is:    %8.8lX\n",
    676                 AcpiGbl_DbDebugLevel);
    677             AcpiOsPrintf ("Current debug level for console output is: %8.8lX\n",
    678                 AcpiGbl_DbConsoleDebugLevel);
    679         }
    680         else if (ParamCount == 2)
    681         {
    682             Temp = AcpiGbl_DbConsoleDebugLevel;
    683             AcpiGbl_DbConsoleDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1],
    684                                             NULL, 16);
    685             AcpiOsPrintf (
    686                 "Debug Level for console output was %8.8lX, now %8.8lX\n",
    687                 Temp, AcpiGbl_DbConsoleDebugLevel);
    688         }
    689         else
    690         {
    691             Temp = AcpiGbl_DbDebugLevel;
    692             AcpiGbl_DbDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1], NULL, 16);
    693             AcpiOsPrintf (
    694                 "Debug Level for file output was %8.8lX, now %8.8lX\n",
    695                 Temp, AcpiGbl_DbDebugLevel);
    696         }
    697         break;
    698 
    699     case CMD_LIST:
    700         AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
    701         break;
    702 
    703     case CMD_LOAD:
    704         Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL);
    705         break;
    706 
    707     case CMD_LOCKS:
    708         AcpiDbDisplayLocks ();
    709         break;
    710 
    711     case CMD_LOCALS:
    712         AcpiDbDisplayLocals ();
    713         break;
    714 
    715     case CMD_METHODS:
    716         Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]);
    717         break;
    718 
    719     case CMD_NAMESPACE:
    720         AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
    721         break;
    722 
    723     case CMD_NOTIFY:
    724         Temp = ACPI_STRTOUL (AcpiGbl_DbArgs[2], NULL, 0);
    725         AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp);
    726         break;
    727 
    728     case CMD_OBJECT:
    729         AcpiUtStrupr (AcpiGbl_DbArgs[1]);
    730         Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
    731         break;
    732 
    733     case CMD_OPEN:
    734         AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]);
    735         break;
    736 
    737     case CMD_OSI:
    738         AcpiDbDisplayInterfaces (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
    739         break;
    740 
    741     case CMD_OWNER:
    742         AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
    743         break;
    744 
    745     case CMD_PREDEFINED:
    746         AcpiDbCheckPredefinedNames ();
    747         break;
    748 
    749     case CMD_PREFIX:
    750         AcpiDbSetScope (AcpiGbl_DbArgs[1]);
    751         break;
    752 
    753     case CMD_REFERENCES:
    754         AcpiDbFindReferences (AcpiGbl_DbArgs[1]);
    755         break;
    756 
    757     case CMD_RESOURCES:
    758         AcpiDbDisplayResources (AcpiGbl_DbArgs[1]);
    759         break;
    760 
    761     case CMD_RESULTS:
    762         AcpiDbDisplayResults ();
    763         break;
    764 
    765     case CMD_SET:
    766         AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
    767             AcpiGbl_DbArgs[3]);
    768         break;
    769 
    770     case CMD_SLEEP:
    771         Status = AcpiDbSleep (AcpiGbl_DbArgs[1]);
    772         break;
    773 
    774     case CMD_STATS:
    775         Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]);
    776         break;
    777 
    778     case CMD_STOP:
    779         return (AE_NOT_IMPLEMENTED);
    780 
    781     case CMD_TABLES:
    782         AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]);
    783         break;
    784 
    785     case CMD_TERMINATE:
    786         AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
    787         AcpiUtSubsystemShutdown ();
    788 
    789         /*
    790          * TBD: [Restructure] Need some way to re-initialize without
    791          * re-creating the semaphores!
    792          */
    793 
    794         /*  AcpiInitialize (NULL);  */
    795         break;
    796 
    797     case CMD_THREADS:
    798         AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
    799             AcpiGbl_DbArgs[3]);
    800         break;
    801 
    802     case CMD_TRACE:
    803         (void) AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1);
    804         break;
    805 
    806     case CMD_TREE:
    807         AcpiDbDisplayCallingTree ();
    808         break;
    809 
    810     case CMD_TYPE:
    811         AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]);
    812         break;
    813 
    814     case CMD_UNLOAD:
    815         AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
    816         break;
    817 
    818     case CMD_EXIT:
    819     case CMD_QUIT:
    820         if (Op)
    821         {
    822             AcpiOsPrintf ("Method execution terminated\n");
    823             return (AE_CTRL_TERMINATE);
    824         }
    825 
    826         if (!AcpiGbl_DbOutputToFile)
    827         {
    828             AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
    829         }
    830 
    831         AcpiDbCloseDebugFile ();
    832         AcpiGbl_DbTerminateThreads = TRUE;
    833         return (AE_CTRL_TERMINATE);
    834 
    835     case CMD_NOT_FOUND:
    836     default:
    837         AcpiOsPrintf ("Unknown Command\n");
    838         return (AE_CTRL_TRUE);
    839     }
    840 
    841     if (ACPI_SUCCESS (Status))
    842     {
    843         Status = AE_CTRL_TRUE;
    844     }
    845 
    846     /* Add all commands that come here to the history buffer */
    847 
    848     AcpiDbAddToHistory (InputBuffer);
    849     return (Status);
    850 }
    851 
    852 
    853 /*******************************************************************************
    854  *
    855  * FUNCTION:    AcpiDbExecuteThread
    856  *
    857  * PARAMETERS:  Context         - Not used
    858  *
    859  * RETURN:      None
    860  *
    861  * DESCRIPTION: Debugger execute thread.  Waits for a command line, then
    862  *              simply dispatches it.
    863  *
    864  ******************************************************************************/
    865 
    866 void ACPI_SYSTEM_XFACE
    867 AcpiDbExecuteThread (
    868     void                    *Context)
    869 {
    870     ACPI_STATUS             Status = AE_OK;
    871     ACPI_STATUS             MStatus;
    872 
    873 
    874     while (Status != AE_CTRL_TERMINATE)
    875     {
    876         AcpiGbl_MethodExecuting = FALSE;
    877         AcpiGbl_StepToNextCall = FALSE;
    878 
    879         MStatus = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
    880         if (ACPI_FAILURE (MStatus))
    881         {
    882             return;
    883         }
    884 
    885         Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
    886 
    887         MStatus = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
    888         if (ACPI_FAILURE (MStatus))
    889         {
    890             return;
    891         }
    892     }
    893 }
    894 
    895 
    896 /*******************************************************************************
    897  *
    898  * FUNCTION:    AcpiDbSingleThread
    899  *
    900  * PARAMETERS:  None
    901  *
    902  * RETURN:      None
    903  *
    904  * DESCRIPTION: Debugger execute thread.  Waits for a command line, then
    905  *              simply dispatches it.
    906  *
    907  ******************************************************************************/
    908 
    909 static void
    910 AcpiDbSingleThread (
    911     void)
    912 {
    913 
    914     AcpiGbl_MethodExecuting = FALSE;
    915     AcpiGbl_StepToNextCall = FALSE;
    916 
    917     (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
    918 }
    919 
    920 
    921 /*******************************************************************************
    922  *
    923  * FUNCTION:    AcpiDbUserCommands
    924  *
    925  * PARAMETERS:  Prompt              - User prompt (depends on mode)
    926  *              Op                  - Current executing parse op
    927  *
    928  * RETURN:      None
    929  *
    930  * DESCRIPTION: Command line execution for the AML debugger.  Commands are
    931  *              matched and dispatched here.
    932  *
    933  ******************************************************************************/
    934 
    935 ACPI_STATUS
    936 AcpiDbUserCommands (
    937     char                    Prompt,
    938     ACPI_PARSE_OBJECT       *Op)
    939 {
    940     ACPI_STATUS             Status = AE_OK;
    941 
    942 
    943     /* TBD: [Restructure] Need a separate command line buffer for step mode */
    944 
    945     while (!AcpiGbl_DbTerminateThreads)
    946     {
    947         /* Force output to console until a command is entered */
    948 
    949         AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
    950 
    951         /* Different prompt if method is executing */
    952 
    953         if (!AcpiGbl_MethodExecuting)
    954         {
    955             AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
    956         }
    957         else
    958         {
    959             AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
    960         }
    961 
    962         /* Get the user input line */
    963 
    964         (void) AcpiOsGetLine (AcpiGbl_DbLineBuf);
    965 
    966         /* Check for single or multithreaded debug */
    967 
    968         if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED)
    969         {
    970             /*
    971              * Signal the debug thread that we have a command to execute,
    972              * and wait for the command to complete.
    973              */
    974             Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY);
    975             if (ACPI_FAILURE (Status))
    976             {
    977                 return (Status);
    978             }
    979 
    980             Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
    981             if (ACPI_FAILURE (Status))
    982             {
    983                 return (Status);
    984             }
    985         }
    986         else
    987         {
    988             /* Just call to the command line interpreter */
    989 
    990             AcpiDbSingleThread ();
    991         }
    992     }
    993 
    994     /*
    995      * Only this thread (the original thread) should actually terminate the
    996      * subsystem, because all the semaphores are deleted during termination
    997      */
    998     Status = AcpiTerminate ();
    999     return (Status);
   1000 }
   1001 
   1002 #endif  /* ACPI_DEBUGGER */
   1003 
   1004