Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1498 serge 1
/*******************************************************************************
2
 *
3
 * Module Name: dbinput - user front-end to the AML debugger
4
 *
5
 ******************************************************************************/
6
 
7
/******************************************************************************
8
 *
9
 * 1. Copyright Notice
10
 *
11
 * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12
 * All rights reserved.
13
 *
14
 * 2. License
15
 *
16
 * 2.1. This is your license from Intel Corp. under its intellectual property
17
 * rights.  You may have additional license terms from the party that provided
18
 * you this software, covering your right to use that party's intellectual
19
 * property rights.
20
 *
21
 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22
 * copy of the source code appearing in this file ("Covered Code") an
23
 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24
 * base code distributed originally by Intel ("Original Intel Code") to copy,
25
 * make derivatives, distribute, use and display any portion of the Covered
26
 * Code in any form, with the right to sublicense such rights; and
27
 *
28
 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29
 * license (with the right to sublicense), under only those claims of Intel
30
 * patents that are infringed by the Original Intel Code, to make, use, sell,
31
 * offer to sell, and import the Covered Code and derivative works thereof
32
 * solely to the minimum extent necessary to exercise the above copyright
33
 * license, and in no event shall the patent license extend to any additions
34
 * to or modifications of the Original Intel Code.  No other license or right
35
 * is granted directly or by implication, estoppel or otherwise;
36
 *
37
 * The above copyright and patent license is granted only if the following
38
 * conditions are met:
39
 *
40
 * 3. Conditions
41
 *
42
 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43
 * Redistribution of source code of any substantial portion of the Covered
44
 * Code or modification with rights to further distribute source must include
45
 * the above Copyright Notice, the above License, this list of Conditions,
46
 * and the following Disclaimer and Export Compliance provision.  In addition,
47
 * Licensee must cause all Covered Code to which Licensee contributes to
48
 * contain a file documenting the changes Licensee made to create that Covered
49
 * Code and the date of any change.  Licensee must include in that file the
50
 * documentation of any changes made by any predecessor Licensee.  Licensee
51
 * must include a prominent statement that the modification is derived,
52
 * directly or indirectly, from Original Intel Code.
53
 *
54
 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55
 * Redistribution of source code of any substantial portion of the Covered
56
 * Code or modification without rights to further distribute source must
57
 * include the following Disclaimer and Export Compliance provision in the
58
 * documentation and/or other materials provided with distribution.  In
59
 * addition, Licensee may not authorize further sublicense of source of any
60
 * portion of the Covered Code, and must include terms to the effect that the
61
 * license from Licensee to its licensee is limited to the intellectual
62
 * property embodied in the software Licensee provides to its licensee, and
63
 * not to intellectual property embodied in modifications its licensee may
64
 * make.
65
 *
66
 * 3.3. Redistribution of Executable. Redistribution in executable form of any
67
 * substantial portion of the Covered Code or modification must reproduce the
68
 * above Copyright Notice, and the following Disclaimer and Export Compliance
69
 * provision in the documentation and/or other materials provided with the
70
 * distribution.
71
 *
72
 * 3.4. Intel retains all right, title, and interest in and to the Original
73
 * Intel Code.
74
 *
75
 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76
 * Intel shall be used in advertising or otherwise to promote the sale, use or
77
 * other dealings in products derived from or relating to the Covered Code
78
 * without prior written authorization from Intel.
79
 *
80
 * 4. Disclaimer and Export Compliance
81
 *
82
 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83
 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84
 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85
 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86
 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87
 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88
 * PARTICULAR PURPOSE.
89
 *
90
 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91
 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92
 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93
 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94
 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95
 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96
 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97
 * LIMITED REMEDY.
98
 *
99
 * 4.3. Licensee shall not export, either directly or indirectly, any of this
100
 * software or system incorporating such software without first obtaining any
101
 * required license or other approval from the U. S. Department of Commerce or
102
 * any other agency or department of the United States Government.  In the
103
 * event Licensee exports any such software from the United States or
104
 * re-exports any such software from a foreign destination, Licensee shall
105
 * ensure that the distribution and export/re-export of the software is in
106
 * compliance with all laws, regulations, orders, or other restrictions of the
107
 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108
 * any of its subsidiaries will export/re-export any technical data, process,
109
 * software, or service, directly or indirectly, to any country for which the
110
 * United States government or any agency thereof requires an export license,
111
 * other governmental approval, or letter of assurance, without first obtaining
112
 * such license, approval or letter.
113
 *
114
 *****************************************************************************/
115
 
116
 
