Subversion Repositories Kolibri OS

Rev

Rev 1498 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1498 serge 1
/*******************************************************************************
2
 *
3
 * Module Name: dmobject - ACPI object decode and display
4
 *
5
 ******************************************************************************/
6
 
7
/******************************************************************************
8
 *
9
 * 1. Copyright Notice
10
 *
2216 Serge 11
 * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
1498 serge 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 "acnamesp.h"
120
#include "acdisasm.h"
121
 
122
 
123
#ifdef ACPI_DISASSEMBLER
124
 
125
#define _COMPONENT          ACPI_CA_DEBUGGER
126
        ACPI_MODULE_NAME    ("dmnames")
127
 
128
/* Local prototypes */
129
 
130
static void
131
AcpiDmDecodeNode (
132
    ACPI_NAMESPACE_NODE     *Node);
133
 
134
 
135
/*******************************************************************************
136
 *
137
 * FUNCTION:    AcpiDmDumpMethodInfo
138
 *
139
 * PARAMETERS:  Status          - Method execution status
140
 *              WalkState       - Current state of the parse tree walk
141
 *              Op              - Executing parse op
142
 *
143
 * RETURN:      None
144
 *
145
 * DESCRIPTION: Called when a method has been aborted because of an error.
146
 *              Dumps the method execution stack, and the method locals/args,
147
 *              and disassembles the AML opcode that failed.
148
 *
149
 ******************************************************************************/
150
 
151
void
152
AcpiDmDumpMethodInfo (
153
    ACPI_STATUS             Status,
154
    ACPI_WALK_STATE         *WalkState,
155
    ACPI_PARSE_OBJECT       *Op)
156
{
157
    ACPI_PARSE_OBJECT       *Next;
158
    ACPI_THREAD_STATE       *Thread;
159
    ACPI_WALK_STATE         *NextWalkState;
160
    ACPI_NAMESPACE_NODE     *PreviousMethod = NULL;
161
 
162
 
163
    /* Ignore control codes, they are not errors */
164
 
165
    if ((Status & AE_CODE_MASK) == AE_CODE_CONTROL)
166
    {
167
        return;
168
    }
169
 
170
    /* We may be executing a deferred opcode */
171
 
172
    if (WalkState->DeferredNode)
173
    {
174
        AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
175
        return;
176
    }
177
 
178
    /*
179
     * If there is no Thread, we are not actually executing a method.
180
     * This can happen when the iASL compiler calls the interpreter
181
     * to perform constant folding.
182
     */
183
    Thread = WalkState->Thread;
184
    if (!Thread)
185
    {
186
        return;
187
    }
188
 
189
    /* Display exception and method name */
190
 
191
    AcpiOsPrintf ("\n**** Exception %s during execution of method ",
192
        AcpiFormatException (Status));
193
    AcpiNsPrintNodePathname (WalkState->MethodNode, NULL);
194
 
195
    /* Display stack of executing methods */
196
 
197
    AcpiOsPrintf ("\n\nMethod Execution Stack:\n");
198
    NextWalkState = Thread->WalkStateList;
199
 
200
    /* Walk list of linked walk states */
201
 
202
    while (NextWalkState)
203
    {
204
        AcpiOsPrintf ("    Method [%4.4s] executing: ",
205
                AcpiUtGetNodeName (NextWalkState->MethodNode));
206
 
207
        /* First method is the currently executing method */
208
 
209
        if (NextWalkState == WalkState)
210
        {
211
            if (Op)
212
            {
213
                /* Display currently executing ASL statement */
214
 
215
                Next = Op->Common.Next;
216
                Op->Common.Next = NULL;
217
 
218
                AcpiDmDisassemble (NextWalkState, Op, ACPI_UINT32_MAX);
219
                Op->Common.Next = Next;
220
            }
221
        }
222
        else
223
        {
224
            /*
225
             * This method has called another method
226
             * NOTE: the method call parse subtree is already deleted at this
227
             * point, so we cannot disassemble the method invocation.
228
             */
229
            AcpiOsPrintf ("Call to method ");
230
            AcpiNsPrintNodePathname (PreviousMethod, NULL);
231
        }
232
 
233
        PreviousMethod = NextWalkState->MethodNode;
234
        NextWalkState = NextWalkState->Next;
235
        AcpiOsPrintf ("\n");
236
    }
237
 
238
    /* Display the method locals and arguments */
239
 
240
    AcpiOsPrintf ("\n");
241
    AcpiDmDisplayLocals (WalkState);
242
    AcpiOsPrintf ("\n");
243
    AcpiDmDisplayArguments (WalkState);
244
    AcpiOsPrintf ("\n");
245
}
246
 
