17c9678bcSSascha Wildner /******************************************************************************
27c9678bcSSascha Wildner *
37c9678bcSSascha Wildner * Module Name: aslxrefout.c - support for optional cross-reference file
47c9678bcSSascha Wildner *
57c9678bcSSascha Wildner *****************************************************************************/
67c9678bcSSascha Wildner
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner *
9b4315fc7SSascha Wildner * 1. Copyright Notice
10b4315fc7SSascha Wildner *
11*383048acSSascha Wildner * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
127c9678bcSSascha Wildner * All rights reserved.
137c9678bcSSascha Wildner *
14b4315fc7SSascha Wildner * 2. License
15b4315fc7SSascha Wildner *
16b4315fc7SSascha Wildner * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner * property rights.
20b4315fc7SSascha Wildner *
21b4315fc7SSascha Wildner * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner *
28b4315fc7SSascha Wildner * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner *
37b4315fc7SSascha Wildner * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner * conditions are met:
39b4315fc7SSascha Wildner *
40b4315fc7SSascha Wildner * 3. Conditions
41b4315fc7SSascha Wildner *
42b4315fc7SSascha Wildner * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner *
54b4315fc7SSascha Wildner * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner * make.
65b4315fc7SSascha Wildner *
66b4315fc7SSascha Wildner * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner * distribution.
71b4315fc7SSascha Wildner *
72b4315fc7SSascha Wildner * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner * Intel Code.
74b4315fc7SSascha Wildner *
75b4315fc7SSascha Wildner * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner * without prior written authorization from Intel.
79b4315fc7SSascha Wildner *
80b4315fc7SSascha Wildner * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner *
82b4315fc7SSascha Wildner * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner *
90b4315fc7SSascha Wildner * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner * LIMITED REMEDY.
98b4315fc7SSascha Wildner *
99b4315fc7SSascha Wildner * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner * such license, approval or letter.
113b4315fc7SSascha Wildner *
114b4315fc7SSascha Wildner *****************************************************************************
115b4315fc7SSascha Wildner *
116b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner * following license:
118b4315fc7SSascha Wildner *
1197c9678bcSSascha Wildner * Redistribution and use in source and binary forms, with or without
1207c9678bcSSascha Wildner * modification, are permitted provided that the following conditions
1217c9678bcSSascha Wildner * are met:
1227c9678bcSSascha Wildner * 1. Redistributions of source code must retain the above copyright
1237c9678bcSSascha Wildner * notice, this list of conditions, and the following disclaimer,
1247c9678bcSSascha Wildner * without modification.
1257c9678bcSSascha Wildner * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1267c9678bcSSascha Wildner * substantially similar to the "NO WARRANTY" disclaimer below
1277c9678bcSSascha Wildner * ("Disclaimer") and any redistribution must be conditioned upon
1287c9678bcSSascha Wildner * including a substantially similar Disclaimer requirement for further
1297c9678bcSSascha Wildner * binary redistribution.
1307c9678bcSSascha Wildner * 3. Neither the names of the above-listed copyright holders nor the names
1317c9678bcSSascha Wildner * of any contributors may be used to endorse or promote products derived
1327c9678bcSSascha Wildner * from this software without specific prior written permission.
1337c9678bcSSascha Wildner *
134b4315fc7SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner *
146b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the
1477c9678bcSSascha Wildner * GNU General Public License ("GPL") version 2 as published by the Free
1487c9678bcSSascha Wildner * Software Foundation.
1497c9678bcSSascha Wildner *
150b4315fc7SSascha Wildner *****************************************************************************/
1517c9678bcSSascha Wildner
1527c9678bcSSascha Wildner #include "aslcompiler.h"
1537c9678bcSSascha Wildner #include "aslcompiler.y.h"
1547c9678bcSSascha Wildner #include "acnamesp.h"
1557c9678bcSSascha Wildner #include "acparser.h"
1567c9678bcSSascha Wildner #include "amlcode.h"
1577c9678bcSSascha Wildner
1587c9678bcSSascha Wildner #define _COMPONENT ACPI_COMPILER
1597c9678bcSSascha Wildner ACPI_MODULE_NAME ("aslxrefout")
1607c9678bcSSascha Wildner
1617c9678bcSSascha Wildner
1627c9678bcSSascha Wildner /* Local prototypes */
1637c9678bcSSascha Wildner
1647c9678bcSSascha Wildner static ACPI_STATUS
1657c9678bcSSascha Wildner OtXrefWalkPart2 (
1667c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
1677c9678bcSSascha Wildner UINT32 Level,
1687c9678bcSSascha Wildner void *Context);
1697c9678bcSSascha Wildner
1707c9678bcSSascha Wildner static ACPI_STATUS
1717c9678bcSSascha Wildner OtXrefWalkPart3 (
1727c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
1737c9678bcSSascha Wildner UINT32 Level,
1747c9678bcSSascha Wildner void *Context);
1757c9678bcSSascha Wildner
1767c9678bcSSascha Wildner static ACPI_STATUS
1777c9678bcSSascha Wildner OtXrefAnalysisWalkPart1 (
1787c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
1797c9678bcSSascha Wildner UINT32 Level,
1807c9678bcSSascha Wildner void *Context);
1817c9678bcSSascha Wildner
1827c9678bcSSascha Wildner
1837c9678bcSSascha Wildner static ACPI_STATUS
1847c9678bcSSascha Wildner OtXrefAnalysisWalkPart2 (
1857c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
1867c9678bcSSascha Wildner UINT32 Level,
1877c9678bcSSascha Wildner void *Context);
1887c9678bcSSascha Wildner
1897c9678bcSSascha Wildner static ACPI_STATUS
1907c9678bcSSascha Wildner OtXrefAnalysisWalkPart3 (
1917c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
1927c9678bcSSascha Wildner UINT32 Level,
1937c9678bcSSascha Wildner void *Context);
1947c9678bcSSascha Wildner
1957c9678bcSSascha Wildner
1967c9678bcSSascha Wildner /*******************************************************************************
1977c9678bcSSascha Wildner *
1987c9678bcSSascha Wildner * FUNCTION: OtPrintHeaders
1997c9678bcSSascha Wildner *
2007c9678bcSSascha Wildner * PARAMETERS: Message - Main header message
2017c9678bcSSascha Wildner *
2027c9678bcSSascha Wildner * RETURN: None
2037c9678bcSSascha Wildner *
2047c9678bcSSascha Wildner * DESCRIPTION: Emits the main header message along with field descriptions
2057c9678bcSSascha Wildner *
2067c9678bcSSascha Wildner ******************************************************************************/
2077c9678bcSSascha Wildner
2087c9678bcSSascha Wildner void
OtPrintHeaders(char * Message)2097c9678bcSSascha Wildner OtPrintHeaders (
2107c9678bcSSascha Wildner char *Message)
2117c9678bcSSascha Wildner {
2127c9678bcSSascha Wildner UINT32 Length;
2137c9678bcSSascha Wildner
2147c9678bcSSascha Wildner
2157c9678bcSSascha Wildner Length = strlen (Message);
2167c9678bcSSascha Wildner
2177c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\n%s\n", Message);
2187c9678bcSSascha Wildner while (Length)
2197c9678bcSSascha Wildner {
2207c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, "-");
2217c9678bcSSascha Wildner Length--;
2227c9678bcSSascha Wildner }
2237c9678bcSSascha Wildner
2247c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\nLineno %-40s Description\n",
2257c9678bcSSascha Wildner "Full Pathname");
2267c9678bcSSascha Wildner }
2277c9678bcSSascha Wildner
2287c9678bcSSascha Wildner
2297c9678bcSSascha Wildner /*******************************************************************************
2307c9678bcSSascha Wildner *
2317c9678bcSSascha Wildner * FUNCTION: OtCreateXrefFile
2327c9678bcSSascha Wildner *
2337c9678bcSSascha Wildner * PARAMETERS: None
2347c9678bcSSascha Wildner *
2357c9678bcSSascha Wildner * RETURN: None
2367c9678bcSSascha Wildner *
2377c9678bcSSascha Wildner * DESCRIPTION Main entry point for parts 2 and 3 of the cross-reference
2387c9678bcSSascha Wildner * file.
2397c9678bcSSascha Wildner *
2407c9678bcSSascha Wildner ******************************************************************************/
2417c9678bcSSascha Wildner
2427c9678bcSSascha Wildner void
OtCreateXrefFile(void)2437c9678bcSSascha Wildner OtCreateXrefFile (
2447c9678bcSSascha Wildner void)
2457c9678bcSSascha Wildner {
2467c9678bcSSascha Wildner ASL_XREF_INFO XrefInfo;
2477c9678bcSSascha Wildner
2487c9678bcSSascha Wildner
2497c9678bcSSascha Wildner /* Build cross-reference output file if requested */
2507c9678bcSSascha Wildner
251806343b9SSascha Wildner if (!AslGbl_CrossReferenceOutput)
2527c9678bcSSascha Wildner {
2537c9678bcSSascha Wildner return;
2547c9678bcSSascha Wildner }
2557c9678bcSSascha Wildner
2567c9678bcSSascha Wildner memset (&XrefInfo, 0, sizeof (ASL_XREF_INFO));
2577c9678bcSSascha Wildner
2587c9678bcSSascha Wildner /* Cross-reference output file, part 2 (Method invocations) */
2597c9678bcSSascha Wildner
2607c9678bcSSascha Wildner OtPrintHeaders ("Part 2: Method Reference Map "
2617c9678bcSSascha Wildner "(Invocations of each user-defined control method)");
2627c9678bcSSascha Wildner
263806343b9SSascha Wildner TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
2647c9678bcSSascha Wildner OtXrefWalkPart2, NULL, &XrefInfo);
2657c9678bcSSascha Wildner
2667c9678bcSSascha Wildner /* Cross-reference output file, part 3 (All other object refs) */
2677c9678bcSSascha Wildner
2687c9678bcSSascha Wildner OtPrintHeaders ("Part 3: Full Object Reference Map "
2697c9678bcSSascha Wildner "(Methods that reference each object in namespace");
2707c9678bcSSascha Wildner
271806343b9SSascha Wildner TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
2727c9678bcSSascha Wildner OtXrefWalkPart3, NULL, &XrefInfo);
2737c9678bcSSascha Wildner
2747c9678bcSSascha Wildner /* Cross-reference summary */
2757c9678bcSSascha Wildner
2767c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\nObject Summary\n");
2777c9678bcSSascha Wildner
2787c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
2797c9678bcSSascha Wildner "\nTotal methods: %u\n",
2807c9678bcSSascha Wildner XrefInfo.TotalPredefinedMethods + XrefInfo.TotalUserMethods);
2817c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
2827c9678bcSSascha Wildner "Total predefined methods: %u\n",
2837c9678bcSSascha Wildner XrefInfo.TotalPredefinedMethods);
2847c9678bcSSascha Wildner
2857c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
2867c9678bcSSascha Wildner "\nTotal user methods: %u\n",
2877c9678bcSSascha Wildner XrefInfo.TotalUserMethods);
2887c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
2897c9678bcSSascha Wildner "Total unreferenced user methods %u\n",
2907c9678bcSSascha Wildner XrefInfo.TotalUnreferenceUserMethods);
2917c9678bcSSascha Wildner
2927c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
2937c9678bcSSascha Wildner "\nTotal defined objects: %u\n",
2947c9678bcSSascha Wildner XrefInfo.TotalObjects);
2957c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
2967c9678bcSSascha Wildner "Total unreferenced objects: %u\n",
2977c9678bcSSascha Wildner XrefInfo.TotalUnreferencedObjects);
2987c9678bcSSascha Wildner }
2997c9678bcSSascha Wildner
3007c9678bcSSascha Wildner
3017c9678bcSSascha Wildner /*
3027c9678bcSSascha Wildner * Part 1 of the cross reference file. This part emits the namespace objects
3037c9678bcSSascha Wildner * that are referenced by each control method in the namespace.
3047c9678bcSSascha Wildner *
3057c9678bcSSascha Wildner * Part 2 and 3 are below part 1.
3067c9678bcSSascha Wildner */
3077c9678bcSSascha Wildner
3087c9678bcSSascha Wildner /*******************************************************************************
3097c9678bcSSascha Wildner *
3107c9678bcSSascha Wildner * FUNCTION: OtXrefWalkPart1
3117c9678bcSSascha Wildner *
3127c9678bcSSascha Wildner * PARAMETERS: Op - Current parse Op
3137c9678bcSSascha Wildner * Level - Current tree nesting level
3147c9678bcSSascha Wildner * MethodInfo - Info block for the current method
3157c9678bcSSascha Wildner *
3167c9678bcSSascha Wildner *
3177c9678bcSSascha Wildner * RETURN: None
3187c9678bcSSascha Wildner *
3197c9678bcSSascha Wildner * DESCRIPTION: Entry point for the creation of the method call reference map.
3207c9678bcSSascha Wildner * For each control method in the namespace, all other methods
3217c9678bcSSascha Wildner * that invoke the method are listed. Predefined names/methods
3227c9678bcSSascha Wildner * that start with an underscore are ignored, because these are
3237c9678bcSSascha Wildner * essentially external/public interfaces.
3247c9678bcSSascha Wildner
3257c9678bcSSascha Wildner * DESCRIPTION: Entry point for the creation of the object reference map.
3267c9678bcSSascha Wildner * For each control method in the namespace, all objects that
3277c9678bcSSascha Wildner * are referenced by the method are listed.
3287c9678bcSSascha Wildner *
3297c9678bcSSascha Wildner * Called during a normal namespace walk, once per namespace
3307c9678bcSSascha Wildner * object. (MtMethodAnalysisWalkBegin)
3317c9678bcSSascha Wildner *
3327c9678bcSSascha Wildner ******************************************************************************/
3337c9678bcSSascha Wildner
3347c9678bcSSascha Wildner void
OtXrefWalkPart1(ACPI_PARSE_OBJECT * Op,UINT32 Level,ASL_METHOD_INFO * MethodInfo)3357c9678bcSSascha Wildner OtXrefWalkPart1 (
3367c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
3377c9678bcSSascha Wildner UINT32 Level,
3387c9678bcSSascha Wildner ASL_METHOD_INFO *MethodInfo)
3397c9678bcSSascha Wildner {
3407c9678bcSSascha Wildner ACPI_NAMESPACE_NODE *Node;
3417c9678bcSSascha Wildner ACPI_PARSE_OBJECT *NextOp;
3427c9678bcSSascha Wildner ACPI_PARSE_OBJECT *FieldOp;
3437c9678bcSSascha Wildner char *ParentPath;
3447c9678bcSSascha Wildner UINT32 Length;
3457c9678bcSSascha Wildner ACPI_STATUS Status;
3467c9678bcSSascha Wildner
3477c9678bcSSascha Wildner
3487c9678bcSSascha Wildner switch (Op->Asl.ParseOpcode)
3497c9678bcSSascha Wildner {
3507c9678bcSSascha Wildner case PARSEOP_NAMESEG:
3517c9678bcSSascha Wildner case PARSEOP_NAMESTRING:
3527c9678bcSSascha Wildner case PARSEOP_METHODCALL:
3537c9678bcSSascha Wildner
3547c9678bcSSascha Wildner if (!MethodInfo ||
3557c9678bcSSascha Wildner (MethodInfo->Op->Asl.Child == Op) ||
3567c9678bcSSascha Wildner !Op->Asl.Node)
3577c9678bcSSascha Wildner {
3587c9678bcSSascha Wildner break;
3597c9678bcSSascha Wildner }
3607c9678bcSSascha Wildner
3617c9678bcSSascha Wildner MethodInfo->CurrentOp = Op;
3627c9678bcSSascha Wildner Node = Op->Asl.Node;
3637c9678bcSSascha Wildner
3647c9678bcSSascha Wildner /* Find all objects referenced by this method */
3657c9678bcSSascha Wildner
3667c9678bcSSascha Wildner Status = TrWalkParseTree (MethodInfo->Op, ASL_WALK_VISIT_DOWNWARD,
3677c9678bcSSascha Wildner OtXrefAnalysisWalkPart1, NULL, MethodInfo);
3687c9678bcSSascha Wildner
3697c9678bcSSascha Wildner if (Status == AE_CTRL_TERMINATE)
3707c9678bcSSascha Wildner {
3712ffe9f16SSascha Wildner ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE);
3722ffe9f16SSascha Wildner
3737c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, " %-40s %s",
3747c9678bcSSascha Wildner ParentPath, AcpiUtGetTypeName (Node->Type));
3752ffe9f16SSascha Wildner ACPI_FREE (ParentPath);
3767c9678bcSSascha Wildner
3777c9678bcSSascha Wildner switch (Node->Type)
3787c9678bcSSascha Wildner {
3797c9678bcSSascha Wildner /* Handle externals */
3807c9678bcSSascha Wildner
3817c9678bcSSascha Wildner case ACPI_TYPE_ANY:
3827c9678bcSSascha Wildner case ACPI_TYPE_FIELD_UNIT:
3837c9678bcSSascha Wildner
3847c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, " <External Object>");
3857c9678bcSSascha Wildner break;
3867c9678bcSSascha Wildner
3877c9678bcSSascha Wildner case ACPI_TYPE_INTEGER:
3887c9678bcSSascha Wildner
3897c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, " %8.8X%8.8X",
3907c9678bcSSascha Wildner ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
3917c9678bcSSascha Wildner break;
3927c9678bcSSascha Wildner
3937c9678bcSSascha Wildner case ACPI_TYPE_METHOD:
3947c9678bcSSascha Wildner
3957c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, " Invocation (%u args)",
3967c9678bcSSascha Wildner Node->ArgCount);
3977c9678bcSSascha Wildner break;
3987c9678bcSSascha Wildner
3997c9678bcSSascha Wildner case ACPI_TYPE_BUFFER_FIELD:
4007c9678bcSSascha Wildner
4017c9678bcSSascha Wildner NextOp = Node->Op; /* Create Buffer Field Op */
4027c9678bcSSascha Wildner switch (NextOp->Asl.ParseOpcode)
4037c9678bcSSascha Wildner {
4047c9678bcSSascha Wildner case PARSEOP_CREATEBITFIELD:
4057c9678bcSSascha Wildner Length = 1;
4067c9678bcSSascha Wildner break;
4077c9678bcSSascha Wildner
4087c9678bcSSascha Wildner case PARSEOP_CREATEBYTEFIELD:
4097c9678bcSSascha Wildner Length = 8;
4107c9678bcSSascha Wildner break;
4117c9678bcSSascha Wildner
4127c9678bcSSascha Wildner case PARSEOP_CREATEWORDFIELD:
4137c9678bcSSascha Wildner Length = 16;
4147c9678bcSSascha Wildner break;
4157c9678bcSSascha Wildner
4167c9678bcSSascha Wildner case PARSEOP_CREATEDWORDFIELD:
4177c9678bcSSascha Wildner Length = 32;
4187c9678bcSSascha Wildner break;
4197c9678bcSSascha Wildner
4207c9678bcSSascha Wildner case PARSEOP_CREATEQWORDFIELD:
4217c9678bcSSascha Wildner Length = 64;
4227c9678bcSSascha Wildner break;
4237c9678bcSSascha Wildner
4247c9678bcSSascha Wildner default:
4257c9678bcSSascha Wildner Length = 0;
4267c9678bcSSascha Wildner break;
4277c9678bcSSascha Wildner }
4287c9678bcSSascha Wildner
4297c9678bcSSascha Wildner NextOp = NextOp->Asl.Child; /* Buffer name */
4307c9678bcSSascha Wildner
4317c9678bcSSascha Wildner if (!NextOp->Asl.ExternalName)
4327c9678bcSSascha Wildner {
4337c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, " in Arg/Local");
4347c9678bcSSascha Wildner }
4357c9678bcSSascha Wildner else
4367c9678bcSSascha Wildner {
4377c9678bcSSascha Wildner ParentPath = AcpiNsGetNormalizedPathname (
4387c9678bcSSascha Wildner NextOp->Asl.Node, TRUE);
4397c9678bcSSascha Wildner
4407c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%.2u bit) in Buffer %s",
4417c9678bcSSascha Wildner Length, ParentPath);
4422ffe9f16SSascha Wildner ACPI_FREE (ParentPath);
4437c9678bcSSascha Wildner }
4447c9678bcSSascha Wildner break;
4457c9678bcSSascha Wildner
4467c9678bcSSascha Wildner case ACPI_TYPE_LOCAL_REGION_FIELD:
4477c9678bcSSascha Wildner
4487c9678bcSSascha Wildner NextOp = Node->Op;
4497c9678bcSSascha Wildner FieldOp = NextOp->Asl.Parent;
4507c9678bcSSascha Wildner NextOp = FieldOp->Asl.Child;
4517c9678bcSSascha Wildner
4527c9678bcSSascha Wildner ParentPath = AcpiNsGetNormalizedPathname (
4537c9678bcSSascha Wildner NextOp->Asl.Node, TRUE);
4547c9678bcSSascha Wildner
4557c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%.2u bit) in Region %s",
4567c9678bcSSascha Wildner (UINT32) Node->Op->Asl.Child->Asl.Value.Integer,
4577c9678bcSSascha Wildner ParentPath);
4582ffe9f16SSascha Wildner ACPI_FREE (ParentPath);
4597c9678bcSSascha Wildner
4607c9678bcSSascha Wildner if (FieldOp->Asl.ParseOpcode == PARSEOP_FIELD)
4617c9678bcSSascha Wildner {
4627c9678bcSSascha Wildner Node = NextOp->Asl.Node; /* Region node */
4637c9678bcSSascha Wildner NextOp = Node->Op; /* PARSEOP_REGION */
4647c9678bcSSascha Wildner NextOp = NextOp->Asl.Child; /* Region name */
4657c9678bcSSascha Wildner NextOp = NextOp->Asl.Next;
4667c9678bcSSascha Wildner
4677c9678bcSSascha Wildner /* Get region space/addr/len? */
4687c9678bcSSascha Wildner
4697c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%s)",
4707c9678bcSSascha Wildner AcpiUtGetRegionName ((UINT8)
4717c9678bcSSascha Wildner NextOp->Asl.Value.Integer));
4727c9678bcSSascha Wildner }
4737c9678bcSSascha Wildner break;
4747c9678bcSSascha Wildner
4757c9678bcSSascha Wildner default:
4767c9678bcSSascha Wildner break;
4777c9678bcSSascha Wildner }
4787c9678bcSSascha Wildner
4797c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n");
4807c9678bcSSascha Wildner }
4817c9678bcSSascha Wildner break;
4827c9678bcSSascha Wildner
4837c9678bcSSascha Wildner case PARSEOP_METHOD:
4847c9678bcSSascha Wildner
4857c9678bcSSascha Wildner ParentPath = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
4867c9678bcSSascha Wildner
4877c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
4887c9678bcSSascha Wildner "\n[%5u] %-40s %s Declaration (%u args)\n",
4897c9678bcSSascha Wildner Op->Asl.LogicalLineNumber, ParentPath,
4907c9678bcSSascha Wildner AcpiUtGetTypeName (Op->Asl.Node->Type), Op->Asl.Node->ArgCount);
4917c9678bcSSascha Wildner
4927c9678bcSSascha Wildner ACPI_FREE (ParentPath);
4937c9678bcSSascha Wildner break;
4947c9678bcSSascha Wildner
4957c9678bcSSascha Wildner default:
4967c9678bcSSascha Wildner break;
4977c9678bcSSascha Wildner }
4987c9678bcSSascha Wildner }
4997c9678bcSSascha Wildner
5007c9678bcSSascha Wildner
5017c9678bcSSascha Wildner /*******************************************************************************
5027c9678bcSSascha Wildner *
5037c9678bcSSascha Wildner * FUNCTION: OtXrefAnalysisWalkPart1
5047c9678bcSSascha Wildner *
5057c9678bcSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK
5067c9678bcSSascha Wildner *
5077c9678bcSSascha Wildner * RETURN: Status
5087c9678bcSSascha Wildner *
5097c9678bcSSascha Wildner * DESCRIPTION: Secondary walk for cross-reference part 1.
5107c9678bcSSascha Wildner *
5117c9678bcSSascha Wildner ******************************************************************************/
5127c9678bcSSascha Wildner
5137c9678bcSSascha Wildner static ACPI_STATUS
OtXrefAnalysisWalkPart1(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)5147c9678bcSSascha Wildner OtXrefAnalysisWalkPart1 (
5157c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
5167c9678bcSSascha Wildner UINT32 Level,
5177c9678bcSSascha Wildner void *Context)
5187c9678bcSSascha Wildner {
5197c9678bcSSascha Wildner ASL_METHOD_INFO *MethodInfo = (ASL_METHOD_INFO *) Context;
5207c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Next;
5217c9678bcSSascha Wildner
5227c9678bcSSascha Wildner
5237c9678bcSSascha Wildner /* Only interested in name string Ops -- ignore all others */
5247c9678bcSSascha Wildner
5257c9678bcSSascha Wildner if ((Op->Asl.ParseOpcode != PARSEOP_NAMESEG) &&
5267c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) &&
5277c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_METHODCALL))
5287c9678bcSSascha Wildner {
5297c9678bcSSascha Wildner return (AE_OK);
5307c9678bcSSascha Wildner }
5317c9678bcSSascha Wildner
5327c9678bcSSascha Wildner /* No node means a locally declared object -- ignore */
5337c9678bcSSascha Wildner
5347c9678bcSSascha Wildner if (!Op->Asl.Node)
5357c9678bcSSascha Wildner {
5367c9678bcSSascha Wildner return (AE_OK);
5377c9678bcSSascha Wildner }
5387c9678bcSSascha Wildner
5397c9678bcSSascha Wildner /* When we encounter the source Op, we are done */
5407c9678bcSSascha Wildner
5417c9678bcSSascha Wildner Next = MethodInfo->CurrentOp;
5427c9678bcSSascha Wildner if (Next == Op)
5437c9678bcSSascha Wildner {
5447c9678bcSSascha Wildner return (AE_CTRL_TERMINATE);
5457c9678bcSSascha Wildner }
5467c9678bcSSascha Wildner
5477c9678bcSSascha Wildner /* If we have a name match, this Op is a duplicate */
5487c9678bcSSascha Wildner
5497c9678bcSSascha Wildner if ((Next->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
5507c9678bcSSascha Wildner (Next->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
5517c9678bcSSascha Wildner (Next->Asl.ParseOpcode == PARSEOP_METHODCALL))
5527c9678bcSSascha Wildner {
5537c9678bcSSascha Wildner if (!strcmp (Op->Asl.ExternalName, Next->Asl.ExternalName))
5547c9678bcSSascha Wildner {
5557c9678bcSSascha Wildner return (AE_ALREADY_EXISTS);
5567c9678bcSSascha Wildner }
5577c9678bcSSascha Wildner }
5587c9678bcSSascha Wildner
5597c9678bcSSascha Wildner return (AE_OK);
5607c9678bcSSascha Wildner }
5617c9678bcSSascha Wildner
5627c9678bcSSascha Wildner
5637c9678bcSSascha Wildner /*
5647c9678bcSSascha Wildner * Part 2 of the cross reference file. This part emits the names of each
5657c9678bcSSascha Wildner * non-predefined method in the namespace (user methods), along with the
5667c9678bcSSascha Wildner * names of each control method that references that method.
5677c9678bcSSascha Wildner */
5687c9678bcSSascha Wildner
5697c9678bcSSascha Wildner /*******************************************************************************
5707c9678bcSSascha Wildner *
5717c9678bcSSascha Wildner * FUNCTION: OtXrefWalkPart2
5727c9678bcSSascha Wildner *
5737c9678bcSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK
5747c9678bcSSascha Wildner *
5757c9678bcSSascha Wildner * RETURN: Status
5767c9678bcSSascha Wildner *
5777c9678bcSSascha Wildner * DESCRIPTION: For each control method in the namespace, we will re-walk the
5787c9678bcSSascha Wildner * namespace to find each and every invocation of that control
5797c9678bcSSascha Wildner * method. Brute force, but does not matter, even for large
5807c9678bcSSascha Wildner * namespaces. Ignore predefined names (start with underscore).
5817c9678bcSSascha Wildner *
5827c9678bcSSascha Wildner ******************************************************************************/
5837c9678bcSSascha Wildner
5847c9678bcSSascha Wildner static ACPI_STATUS
OtXrefWalkPart2(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)5857c9678bcSSascha Wildner OtXrefWalkPart2 (
5867c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
5877c9678bcSSascha Wildner UINT32 Level,
5887c9678bcSSascha Wildner void *Context)
5897c9678bcSSascha Wildner {
5907c9678bcSSascha Wildner ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context;
5917c9678bcSSascha Wildner ACPI_NAMESPACE_NODE *Node;
5927c9678bcSSascha Wildner char *ParentPath;
5937c9678bcSSascha Wildner
5947c9678bcSSascha Wildner
5957c9678bcSSascha Wildner /* Looking for Method Declaration Ops only */
5967c9678bcSSascha Wildner
5977c9678bcSSascha Wildner if (!Op->Asl.Node ||
5987c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_METHOD))
5997c9678bcSSascha Wildner {
6007c9678bcSSascha Wildner return (AE_OK);
6017c9678bcSSascha Wildner }
6027c9678bcSSascha Wildner
6037c9678bcSSascha Wildner /* Ignore predefined names */
6047c9678bcSSascha Wildner
6057c9678bcSSascha Wildner if (Op->Asl.Node->Name.Ascii[0] == '_')
6067c9678bcSSascha Wildner {
6077c9678bcSSascha Wildner XrefInfo->TotalPredefinedMethods++;
6087c9678bcSSascha Wildner return (AE_OK);
6097c9678bcSSascha Wildner }
6107c9678bcSSascha Wildner
6117c9678bcSSascha Wildner Node = Op->Asl.Node;
6127c9678bcSSascha Wildner ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE);
6137c9678bcSSascha Wildner
6147c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
6157c9678bcSSascha Wildner "\n[%5u] %-40s %s Declaration (%u args)\n",
6167c9678bcSSascha Wildner Op->Asl.LogicalLineNumber, ParentPath,
6177c9678bcSSascha Wildner AcpiUtGetTypeName (Node->Type), Node->ArgCount);
6187c9678bcSSascha Wildner
6197c9678bcSSascha Wildner XrefInfo->TotalUserMethods++;
6207c9678bcSSascha Wildner XrefInfo->ThisMethodInvocations = 0;
6217c9678bcSSascha Wildner XrefInfo->MethodOp = Op;
6227c9678bcSSascha Wildner
623806343b9SSascha Wildner (void) TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
6247c9678bcSSascha Wildner OtXrefAnalysisWalkPart2, NULL, XrefInfo);
6257c9678bcSSascha Wildner
6267c9678bcSSascha Wildner if (!XrefInfo->ThisMethodInvocations)
6277c9678bcSSascha Wildner {
6287c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
6297c9678bcSSascha Wildner " Zero invocations of this method in this module\n");
6307c9678bcSSascha Wildner XrefInfo->TotalUnreferenceUserMethods++;
6317c9678bcSSascha Wildner }
6327c9678bcSSascha Wildner else
6337c9678bcSSascha Wildner {
6347c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
6357c9678bcSSascha Wildner " %u invocations of method %s in this module\n",
6367c9678bcSSascha Wildner XrefInfo->ThisMethodInvocations, ParentPath);
6377c9678bcSSascha Wildner }
6387c9678bcSSascha Wildner
6397c9678bcSSascha Wildner ACPI_FREE (ParentPath);
6407c9678bcSSascha Wildner return (AE_OK);
6417c9678bcSSascha Wildner }
6427c9678bcSSascha Wildner
6437c9678bcSSascha Wildner
6447c9678bcSSascha Wildner /*******************************************************************************
6457c9678bcSSascha Wildner *
6467c9678bcSSascha Wildner * FUNCTION: OtXrefAnalysisWalkPart2
6477c9678bcSSascha Wildner *
6487c9678bcSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK
6497c9678bcSSascha Wildner *
6507c9678bcSSascha Wildner * RETURN: Status
6517c9678bcSSascha Wildner *
6527c9678bcSSascha Wildner * DESCRIPTION: For every Op that is a method invocation, emit a reference
6537c9678bcSSascha Wildner * line if the Op is invoking the target method.
6547c9678bcSSascha Wildner *
6557c9678bcSSascha Wildner ******************************************************************************/
6567c9678bcSSascha Wildner
6577c9678bcSSascha Wildner static ACPI_STATUS
OtXrefAnalysisWalkPart2(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)6587c9678bcSSascha Wildner OtXrefAnalysisWalkPart2 (
6597c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
6607c9678bcSSascha Wildner UINT32 Level,
6617c9678bcSSascha Wildner void *Context)
6627c9678bcSSascha Wildner {
6637c9678bcSSascha Wildner ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context;
6647c9678bcSSascha Wildner ACPI_PARSE_OBJECT *CallerOp;
6657c9678bcSSascha Wildner char *CallerFullPathname;
6667c9678bcSSascha Wildner
6677c9678bcSSascha Wildner
6687c9678bcSSascha Wildner /* Looking for MethodCall Ops only */
6697c9678bcSSascha Wildner
6707c9678bcSSascha Wildner if (!Op->Asl.Node ||
6717c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_METHODCALL))
6727c9678bcSSascha Wildner {
6737c9678bcSSascha Wildner return (AE_OK);
6747c9678bcSSascha Wildner }
6757c9678bcSSascha Wildner
6767c9678bcSSascha Wildner /* If not a match to the target method, we are done */
6777c9678bcSSascha Wildner
6787c9678bcSSascha Wildner if (Op->Asl.Node != XrefInfo->MethodOp->Asl.Node)
6797c9678bcSSascha Wildner {
6807c9678bcSSascha Wildner return (AE_CTRL_DEPTH);
6817c9678bcSSascha Wildner }
6827c9678bcSSascha Wildner
6837c9678bcSSascha Wildner /* Find parent method to get method caller namepath */
6847c9678bcSSascha Wildner
6857c9678bcSSascha Wildner CallerOp = Op->Asl.Parent;
6867c9678bcSSascha Wildner while (CallerOp &&
6877c9678bcSSascha Wildner (CallerOp->Asl.ParseOpcode != PARSEOP_METHOD))
6887c9678bcSSascha Wildner {
6897c9678bcSSascha Wildner CallerOp = CallerOp->Asl.Parent;
6907c9678bcSSascha Wildner }
6917c9678bcSSascha Wildner
6927c9678bcSSascha Wildner /* There is no parent method for External() statements */
6937c9678bcSSascha Wildner
6947c9678bcSSascha Wildner if (!CallerOp)
6957c9678bcSSascha Wildner {
6967c9678bcSSascha Wildner return (AE_OK);
6977c9678bcSSascha Wildner }
6987c9678bcSSascha Wildner
6997c9678bcSSascha Wildner CallerFullPathname = AcpiNsGetNormalizedPathname (
7007c9678bcSSascha Wildner CallerOp->Asl.Node, TRUE);
7017c9678bcSSascha Wildner
7027c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
7037c9678bcSSascha Wildner "[%5u] %-40s Invocation path: %s\n",
7047c9678bcSSascha Wildner Op->Asl.LogicalLineNumber, CallerFullPathname,
7057c9678bcSSascha Wildner Op->Asl.ExternalName);
7067c9678bcSSascha Wildner
7077c9678bcSSascha Wildner ACPI_FREE (CallerFullPathname);
7087c9678bcSSascha Wildner XrefInfo->ThisMethodInvocations++;
7097c9678bcSSascha Wildner return (AE_OK);
7107c9678bcSSascha Wildner }
7117c9678bcSSascha Wildner
7127c9678bcSSascha Wildner
7137c9678bcSSascha Wildner /*
7147c9678bcSSascha Wildner * Part 3 of the cross reference file. This part emits the names of each
7157c9678bcSSascha Wildner * non-predefined method in the namespace (user methods), along with the
7167c9678bcSSascha Wildner * names of each control method that references that method.
7177c9678bcSSascha Wildner */
7187c9678bcSSascha Wildner
7197c9678bcSSascha Wildner /*******************************************************************************
7207c9678bcSSascha Wildner *
7217c9678bcSSascha Wildner * FUNCTION: OtXrefWalkPart3
7227c9678bcSSascha Wildner *
7237c9678bcSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK
7247c9678bcSSascha Wildner *
7257c9678bcSSascha Wildner * RETURN: Status
7267c9678bcSSascha Wildner *
7277c9678bcSSascha Wildner * DESCRIPTION: Cross-reference part 3. references to objects other than
7287c9678bcSSascha Wildner * control methods.
7297c9678bcSSascha Wildner *
7307c9678bcSSascha Wildner ******************************************************************************/
7317c9678bcSSascha Wildner
7327c9678bcSSascha Wildner static ACPI_STATUS
OtXrefWalkPart3(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)7337c9678bcSSascha Wildner OtXrefWalkPart3 (
7347c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
7357c9678bcSSascha Wildner UINT32 Level,
7367c9678bcSSascha Wildner void *Context)
7377c9678bcSSascha Wildner {
7387c9678bcSSascha Wildner ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context;
7397c9678bcSSascha Wildner ACPI_NAMESPACE_NODE *Node;
7407c9678bcSSascha Wildner char *ParentPath;
7417c9678bcSSascha Wildner const ACPI_OPCODE_INFO *OpInfo;
7427c9678bcSSascha Wildner
7437c9678bcSSascha Wildner
7447c9678bcSSascha Wildner /* Ignore method declarations */
7457c9678bcSSascha Wildner
7467c9678bcSSascha Wildner if (!Op->Asl.Node ||
7477c9678bcSSascha Wildner (Op->Asl.ParseOpcode == PARSEOP_METHOD))
7487c9678bcSSascha Wildner {
7497c9678bcSSascha Wildner return (AE_OK);
7507c9678bcSSascha Wildner }
7517c9678bcSSascha Wildner
7527c9678bcSSascha Wildner OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
7537c9678bcSSascha Wildner if (!(OpInfo->Class & AML_CLASS_NAMED_OBJECT))
7547c9678bcSSascha Wildner {
7557c9678bcSSascha Wildner return (AE_OK);
7567c9678bcSSascha Wildner }
7577c9678bcSSascha Wildner
7587c9678bcSSascha Wildner /* Only care about named object creation opcodes */
7597c9678bcSSascha Wildner
7607c9678bcSSascha Wildner if ((Op->Asl.ParseOpcode != PARSEOP_NAME) &&
7617c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_DEVICE) &&
7627c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_MUTEX) &&
7637c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_OPERATIONREGION) &&
7647c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_FIELD) &&
7657c9678bcSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_EVENT))
7667c9678bcSSascha Wildner {
7677c9678bcSSascha Wildner return (AE_OK);
7687c9678bcSSascha Wildner }
7697c9678bcSSascha Wildner
7707c9678bcSSascha Wildner /* Ignore predefined names */
7717c9678bcSSascha Wildner
7727c9678bcSSascha Wildner if (Op->Asl.Node->Name.Ascii[0] == '_')
7737c9678bcSSascha Wildner {
7747c9678bcSSascha Wildner return (AE_OK);
7757c9678bcSSascha Wildner }
7767c9678bcSSascha Wildner
7777c9678bcSSascha Wildner Node = Op->Asl.Node;
7787c9678bcSSascha Wildner ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE);
7797c9678bcSSascha Wildner
7807c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
7817c9678bcSSascha Wildner "\n[%5u] %-40s %s Declaration\n",
7827c9678bcSSascha Wildner Op->Asl.LogicalLineNumber, ParentPath,
7837c9678bcSSascha Wildner AcpiUtGetTypeName (Node->Type));
7842ffe9f16SSascha Wildner ACPI_FREE (ParentPath);
7857c9678bcSSascha Wildner
7867c9678bcSSascha Wildner XrefInfo->MethodOp = Op;
7877c9678bcSSascha Wildner XrefInfo->ThisObjectReferences = 0;
7887c9678bcSSascha Wildner XrefInfo->TotalObjects = 0;
7897c9678bcSSascha Wildner
790806343b9SSascha Wildner (void) TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
7917c9678bcSSascha Wildner OtXrefAnalysisWalkPart3, NULL, XrefInfo);
7927c9678bcSSascha Wildner
7937c9678bcSSascha Wildner if (!XrefInfo->ThisObjectReferences)
7947c9678bcSSascha Wildner {
7957c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
7967c9678bcSSascha Wildner " Zero references to this object in this module\n");
7977c9678bcSSascha Wildner XrefInfo->TotalUnreferencedObjects++;
7987c9678bcSSascha Wildner }
7997c9678bcSSascha Wildner else
8007c9678bcSSascha Wildner {
8017c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
802e5412f1eSSascha Wildner " %u references to this object in this module [%s]\n",
8037c9678bcSSascha Wildner XrefInfo->ThisObjectReferences, ParentPath);
8047c9678bcSSascha Wildner }
8057c9678bcSSascha Wildner
8067c9678bcSSascha Wildner return (AE_OK);
8077c9678bcSSascha Wildner }
8087c9678bcSSascha Wildner
8097c9678bcSSascha Wildner
8107c9678bcSSascha Wildner /*******************************************************************************
8117c9678bcSSascha Wildner *
8127c9678bcSSascha Wildner * FUNCTION: OtXrefAnalysisWalkPart3
8137c9678bcSSascha Wildner *
8147c9678bcSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK
8157c9678bcSSascha Wildner *
8167c9678bcSSascha Wildner * RETURN: Status
8177c9678bcSSascha Wildner *
8187c9678bcSSascha Wildner * DESCRIPTION: Secondary walk for cross-reference part 3.
8197c9678bcSSascha Wildner *
8207c9678bcSSascha Wildner ******************************************************************************/
8217c9678bcSSascha Wildner
8227c9678bcSSascha Wildner static ACPI_STATUS
OtXrefAnalysisWalkPart3(ACPI_PARSE_OBJECT * Op,UINT32 Level,void * Context)8237c9678bcSSascha Wildner OtXrefAnalysisWalkPart3 (
8247c9678bcSSascha Wildner ACPI_PARSE_OBJECT *Op,
8257c9678bcSSascha Wildner UINT32 Level,
8267c9678bcSSascha Wildner void *Context)
8277c9678bcSSascha Wildner {
8287c9678bcSSascha Wildner ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context;
8292ffe9f16SSascha Wildner char *CallerFullPathname = NULL;
8307c9678bcSSascha Wildner ACPI_PARSE_OBJECT *CallerOp;
8317c9678bcSSascha Wildner const char *Operator;
8327c9678bcSSascha Wildner
8337c9678bcSSascha Wildner
8347c9678bcSSascha Wildner if (!Op->Asl.Node)
8357c9678bcSSascha Wildner {
8367c9678bcSSascha Wildner return (AE_OK);
8377c9678bcSSascha Wildner }
8387c9678bcSSascha Wildner
8397c9678bcSSascha Wildner XrefInfo->TotalObjects++;
8407c9678bcSSascha Wildner
8417c9678bcSSascha Wildner /* Ignore Op that actually defined the object */
8427c9678bcSSascha Wildner
8437c9678bcSSascha Wildner if (Op == XrefInfo->MethodOp)
8447c9678bcSSascha Wildner {
8457c9678bcSSascha Wildner return (AE_OK);
8467c9678bcSSascha Wildner }
8477c9678bcSSascha Wildner
8487c9678bcSSascha Wildner /* Only interested in Ops that reference the target node */
8497c9678bcSSascha Wildner
8507c9678bcSSascha Wildner if (Op->Asl.Node != XrefInfo->MethodOp->Asl.Node)
8517c9678bcSSascha Wildner {
8527c9678bcSSascha Wildner return (AE_OK);
8537c9678bcSSascha Wildner }
8547c9678bcSSascha Wildner
8557c9678bcSSascha Wildner /* Find parent "open scope" object to get method caller namepath */
8567c9678bcSSascha Wildner
8577c9678bcSSascha Wildner CallerOp = Op->Asl.Parent;
8587c9678bcSSascha Wildner while (CallerOp &&
8597c9678bcSSascha Wildner (CallerOp->Asl.ParseOpcode != PARSEOP_NAME) &&
8607c9678bcSSascha Wildner (CallerOp->Asl.ParseOpcode != PARSEOP_METHOD) &&
8617c9678bcSSascha Wildner (CallerOp->Asl.ParseOpcode != PARSEOP_DEVICE) &&
8627c9678bcSSascha Wildner (CallerOp->Asl.ParseOpcode != PARSEOP_POWERRESOURCE) &&
8637c9678bcSSascha Wildner (CallerOp->Asl.ParseOpcode != PARSEOP_PROCESSOR) &&
8647c9678bcSSascha Wildner (CallerOp->Asl.ParseOpcode != PARSEOP_THERMALZONE))
8657c9678bcSSascha Wildner {
8667c9678bcSSascha Wildner CallerOp = CallerOp->Asl.Parent;
8677c9678bcSSascha Wildner }
8687c9678bcSSascha Wildner
8692ffe9f16SSascha Wildner if (CallerOp == XrefInfo->CurrentMethodOp)
8702ffe9f16SSascha Wildner {
8712ffe9f16SSascha Wildner return (AE_OK);
8722ffe9f16SSascha Wildner }
8732ffe9f16SSascha Wildner
8742ffe9f16SSascha Wildner /* Null CallerOp means the caller is at the namespace root */
8757c9678bcSSascha Wildner
8767c9678bcSSascha Wildner if (CallerOp)
8777c9678bcSSascha Wildner {
8787c9678bcSSascha Wildner CallerFullPathname = AcpiNsGetNormalizedPathname (
8797c9678bcSSascha Wildner CallerOp->Asl.Node, TRUE);
8807c9678bcSSascha Wildner }
8817c9678bcSSascha Wildner
8822ffe9f16SSascha Wildner /* There are some special cases for the oddball operators */
8837c9678bcSSascha Wildner
8847c9678bcSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_SCOPE)
8857c9678bcSSascha Wildner {
8867c9678bcSSascha Wildner Operator = "Scope";
8877c9678bcSSascha Wildner }
8887c9678bcSSascha Wildner else if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_ALIAS)
8897c9678bcSSascha Wildner {
8907c9678bcSSascha Wildner Operator = "Alias";
8917c9678bcSSascha Wildner }
8927c9678bcSSascha Wildner else if (!CallerOp)
8937c9678bcSSascha Wildner {
8947c9678bcSSascha Wildner Operator = "ModLevel";
8957c9678bcSSascha Wildner }
8967c9678bcSSascha Wildner else
8977c9678bcSSascha Wildner {
8987c9678bcSSascha Wildner Operator = AcpiUtGetTypeName (CallerOp->Asl.Node->Type);
8997c9678bcSSascha Wildner }
9007c9678bcSSascha Wildner
9017c9678bcSSascha Wildner FlPrintFile (ASL_FILE_XREF_OUTPUT,
9027c9678bcSSascha Wildner "[%5u] %-40s %-8s via path: %s, Operator: %s\n",
9037c9678bcSSascha Wildner Op->Asl.LogicalLineNumber,
9042ffe9f16SSascha Wildner CallerFullPathname ? CallerFullPathname : "<root>",
9057c9678bcSSascha Wildner Operator,
9067c9678bcSSascha Wildner Op->Asl.ExternalName,
9077c9678bcSSascha Wildner Op->Asl.Parent->Asl.ParseOpName);
9087c9678bcSSascha Wildner
9097c9678bcSSascha Wildner if (!CallerOp)
9107c9678bcSSascha Wildner {
9117c9678bcSSascha Wildner CallerOp = ACPI_TO_POINTER (0xFFFFFFFF);
9127c9678bcSSascha Wildner }
9137c9678bcSSascha Wildner
9142ffe9f16SSascha Wildner if (CallerFullPathname)
9152ffe9f16SSascha Wildner {
9162ffe9f16SSascha Wildner ACPI_FREE (CallerFullPathname);
9172ffe9f16SSascha Wildner }
9182ffe9f16SSascha Wildner
9197c9678bcSSascha Wildner XrefInfo->CurrentMethodOp = CallerOp;
9207c9678bcSSascha Wildner XrefInfo->ThisObjectReferences++;
9217c9678bcSSascha Wildner return (AE_OK);
9227c9678bcSSascha Wildner }
923