117
#include "acpi.h"
118
#include "accommon.h"
119
#include "acdebug.h"
120
 
121
 
122
#ifdef ACPI_DEBUGGER
123
 
124
#define _COMPONENT          ACPI_CA_DEBUGGER
125
        ACPI_MODULE_NAME    ("dbinput")
126
 
127
/* Local prototypes */
128
 
129
static char *
130
AcpiDbGetNextToken (
131
    char                    *String,
132
    char                    **Next);
133
 
134
static UINT32
135
AcpiDbGetLine (
136
    char                    *InputBuffer);
137
 
138
static UINT32
139
AcpiDbMatchCommand (
140
    char                    *UserCommand);
141
 
142
static void
143
AcpiDbSingleThread (
144
    void);
145
 
146
static void
147
AcpiDbDisplayHelp (
148
    char                    *HelpType);
149
 
150
 
151
/*
152
 * Top-level debugger commands.
153
 *
154
 * This list of commands must match the string table below it
155
 */
156
enum AcpiExDebuggerCommands
157
{
158
    CMD_NOT_FOUND = 0,
159
    CMD_NULL,
160
    CMD_ALLOCATIONS,
161
    CMD_ARGS,
162
    CMD_ARGUMENTS,
163
    CMD_BATCH,
164
    CMD_BREAKPOINT,
165
    CMD_BUSINFO,
166
    CMD_CALL,
167
    CMD_CLOSE,
168
    CMD_DEBUG,
169
    CMD_DISASSEMBLE,
170
    CMD_DUMP,
171
    CMD_ENABLEACPI,
172
    CMD_EVENT,
173
    CMD_EXECUTE,
174
    CMD_EXIT,
175
    CMD_FIND,
176
    CMD_GO,
177
    CMD_GPE,
178
    CMD_GPES,
179
    CMD_HELP,
180
    CMD_HELP2,
181
    CMD_HISTORY,
182
    CMD_HISTORY_EXE,
183
    CMD_HISTORY_LAST,
184
    CMD_INFORMATION,
185
    CMD_INTEGRITY,
186
    CMD_INTO,
187
    CMD_LEVEL,
188
    CMD_LIST,
189
    CMD_LOAD,
190
    CMD_LOCALS,
191
    CMD_LOCKS,
192
    CMD_METHODS,
193
    CMD_NAMESPACE,
194
    CMD_NOTIFY,
195
    CMD_OBJECT,
196
    CMD_OPEN,
197
    CMD_OWNER,
198
    CMD_PREDEFINED,
199
    CMD_PREFIX,
200
    CMD_QUIT,
201
    CMD_REFERENCES,
202
    CMD_RESOURCES,
203
    CMD_RESULTS,
204
    CMD_SET,
205
    CMD_SLEEP,
206
    CMD_STATS,
207
    CMD_STOP,
208
    CMD_TABLES,
209
    CMD_TERMINATE,
210
    CMD_THREADS,
211
    CMD_TRACE,
212
    CMD_TREE,
213
    CMD_TYPE,
214
    CMD_UNLOAD
215
};
216
 
217
#define CMD_FIRST_VALID     2
218
 
219
 
220
/* Second parameter is the required argument count */
221
 
222
static const COMMAND_INFO       AcpiGbl_DbCommands[] =
223
{
224
    {"",  0},
225
    {"",       0},
226
    {"ALLOCATIONS",  0},
227
    {"ARGS",         0},
228
    {"ARGUMENTS",    0},
229
    {"BATCH",        0},
230
    {"BREAKPOINT",   1},
231
    {"BUSINFO",      0},
232
    {"CALL",         0},
233
    {"CLOSE",        0},
234
    {"DEBUG",        1},
235
    {"DISASSEMBLE",  1},
236
    {"DUMP",         1},
237
    {"ENABLEACPI",   0},
238
    {"EVENT",        1},
239
    {"EXECUTE",      1},
240
    {"EXIT",         0},
241
    {"FIND",         1},
242
    {"GO",           0},
243
    {"GPE",          2},
244
    {"GPES",         0},
245
    {"HELP",         0},
246
    {"?",            0},
247
    {"HISTORY",      0},
248
    {"!",            1},
249
    {"!!",           0},
250
    {"INFORMATION",  0},
251
    {"INTEGRITY",    0},
252
    {"INTO",         0},
253
    {"LEVEL",        0},
254
    {"LIST",         0},
255
    {"LOAD",         1},
256
    {"LOCALS",       0},
257
    {"LOCKS",        0},
258
    {"METHODS",      0},
259
    {"NAMESPACE",    0},
260
    {"NOTIFY",       2},
261
    {"OBJECT",       1},
262
    {"OPEN",         1},
263
    {"OWNER",        1},
264
    {"PREDEFINED",   0},
265
    {"PREFIX",       0},
266
    {"QUIT",         0},
267
    {"REFERENCES",   1},
268
    {"RESOURCES",    1},
269
    {"RESULTS",      0},
270
    {"SET",          3},
271
    {"SLEEP",        1},
272
    {"STATS",        0},
273
    {"STOP",         0},
274
    {"TABLES",       0},
275
    {"TERMINATE",    0},
276
    {"THREADS",      3},
277
    {"TRACE",        1},
278
    {"TREE",         0},
279
    {"TYPE",         1},
280
    {"UNLOAD",       1},
281
    {NULL,           0}
282
};
283
 