247
 
248
/*******************************************************************************
249
 *
250
 * FUNCTION:    AcpiDmDecodeInternalObject
251
 *
252
 * PARAMETERS:  ObjDesc         - Object to be displayed
253
 *
254
 * RETURN:      None
255
 *
256
 * DESCRIPTION: Short display of an internal object.  Numbers/Strings/Buffers.
257
 *
258
 ******************************************************************************/
259
 
260
void
261
AcpiDmDecodeInternalObject (
262
    ACPI_OPERAND_OBJECT     *ObjDesc)
263
{
264
    UINT32                  i;
265
 
266
 
267
    if (!ObjDesc)
268
    {
269
        AcpiOsPrintf (" Uninitialized");
270
        return;
271
    }
272
 
273
    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
274
    {
275
        AcpiOsPrintf (" %p [%s]", ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
276
        return;
277
    }
278
 
279
    AcpiOsPrintf (" %s", AcpiUtGetObjectTypeName (ObjDesc));
280
 
281
    switch (ObjDesc->Common.Type)
282
    {
283
    case ACPI_TYPE_INTEGER:
284
 
285
        AcpiOsPrintf (" %8.8X%8.8X",
286
                ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
287
        break;
288
 
289
 
290
    case ACPI_TYPE_STRING:
291
 
292
        AcpiOsPrintf ("(%u) \"%.24s",
293
                ObjDesc->String.Length, ObjDesc->String.Pointer);
294
 
295
        if (ObjDesc->String.Length > 24)
296
        {
297
            AcpiOsPrintf ("...");
298
        }
299
        else
300
        {
301
            AcpiOsPrintf ("\"");
302
        }
303
        break;
304
 
305
 
306
    case ACPI_TYPE_BUFFER:
307
 
308
        AcpiOsPrintf ("(%u)", ObjDesc->Buffer.Length);
309
        for (i = 0; (i < 8) && (i < ObjDesc->Buffer.Length); i++)
310
        {
311
            AcpiOsPrintf (" %2.2X", ObjDesc->Buffer.Pointer[i]);
312
        }
313
        break;
314
 
315
 
316
    default:
317
 
318
        AcpiOsPrintf (" %p", ObjDesc);
319
        break;
320
    }
321
}
322
 
323
 
324
/*******************************************************************************
325
 *
326
 * FUNCTION:    AcpiDmDecodeNode
327
 *
328
 * PARAMETERS:  Node        - Object to be displayed
329
 *
330
 * RETURN:      None
331
 *
332
 * DESCRIPTION: Short display of a namespace node
333
 *
334
 ******************************************************************************/
335
 
336
static void
337
AcpiDmDecodeNode (
338
    ACPI_NAMESPACE_NODE     *Node)
339
{
340
 
341
    AcpiOsPrintf ("            Name %4.4s",
342
            AcpiUtGetNodeName (Node));
343
 
344
    if (Node->Flags & ANOBJ_METHOD_ARG)
345
    {
346
        AcpiOsPrintf (" [Method Arg]");
347
    }
348
    if (Node->Flags & ANOBJ_METHOD_LOCAL)
349
    {
350
        AcpiOsPrintf (" [Method Local]");
351
    }
352
 
353
    switch (Node->Type)
354
    {
355
    /* These types have no attached object */
356
 
357
    case ACPI_TYPE_DEVICE:
358
        AcpiOsPrintf (" Device");
359
        break;
360
 
361
    case ACPI_TYPE_THERMAL:
362
        AcpiOsPrintf (" Thermal Zone");
363
        break;
364
 
365
    default:
366
        AcpiDmDecodeInternalObject (AcpiNsGetAttachedObject (Node));
367
        break;
368
    }
369
}
370
 
371
 
372
/*******************************************************************************
373
 *
374
 * FUNCTION:    AcpiDmDisplayInternalObject
375
 *
376
 * PARAMETERS:  ObjDesc         - Object to be displayed
377
 *              WalkState       - Current walk state
378
 *
379
 * RETURN:      None
380
 *
381
 * DESCRIPTION: Short display of an internal object
382
 *
383
 ******************************************************************************/
384
 
385
void
386
AcpiDmDisplayInternalObject (
387
    ACPI_OPERAND_OBJECT     *ObjDesc,
388
    ACPI_WALK_STATE         *WalkState)
389
{
390
    UINT8                   Type;
391
 
392
 
393
    AcpiOsPrintf ("%p ", ObjDesc);
394
 
395
    if (!ObjDesc)
396
    {
397
        AcpiOsPrintf ("\n");
398
        return;
399
    }
400
 
401
    /* Decode the object type */
402
 
403
    switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
404
    {
405
    case ACPI_DESC_TYPE_PARSER:
406
 
407
        AcpiOsPrintf ("  ");
408
        break;
409
 
410
 
411
    case ACPI_DESC_TYPE_NAMED:
412
 
413
        AcpiDmDecodeNode ((ACPI_NAMESPACE_NODE *) ObjDesc);
414
        break;
415
 
416
 
417
    case ACPI_DESC_TYPE_OPERAND:
418
 
419
        Type = ObjDesc->Common.Type;
420
        if (Type > ACPI_TYPE_LOCAL_MAX)
421
        {
422
            AcpiOsPrintf (" Type %X [Invalid Type]", (UINT32) Type);
423
            return;
424
        }
425
 
426
        /* Decode the ACPI object type */
427
 
428
        switch (ObjDesc->Common.Type)
429
        {
430
        case ACPI_TYPE_LOCAL_REFERENCE:
431
 
432
            AcpiOsPrintf ("[%s] ", AcpiUtGetReferenceName (ObjDesc));
433
 
434
            /* Decode the refererence */
435
 
436
            switch (ObjDesc->Reference.Class)
437
            {
438
            case ACPI_REFCLASS_LOCAL:
439
 
440
                AcpiOsPrintf ("%X ", ObjDesc->Reference.Value);
441
                if (WalkState)
442
                {
443
                    ObjDesc = WalkState->LocalVariables
444
                                [ObjDesc->Reference.Value].Object;
445
                    AcpiOsPrintf ("%p", ObjDesc);
446
                    AcpiDmDecodeInternalObject (ObjDesc);
447
                }
448
                break;
449
 
450
 
451
            case ACPI_REFCLASS_ARG:
452
 
453
                AcpiOsPrintf ("%X ", ObjDesc->Reference.Value);
454
                if (WalkState)
455
                {
456
                    ObjDesc = WalkState->Arguments
457
                                [ObjDesc->Reference.Value].Object;
458
                    AcpiOsPrintf ("%p", ObjDesc);
459
                    AcpiDmDecodeInternalObject (ObjDesc);
460
                }
461
                break;
462
 
463
 
464
            case ACPI_REFCLASS_INDEX:
465
 
466
                switch (ObjDesc->Reference.TargetType)
467
                {
468
                case ACPI_TYPE_BUFFER_FIELD:
469
 
470
                    AcpiOsPrintf ("%p", ObjDesc->Reference.Object);
471
                    AcpiDmDecodeInternalObject (ObjDesc->Reference.Object);
472
                    break;
473
 
474
                case ACPI_TYPE_PACKAGE:
475
 
476
                    AcpiOsPrintf ("%p", ObjDesc->Reference.Where);
477
                    if (!ObjDesc->Reference.Where)
478
                    {
479
                        AcpiOsPrintf (" Uninitialized WHERE pointer");
480
                    }
481
                    else
482
                    {
483
                        AcpiDmDecodeInternalObject (
484
                            *(ObjDesc->Reference.Where));
485
                    }
486
                    break;
487
 
488
                default:
489
 
490
                    AcpiOsPrintf ("Unknown index target type");
491
                    break;
492
                }
493
                break;
494
 
495
 
496
            case ACPI_REFCLASS_REFOF:
497
 
498
                if (!ObjDesc->Reference.Object)
499
                {
500
                    AcpiOsPrintf ("Uninitialized reference subobject pointer");
501
                    break;
502
                }
503
 
504
                /* Reference can be to a Node or an Operand object */
505
 
506
                switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc->Reference.Object))
507
                {
508
                case ACPI_DESC_TYPE_NAMED:
509
                    AcpiDmDecodeNode (ObjDesc->Reference.Object);
510
                    break;
511
 
512
                case ACPI_DESC_TYPE_OPERAND:
513
                    AcpiDmDecodeInternalObject (ObjDesc->Reference.Object);
514
                    break;
515
 
516
                default:
517
                    break;
518
                }
519
                break;
520
 
521
 
522
            case ACPI_REFCLASS_NAME:
523
 
524
                AcpiDmDecodeNode (ObjDesc->Reference.Node);
525
                break;
526
 
527
 
528
            case ACPI_REFCLASS_DEBUG:
529
            case ACPI_REFCLASS_TABLE:
530
 
531
                AcpiOsPrintf ("\n");
532
                break;
533
 
534
 
535
            default:    /* Unknown reference class */
536
 
537
                AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
538
                break;
539
            }
540
            break;
541
 
542
 
543
        default:
544
 
545
            AcpiOsPrintf ("            ");
546
            AcpiDmDecodeInternalObject (ObjDesc);
547
            break;
548
        }
549
        break;
550
 
551
 
552
    default:
553
 
554
        AcpiOsPrintf (" [%s]",
555
            AcpiUtGetDescriptorName (ObjDesc));
556
        break;
557
    }
558
 
559
    AcpiOsPrintf ("\n");
560
}
561
 
