1f8146b88SJung-uk Kim /****************************************************************************** 2f8146b88SJung-uk Kim * 3f8146b88SJung-uk Kim * Module Name: aslxrefout.c - support for optional cross-reference file 4f8146b88SJung-uk Kim * 5f8146b88SJung-uk Kim *****************************************************************************/ 6f8146b88SJung-uk Kim 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 11e5e1f58aSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2019, Intel Corp. 12f8146b88SJung-uk Kim * All rights reserved. 13f8146b88SJung-uk Kim * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 119f8146b88SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120f8146b88SJung-uk Kim * modification, are permitted provided that the following conditions 121f8146b88SJung-uk Kim * are met: 122f8146b88SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123f8146b88SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124f8146b88SJung-uk Kim * without modification. 125f8146b88SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126f8146b88SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127f8146b88SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128f8146b88SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129f8146b88SJung-uk Kim * binary redistribution. 130f8146b88SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131f8146b88SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132f8146b88SJung-uk Kim * from this software without specific prior written permission. 133f8146b88SJung-uk Kim * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147f8146b88SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148f8146b88SJung-uk Kim * Software Foundation. 149f8146b88SJung-uk Kim * 1500d84335fSJung-uk Kim *****************************************************************************/ 151f8146b88SJung-uk Kim 152f8146b88SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 153f8146b88SJung-uk Kim #include "aslcompiler.y.h" 154f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 155f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 156f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 157f8146b88SJung-uk Kim 158f8146b88SJung-uk Kim #define _COMPONENT ACPI_COMPILER 159f8146b88SJung-uk Kim ACPI_MODULE_NAME ("aslxrefout") 160f8146b88SJung-uk Kim 161f8146b88SJung-uk Kim 162f8146b88SJung-uk Kim /* Local prototypes */ 163f8146b88SJung-uk Kim 164f8146b88SJung-uk Kim static ACPI_STATUS 165f8146b88SJung-uk Kim OtXrefWalkPart2 ( 166f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 167f8146b88SJung-uk Kim UINT32 Level, 168f8146b88SJung-uk Kim void *Context); 169f8146b88SJung-uk Kim 170f8146b88SJung-uk Kim static ACPI_STATUS 171f8146b88SJung-uk Kim OtXrefWalkPart3 ( 172f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 173f8146b88SJung-uk Kim UINT32 Level, 174f8146b88SJung-uk Kim void *Context); 175f8146b88SJung-uk Kim 176f8146b88SJung-uk Kim static ACPI_STATUS 177f8146b88SJung-uk Kim OtXrefAnalysisWalkPart1 ( 178f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 179f8146b88SJung-uk Kim UINT32 Level, 180f8146b88SJung-uk Kim void *Context); 181f8146b88SJung-uk Kim 182f8146b88SJung-uk Kim 183f8146b88SJung-uk Kim static ACPI_STATUS 184f8146b88SJung-uk Kim OtXrefAnalysisWalkPart2 ( 185f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 186f8146b88SJung-uk Kim UINT32 Level, 187f8146b88SJung-uk Kim void *Context); 188f8146b88SJung-uk Kim 189f8146b88SJung-uk Kim static ACPI_STATUS 190f8146b88SJung-uk Kim OtXrefAnalysisWalkPart3 ( 191f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 192f8146b88SJung-uk Kim UINT32 Level, 193f8146b88SJung-uk Kim void *Context); 194f8146b88SJung-uk Kim 195f8146b88SJung-uk Kim 196f8146b88SJung-uk Kim /******************************************************************************* 197f8146b88SJung-uk Kim * 198f8146b88SJung-uk Kim * FUNCTION: OtPrintHeaders 199f8146b88SJung-uk Kim * 200f8146b88SJung-uk Kim * PARAMETERS: Message - Main header message 201f8146b88SJung-uk Kim * 202f8146b88SJung-uk Kim * RETURN: None 203f8146b88SJung-uk Kim * 204f8146b88SJung-uk Kim * DESCRIPTION: Emits the main header message along with field descriptions 205f8146b88SJung-uk Kim * 206f8146b88SJung-uk Kim ******************************************************************************/ 207f8146b88SJung-uk Kim 208f8146b88SJung-uk Kim void 209f8146b88SJung-uk Kim OtPrintHeaders ( 210f8146b88SJung-uk Kim char *Message) 211f8146b88SJung-uk Kim { 212f8146b88SJung-uk Kim UINT32 Length; 213f8146b88SJung-uk Kim 214f8146b88SJung-uk Kim 215f8146b88SJung-uk Kim Length = strlen (Message); 216f8146b88SJung-uk Kim 217f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\n%s\n", Message); 218f8146b88SJung-uk Kim while (Length) 219f8146b88SJung-uk Kim { 220f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "-"); 221f8146b88SJung-uk Kim Length--; 222f8146b88SJung-uk Kim } 223f8146b88SJung-uk Kim 224f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\nLineno %-40s Description\n", 225f8146b88SJung-uk Kim "Full Pathname"); 226f8146b88SJung-uk Kim } 227f8146b88SJung-uk Kim 228f8146b88SJung-uk Kim 229f8146b88SJung-uk Kim /******************************************************************************* 230f8146b88SJung-uk Kim * 231f8146b88SJung-uk Kim * FUNCTION: OtCreateXrefFile 232f8146b88SJung-uk Kim * 233f8146b88SJung-uk Kim * PARAMETERS: None 234f8146b88SJung-uk Kim * 235f8146b88SJung-uk Kim * RETURN: None 236f8146b88SJung-uk Kim * 237f8146b88SJung-uk Kim * DESCRIPTION Main entry point for parts 2 and 3 of the cross-reference 238f8146b88SJung-uk Kim * file. 239f8146b88SJung-uk Kim * 240f8146b88SJung-uk Kim ******************************************************************************/ 241f8146b88SJung-uk Kim 242f8146b88SJung-uk Kim void 243f8146b88SJung-uk Kim OtCreateXrefFile ( 244f8146b88SJung-uk Kim void) 245f8146b88SJung-uk Kim { 246f8146b88SJung-uk Kim ASL_XREF_INFO XrefInfo; 247f8146b88SJung-uk Kim 248f8146b88SJung-uk Kim 249f8146b88SJung-uk Kim /* Build cross-reference output file if requested */ 250f8146b88SJung-uk Kim 2516f1f1a63SJung-uk Kim if (!AslGbl_CrossReferenceOutput) 252f8146b88SJung-uk Kim { 253f8146b88SJung-uk Kim return; 254f8146b88SJung-uk Kim } 255f8146b88SJung-uk Kim 256f8146b88SJung-uk Kim memset (&XrefInfo, 0, sizeof (ASL_XREF_INFO)); 257f8146b88SJung-uk Kim 258f8146b88SJung-uk Kim /* Cross-reference output file, part 2 (Method invocations) */ 259f8146b88SJung-uk Kim 260f8146b88SJung-uk Kim OtPrintHeaders ("Part 2: Method Reference Map " 261f8146b88SJung-uk Kim "(Invocations of each user-defined control method)"); 262f8146b88SJung-uk Kim 2636f1f1a63SJung-uk Kim TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 264f8146b88SJung-uk Kim OtXrefWalkPart2, NULL, &XrefInfo); 265f8146b88SJung-uk Kim 266f8146b88SJung-uk Kim /* Cross-reference output file, part 3 (All other object refs) */ 267f8146b88SJung-uk Kim 268f8146b88SJung-uk Kim OtPrintHeaders ("Part 3: Full Object Reference Map " 269f8146b88SJung-uk Kim "(Methods that reference each object in namespace"); 270f8146b88SJung-uk Kim 2716f1f1a63SJung-uk Kim TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 272f8146b88SJung-uk Kim OtXrefWalkPart3, NULL, &XrefInfo); 273f8146b88SJung-uk Kim 274f8146b88SJung-uk Kim /* Cross-reference summary */ 275f8146b88SJung-uk Kim 276f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\nObject Summary\n"); 277f8146b88SJung-uk Kim 278f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 279f8146b88SJung-uk Kim "\nTotal methods: %u\n", 280f8146b88SJung-uk Kim XrefInfo.TotalPredefinedMethods + XrefInfo.TotalUserMethods); 281f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 282f8146b88SJung-uk Kim "Total predefined methods: %u\n", 283f8146b88SJung-uk Kim XrefInfo.TotalPredefinedMethods); 284f8146b88SJung-uk Kim 285f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 286f8146b88SJung-uk Kim "\nTotal user methods: %u\n", 287f8146b88SJung-uk Kim XrefInfo.TotalUserMethods); 288f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 289f8146b88SJung-uk Kim "Total unreferenced user methods %u\n", 290f8146b88SJung-uk Kim XrefInfo.TotalUnreferenceUserMethods); 291f8146b88SJung-uk Kim 292f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 293f8146b88SJung-uk Kim "\nTotal defined objects: %u\n", 294f8146b88SJung-uk Kim XrefInfo.TotalObjects); 295f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 296f8146b88SJung-uk Kim "Total unreferenced objects: %u\n", 297f8146b88SJung-uk Kim XrefInfo.TotalUnreferencedObjects); 298f8146b88SJung-uk Kim } 299f8146b88SJung-uk Kim 300f8146b88SJung-uk Kim 301f8146b88SJung-uk Kim /* 302f8146b88SJung-uk Kim * Part 1 of the cross reference file. This part emits the namespace objects 303f8146b88SJung-uk Kim * that are referenced by each control method in the namespace. 304f8146b88SJung-uk Kim * 305f8146b88SJung-uk Kim * Part 2 and 3 are below part 1. 306f8146b88SJung-uk Kim */ 307f8146b88SJung-uk Kim 308f8146b88SJung-uk Kim /******************************************************************************* 309f8146b88SJung-uk Kim * 310f8146b88SJung-uk Kim * FUNCTION: OtXrefWalkPart1 311f8146b88SJung-uk Kim * 312f8146b88SJung-uk Kim * PARAMETERS: Op - Current parse Op 313f8146b88SJung-uk Kim * Level - Current tree nesting level 314f8146b88SJung-uk Kim * MethodInfo - Info block for the current method 315f8146b88SJung-uk Kim * 316f8146b88SJung-uk Kim * 317f8146b88SJung-uk Kim * RETURN: None 318f8146b88SJung-uk Kim * 319f8146b88SJung-uk Kim * DESCRIPTION: Entry point for the creation of the method call reference map. 320f8146b88SJung-uk Kim * For each control method in the namespace, all other methods 321f8146b88SJung-uk Kim * that invoke the method are listed. Predefined names/methods 322f8146b88SJung-uk Kim * that start with an underscore are ignored, because these are 323f8146b88SJung-uk Kim * essentially external/public interfaces. 324f8146b88SJung-uk Kim 325f8146b88SJung-uk Kim * DESCRIPTION: Entry point for the creation of the object reference map. 326f8146b88SJung-uk Kim * For each control method in the namespace, all objects that 327f8146b88SJung-uk Kim * are referenced by the method are listed. 328f8146b88SJung-uk Kim * 329f8146b88SJung-uk Kim * Called during a normal namespace walk, once per namespace 330f8146b88SJung-uk Kim * object. (MtMethodAnalysisWalkBegin) 331f8146b88SJung-uk Kim * 332f8146b88SJung-uk Kim ******************************************************************************/ 333f8146b88SJung-uk Kim 334f8146b88SJung-uk Kim void 335f8146b88SJung-uk Kim OtXrefWalkPart1 ( 336f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 337f8146b88SJung-uk Kim UINT32 Level, 338f8146b88SJung-uk Kim ASL_METHOD_INFO *MethodInfo) 339f8146b88SJung-uk Kim { 340f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 341f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 342f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *FieldOp; 343f8146b88SJung-uk Kim char *ParentPath; 344f8146b88SJung-uk Kim UINT32 Length; 345f8146b88SJung-uk Kim ACPI_STATUS Status; 346f8146b88SJung-uk Kim 347f8146b88SJung-uk Kim 348f8146b88SJung-uk Kim switch (Op->Asl.ParseOpcode) 349f8146b88SJung-uk Kim { 350f8146b88SJung-uk Kim case PARSEOP_NAMESEG: 351f8146b88SJung-uk Kim case PARSEOP_NAMESTRING: 352f8146b88SJung-uk Kim case PARSEOP_METHODCALL: 353f8146b88SJung-uk Kim 354f8146b88SJung-uk Kim if (!MethodInfo || 355f8146b88SJung-uk Kim (MethodInfo->Op->Asl.Child == Op) || 356f8146b88SJung-uk Kim !Op->Asl.Node) 357f8146b88SJung-uk Kim { 358f8146b88SJung-uk Kim break; 359f8146b88SJung-uk Kim } 360f8146b88SJung-uk Kim 361f8146b88SJung-uk Kim MethodInfo->CurrentOp = Op; 362f8146b88SJung-uk Kim Node = Op->Asl.Node; 363f8146b88SJung-uk Kim 364f8146b88SJung-uk Kim /* Find all objects referenced by this method */ 365f8146b88SJung-uk Kim 366f8146b88SJung-uk Kim Status = TrWalkParseTree (MethodInfo->Op, ASL_WALK_VISIT_DOWNWARD, 367f8146b88SJung-uk Kim OtXrefAnalysisWalkPart1, NULL, MethodInfo); 368f8146b88SJung-uk Kim 369f8146b88SJung-uk Kim if (Status == AE_CTRL_TERMINATE) 370f8146b88SJung-uk Kim { 371f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE); 372f8146b88SJung-uk Kim 373f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " %-40s %s", 374f8146b88SJung-uk Kim ParentPath, AcpiUtGetTypeName (Node->Type)); 375f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 376f8146b88SJung-uk Kim 377f8146b88SJung-uk Kim switch (Node->Type) 378f8146b88SJung-uk Kim { 379f8146b88SJung-uk Kim /* Handle externals */ 380f8146b88SJung-uk Kim 381f8146b88SJung-uk Kim case ACPI_TYPE_ANY: 382f8146b88SJung-uk Kim case ACPI_TYPE_FIELD_UNIT: 383f8146b88SJung-uk Kim 384f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " <External Object>"); 385f8146b88SJung-uk Kim break; 386f8146b88SJung-uk Kim 387f8146b88SJung-uk Kim case ACPI_TYPE_INTEGER: 388f8146b88SJung-uk Kim 389f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " %8.8X%8.8X", 390f8146b88SJung-uk Kim ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer)); 391f8146b88SJung-uk Kim break; 392f8146b88SJung-uk Kim 393f8146b88SJung-uk Kim case ACPI_TYPE_METHOD: 394f8146b88SJung-uk Kim 395f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " Invocation (%u args)", 396f8146b88SJung-uk Kim Node->ArgCount); 397f8146b88SJung-uk Kim break; 398f8146b88SJung-uk Kim 399f8146b88SJung-uk Kim case ACPI_TYPE_BUFFER_FIELD: 400f8146b88SJung-uk Kim 401f8146b88SJung-uk Kim NextOp = Node->Op; /* Create Buffer Field Op */ 402f8146b88SJung-uk Kim switch (NextOp->Asl.ParseOpcode) 403f8146b88SJung-uk Kim { 404f8146b88SJung-uk Kim case PARSEOP_CREATEBITFIELD: 405f8146b88SJung-uk Kim Length = 1; 406f8146b88SJung-uk Kim break; 407f8146b88SJung-uk Kim 408f8146b88SJung-uk Kim case PARSEOP_CREATEBYTEFIELD: 409f8146b88SJung-uk Kim Length = 8; 410f8146b88SJung-uk Kim break; 411f8146b88SJung-uk Kim 412f8146b88SJung-uk Kim case PARSEOP_CREATEWORDFIELD: 413f8146b88SJung-uk Kim Length = 16; 414f8146b88SJung-uk Kim break; 415f8146b88SJung-uk Kim 416f8146b88SJung-uk Kim case PARSEOP_CREATEDWORDFIELD: 417f8146b88SJung-uk Kim Length = 32; 418f8146b88SJung-uk Kim break; 419f8146b88SJung-uk Kim 420f8146b88SJung-uk Kim case PARSEOP_CREATEQWORDFIELD: 421f8146b88SJung-uk Kim Length = 64; 422f8146b88SJung-uk Kim break; 423f8146b88SJung-uk Kim 424f8146b88SJung-uk Kim default: 425f8146b88SJung-uk Kim Length = 0; 426f8146b88SJung-uk Kim break; 427f8146b88SJung-uk Kim } 428f8146b88SJung-uk Kim 429f8146b88SJung-uk Kim NextOp = NextOp->Asl.Child; /* Buffer name */ 430f8146b88SJung-uk Kim 431f8146b88SJung-uk Kim if (!NextOp->Asl.ExternalName) 432f8146b88SJung-uk Kim { 433f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " in Arg/Local"); 434f8146b88SJung-uk Kim } 435f8146b88SJung-uk Kim else 436f8146b88SJung-uk Kim { 437f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname ( 438f8146b88SJung-uk Kim NextOp->Asl.Node, TRUE); 439f8146b88SJung-uk Kim 440f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%.2u bit) in Buffer %s", 441f8146b88SJung-uk Kim Length, ParentPath); 442f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 443f8146b88SJung-uk Kim } 444f8146b88SJung-uk Kim break; 445f8146b88SJung-uk Kim 446f8146b88SJung-uk Kim case ACPI_TYPE_LOCAL_REGION_FIELD: 447f8146b88SJung-uk Kim 448f8146b88SJung-uk Kim NextOp = Node->Op; 449f8146b88SJung-uk Kim FieldOp = NextOp->Asl.Parent; 450f8146b88SJung-uk Kim NextOp = FieldOp->Asl.Child; 451f8146b88SJung-uk Kim 452f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname ( 453f8146b88SJung-uk Kim NextOp->Asl.Node, TRUE); 454f8146b88SJung-uk Kim 455f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%.2u bit) in Region %s", 456f8146b88SJung-uk Kim (UINT32) Node->Op->Asl.Child->Asl.Value.Integer, 457f8146b88SJung-uk Kim ParentPath); 458f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 459f8146b88SJung-uk Kim 460f8146b88SJung-uk Kim if (FieldOp->Asl.ParseOpcode == PARSEOP_FIELD) 461f8146b88SJung-uk Kim { 462f8146b88SJung-uk Kim Node = NextOp->Asl.Node; /* Region node */ 463f8146b88SJung-uk Kim NextOp = Node->Op; /* PARSEOP_REGION */ 464f8146b88SJung-uk Kim NextOp = NextOp->Asl.Child; /* Region name */ 465f8146b88SJung-uk Kim NextOp = NextOp->Asl.Next; 466f8146b88SJung-uk Kim 467f8146b88SJung-uk Kim /* Get region space/addr/len? */ 468f8146b88SJung-uk Kim 469f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%s)", 470f8146b88SJung-uk Kim AcpiUtGetRegionName ((UINT8) 471f8146b88SJung-uk Kim NextOp->Asl.Value.Integer)); 472f8146b88SJung-uk Kim } 473f8146b88SJung-uk Kim break; 474f8146b88SJung-uk Kim 475f8146b88SJung-uk Kim default: 476f8146b88SJung-uk Kim break; 477f8146b88SJung-uk Kim } 478f8146b88SJung-uk Kim 479f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n"); 480f8146b88SJung-uk Kim } 481f8146b88SJung-uk Kim break; 482f8146b88SJung-uk Kim 483f8146b88SJung-uk Kim case PARSEOP_METHOD: 484f8146b88SJung-uk Kim 485f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE); 486f8146b88SJung-uk Kim 487f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 488f8146b88SJung-uk Kim "\n[%5u] %-40s %s Declaration (%u args)\n", 489f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, ParentPath, 490f8146b88SJung-uk Kim AcpiUtGetTypeName (Op->Asl.Node->Type), Op->Asl.Node->ArgCount); 491f8146b88SJung-uk Kim 492f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 493f8146b88SJung-uk Kim break; 494f8146b88SJung-uk Kim 495f8146b88SJung-uk Kim default: 496f8146b88SJung-uk Kim break; 497f8146b88SJung-uk Kim } 498f8146b88SJung-uk Kim } 499f8146b88SJung-uk Kim 500f8146b88SJung-uk Kim 501f8146b88SJung-uk Kim /******************************************************************************* 502f8146b88SJung-uk Kim * 503f8146b88SJung-uk Kim * FUNCTION: OtXrefAnalysisWalkPart1 504f8146b88SJung-uk Kim * 505f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 506f8146b88SJung-uk Kim * 507f8146b88SJung-uk Kim * RETURN: Status 508f8146b88SJung-uk Kim * 509f8146b88SJung-uk Kim * DESCRIPTION: Secondary walk for cross-reference part 1. 510f8146b88SJung-uk Kim * 511f8146b88SJung-uk Kim ******************************************************************************/ 512f8146b88SJung-uk Kim 513f8146b88SJung-uk Kim static ACPI_STATUS 514f8146b88SJung-uk Kim OtXrefAnalysisWalkPart1 ( 515f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 516f8146b88SJung-uk Kim UINT32 Level, 517f8146b88SJung-uk Kim void *Context) 518f8146b88SJung-uk Kim { 519f8146b88SJung-uk Kim ASL_METHOD_INFO *MethodInfo = (ASL_METHOD_INFO *) Context; 520f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Next; 521f8146b88SJung-uk Kim 522f8146b88SJung-uk Kim 523f8146b88SJung-uk Kim /* Only interested in name string Ops -- ignore all others */ 524f8146b88SJung-uk Kim 525f8146b88SJung-uk Kim if ((Op->Asl.ParseOpcode != PARSEOP_NAMESEG) && 526f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) && 527f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)) 528f8146b88SJung-uk Kim { 529f8146b88SJung-uk Kim return (AE_OK); 530f8146b88SJung-uk Kim } 531f8146b88SJung-uk Kim 532f8146b88SJung-uk Kim /* No node means a locally declared object -- ignore */ 533f8146b88SJung-uk Kim 534f8146b88SJung-uk Kim if (!Op->Asl.Node) 535f8146b88SJung-uk Kim { 536f8146b88SJung-uk Kim return (AE_OK); 537f8146b88SJung-uk Kim } 538f8146b88SJung-uk Kim 539f8146b88SJung-uk Kim /* When we encounter the source Op, we are done */ 540f8146b88SJung-uk Kim 541f8146b88SJung-uk Kim Next = MethodInfo->CurrentOp; 542f8146b88SJung-uk Kim if (Next == Op) 543f8146b88SJung-uk Kim { 544f8146b88SJung-uk Kim return (AE_CTRL_TERMINATE); 545f8146b88SJung-uk Kim } 546f8146b88SJung-uk Kim 547f8146b88SJung-uk Kim /* If we have a name match, this Op is a duplicate */ 548f8146b88SJung-uk Kim 549f8146b88SJung-uk Kim if ((Next->Asl.ParseOpcode == PARSEOP_NAMESEG) || 550f8146b88SJung-uk Kim (Next->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 551f8146b88SJung-uk Kim (Next->Asl.ParseOpcode == PARSEOP_METHODCALL)) 552f8146b88SJung-uk Kim { 553f8146b88SJung-uk Kim if (!strcmp (Op->Asl.ExternalName, Next->Asl.ExternalName)) 554f8146b88SJung-uk Kim { 555f8146b88SJung-uk Kim return (AE_ALREADY_EXISTS); 556f8146b88SJung-uk Kim } 557f8146b88SJung-uk Kim } 558f8146b88SJung-uk Kim 559f8146b88SJung-uk Kim return (AE_OK); 560f8146b88SJung-uk Kim } 561f8146b88SJung-uk Kim 562f8146b88SJung-uk Kim 563f8146b88SJung-uk Kim /* 564f8146b88SJung-uk Kim * Part 2 of the cross reference file. This part emits the names of each 565f8146b88SJung-uk Kim * non-predefined method in the namespace (user methods), along with the 566f8146b88SJung-uk Kim * names of each control method that references that method. 567f8146b88SJung-uk Kim */ 568f8146b88SJung-uk Kim 569f8146b88SJung-uk Kim /******************************************************************************* 570f8146b88SJung-uk Kim * 571f8146b88SJung-uk Kim * FUNCTION: OtXrefWalkPart2 572f8146b88SJung-uk Kim * 573f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 574f8146b88SJung-uk Kim * 575f8146b88SJung-uk Kim * RETURN: Status 576f8146b88SJung-uk Kim * 577f8146b88SJung-uk Kim * DESCRIPTION: For each control method in the namespace, we will re-walk the 578f8146b88SJung-uk Kim * namespace to find each and every invocation of that control 579f8146b88SJung-uk Kim * method. Brute force, but does not matter, even for large 580f8146b88SJung-uk Kim * namespaces. Ignore predefined names (start with underscore). 581f8146b88SJung-uk Kim * 582f8146b88SJung-uk Kim ******************************************************************************/ 583f8146b88SJung-uk Kim 584f8146b88SJung-uk Kim static ACPI_STATUS 585f8146b88SJung-uk Kim OtXrefWalkPart2 ( 586f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 587f8146b88SJung-uk Kim UINT32 Level, 588f8146b88SJung-uk Kim void *Context) 589f8146b88SJung-uk Kim { 590f8146b88SJung-uk Kim ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context; 591f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 592f8146b88SJung-uk Kim char *ParentPath; 593f8146b88SJung-uk Kim 594f8146b88SJung-uk Kim 595f8146b88SJung-uk Kim /* Looking for Method Declaration Ops only */ 596f8146b88SJung-uk Kim 597f8146b88SJung-uk Kim if (!Op->Asl.Node || 598f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_METHOD)) 599f8146b88SJung-uk Kim { 600f8146b88SJung-uk Kim return (AE_OK); 601f8146b88SJung-uk Kim } 602f8146b88SJung-uk Kim 603f8146b88SJung-uk Kim /* Ignore predefined names */ 604f8146b88SJung-uk Kim 605f8146b88SJung-uk Kim if (Op->Asl.Node->Name.Ascii[0] == '_') 606f8146b88SJung-uk Kim { 607f8146b88SJung-uk Kim XrefInfo->TotalPredefinedMethods++; 608f8146b88SJung-uk Kim return (AE_OK); 609f8146b88SJung-uk Kim } 610f8146b88SJung-uk Kim 611f8146b88SJung-uk Kim Node = Op->Asl.Node; 612f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE); 613f8146b88SJung-uk Kim 614f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 615f8146b88SJung-uk Kim "\n[%5u] %-40s %s Declaration (%u args)\n", 616f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, ParentPath, 617f8146b88SJung-uk Kim AcpiUtGetTypeName (Node->Type), Node->ArgCount); 618f8146b88SJung-uk Kim 619f8146b88SJung-uk Kim XrefInfo->TotalUserMethods++; 620f8146b88SJung-uk Kim XrefInfo->ThisMethodInvocations = 0; 621f8146b88SJung-uk Kim XrefInfo->MethodOp = Op; 622f8146b88SJung-uk Kim 6236f1f1a63SJung-uk Kim (void) TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 624f8146b88SJung-uk Kim OtXrefAnalysisWalkPart2, NULL, XrefInfo); 625f8146b88SJung-uk Kim 626f8146b88SJung-uk Kim if (!XrefInfo->ThisMethodInvocations) 627f8146b88SJung-uk Kim { 628f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 629f8146b88SJung-uk Kim " Zero invocations of this method in this module\n"); 630f8146b88SJung-uk Kim XrefInfo->TotalUnreferenceUserMethods++; 631f8146b88SJung-uk Kim } 632f8146b88SJung-uk Kim else 633f8146b88SJung-uk Kim { 634f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 635f8146b88SJung-uk Kim " %u invocations of method %s in this module\n", 636f8146b88SJung-uk Kim XrefInfo->ThisMethodInvocations, ParentPath); 637f8146b88SJung-uk Kim } 638f8146b88SJung-uk Kim 639f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 640f8146b88SJung-uk Kim return (AE_OK); 641f8146b88SJung-uk Kim } 642f8146b88SJung-uk Kim 643f8146b88SJung-uk Kim 644f8146b88SJung-uk Kim /******************************************************************************* 645f8146b88SJung-uk Kim * 646f8146b88SJung-uk Kim * FUNCTION: OtXrefAnalysisWalkPart2 647f8146b88SJung-uk Kim * 648f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 649f8146b88SJung-uk Kim * 650f8146b88SJung-uk Kim * RETURN: Status 651f8146b88SJung-uk Kim * 652f8146b88SJung-uk Kim * DESCRIPTION: For every Op that is a method invocation, emit a reference 653f8146b88SJung-uk Kim * line if the Op is invoking the target method. 654f8146b88SJung-uk Kim * 655f8146b88SJung-uk Kim ******************************************************************************/ 656f8146b88SJung-uk Kim 657f8146b88SJung-uk Kim static ACPI_STATUS 658f8146b88SJung-uk Kim OtXrefAnalysisWalkPart2 ( 659f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 660f8146b88SJung-uk Kim UINT32 Level, 661f8146b88SJung-uk Kim void *Context) 662f8146b88SJung-uk Kim { 663f8146b88SJung-uk Kim ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context; 664f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *CallerOp; 665f8146b88SJung-uk Kim char *CallerFullPathname; 666f8146b88SJung-uk Kim 667f8146b88SJung-uk Kim 668f8146b88SJung-uk Kim /* Looking for MethodCall Ops only */ 669f8146b88SJung-uk Kim 670f8146b88SJung-uk Kim if (!Op->Asl.Node || 671f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)) 672f8146b88SJung-uk Kim { 673f8146b88SJung-uk Kim return (AE_OK); 674f8146b88SJung-uk Kim } 675f8146b88SJung-uk Kim 676f8146b88SJung-uk Kim /* If not a match to the target method, we are done */ 677f8146b88SJung-uk Kim 678f8146b88SJung-uk Kim if (Op->Asl.Node != XrefInfo->MethodOp->Asl.Node) 679f8146b88SJung-uk Kim { 680f8146b88SJung-uk Kim return (AE_CTRL_DEPTH); 681f8146b88SJung-uk Kim } 682f8146b88SJung-uk Kim 683f8146b88SJung-uk Kim /* Find parent method to get method caller namepath */ 684f8146b88SJung-uk Kim 685f8146b88SJung-uk Kim CallerOp = Op->Asl.Parent; 686f8146b88SJung-uk Kim while (CallerOp && 687f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_METHOD)) 688f8146b88SJung-uk Kim { 689f8146b88SJung-uk Kim CallerOp = CallerOp->Asl.Parent; 690f8146b88SJung-uk Kim } 691f8146b88SJung-uk Kim 692f8146b88SJung-uk Kim /* There is no parent method for External() statements */ 693f8146b88SJung-uk Kim 694f8146b88SJung-uk Kim if (!CallerOp) 695f8146b88SJung-uk Kim { 696f8146b88SJung-uk Kim return (AE_OK); 697f8146b88SJung-uk Kim } 698f8146b88SJung-uk Kim 699f8146b88SJung-uk Kim CallerFullPathname = AcpiNsGetNormalizedPathname ( 700f8146b88SJung-uk Kim CallerOp->Asl.Node, TRUE); 701f8146b88SJung-uk Kim 702f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 703f8146b88SJung-uk Kim "[%5u] %-40s Invocation path: %s\n", 704f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, CallerFullPathname, 705f8146b88SJung-uk Kim Op->Asl.ExternalName); 706f8146b88SJung-uk Kim 707f8146b88SJung-uk Kim ACPI_FREE (CallerFullPathname); 708f8146b88SJung-uk Kim XrefInfo->ThisMethodInvocations++; 709f8146b88SJung-uk Kim return (AE_OK); 710f8146b88SJung-uk Kim } 711f8146b88SJung-uk Kim 712f8146b88SJung-uk Kim 713f8146b88SJung-uk Kim /* 714f8146b88SJung-uk Kim * Part 3 of the cross reference file. This part emits the names of each 715f8146b88SJung-uk Kim * non-predefined method in the namespace (user methods), along with the 716f8146b88SJung-uk Kim * names of each control method that references that method. 717f8146b88SJung-uk Kim */ 718f8146b88SJung-uk Kim 719f8146b88SJung-uk Kim /******************************************************************************* 720f8146b88SJung-uk Kim * 721f8146b88SJung-uk Kim * FUNCTION: OtXrefWalkPart3 722f8146b88SJung-uk Kim * 723f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 724f8146b88SJung-uk Kim * 725f8146b88SJung-uk Kim * RETURN: Status 726f8146b88SJung-uk Kim * 727f8146b88SJung-uk Kim * DESCRIPTION: Cross-reference part 3. references to objects other than 728f8146b88SJung-uk Kim * control methods. 729f8146b88SJung-uk Kim * 730f8146b88SJung-uk Kim ******************************************************************************/ 731f8146b88SJung-uk Kim 732f8146b88SJung-uk Kim static ACPI_STATUS 733f8146b88SJung-uk Kim OtXrefWalkPart3 ( 734f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 735f8146b88SJung-uk Kim UINT32 Level, 736f8146b88SJung-uk Kim void *Context) 737f8146b88SJung-uk Kim { 738f8146b88SJung-uk Kim ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context; 739f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 740f8146b88SJung-uk Kim char *ParentPath; 741f8146b88SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 742f8146b88SJung-uk Kim 743f8146b88SJung-uk Kim 744f8146b88SJung-uk Kim /* Ignore method declarations */ 745f8146b88SJung-uk Kim 746f8146b88SJung-uk Kim if (!Op->Asl.Node || 747f8146b88SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_METHOD)) 748f8146b88SJung-uk Kim { 749f8146b88SJung-uk Kim return (AE_OK); 750f8146b88SJung-uk Kim } 751f8146b88SJung-uk Kim 752f8146b88SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 753f8146b88SJung-uk Kim if (!(OpInfo->Class & AML_CLASS_NAMED_OBJECT)) 754f8146b88SJung-uk Kim { 755f8146b88SJung-uk Kim return (AE_OK); 756f8146b88SJung-uk Kim } 757f8146b88SJung-uk Kim 758f8146b88SJung-uk Kim /* Only care about named object creation opcodes */ 759f8146b88SJung-uk Kim 760f8146b88SJung-uk Kim if ((Op->Asl.ParseOpcode != PARSEOP_NAME) && 761f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_DEVICE) && 762f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_MUTEX) && 763f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_OPERATIONREGION) && 764f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_FIELD) && 765f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_EVENT)) 766f8146b88SJung-uk Kim { 767f8146b88SJung-uk Kim return (AE_OK); 768f8146b88SJung-uk Kim } 769f8146b88SJung-uk Kim 770f8146b88SJung-uk Kim /* Ignore predefined names */ 771f8146b88SJung-uk Kim 772f8146b88SJung-uk Kim if (Op->Asl.Node->Name.Ascii[0] == '_') 773f8146b88SJung-uk Kim { 774f8146b88SJung-uk Kim return (AE_OK); 775f8146b88SJung-uk Kim } 776f8146b88SJung-uk Kim 777f8146b88SJung-uk Kim Node = Op->Asl.Node; 778f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE); 779f8146b88SJung-uk Kim 780f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 781f8146b88SJung-uk Kim "\n[%5u] %-40s %s Declaration\n", 782f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, ParentPath, 783f8146b88SJung-uk Kim AcpiUtGetTypeName (Node->Type)); 784f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 785f8146b88SJung-uk Kim 786f8146b88SJung-uk Kim XrefInfo->MethodOp = Op; 787f8146b88SJung-uk Kim XrefInfo->ThisObjectReferences = 0; 788f8146b88SJung-uk Kim XrefInfo->TotalObjects = 0; 789f8146b88SJung-uk Kim 7906f1f1a63SJung-uk Kim (void) TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 791f8146b88SJung-uk Kim OtXrefAnalysisWalkPart3, NULL, XrefInfo); 792f8146b88SJung-uk Kim 793f8146b88SJung-uk Kim if (!XrefInfo->ThisObjectReferences) 794f8146b88SJung-uk Kim { 795f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 796f8146b88SJung-uk Kim " Zero references to this object in this module\n"); 797f8146b88SJung-uk Kim XrefInfo->TotalUnreferencedObjects++; 798f8146b88SJung-uk Kim } 799f8146b88SJung-uk Kim else 800f8146b88SJung-uk Kim { 801f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 802*a009b7dcSJung-uk Kim " %u references to this object in this module [%s]\n", 803f8146b88SJung-uk Kim XrefInfo->ThisObjectReferences, ParentPath); 804f8146b88SJung-uk Kim } 805f8146b88SJung-uk Kim 806f8146b88SJung-uk Kim return (AE_OK); 807f8146b88SJung-uk Kim } 808f8146b88SJung-uk Kim 809f8146b88SJung-uk Kim 810f8146b88SJung-uk Kim /******************************************************************************* 811f8146b88SJung-uk Kim * 812f8146b88SJung-uk Kim * FUNCTION: OtXrefAnalysisWalkPart3 813f8146b88SJung-uk Kim * 814f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 815f8146b88SJung-uk Kim * 816f8146b88SJung-uk Kim * RETURN: Status 817f8146b88SJung-uk Kim * 818f8146b88SJung-uk Kim * DESCRIPTION: Secondary walk for cross-reference part 3. 819f8146b88SJung-uk Kim * 820f8146b88SJung-uk Kim ******************************************************************************/ 821f8146b88SJung-uk Kim 822f8146b88SJung-uk Kim static ACPI_STATUS 823f8146b88SJung-uk Kim OtXrefAnalysisWalkPart3 ( 824f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 825f8146b88SJung-uk Kim UINT32 Level, 826f8146b88SJung-uk Kim void *Context) 827f8146b88SJung-uk Kim { 828f8146b88SJung-uk Kim ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context; 829f8146b88SJung-uk Kim char *CallerFullPathname = NULL; 830f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *CallerOp; 831f8146b88SJung-uk Kim const char *Operator; 832f8146b88SJung-uk Kim 833f8146b88SJung-uk Kim 834f8146b88SJung-uk Kim if (!Op->Asl.Node) 835f8146b88SJung-uk Kim { 836f8146b88SJung-uk Kim return (AE_OK); 837f8146b88SJung-uk Kim } 838f8146b88SJung-uk Kim 839f8146b88SJung-uk Kim XrefInfo->TotalObjects++; 840f8146b88SJung-uk Kim 841f8146b88SJung-uk Kim /* Ignore Op that actually defined the object */ 842f8146b88SJung-uk Kim 843f8146b88SJung-uk Kim if (Op == XrefInfo->MethodOp) 844f8146b88SJung-uk Kim { 845f8146b88SJung-uk Kim return (AE_OK); 846f8146b88SJung-uk Kim } 847f8146b88SJung-uk Kim 848f8146b88SJung-uk Kim /* Only interested in Ops that reference the target node */ 849f8146b88SJung-uk Kim 850f8146b88SJung-uk Kim if (Op->Asl.Node != XrefInfo->MethodOp->Asl.Node) 851f8146b88SJung-uk Kim { 852f8146b88SJung-uk Kim return (AE_OK); 853f8146b88SJung-uk Kim } 854f8146b88SJung-uk Kim 855f8146b88SJung-uk Kim /* Find parent "open scope" object to get method caller namepath */ 856f8146b88SJung-uk Kim 857f8146b88SJung-uk Kim CallerOp = Op->Asl.Parent; 858f8146b88SJung-uk Kim while (CallerOp && 859f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_NAME) && 860f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_METHOD) && 861f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_DEVICE) && 862f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_POWERRESOURCE) && 863f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_PROCESSOR) && 864f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_THERMALZONE)) 865f8146b88SJung-uk Kim { 866f8146b88SJung-uk Kim CallerOp = CallerOp->Asl.Parent; 867f8146b88SJung-uk Kim } 868f8146b88SJung-uk Kim 869f8146b88SJung-uk Kim if (CallerOp == XrefInfo->CurrentMethodOp) 870f8146b88SJung-uk Kim { 871f8146b88SJung-uk Kim return (AE_OK); 872f8146b88SJung-uk Kim } 873f8146b88SJung-uk Kim 874f8146b88SJung-uk Kim /* Null CallerOp means the caller is at the namespace root */ 875f8146b88SJung-uk Kim 876f8146b88SJung-uk Kim if (CallerOp) 877f8146b88SJung-uk Kim { 878f8146b88SJung-uk Kim CallerFullPathname = AcpiNsGetNormalizedPathname ( 879f8146b88SJung-uk Kim CallerOp->Asl.Node, TRUE); 880f8146b88SJung-uk Kim } 881f8146b88SJung-uk Kim 882f8146b88SJung-uk Kim /* There are some special cases for the oddball operators */ 883f8146b88SJung-uk Kim 884f8146b88SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_SCOPE) 885f8146b88SJung-uk Kim { 886f8146b88SJung-uk Kim Operator = "Scope"; 887f8146b88SJung-uk Kim } 888f8146b88SJung-uk Kim else if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_ALIAS) 889f8146b88SJung-uk Kim { 890f8146b88SJung-uk Kim Operator = "Alias"; 891f8146b88SJung-uk Kim } 892f8146b88SJung-uk Kim else if (!CallerOp) 893f8146b88SJung-uk Kim { 894f8146b88SJung-uk Kim Operator = "ModLevel"; 895f8146b88SJung-uk Kim } 896f8146b88SJung-uk Kim else 897f8146b88SJung-uk Kim { 898f8146b88SJung-uk Kim Operator = AcpiUtGetTypeName (CallerOp->Asl.Node->Type); 899f8146b88SJung-uk Kim } 900f8146b88SJung-uk Kim 901f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 902f8146b88SJung-uk Kim "[%5u] %-40s %-8s via path: %s, Operator: %s\n", 903f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, 904f8146b88SJung-uk Kim CallerFullPathname ? CallerFullPathname : "<root>", 905f8146b88SJung-uk Kim Operator, 906f8146b88SJung-uk Kim Op->Asl.ExternalName, 907f8146b88SJung-uk Kim Op->Asl.Parent->Asl.ParseOpName); 908f8146b88SJung-uk Kim 909f8146b88SJung-uk Kim if (!CallerOp) 910f8146b88SJung-uk Kim { 911f8146b88SJung-uk Kim CallerOp = ACPI_TO_POINTER (0xFFFFFFFF); 912f8146b88SJung-uk Kim } 913f8146b88SJung-uk Kim 914f8146b88SJung-uk Kim if (CallerFullPathname) 915f8146b88SJung-uk Kim { 916f8146b88SJung-uk Kim ACPI_FREE (CallerFullPathname); 917f8146b88SJung-uk Kim } 918f8146b88SJung-uk Kim 919f8146b88SJung-uk Kim XrefInfo->CurrentMethodOp = CallerOp; 920f8146b88SJung-uk Kim XrefInfo->ThisObjectReferences++; 921f8146b88SJung-uk Kim return (AE_OK); 922f8146b88SJung-uk Kim } 923