284
 
285
/*******************************************************************************
286
 *
287
 * FUNCTION:    AcpiDbDisplayHelp
288
 *
289
 * PARAMETERS:  HelpType        - Subcommand (optional)
290
 *
291
 * RETURN:      None
292
 *
293
 * DESCRIPTION: Print a usage message.
294
 *
295
 ******************************************************************************/
296
 
297
static void
298
AcpiDbDisplayHelp (
299
    char                    *HelpType)
300
{
301
 
302
    AcpiUtStrupr (HelpType);
303
 
304
    /* No parameter, just give the overview */
305
 
306
    if (!HelpType)
307
    {
308
        AcpiOsPrintf ("ACPI CA Debugger Commands\n\n");
309
        AcpiOsPrintf ("The following classes of commands are available.  Help is available for\n");
310
        AcpiOsPrintf ("each class by entering \"Help \"\n\n");
311
        AcpiOsPrintf ("    [GENERAL]       General-Purpose Commands\n");
312
        AcpiOsPrintf ("    [NAMESPACE]     Namespace Access Commands\n");
313
        AcpiOsPrintf ("    [METHOD]        Control Method Execution Commands\n");
314
        AcpiOsPrintf ("    [STATISTICS]    Statistical Information\n");
315
        AcpiOsPrintf ("    [FILE]          File I/O Commands\n");
316
        return;
317
    }
318
 
319
    /*
320
     * Parameter is the command class
321
     *
322
     * The idea here is to keep each class of commands smaller than a screenful
323
     */
324
    switch (HelpType[0])
325
    {
326
    case 'G':
327
        AcpiOsPrintf ("\nGeneral-Purpose Commands\n\n");
328
        AcpiOsPrintf ("Allocations                         Display list of current memory allocations\n");
329
        AcpiOsPrintf ("Dump 
|\n");
330
        AcpiOsPrintf ("     [Byte|Word|Dword|Qword]        Display ACPI objects or memory\n");
331
        AcpiOsPrintf ("EnableAcpi                          Enable ACPI (hardware) mode\n");
332
        AcpiOsPrintf ("Help                                This help screen\n");
333
        AcpiOsPrintf ("History                             Display command history buffer\n");
334
        AcpiOsPrintf ("Level [] [console]      Get/Set debug level for file or console\n");
335
        AcpiOsPrintf ("Locks                               Current status of internal mutexes\n");
336
        AcpiOsPrintf ("Quit or Exit                        Exit this command\n");
337
        AcpiOsPrintf ("Stats [Allocations|Memory|Misc\n");
338
        AcpiOsPrintf ("      |Objects|Sizes|Stack|Tables]  Display namespace and memory statistics\n");
339
        AcpiOsPrintf ("Tables                              Display info about loaded ACPI tables\n");
340
        AcpiOsPrintf ("Unload  [Instance]        Unload an ACPI table\n");
341
        AcpiOsPrintf ("!                    Execute command from history buffer\n");
342
        AcpiOsPrintf ("!!                                  Execute last command again\n");
343
        return;
344
 
345
    case 'S':
346
        AcpiOsPrintf ("\nStats Subcommands\n\n");
347
        AcpiOsPrintf ("Allocations                         Display list of current memory allocations\n");
348
        AcpiOsPrintf ("Memory                              Dump internal memory lists\n");
349
        AcpiOsPrintf ("Misc                                Namespace search and mutex stats\n");
350
        AcpiOsPrintf ("Objects                             Summary of namespace objects\n");
351
        AcpiOsPrintf ("Sizes                               Sizes for each of the internal objects\n");
352
        AcpiOsPrintf ("Stack                               Display CPU stack usage\n");
353
        AcpiOsPrintf ("Tables                              Info about current ACPI table(s)\n");
354
        return;
355
 
356
    case 'N':
357
        AcpiOsPrintf ("\nNamespace Access Commands\n\n");
358
        AcpiOsPrintf ("Businfo                             Display system bus info\n");
359
        AcpiOsPrintf ("Disassemble                 Disassemble a control method\n");
360
        AcpiOsPrintf ("Event                   Generate AcpiEvent (Fixed/GPE)\n");
361
        AcpiOsPrintf ("Find   (? is wildcard)    Find ACPI name(s) with wildcards\n");
362
        AcpiOsPrintf ("Gpe               Simulate a GPE\n");
363
        AcpiOsPrintf ("Gpes                                Display info on all GPEs\n");
364
        AcpiOsPrintf ("Integrity                           Validate namespace integrity\n");
365
        AcpiOsPrintf ("Methods                             Display list of loaded control methods\n");
366
        AcpiOsPrintf ("Namespace [Object] [Depth]          Display loaded namespace tree/subtree\n");
367
        AcpiOsPrintf ("Notify               Send a notification on Object\n");
368
        AcpiOsPrintf ("Objects                 Display all objects of the given type\n");
369
        AcpiOsPrintf ("Owner  [Depth]             Display loaded namespace by object owner\n");
370
        AcpiOsPrintf ("Predefined                          Check all predefined names\n");
371
        AcpiOsPrintf ("Prefix []                 Set or Get current execution prefix\n");
372
        AcpiOsPrintf ("References                    Find all references to object at addr\n");
373
        AcpiOsPrintf ("Resources                   Get and display Device resources\n");
374
        AcpiOsPrintf ("Set N           Set value for named integer\n");
375
        AcpiOsPrintf ("Sleep                   Simulate sleep/wake sequence\n");
376
        AcpiOsPrintf ("Terminate                           Delete namespace and all internal objects\n");
377
        AcpiOsPrintf ("Type                        Display object type\n");
378
        return;
379
 
380
    case 'M':
381
        AcpiOsPrintf ("\nControl Method Execution Commands\n\n");
382
        AcpiOsPrintf ("Arguments (or Args)                 Display method arguments\n");
383
        AcpiOsPrintf ("Breakpoint               Set an AML execution breakpoint\n");
384
        AcpiOsPrintf ("Call                                Run to next control method invocation\n");
385
        AcpiOsPrintf ("Debug  [Arguments]        Single Step a control method\n");
386
        AcpiOsPrintf ("Execute  [Arguments]      Execute control method\n");
387
        AcpiOsPrintf ("Go                                  Allow method to run to completion\n");
388
        AcpiOsPrintf ("Information                         Display info about the current method\n");
389
        AcpiOsPrintf ("Into                                Step into (not over) a method call\n");
390
        AcpiOsPrintf ("List [# of Aml Opcodes]             Display method ASL statements\n");
391
        AcpiOsPrintf ("Locals                              Display method local variables\n");
392
        AcpiOsPrintf ("Results                             Display method result stack\n");
393
        AcpiOsPrintf ("Set  <#>                Set method data (Arguments/Locals)\n");
394
        AcpiOsPrintf ("Stop                                Terminate control method\n");
395
        AcpiOsPrintf ("Thread    Spawn threads to execute method(s)\n");
396
        AcpiOsPrintf ("Trace                  Trace method execution\n");
397
        AcpiOsPrintf ("Tree                                Display control method calling tree\n");
398
        AcpiOsPrintf ("                             Single step next AML opcode (over calls)\n");
399
        return;
400
 
401
    case 'F':
402
        AcpiOsPrintf ("\nFile I/O Commands\n\n");
403
        AcpiOsPrintf ("Close                               Close debug output file\n");
404
        AcpiOsPrintf ("Open               Open a file for debug output\n");
405
        AcpiOsPrintf ("Load                Load ACPI table from a file\n");
406
        return;
407
 
408
    default:
409
        AcpiOsPrintf ("Unrecognized Command Class: %s\n", HelpType);
410
        return;
411
    }
412
}
413
 
414
 
415
/*******************************************************************************
416
 *
417
 * FUNCTION:    AcpiDbGetNextToken
418
 *
419
 * PARAMETERS:  String          - Command buffer
420
 *              Next            - Return value, end of next token
421
 *
422
 * RETURN:      Pointer to the start of the next token.
423
 *
424
 * DESCRIPTION: Command line parsing.  Get the next token on the command line
425
 *
426
 ******************************************************************************/
427
 
428
static char *
429
AcpiDbGetNextToken (
430
    char                    *String,
431
    char                    **Next)
432
{
433
    char                    *Start;
434
 
435
 
436
    /* At end of buffer? */
437
 
438
    if (!String || !(*String))
439
    {
440
        return (NULL);
441
    }
442
 
443
    /* Get rid of any spaces at the beginning */
444
 
445
    if (*String == ' ')
446
    {
447
        while (*String && (*String == ' '))
448
        {
449
            String++;
450
        }
451
 
452
        if (!(*String))
453
        {
454
            return (NULL);
455
        }
456
    }
457
 
458
    Start = String;
459
 
460
    /* Find end of token */
461
 
462
    while (*String && (*String != ' '))
463
    {
464
        String++;
465
    }
466
 
467
    if (!(*String))
468
    {
469
        *Next = NULL;
470
    }
471
    else
472
    {
473
        *String = 0;
474
        *Next = String + 1;
475
    }
476
 
477
    return (Start);
478
}
479
 
480
 
481
/*******************************************************************************
482
 *
483
 * FUNCTION:    AcpiDbGetLine
484
 *
485
 * PARAMETERS:  InputBuffer         - Command line buffer
486
 *
487
 * RETURN:      Count of arguments to the command
488
 *
489
 * DESCRIPTION: Get the next command line from the user.  Gets entire line
490
 *              up to the next newline
491
 *
492
 ******************************************************************************/
493
 
494
static UINT32
495
AcpiDbGetLine (
496
    char                    *InputBuffer)
497
{
498
    UINT32                  i;
499
    UINT32                  Count;
500
    char                    *Next;
501
    char                    *This;
502
 
503
 
504
    ACPI_STRCPY (AcpiGbl_DbParsedBuf, InputBuffer);
505
 
506
    This = AcpiGbl_DbParsedBuf;
507
    for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
508
    {
509
        AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next);
510
        if (!AcpiGbl_DbArgs[i])
511
        {
512
            break;
513
        }
514
 
515
        This = Next;
516
    }
517
 
518
    /* Uppercase the actual command */
519
 
520
    if (AcpiGbl_DbArgs[0])
521
    {
522
        AcpiUtStrupr (AcpiGbl_DbArgs[0]);
523
    }
524
 
525
    Count = i;
526
    if (Count)
527
    {
528
        Count--;  /* Number of args only */
529
    }
530
 
531
    return (Count);
532
}
533
 
