1/******************************************************************************
2 *
3 * Module Name: aslnamesp - Namespace output file generation
4 *
5 *****************************************************************************/
6
7/******************************************************************************
8 *
9 * 1. Copyright Notice
10 *
11 * Some or all of this work - Copyright (c) 1999 - 2016, 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#include "aslcompiler.h"
117#include "aslcompiler.y.h"
118#include "acnamesp.h"
119
120
121#define _COMPONENT          ACPI_COMPILER
122        ACPI_MODULE_NAME    ("aslnamesp")
123
124/* Local prototypes */
125
126static ACPI_STATUS
127NsDoOneNamespaceObject (
128    ACPI_HANDLE             ObjHandle,
129    UINT32                  Level,
130    void                    *Context,
131    void                    **ReturnValue);
132
133static ACPI_STATUS
134NsDoOnePathname (
135    ACPI_HANDLE             ObjHandle,
136    UINT32                  Level,
137    void                    *Context,
138    void                    **ReturnValue);
139
140
141/*******************************************************************************
142 *
143 * FUNCTION:    NsSetupNamespaceListing
144 *
145 * PARAMETERS:  Handle          - local file handle
146 *
147 * RETURN:      None
148 *
149 * DESCRIPTION: Set the namespace output file to the input handle
150 *
151 ******************************************************************************/
152
153void
154NsSetupNamespaceListing (
155    void                    *Handle)
156{
157
158    Gbl_NsOutputFlag = TRUE;
159    Gbl_Files[ASL_FILE_NAMESPACE_OUTPUT].Handle = Handle;
160}
161
162
163/*******************************************************************************
164 *
165 * FUNCTION:    NsDisplayNamespace
166 *
167 * PARAMETERS:  None
168 *
169 * RETURN:      Status
170 *
171 * DESCRIPTION: Walk the namespace an display information about each node
172 *              in the tree. Information is written to the optional
173 *              namespace output file.
174 *
175 ******************************************************************************/
176
177ACPI_STATUS
178NsDisplayNamespace (
179    void)
180{
181    ACPI_STATUS             Status;
182
183
184    if (!Gbl_NsOutputFlag)
185    {
186        return (AE_OK);
187    }
188
189    Gbl_NumNamespaceObjects = 0;
190
191    /* File header */
192
193    FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n");
194    FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Count  Depth    Name - Type\n\n");
195
196    /* Walk entire namespace from the root */
197
198    Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
199        ACPI_UINT32_MAX, FALSE, NsDoOneNamespaceObject, NULL,
200        NULL, NULL);
201
202    /* Print the full pathname for each namespace node */
203
204    FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\nNamespace pathnames\n\n");
205
206    Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
207        ACPI_UINT32_MAX, FALSE, NsDoOnePathname, NULL,
208        NULL, NULL);
209
210    return (Status);
211}
212
213
214/*******************************************************************************
215 *
216 * FUNCTION:    NsDoOneNamespaceObject
217 *
218 * PARAMETERS:  ACPI_WALK_CALLBACK
219 *
220 * RETURN:      Status
221 *
222 * DESCRIPTION: Dump a namespace object to the namespace output file.
223 *              Called during the walk of the namespace to dump all objects.
224 *
225 ******************************************************************************/
226
227static ACPI_STATUS
228NsDoOneNamespaceObject (
229    ACPI_HANDLE             ObjHandle,
230    UINT32                  Level,
231    void                    *Context,
232    void                    **ReturnValue)
233{
234    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
235    ACPI_OPERAND_OBJECT     *ObjDesc;
236    ACPI_PARSE_OBJECT       *Op;
237
238
239    Gbl_NumNamespaceObjects++;
240
241    FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%5u  [%u]  %*s %4.4s - %s",
242        Gbl_NumNamespaceObjects, Level, (Level * 3), " ",
243        &Node->Name, AcpiUtGetTypeName (Node->Type));
244
245    Op = Node->Op;
246    ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node->Object);
247
248    if (!Op)
249    {
250        FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
251        return (AE_OK);
252    }
253
254
255    if ((ObjDesc) &&
256        (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND))
257    {
258        switch (Node->Type)
259        {
260        case ACPI_TYPE_INTEGER:
261
262            FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
263                "       [Initial Value   0x%8.8X%8.8X]",
264                ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
265            break;
266
267        case ACPI_TYPE_STRING:
268
269            FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
270                "        [Initial Value   \"%s\"]",
271                ObjDesc->String.Pointer);
272            break;
273
274        default:
275
276            /* Nothing to do for other types */
277
278            break;
279        }
280
281    }
282    else
283    {
284        switch (Node->Type)
285        {
286        case ACPI_TYPE_INTEGER:
287
288            if (Op->Asl.ParseOpcode == PARSEOP_NAME)
289            {
290                Op = Op->Asl.Child;
291            }
292
293            if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
294                (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
295            {
296                Op = Op->Asl.Next;
297            }
298
299            FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
300                "       [Initial Value   0x%8.8X%8.8X]",
301                ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
302            break;
303
304        case ACPI_TYPE_STRING:
305
306            if (Op->Asl.ParseOpcode == PARSEOP_NAME)
307            {
308                Op = Op->Asl.Child;
309            }
310
311            if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
312                (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
313            {
314                Op = Op->Asl.Next;
315            }
316
317            FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
318                "        [Initial Value   \"%s\"]",
319                Op->Asl.Value.String);
320            break;
321
322        case ACPI_TYPE_LOCAL_REGION_FIELD:
323
324            if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
325                (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
326            {
327                Op = Op->Asl.Child;
328            }
329
330            FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
331                "   [Offset 0x%04X   Length 0x%04X bits]",
332                Op->Asl.Parent->Asl.ExtraValue, (UINT32) Op->Asl.Value.Integer);
333            break;
334
335        case ACPI_TYPE_BUFFER_FIELD:
336
337            switch (Op->Asl.ParseOpcode)
338            {
339            case PARSEOP_CREATEBYTEFIELD:
340
341                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [BYTE  ( 8 bit)]");
342                break;
343
344            case PARSEOP_CREATEDWORDFIELD:
345
346                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [DWORD (32 bit)]");
347                break;
348
349            case PARSEOP_CREATEQWORDFIELD:
350
351                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [QWORD (64 bit)]");
352                break;
353
354            case PARSEOP_CREATEWORDFIELD:
355
356                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [WORD  (16 bit)]");
357                break;
358
359            case PARSEOP_CREATEBITFIELD:
360
361                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [BIT   ( 1 bit)]");
362                break;
363
364            case PARSEOP_CREATEFIELD:
365
366                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "   [Arbitrary Bit Field]");
367                break;
368
369            default:
370
371                break;
372
373            }
374            break;
375
376        case ACPI_TYPE_PACKAGE:
377
378            if (Op->Asl.ParseOpcode == PARSEOP_NAME)
379            {
380                Op = Op->Asl.Child;
381            }
382
383            if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
384                (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
385            {
386                Op = Op->Asl.Next;
387            }
388
389            Op = Op->Asl.Child;
390
391            if ((Op->Asl.ParseOpcode == PARSEOP_BYTECONST) ||
392                (Op->Asl.ParseOpcode == PARSEOP_RAW_DATA))
393            {
394                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
395                    "       [Initial Length  0x%.2X elements]",
396                    Op->Asl.Value.Integer);
397            }
398            break;
399
400        case ACPI_TYPE_BUFFER:
401
402            if (Op->Asl.ParseOpcode == PARSEOP_NAME)
403            {
404                Op = Op->Asl.Child;
405            }
406
407            if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG)  ||
408                (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
409            {
410                Op = Op->Asl.Next;
411            }
412
413            Op = Op->Asl.Child;
414
415            if (Op && (Op->Asl.ParseOpcode == PARSEOP_INTEGER))
416            {
417                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
418                    "        [Initial Length  0x%.2X bytes]",
419                    Op->Asl.Value.Integer);
420            }
421            break;
422
423        case ACPI_TYPE_METHOD:
424
425            FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
426                "        [Code Length     0x%.4X bytes]",
427                Op->Asl.AmlSubtreeLength);
428            break;
429
430        case ACPI_TYPE_LOCAL_RESOURCE:
431
432            FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
433                "  [Desc Offset     0x%.4X Bytes]", Node->Value);
434            break;
435
436        case ACPI_TYPE_LOCAL_RESOURCE_FIELD:
437
438            FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
439                "   [Field Offset    0x%.4X Bits 0x%.4X Bytes] ",
440                Node->Value, Node->Value / 8);
441
442            if (Node->Flags & ANOBJ_IS_REFERENCED)
443            {
444                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
445                    "Referenced");
446            }
447            else
448            {
449                FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
450                    "Name not referenced");
451            }
452            break;
453
454        default:
455
456            /* Nothing to do for other types */
457
458            break;
459        }
460    }
461
462    FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
463    return (AE_OK);
464}
465
466
467/*******************************************************************************
468 *
469 * FUNCTION:    NsDoOnePathname
470 *
471 * PARAMETERS:  ACPI_WALK_CALLBACK
472 *
473 * RETURN:      Status
474 *
475 * DESCRIPTION: Print the full pathname for a namespace node.
476 *
477 ******************************************************************************/
478
479static ACPI_STATUS
480NsDoOnePathname (
481    ACPI_HANDLE             ObjHandle,
482    UINT32                  Level,
483    void                    *Context,
484    void                    **ReturnValue)
485{
486    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
487    ACPI_STATUS             Status;
488    ACPI_BUFFER             TargetPath;
489
490
491    TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
492    Status = AcpiNsHandleToPathname (Node, &TargetPath, FALSE);
493    if (ACPI_FAILURE (Status))
494    {
495        return (Status);
496    }
497
498    FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%s\n", TargetPath.Pointer);
499    ACPI_FREE (TargetPath.Pointer);
500    return (AE_OK);
501}
502