xref: /dflybsd-src/sys/contrib/dev/acpica/source/compiler/aslxrefout.c (revision 383048aca08c2de51d27aa8638a36982a0d74550)
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