534
 
535
/*******************************************************************************
536
 *
537
 * FUNCTION:    AcpiDbMatchCommand
538
 *
539
 * PARAMETERS:  UserCommand             - User command line
540
 *
541
 * RETURN:      Index into command array, -1 if not found
542
 *
543
 * DESCRIPTION: Search command array for a command match
544
 *
545
 ******************************************************************************/
546
 
547
static UINT32
548
AcpiDbMatchCommand (
549
    char                    *UserCommand)
550
{
551
    UINT32                  i;
552
 
553
 
554
    if (!UserCommand || UserCommand[0] == 0)
555
    {
556
        return (CMD_NULL);
557
    }
558
 
559
    for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++)
560
    {
561
        if (ACPI_STRSTR (AcpiGbl_DbCommands[i].Name, UserCommand) ==
562
                         AcpiGbl_DbCommands[i].Name)
563
        {
564
            return (i);
565
        }
566
    }
567
 
568
    /* Command not recognized */
569
 
570
    return (CMD_NOT_FOUND);
571
}
572
 
573
 
574
/*******************************************************************************
575
 *
576
 * FUNCTION:    AcpiDbCommandDispatch
577
 *
578
 * PARAMETERS:  InputBuffer         - Command line buffer
579
 *              WalkState           - Current walk
580
 *              Op                  - Current (executing) parse op
581
 *
582
 * RETURN:      Status
583
 *
584
 * DESCRIPTION: Command dispatcher.
585
 *
586
 ******************************************************************************/