562
 
563
/*******************************************************************************
564
 *
565
 * FUNCTION:    AcpiDmDisplayLocals
566
 *
567
 * PARAMETERS:  WalkState       - State for current method
568
 *
569
 * RETURN:      None
570
 *
571
 * DESCRIPTION: Display all locals for the currently running control method
572
 *
573
 ******************************************************************************/
574
 
575
void
576
AcpiDmDisplayLocals (
577
    ACPI_WALK_STATE         *WalkState)
578
{
579
    UINT32                  i;
580
    ACPI_OPERAND_OBJECT     *ObjDesc;
581
    ACPI_NAMESPACE_NODE     *Node;
582
 
583
 
584
    ObjDesc = WalkState->MethodDesc;
585
    Node    = WalkState->MethodNode;
586
    if (!Node)
587
    {
588
        AcpiOsPrintf (
589
            "No method node (Executing subtree for buffer or opregion)\n");
590
        return;
591
    }
592
 
593
    if (Node->Type != ACPI_TYPE_METHOD)
594
    {
595
        AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
596
        return;
597
    }
598
 
599
    AcpiOsPrintf ("Local Variables for method [%4.4s]:\n",
600
            AcpiUtGetNodeName (Node));
601
 
602
    for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
603
    {
604
        ObjDesc = WalkState->LocalVariables[i].Object;
605
        AcpiOsPrintf ("    Local%X: ", i);
606
        AcpiDmDisplayInternalObject (ObjDesc, WalkState);
607
    }
608
}
609
 