587
 
588
ACPI_STATUS
589
AcpiDbCommandDispatch (
590
    char                    *InputBuffer,
591
    ACPI_WALK_STATE         *WalkState,
592
    ACPI_PARSE_OBJECT       *Op)
593
{
594
    UINT32                  Temp;
595
    UINT32                  CommandIndex;
596
    UINT32                  ParamCount;
597
    char                    *CommandLine;
598
    ACPI_STATUS             Status = AE_CTRL_TRUE;
599
 
600
 
601
    /* If AcpiTerminate has been called, terminate this thread */
602
 
603
    if (AcpiGbl_DbTerminateThreads)
604
    {
605
        return (AE_CTRL_TERMINATE);
606
    }
607
 
608
    ParamCount = AcpiDbGetLine (InputBuffer);
609
    CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
610
    Temp = 0;
611
 
612
    /* Verify that we have the minimum number of params */
613
 
614
    if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs)
615
    {
616
        AcpiOsPrintf ("%u parameters entered, [%s] requires %u parameters\n",
617
            ParamCount, AcpiGbl_DbCommands[CommandIndex].Name,
618
            AcpiGbl_DbCommands[CommandIndex].MinArgs);
619
 
620
        return (AE_CTRL_TRUE);
621
    }
622
 
623
    /* Decode and dispatch the command */
624
 
625
    switch (CommandIndex)
626
    {
627
    case CMD_NULL:
628
        if (Op)
629
        {
630
            return (AE_OK);
631
        }
632
        break;
633
 
634
    case CMD_ALLOCATIONS:
635
 
636
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
637
        AcpiUtDumpAllocations ((UINT32) -1, NULL);
638
#endif
639
        break;
640
 
641
    case CMD_ARGS:
642
    case CMD_ARGUMENTS:
643
        AcpiDbDisplayArguments ();
644
        break;
645
 
646
    case CMD_BATCH:
647
        AcpiDbBatchExecute (AcpiGbl_DbArgs[1]);
648
        break;
649
 
650
    case CMD_BREAKPOINT:
651
        AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op);
652
        break;
653
 
654
    case CMD_BUSINFO:
655
        AcpiDbGetBusInfo ();
656
        break;
657
 
658
    case CMD_CALL:
659
        AcpiDbSetMethodCallBreakpoint (Op);
660
        Status = AE_OK;
661
        break;
662
 
663
    case CMD_CLOSE:
664
        AcpiDbCloseDebugFile ();
665
        break;
666
 
667
    case CMD_DEBUG:
668
        AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], EX_SINGLE_STEP);
669
        break;
670
 
671
    case CMD_DISASSEMBLE:
672
        (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
673
        break;
674
 
675
    case CMD_DUMP:
676
        AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
677
        break;
678
 
679
    case CMD_ENABLEACPI:
680
        Status = AcpiEnable();
681
        if (ACPI_FAILURE(Status))
682
        {
683
            AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status);
684
            return (Status);
685
        }
686
        break;
687
 
688
    case CMD_EVENT:
689
        AcpiOsPrintf ("Event command not implemented\n");
690
        break;
691
 
692
    case CMD_EXECUTE:
693
        AcpiDbExecute (AcpiGbl_DbArgs[1],
694
            &AcpiGbl_DbArgs[2], EX_NO_SINGLE_STEP);
695
        break;
696
 
697
    case CMD_FIND:
698
        Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]);
699
        break;
700
 
701
    case CMD_GO:
702
        AcpiGbl_CmSingleStep = FALSE;
703
        return (AE_OK);
704
 
705
    case CMD_GPE:
706
        AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
707
        break;
708
 
709
    case CMD_GPES:
710
        AcpiDbDisplayGpes ();
711
        break;
712
 
713
    case CMD_HELP:
714
    case CMD_HELP2:
715
        AcpiDbDisplayHelp (AcpiGbl_DbArgs[1]);
716
        break;
717
 
718
    case CMD_HISTORY:
719
        AcpiDbDisplayHistory ();
720
        break;
721
 
722
    case CMD_HISTORY_EXE:
723
        CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]);
724
        if (!CommandLine)
725
        {
726
            return (AE_CTRL_TRUE);
727
        }
728
 
729
        Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
730
        return (Status);
731
 
732
    case CMD_HISTORY_LAST:
733
        CommandLine = AcpiDbGetFromHistory (NULL);
734
        if (!CommandLine)
735
        {
736
            return (AE_CTRL_TRUE);
737
        }
738
 
739
        Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
740
        return (Status);
741
 
742
    case CMD_INFORMATION:
743
        AcpiDbDisplayMethodInfo (Op);
744
        break;
745
 
746
    case CMD_INTEGRITY:
747
        AcpiDbCheckIntegrity ();
748
        break;
749
 
750
    case CMD_INTO:
751
        if (Op)
752
        {
753
            AcpiGbl_CmSingleStep = TRUE;
754
            return (AE_OK);
755
        }
756
        break;
757
 
758
    case CMD_LEVEL:
759
        if (ParamCount == 0)
760
        {
761
            AcpiOsPrintf ("Current debug level for file output is:    %8.8lX\n",
762
                AcpiGbl_DbDebugLevel);
763
            AcpiOsPrintf ("Current debug level for console output is: %8.8lX\n",
764
                AcpiGbl_DbConsoleDebugLevel);
765
        }