610
 
611
/*******************************************************************************
612
 *
613
 * FUNCTION:    AcpiDmDisplayArguments
614
 *
615
 * PARAMETERS:  WalkState       - State for current method
616
 *
617
 * RETURN:      None
618
 *
619
 * DESCRIPTION: Display all arguments for the currently running control method
620
 *
621
 ******************************************************************************/
622
 
623
void
624
AcpiDmDisplayArguments (
625
    ACPI_WALK_STATE         *WalkState)
626
{
627
    UINT32                  i;
628
    ACPI_OPERAND_OBJECT     *ObjDesc;
629
    ACPI_NAMESPACE_NODE     *Node;
630
 
631
 
632
    ObjDesc = WalkState->MethodDesc;
633
    Node    = WalkState->MethodNode;
634
    if (!Node)
635
    {
636
        AcpiOsPrintf (
637
            "No method node (Executing subtree for buffer or opregion)\n");
638
        return;
639
    }
640
 
641
    if (Node->Type != ACPI_TYPE_METHOD)
642
    {
643
        AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
644
        return;
645
    }
646
 
647
    AcpiOsPrintf (
648
        "Arguments for Method [%4.4s]:  (%X arguments defined, max concurrency = %X)\n",
649
        AcpiUtGetNodeName (Node), ObjDesc->Method.ParamCount, ObjDesc->Method.SyncLevel);
650
 
651
    for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
652
    {
653
        ObjDesc = WalkState->Arguments[i].Object;
654
        AcpiOsPrintf ("    Arg%u:   ", i);
655
        AcpiDmDisplayInternalObject (ObjDesc, WalkState);
656
    }
657
}
658
 
659
#endif
660