766
        else if (ParamCount == 2)
767
        {
768
            Temp = AcpiGbl_DbConsoleDebugLevel;
769
            AcpiGbl_DbConsoleDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1],
770
                                            NULL, 16);
771
            AcpiOsPrintf (
772
                "Debug Level for console output was %8.8lX, now %8.8lX\n",
773
                Temp, AcpiGbl_DbConsoleDebugLevel);
774
        }
775
        else
776
        {
777
            Temp = AcpiGbl_DbDebugLevel;
778
            AcpiGbl_DbDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1], NULL, 16);
779
            AcpiOsPrintf (
780
                "Debug Level for file output was %8.8lX, now %8.8lX\n",
781
                Temp, AcpiGbl_DbDebugLevel);
782
        }
783
        break;
784
 
785
    case CMD_LIST:
786
        AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
787
        break;
788
 
789
    case CMD_LOAD:
790
        Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL);
791
        break;
792
 
793
    case CMD_LOCKS:
794
        AcpiDbDisplayLocks ();
795
        break;
796
 
797
    case CMD_LOCALS:
798
        AcpiDbDisplayLocals ();
799
        break;
800
 
801
    case CMD_METHODS:
802
        Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]);
803
        break;
804
 
805
    case CMD_NAMESPACE:
806
        AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
807
        break;
808
 
809
    case CMD_NOTIFY:
810
        Temp = ACPI_STRTOUL (AcpiGbl_DbArgs[2], NULL, 0);
811
        AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp);
812
        break;
813
 
814
    case CMD_OBJECT:
815
        AcpiUtStrupr (AcpiGbl_DbArgs[1]);
816
        Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
817
        break;
818
 
819
    case CMD_OPEN:
820
        AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]);
821
        break;
822
 
823
    case CMD_OWNER:
824
        AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
825
        break;
826
 
827
    case CMD_PREDEFINED:
828
        AcpiDbCheckPredefinedNames ();
829
        break;
830
 
831
    case CMD_PREFIX:
832
        AcpiDbSetScope (AcpiGbl_DbArgs[1]);
833
        break;
834
 
835
    case CMD_REFERENCES:
836
        AcpiDbFindReferences (AcpiGbl_DbArgs[1]);
837
        break;
838
 
839
    case CMD_RESOURCES:
840
        AcpiDbDisplayResources (AcpiGbl_DbArgs[1]);
841
        break;
842
 
843
    case CMD_RESULTS:
844
        AcpiDbDisplayResults ();
845
        break;
846
 
847
    case CMD_SET:
848
        AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
849
            AcpiGbl_DbArgs[3]);
850
        break;
851
 
852
    case CMD_SLEEP:
853
        Status = AcpiDbSleep (AcpiGbl_DbArgs[1]);
854
        break;
855
 
856
    case CMD_STATS:
857
        Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]);
858
        break;
859
 
860
    case CMD_STOP:
861
        return (AE_NOT_IMPLEMENTED);
862
 
863
    case CMD_TABLES:
864
        AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]);
865
        break;
866
 
867
    case CMD_TERMINATE:
868
        AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
869
        AcpiUtSubsystemShutdown ();
870
 
871
        /*
872
         * TBD: [Restructure] Need some way to re-initialize without
873
         * re-creating the semaphores!
874
         */
875
 
876
        /*  AcpiInitialize (NULL);  */
877
        break;
878
 
879
    case CMD_THREADS:
880
        AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
881
            AcpiGbl_DbArgs[3]);
882
        break;
883
 
884
    case CMD_TRACE:
885
        (void) AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1);
886
        break;
887
 
888
    case CMD_TREE:
889
        AcpiDbDisplayCallingTree ();
890
        break;
891
 
892
    case CMD_TYPE:
893
        AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]);
894
        break;
895
 
896
    case CMD_UNLOAD:
897
        AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
898
        break;
899
 
900
    case CMD_EXIT:
901
    case CMD_QUIT:
902
        if (Op)
903
        {
904
            AcpiOsPrintf ("Method execution terminated\n");
905
            return (AE_CTRL_TERMINATE);
906
        }
907
 
908
        if (!AcpiGbl_DbOutputToFile)
909
        {
910
            AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
911
        }
912
 
913
        AcpiDbCloseDebugFile ();
914
        AcpiGbl_DbTerminateThreads = TRUE;
915
        return (AE_CTRL_TERMINATE);
916
 
917
    case CMD_NOT_FOUND:
918
    default:
919
        AcpiOsPrintf ("Unknown Command\n");
920
        return (AE_CTRL_TRUE);
921
    }
922
 
923
    if (ACPI_SUCCESS (Status))
924
    {
925
        Status = AE_CTRL_TRUE;
926
    }
927
 
928
    /* Add all commands that come here to the history buffer */
929
 
930
    AcpiDbAddToHistory (InputBuffer);
931
    return (Status);
932
}
933
 
934
 
935
/*******************************************************************************
936
 *
937
 * FUNCTION:    AcpiDbExecuteThread
938
 *
939
 * PARAMETERS:  Context         - Not used
940
 *
941
 * RETURN:      None
942
 *
943
 * DESCRIPTION: Debugger execute thread.  Waits for a command line, then
944
 *              simply dispatches it.
945
 *
946
 ******************************************************************************/
947
 
948
void ACPI_SYSTEM_XFACE
949
AcpiDbExecuteThread (
950
    void                    *Context)
951
{
952
    ACPI_STATUS             Status = AE_OK;
953
    ACPI_STATUS             MStatus;
954
 
955
 
956
    while (Status != AE_CTRL_TERMINATE)
957
    {
958
        AcpiGbl_MethodExecuting = FALSE;
959
        AcpiGbl_StepToNextCall = FALSE;
960
 
961
        MStatus = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
962
        if (ACPI_FAILURE (MStatus))
963
        {
964
            return;
965
        }
966
 
967
        Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
968
 
969
        MStatus = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
970
        if (ACPI_FAILURE (MStatus))
971
        {
972
            return;
973
        }
974
    }
975
}
976
 
977
 
978
/*******************************************************************************
979
 *
980
 * FUNCTION:    AcpiDbSingleThread
981
 *
982
 * PARAMETERS:  None
983
 *
984
 * RETURN:      None
985
 *
986
 * DESCRIPTION: Debugger execute thread.  Waits for a command line, then
987
 *              simply dispatches it.
988
 *
989
 ******************************************************************************/
990
 
991
static void
992
AcpiDbSingleThread (
993
    void)
994
{
995
 
996
    AcpiGbl_MethodExecuting = FALSE;
997
    AcpiGbl_StepToNextCall = FALSE;
998
 
999
    (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
1000
}
1001
 
1002
 
1003
/*******************************************************************************
1004
 *
1005
 * FUNCTION:    AcpiDbUserCommands
1006
 *
1007
 * PARAMETERS:  Prompt              - User prompt (depends on mode)
1008
 *              Op                  - Current executing parse op
1009
 *
1010
 * RETURN:      None
1011
 *
1012
 * DESCRIPTION: Command line execution for the AML debugger.  Commands are
1013
 *              matched and dispatched here.
1014
 *
1015
 ******************************************************************************/
1016
 
1017
ACPI_STATUS
1018
AcpiDbUserCommands (
1019
    char                    Prompt,
1020
    ACPI_PARSE_OBJECT       *Op)
1021
{
1022
    ACPI_STATUS             Status = AE_OK;
1023
 
1024
 
1025
    /* TBD: [Restructure] Need a separate command line buffer for step mode */
1026
 
1027
    while (!AcpiGbl_DbTerminateThreads)
1028
    {
1029
        /* Force output to console until a command is entered */
1030
 
1031
        AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
1032
 
1033
        /* Different prompt if method is executing */
1034
 
1035
        if (!AcpiGbl_MethodExecuting)
1036
        {
1037
            AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
1038
        }
1039
        else
1040
        {
1041
            AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
1042
        }
1043
 
1044
        /* Get the user input line */
1045
 
1046
        (void) AcpiOsGetLine (AcpiGbl_DbLineBuf);
1047
 
1048
        /* Check for single or multithreaded debug */
1049
 
1050
        if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED)
1051
        {
1052
            /*
1053
             * Signal the debug thread that we have a command to execute,
1054
             * and wait for the command to complete.
1055
             */
1056
            Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY);
1057
            if (ACPI_FAILURE (Status))
1058
            {
1059
                return (Status);
1060
            }
1061
 
1062
            Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
1063
            if (ACPI_FAILURE (Status))
1064
            {
1065
                return (Status);
1066
            }
1067
        }
1068
        else
1069
        {
1070
            /* Just call to the command line interpreter */
1071
 
1072
            AcpiDbSingleThread ();
1073
        }
1074
    }
1075
 
1076
    /*
1077
     * Only this thread (the original thread) should actually terminate the
1078
     * subsystem, because all the semaphores are deleted during termination
1079
     */
1080
    Status = AcpiTerminate ();
1081
    return (Status);
1082
}
1083
 
1084
#endif  /* ACPI_DEBUGGER */
1085