1*f8146b88SJung-uk Kim /****************************************************************************** 2*f8146b88SJung-uk Kim * 3*f8146b88SJung-uk Kim * Module Name: aslxrefout.c - support for optional cross-reference file 4*f8146b88SJung-uk Kim * 5*f8146b88SJung-uk Kim *****************************************************************************/ 6*f8146b88SJung-uk Kim 7*f8146b88SJung-uk Kim /* 8*f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, Intel Corp. 9*f8146b88SJung-uk Kim * All rights reserved. 10*f8146b88SJung-uk Kim * 11*f8146b88SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*f8146b88SJung-uk Kim * modification, are permitted provided that the following conditions 13*f8146b88SJung-uk Kim * are met: 14*f8146b88SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*f8146b88SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*f8146b88SJung-uk Kim * without modification. 17*f8146b88SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*f8146b88SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*f8146b88SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*f8146b88SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*f8146b88SJung-uk Kim * binary redistribution. 22*f8146b88SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*f8146b88SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*f8146b88SJung-uk Kim * from this software without specific prior written permission. 25*f8146b88SJung-uk Kim * 26*f8146b88SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*f8146b88SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*f8146b88SJung-uk Kim * Software Foundation. 29*f8146b88SJung-uk Kim * 30*f8146b88SJung-uk Kim * NO WARRANTY 31*f8146b88SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*f8146b88SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*f8146b88SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*f8146b88SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*f8146b88SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*f8146b88SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*f8146b88SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*f8146b88SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*f8146b88SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*f8146b88SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*f8146b88SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*f8146b88SJung-uk Kim */ 43*f8146b88SJung-uk Kim 44*f8146b88SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 45*f8146b88SJung-uk Kim #include "aslcompiler.y.h" 46*f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 47*f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 48*f8146b88SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 49*f8146b88SJung-uk Kim 50*f8146b88SJung-uk Kim #define _COMPONENT ACPI_COMPILER 51*f8146b88SJung-uk Kim ACPI_MODULE_NAME ("aslxrefout") 52*f8146b88SJung-uk Kim 53*f8146b88SJung-uk Kim 54*f8146b88SJung-uk Kim /* Local prototypes */ 55*f8146b88SJung-uk Kim 56*f8146b88SJung-uk Kim static ACPI_STATUS 57*f8146b88SJung-uk Kim OtXrefWalkPart2 ( 58*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 59*f8146b88SJung-uk Kim UINT32 Level, 60*f8146b88SJung-uk Kim void *Context); 61*f8146b88SJung-uk Kim 62*f8146b88SJung-uk Kim static ACPI_STATUS 63*f8146b88SJung-uk Kim OtXrefWalkPart3 ( 64*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 65*f8146b88SJung-uk Kim UINT32 Level, 66*f8146b88SJung-uk Kim void *Context); 67*f8146b88SJung-uk Kim 68*f8146b88SJung-uk Kim static ACPI_STATUS 69*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart1 ( 70*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 71*f8146b88SJung-uk Kim UINT32 Level, 72*f8146b88SJung-uk Kim void *Context); 73*f8146b88SJung-uk Kim 74*f8146b88SJung-uk Kim 75*f8146b88SJung-uk Kim static ACPI_STATUS 76*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart2 ( 77*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 78*f8146b88SJung-uk Kim UINT32 Level, 79*f8146b88SJung-uk Kim void *Context); 80*f8146b88SJung-uk Kim 81*f8146b88SJung-uk Kim static ACPI_STATUS 82*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart3 ( 83*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 84*f8146b88SJung-uk Kim UINT32 Level, 85*f8146b88SJung-uk Kim void *Context); 86*f8146b88SJung-uk Kim 87*f8146b88SJung-uk Kim 88*f8146b88SJung-uk Kim /******************************************************************************* 89*f8146b88SJung-uk Kim * 90*f8146b88SJung-uk Kim * FUNCTION: OtPrintHeaders 91*f8146b88SJung-uk Kim * 92*f8146b88SJung-uk Kim * PARAMETERS: Message - Main header message 93*f8146b88SJung-uk Kim * 94*f8146b88SJung-uk Kim * RETURN: None 95*f8146b88SJung-uk Kim * 96*f8146b88SJung-uk Kim * DESCRIPTION: Emits the main header message along with field descriptions 97*f8146b88SJung-uk Kim * 98*f8146b88SJung-uk Kim ******************************************************************************/ 99*f8146b88SJung-uk Kim 100*f8146b88SJung-uk Kim void 101*f8146b88SJung-uk Kim OtPrintHeaders ( 102*f8146b88SJung-uk Kim char *Message) 103*f8146b88SJung-uk Kim { 104*f8146b88SJung-uk Kim UINT32 Length; 105*f8146b88SJung-uk Kim 106*f8146b88SJung-uk Kim 107*f8146b88SJung-uk Kim Length = strlen (Message); 108*f8146b88SJung-uk Kim 109*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\n%s\n", Message); 110*f8146b88SJung-uk Kim while (Length) 111*f8146b88SJung-uk Kim { 112*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "-"); 113*f8146b88SJung-uk Kim Length--; 114*f8146b88SJung-uk Kim } 115*f8146b88SJung-uk Kim 116*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\nLineno %-40s Description\n", 117*f8146b88SJung-uk Kim "Full Pathname"); 118*f8146b88SJung-uk Kim } 119*f8146b88SJung-uk Kim 120*f8146b88SJung-uk Kim 121*f8146b88SJung-uk Kim /******************************************************************************* 122*f8146b88SJung-uk Kim * 123*f8146b88SJung-uk Kim * FUNCTION: OtCreateXrefFile 124*f8146b88SJung-uk Kim * 125*f8146b88SJung-uk Kim * PARAMETERS: None 126*f8146b88SJung-uk Kim * 127*f8146b88SJung-uk Kim * RETURN: None 128*f8146b88SJung-uk Kim * 129*f8146b88SJung-uk Kim * DESCRIPTION Main entry point for parts 2 and 3 of the cross-reference 130*f8146b88SJung-uk Kim * file. 131*f8146b88SJung-uk Kim * 132*f8146b88SJung-uk Kim ******************************************************************************/ 133*f8146b88SJung-uk Kim 134*f8146b88SJung-uk Kim void 135*f8146b88SJung-uk Kim OtCreateXrefFile ( 136*f8146b88SJung-uk Kim void) 137*f8146b88SJung-uk Kim { 138*f8146b88SJung-uk Kim ASL_XREF_INFO XrefInfo; 139*f8146b88SJung-uk Kim 140*f8146b88SJung-uk Kim 141*f8146b88SJung-uk Kim /* Build cross-reference output file if requested */ 142*f8146b88SJung-uk Kim 143*f8146b88SJung-uk Kim if (!Gbl_CrossReferenceOutput) 144*f8146b88SJung-uk Kim { 145*f8146b88SJung-uk Kim return; 146*f8146b88SJung-uk Kim } 147*f8146b88SJung-uk Kim 148*f8146b88SJung-uk Kim memset (&XrefInfo, 0, sizeof (ASL_XREF_INFO)); 149*f8146b88SJung-uk Kim 150*f8146b88SJung-uk Kim /* Cross-reference output file, part 2 (Method invocations) */ 151*f8146b88SJung-uk Kim 152*f8146b88SJung-uk Kim OtPrintHeaders ("Part 2: Method Reference Map " 153*f8146b88SJung-uk Kim "(Invocations of each user-defined control method)"); 154*f8146b88SJung-uk Kim 155*f8146b88SJung-uk Kim TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 156*f8146b88SJung-uk Kim OtXrefWalkPart2, NULL, &XrefInfo); 157*f8146b88SJung-uk Kim 158*f8146b88SJung-uk Kim /* Cross-reference output file, part 3 (All other object refs) */ 159*f8146b88SJung-uk Kim 160*f8146b88SJung-uk Kim OtPrintHeaders ("Part 3: Full Object Reference Map " 161*f8146b88SJung-uk Kim "(Methods that reference each object in namespace"); 162*f8146b88SJung-uk Kim 163*f8146b88SJung-uk Kim TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 164*f8146b88SJung-uk Kim OtXrefWalkPart3, NULL, &XrefInfo); 165*f8146b88SJung-uk Kim 166*f8146b88SJung-uk Kim /* Cross-reference summary */ 167*f8146b88SJung-uk Kim 168*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n\nObject Summary\n"); 169*f8146b88SJung-uk Kim 170*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 171*f8146b88SJung-uk Kim "\nTotal methods: %u\n", 172*f8146b88SJung-uk Kim XrefInfo.TotalPredefinedMethods + XrefInfo.TotalUserMethods); 173*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 174*f8146b88SJung-uk Kim "Total predefined methods: %u\n", 175*f8146b88SJung-uk Kim XrefInfo.TotalPredefinedMethods); 176*f8146b88SJung-uk Kim 177*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 178*f8146b88SJung-uk Kim "\nTotal user methods: %u\n", 179*f8146b88SJung-uk Kim XrefInfo.TotalUserMethods); 180*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 181*f8146b88SJung-uk Kim "Total unreferenced user methods %u\n", 182*f8146b88SJung-uk Kim XrefInfo.TotalUnreferenceUserMethods); 183*f8146b88SJung-uk Kim 184*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 185*f8146b88SJung-uk Kim "\nTotal defined objects: %u\n", 186*f8146b88SJung-uk Kim XrefInfo.TotalObjects); 187*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 188*f8146b88SJung-uk Kim "Total unreferenced objects: %u\n", 189*f8146b88SJung-uk Kim XrefInfo.TotalUnreferencedObjects); 190*f8146b88SJung-uk Kim } 191*f8146b88SJung-uk Kim 192*f8146b88SJung-uk Kim 193*f8146b88SJung-uk Kim /* 194*f8146b88SJung-uk Kim * Part 1 of the cross reference file. This part emits the namespace objects 195*f8146b88SJung-uk Kim * that are referenced by each control method in the namespace. 196*f8146b88SJung-uk Kim * 197*f8146b88SJung-uk Kim * Part 2 and 3 are below part 1. 198*f8146b88SJung-uk Kim */ 199*f8146b88SJung-uk Kim 200*f8146b88SJung-uk Kim /******************************************************************************* 201*f8146b88SJung-uk Kim * 202*f8146b88SJung-uk Kim * FUNCTION: OtXrefWalkPart1 203*f8146b88SJung-uk Kim * 204*f8146b88SJung-uk Kim * PARAMETERS: Op - Current parse Op 205*f8146b88SJung-uk Kim * Level - Current tree nesting level 206*f8146b88SJung-uk Kim * MethodInfo - Info block for the current method 207*f8146b88SJung-uk Kim * 208*f8146b88SJung-uk Kim * 209*f8146b88SJung-uk Kim * RETURN: None 210*f8146b88SJung-uk Kim * 211*f8146b88SJung-uk Kim * DESCRIPTION: Entry point for the creation of the method call reference map. 212*f8146b88SJung-uk Kim * For each control method in the namespace, all other methods 213*f8146b88SJung-uk Kim * that invoke the method are listed. Predefined names/methods 214*f8146b88SJung-uk Kim * that start with an underscore are ignored, because these are 215*f8146b88SJung-uk Kim * essentially external/public interfaces. 216*f8146b88SJung-uk Kim 217*f8146b88SJung-uk Kim * DESCRIPTION: Entry point for the creation of the object reference map. 218*f8146b88SJung-uk Kim * For each control method in the namespace, all objects that 219*f8146b88SJung-uk Kim * are referenced by the method are listed. 220*f8146b88SJung-uk Kim * 221*f8146b88SJung-uk Kim * Called during a normal namespace walk, once per namespace 222*f8146b88SJung-uk Kim * object. (MtMethodAnalysisWalkBegin) 223*f8146b88SJung-uk Kim * 224*f8146b88SJung-uk Kim ******************************************************************************/ 225*f8146b88SJung-uk Kim 226*f8146b88SJung-uk Kim void 227*f8146b88SJung-uk Kim OtXrefWalkPart1 ( 228*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 229*f8146b88SJung-uk Kim UINT32 Level, 230*f8146b88SJung-uk Kim ASL_METHOD_INFO *MethodInfo) 231*f8146b88SJung-uk Kim { 232*f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 233*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 234*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *FieldOp; 235*f8146b88SJung-uk Kim char *ParentPath; 236*f8146b88SJung-uk Kim UINT32 Length; 237*f8146b88SJung-uk Kim ACPI_STATUS Status; 238*f8146b88SJung-uk Kim 239*f8146b88SJung-uk Kim 240*f8146b88SJung-uk Kim switch (Op->Asl.ParseOpcode) 241*f8146b88SJung-uk Kim { 242*f8146b88SJung-uk Kim case PARSEOP_NAMESEG: 243*f8146b88SJung-uk Kim case PARSEOP_NAMESTRING: 244*f8146b88SJung-uk Kim case PARSEOP_METHODCALL: 245*f8146b88SJung-uk Kim 246*f8146b88SJung-uk Kim if (!MethodInfo || 247*f8146b88SJung-uk Kim (MethodInfo->Op->Asl.Child == Op) || 248*f8146b88SJung-uk Kim !Op->Asl.Node) 249*f8146b88SJung-uk Kim { 250*f8146b88SJung-uk Kim break; 251*f8146b88SJung-uk Kim } 252*f8146b88SJung-uk Kim 253*f8146b88SJung-uk Kim MethodInfo->CurrentOp = Op; 254*f8146b88SJung-uk Kim Node = Op->Asl.Node; 255*f8146b88SJung-uk Kim 256*f8146b88SJung-uk Kim /* Find all objects referenced by this method */ 257*f8146b88SJung-uk Kim 258*f8146b88SJung-uk Kim Status = TrWalkParseTree (MethodInfo->Op, ASL_WALK_VISIT_DOWNWARD, 259*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart1, NULL, MethodInfo); 260*f8146b88SJung-uk Kim 261*f8146b88SJung-uk Kim if (Status == AE_CTRL_TERMINATE) 262*f8146b88SJung-uk Kim { 263*f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE); 264*f8146b88SJung-uk Kim 265*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " %-40s %s", 266*f8146b88SJung-uk Kim ParentPath, AcpiUtGetTypeName (Node->Type)); 267*f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 268*f8146b88SJung-uk Kim 269*f8146b88SJung-uk Kim switch (Node->Type) 270*f8146b88SJung-uk Kim { 271*f8146b88SJung-uk Kim /* Handle externals */ 272*f8146b88SJung-uk Kim 273*f8146b88SJung-uk Kim case ACPI_TYPE_ANY: 274*f8146b88SJung-uk Kim case ACPI_TYPE_FIELD_UNIT: 275*f8146b88SJung-uk Kim 276*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " <External Object>"); 277*f8146b88SJung-uk Kim break; 278*f8146b88SJung-uk Kim 279*f8146b88SJung-uk Kim case ACPI_TYPE_INTEGER: 280*f8146b88SJung-uk Kim 281*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " %8.8X%8.8X", 282*f8146b88SJung-uk Kim ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer)); 283*f8146b88SJung-uk Kim break; 284*f8146b88SJung-uk Kim 285*f8146b88SJung-uk Kim case ACPI_TYPE_METHOD: 286*f8146b88SJung-uk Kim 287*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " Invocation (%u args)", 288*f8146b88SJung-uk Kim Node->ArgCount); 289*f8146b88SJung-uk Kim break; 290*f8146b88SJung-uk Kim 291*f8146b88SJung-uk Kim case ACPI_TYPE_BUFFER_FIELD: 292*f8146b88SJung-uk Kim 293*f8146b88SJung-uk Kim NextOp = Node->Op; /* Create Buffer Field Op */ 294*f8146b88SJung-uk Kim switch (NextOp->Asl.ParseOpcode) 295*f8146b88SJung-uk Kim { 296*f8146b88SJung-uk Kim case PARSEOP_CREATEBITFIELD: 297*f8146b88SJung-uk Kim Length = 1; 298*f8146b88SJung-uk Kim break; 299*f8146b88SJung-uk Kim 300*f8146b88SJung-uk Kim case PARSEOP_CREATEBYTEFIELD: 301*f8146b88SJung-uk Kim Length = 8; 302*f8146b88SJung-uk Kim break; 303*f8146b88SJung-uk Kim 304*f8146b88SJung-uk Kim case PARSEOP_CREATEWORDFIELD: 305*f8146b88SJung-uk Kim Length = 16; 306*f8146b88SJung-uk Kim break; 307*f8146b88SJung-uk Kim 308*f8146b88SJung-uk Kim case PARSEOP_CREATEDWORDFIELD: 309*f8146b88SJung-uk Kim Length = 32; 310*f8146b88SJung-uk Kim break; 311*f8146b88SJung-uk Kim 312*f8146b88SJung-uk Kim case PARSEOP_CREATEQWORDFIELD: 313*f8146b88SJung-uk Kim Length = 64; 314*f8146b88SJung-uk Kim break; 315*f8146b88SJung-uk Kim 316*f8146b88SJung-uk Kim default: 317*f8146b88SJung-uk Kim Length = 0; 318*f8146b88SJung-uk Kim break; 319*f8146b88SJung-uk Kim } 320*f8146b88SJung-uk Kim 321*f8146b88SJung-uk Kim NextOp = NextOp->Asl.Child; /* Buffer name */ 322*f8146b88SJung-uk Kim 323*f8146b88SJung-uk Kim if (!NextOp->Asl.ExternalName) 324*f8146b88SJung-uk Kim { 325*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " in Arg/Local"); 326*f8146b88SJung-uk Kim } 327*f8146b88SJung-uk Kim else 328*f8146b88SJung-uk Kim { 329*f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname ( 330*f8146b88SJung-uk Kim NextOp->Asl.Node, TRUE); 331*f8146b88SJung-uk Kim 332*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%.2u bit) in Buffer %s", 333*f8146b88SJung-uk Kim Length, ParentPath); 334*f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 335*f8146b88SJung-uk Kim } 336*f8146b88SJung-uk Kim break; 337*f8146b88SJung-uk Kim 338*f8146b88SJung-uk Kim case ACPI_TYPE_LOCAL_REGION_FIELD: 339*f8146b88SJung-uk Kim 340*f8146b88SJung-uk Kim NextOp = Node->Op; 341*f8146b88SJung-uk Kim FieldOp = NextOp->Asl.Parent; 342*f8146b88SJung-uk Kim NextOp = FieldOp->Asl.Child; 343*f8146b88SJung-uk Kim 344*f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname ( 345*f8146b88SJung-uk Kim NextOp->Asl.Node, TRUE); 346*f8146b88SJung-uk Kim 347*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%.2u bit) in Region %s", 348*f8146b88SJung-uk Kim (UINT32) Node->Op->Asl.Child->Asl.Value.Integer, 349*f8146b88SJung-uk Kim ParentPath); 350*f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 351*f8146b88SJung-uk Kim 352*f8146b88SJung-uk Kim if (FieldOp->Asl.ParseOpcode == PARSEOP_FIELD) 353*f8146b88SJung-uk Kim { 354*f8146b88SJung-uk Kim Node = NextOp->Asl.Node; /* Region node */ 355*f8146b88SJung-uk Kim NextOp = Node->Op; /* PARSEOP_REGION */ 356*f8146b88SJung-uk Kim NextOp = NextOp->Asl.Child; /* Region name */ 357*f8146b88SJung-uk Kim NextOp = NextOp->Asl.Next; 358*f8146b88SJung-uk Kim 359*f8146b88SJung-uk Kim /* Get region space/addr/len? */ 360*f8146b88SJung-uk Kim 361*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, " (%s)", 362*f8146b88SJung-uk Kim AcpiUtGetRegionName ((UINT8) 363*f8146b88SJung-uk Kim NextOp->Asl.Value.Integer)); 364*f8146b88SJung-uk Kim } 365*f8146b88SJung-uk Kim break; 366*f8146b88SJung-uk Kim 367*f8146b88SJung-uk Kim default: 368*f8146b88SJung-uk Kim break; 369*f8146b88SJung-uk Kim } 370*f8146b88SJung-uk Kim 371*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, "\n"); 372*f8146b88SJung-uk Kim } 373*f8146b88SJung-uk Kim break; 374*f8146b88SJung-uk Kim 375*f8146b88SJung-uk Kim case PARSEOP_METHOD: 376*f8146b88SJung-uk Kim 377*f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE); 378*f8146b88SJung-uk Kim 379*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 380*f8146b88SJung-uk Kim "\n[%5u] %-40s %s Declaration (%u args)\n", 381*f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, ParentPath, 382*f8146b88SJung-uk Kim AcpiUtGetTypeName (Op->Asl.Node->Type), Op->Asl.Node->ArgCount); 383*f8146b88SJung-uk Kim 384*f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 385*f8146b88SJung-uk Kim break; 386*f8146b88SJung-uk Kim 387*f8146b88SJung-uk Kim default: 388*f8146b88SJung-uk Kim break; 389*f8146b88SJung-uk Kim } 390*f8146b88SJung-uk Kim } 391*f8146b88SJung-uk Kim 392*f8146b88SJung-uk Kim 393*f8146b88SJung-uk Kim /******************************************************************************* 394*f8146b88SJung-uk Kim * 395*f8146b88SJung-uk Kim * FUNCTION: OtXrefAnalysisWalkPart1 396*f8146b88SJung-uk Kim * 397*f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 398*f8146b88SJung-uk Kim * 399*f8146b88SJung-uk Kim * RETURN: Status 400*f8146b88SJung-uk Kim * 401*f8146b88SJung-uk Kim * DESCRIPTION: Secondary walk for cross-reference part 1. 402*f8146b88SJung-uk Kim * 403*f8146b88SJung-uk Kim ******************************************************************************/ 404*f8146b88SJung-uk Kim 405*f8146b88SJung-uk Kim static ACPI_STATUS 406*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart1 ( 407*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 408*f8146b88SJung-uk Kim UINT32 Level, 409*f8146b88SJung-uk Kim void *Context) 410*f8146b88SJung-uk Kim { 411*f8146b88SJung-uk Kim ASL_METHOD_INFO *MethodInfo = (ASL_METHOD_INFO *) Context; 412*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Next; 413*f8146b88SJung-uk Kim 414*f8146b88SJung-uk Kim 415*f8146b88SJung-uk Kim /* Only interested in name string Ops -- ignore all others */ 416*f8146b88SJung-uk Kim 417*f8146b88SJung-uk Kim if ((Op->Asl.ParseOpcode != PARSEOP_NAMESEG) && 418*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) && 419*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)) 420*f8146b88SJung-uk Kim { 421*f8146b88SJung-uk Kim return (AE_OK); 422*f8146b88SJung-uk Kim } 423*f8146b88SJung-uk Kim 424*f8146b88SJung-uk Kim /* No node means a locally declared object -- ignore */ 425*f8146b88SJung-uk Kim 426*f8146b88SJung-uk Kim if (!Op->Asl.Node) 427*f8146b88SJung-uk Kim { 428*f8146b88SJung-uk Kim return (AE_OK); 429*f8146b88SJung-uk Kim } 430*f8146b88SJung-uk Kim 431*f8146b88SJung-uk Kim /* When we encounter the source Op, we are done */ 432*f8146b88SJung-uk Kim 433*f8146b88SJung-uk Kim Next = MethodInfo->CurrentOp; 434*f8146b88SJung-uk Kim if (Next == Op) 435*f8146b88SJung-uk Kim { 436*f8146b88SJung-uk Kim return (AE_CTRL_TERMINATE); 437*f8146b88SJung-uk Kim } 438*f8146b88SJung-uk Kim 439*f8146b88SJung-uk Kim /* If we have a name match, this Op is a duplicate */ 440*f8146b88SJung-uk Kim 441*f8146b88SJung-uk Kim if ((Next->Asl.ParseOpcode == PARSEOP_NAMESEG) || 442*f8146b88SJung-uk Kim (Next->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 443*f8146b88SJung-uk Kim (Next->Asl.ParseOpcode == PARSEOP_METHODCALL)) 444*f8146b88SJung-uk Kim { 445*f8146b88SJung-uk Kim if (!strcmp (Op->Asl.ExternalName, Next->Asl.ExternalName)) 446*f8146b88SJung-uk Kim { 447*f8146b88SJung-uk Kim return (AE_ALREADY_EXISTS); 448*f8146b88SJung-uk Kim } 449*f8146b88SJung-uk Kim } 450*f8146b88SJung-uk Kim 451*f8146b88SJung-uk Kim return (AE_OK); 452*f8146b88SJung-uk Kim } 453*f8146b88SJung-uk Kim 454*f8146b88SJung-uk Kim 455*f8146b88SJung-uk Kim /* 456*f8146b88SJung-uk Kim * Part 2 of the cross reference file. This part emits the names of each 457*f8146b88SJung-uk Kim * non-predefined method in the namespace (user methods), along with the 458*f8146b88SJung-uk Kim * names of each control method that references that method. 459*f8146b88SJung-uk Kim */ 460*f8146b88SJung-uk Kim 461*f8146b88SJung-uk Kim /******************************************************************************* 462*f8146b88SJung-uk Kim * 463*f8146b88SJung-uk Kim * FUNCTION: OtXrefWalkPart2 464*f8146b88SJung-uk Kim * 465*f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 466*f8146b88SJung-uk Kim * 467*f8146b88SJung-uk Kim * RETURN: Status 468*f8146b88SJung-uk Kim * 469*f8146b88SJung-uk Kim * DESCRIPTION: For each control method in the namespace, we will re-walk the 470*f8146b88SJung-uk Kim * namespace to find each and every invocation of that control 471*f8146b88SJung-uk Kim * method. Brute force, but does not matter, even for large 472*f8146b88SJung-uk Kim * namespaces. Ignore predefined names (start with underscore). 473*f8146b88SJung-uk Kim * 474*f8146b88SJung-uk Kim ******************************************************************************/ 475*f8146b88SJung-uk Kim 476*f8146b88SJung-uk Kim static ACPI_STATUS 477*f8146b88SJung-uk Kim OtXrefWalkPart2 ( 478*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 479*f8146b88SJung-uk Kim UINT32 Level, 480*f8146b88SJung-uk Kim void *Context) 481*f8146b88SJung-uk Kim { 482*f8146b88SJung-uk Kim ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context; 483*f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 484*f8146b88SJung-uk Kim char *ParentPath; 485*f8146b88SJung-uk Kim 486*f8146b88SJung-uk Kim 487*f8146b88SJung-uk Kim /* Looking for Method Declaration Ops only */ 488*f8146b88SJung-uk Kim 489*f8146b88SJung-uk Kim if (!Op->Asl.Node || 490*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_METHOD)) 491*f8146b88SJung-uk Kim { 492*f8146b88SJung-uk Kim return (AE_OK); 493*f8146b88SJung-uk Kim } 494*f8146b88SJung-uk Kim 495*f8146b88SJung-uk Kim /* Ignore predefined names */ 496*f8146b88SJung-uk Kim 497*f8146b88SJung-uk Kim if (Op->Asl.Node->Name.Ascii[0] == '_') 498*f8146b88SJung-uk Kim { 499*f8146b88SJung-uk Kim XrefInfo->TotalPredefinedMethods++; 500*f8146b88SJung-uk Kim return (AE_OK); 501*f8146b88SJung-uk Kim } 502*f8146b88SJung-uk Kim 503*f8146b88SJung-uk Kim Node = Op->Asl.Node; 504*f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE); 505*f8146b88SJung-uk Kim 506*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 507*f8146b88SJung-uk Kim "\n[%5u] %-40s %s Declaration (%u args)\n", 508*f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, ParentPath, 509*f8146b88SJung-uk Kim AcpiUtGetTypeName (Node->Type), Node->ArgCount); 510*f8146b88SJung-uk Kim 511*f8146b88SJung-uk Kim XrefInfo->TotalUserMethods++; 512*f8146b88SJung-uk Kim XrefInfo->ThisMethodInvocations = 0; 513*f8146b88SJung-uk Kim XrefInfo->MethodOp = Op; 514*f8146b88SJung-uk Kim 515*f8146b88SJung-uk Kim (void) TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 516*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart2, NULL, XrefInfo); 517*f8146b88SJung-uk Kim 518*f8146b88SJung-uk Kim if (!XrefInfo->ThisMethodInvocations) 519*f8146b88SJung-uk Kim { 520*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 521*f8146b88SJung-uk Kim " Zero invocations of this method in this module\n"); 522*f8146b88SJung-uk Kim XrefInfo->TotalUnreferenceUserMethods++; 523*f8146b88SJung-uk Kim } 524*f8146b88SJung-uk Kim else 525*f8146b88SJung-uk Kim { 526*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 527*f8146b88SJung-uk Kim " %u invocations of method %s in this module\n", 528*f8146b88SJung-uk Kim XrefInfo->ThisMethodInvocations, ParentPath); 529*f8146b88SJung-uk Kim } 530*f8146b88SJung-uk Kim 531*f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 532*f8146b88SJung-uk Kim return (AE_OK); 533*f8146b88SJung-uk Kim } 534*f8146b88SJung-uk Kim 535*f8146b88SJung-uk Kim 536*f8146b88SJung-uk Kim /******************************************************************************* 537*f8146b88SJung-uk Kim * 538*f8146b88SJung-uk Kim * FUNCTION: OtXrefAnalysisWalkPart2 539*f8146b88SJung-uk Kim * 540*f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 541*f8146b88SJung-uk Kim * 542*f8146b88SJung-uk Kim * RETURN: Status 543*f8146b88SJung-uk Kim * 544*f8146b88SJung-uk Kim * DESCRIPTION: For every Op that is a method invocation, emit a reference 545*f8146b88SJung-uk Kim * line if the Op is invoking the target method. 546*f8146b88SJung-uk Kim * 547*f8146b88SJung-uk Kim ******************************************************************************/ 548*f8146b88SJung-uk Kim 549*f8146b88SJung-uk Kim static ACPI_STATUS 550*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart2 ( 551*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 552*f8146b88SJung-uk Kim UINT32 Level, 553*f8146b88SJung-uk Kim void *Context) 554*f8146b88SJung-uk Kim { 555*f8146b88SJung-uk Kim ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context; 556*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *CallerOp; 557*f8146b88SJung-uk Kim char *CallerFullPathname; 558*f8146b88SJung-uk Kim 559*f8146b88SJung-uk Kim 560*f8146b88SJung-uk Kim /* Looking for MethodCall Ops only */ 561*f8146b88SJung-uk Kim 562*f8146b88SJung-uk Kim if (!Op->Asl.Node || 563*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)) 564*f8146b88SJung-uk Kim { 565*f8146b88SJung-uk Kim return (AE_OK); 566*f8146b88SJung-uk Kim } 567*f8146b88SJung-uk Kim 568*f8146b88SJung-uk Kim /* If not a match to the target method, we are done */ 569*f8146b88SJung-uk Kim 570*f8146b88SJung-uk Kim if (Op->Asl.Node != XrefInfo->MethodOp->Asl.Node) 571*f8146b88SJung-uk Kim { 572*f8146b88SJung-uk Kim return (AE_CTRL_DEPTH); 573*f8146b88SJung-uk Kim } 574*f8146b88SJung-uk Kim 575*f8146b88SJung-uk Kim /* Find parent method to get method caller namepath */ 576*f8146b88SJung-uk Kim 577*f8146b88SJung-uk Kim CallerOp = Op->Asl.Parent; 578*f8146b88SJung-uk Kim while (CallerOp && 579*f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_METHOD)) 580*f8146b88SJung-uk Kim { 581*f8146b88SJung-uk Kim CallerOp = CallerOp->Asl.Parent; 582*f8146b88SJung-uk Kim } 583*f8146b88SJung-uk Kim 584*f8146b88SJung-uk Kim /* There is no parent method for External() statements */ 585*f8146b88SJung-uk Kim 586*f8146b88SJung-uk Kim if (!CallerOp) 587*f8146b88SJung-uk Kim { 588*f8146b88SJung-uk Kim return (AE_OK); 589*f8146b88SJung-uk Kim } 590*f8146b88SJung-uk Kim 591*f8146b88SJung-uk Kim CallerFullPathname = AcpiNsGetNormalizedPathname ( 592*f8146b88SJung-uk Kim CallerOp->Asl.Node, TRUE); 593*f8146b88SJung-uk Kim 594*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 595*f8146b88SJung-uk Kim "[%5u] %-40s Invocation path: %s\n", 596*f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, CallerFullPathname, 597*f8146b88SJung-uk Kim Op->Asl.ExternalName); 598*f8146b88SJung-uk Kim 599*f8146b88SJung-uk Kim ACPI_FREE (CallerFullPathname); 600*f8146b88SJung-uk Kim XrefInfo->ThisMethodInvocations++; 601*f8146b88SJung-uk Kim return (AE_OK); 602*f8146b88SJung-uk Kim } 603*f8146b88SJung-uk Kim 604*f8146b88SJung-uk Kim 605*f8146b88SJung-uk Kim /* 606*f8146b88SJung-uk Kim * Part 3 of the cross reference file. This part emits the names of each 607*f8146b88SJung-uk Kim * non-predefined method in the namespace (user methods), along with the 608*f8146b88SJung-uk Kim * names of each control method that references that method. 609*f8146b88SJung-uk Kim */ 610*f8146b88SJung-uk Kim 611*f8146b88SJung-uk Kim /******************************************************************************* 612*f8146b88SJung-uk Kim * 613*f8146b88SJung-uk Kim * FUNCTION: OtXrefWalkPart3 614*f8146b88SJung-uk Kim * 615*f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 616*f8146b88SJung-uk Kim * 617*f8146b88SJung-uk Kim * RETURN: Status 618*f8146b88SJung-uk Kim * 619*f8146b88SJung-uk Kim * DESCRIPTION: Cross-reference part 3. references to objects other than 620*f8146b88SJung-uk Kim * control methods. 621*f8146b88SJung-uk Kim * 622*f8146b88SJung-uk Kim ******************************************************************************/ 623*f8146b88SJung-uk Kim 624*f8146b88SJung-uk Kim static ACPI_STATUS 625*f8146b88SJung-uk Kim OtXrefWalkPart3 ( 626*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 627*f8146b88SJung-uk Kim UINT32 Level, 628*f8146b88SJung-uk Kim void *Context) 629*f8146b88SJung-uk Kim { 630*f8146b88SJung-uk Kim ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context; 631*f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 632*f8146b88SJung-uk Kim char *ParentPath; 633*f8146b88SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 634*f8146b88SJung-uk Kim 635*f8146b88SJung-uk Kim 636*f8146b88SJung-uk Kim /* Ignore method declarations */ 637*f8146b88SJung-uk Kim 638*f8146b88SJung-uk Kim if (!Op->Asl.Node || 639*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_METHOD)) 640*f8146b88SJung-uk Kim { 641*f8146b88SJung-uk Kim return (AE_OK); 642*f8146b88SJung-uk Kim } 643*f8146b88SJung-uk Kim 644*f8146b88SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 645*f8146b88SJung-uk Kim if (!(OpInfo->Class & AML_CLASS_NAMED_OBJECT)) 646*f8146b88SJung-uk Kim { 647*f8146b88SJung-uk Kim return (AE_OK); 648*f8146b88SJung-uk Kim } 649*f8146b88SJung-uk Kim 650*f8146b88SJung-uk Kim /* Only care about named object creation opcodes */ 651*f8146b88SJung-uk Kim 652*f8146b88SJung-uk Kim if ((Op->Asl.ParseOpcode != PARSEOP_NAME) && 653*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_DEVICE) && 654*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_MUTEX) && 655*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_OPERATIONREGION) && 656*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_FIELD) && 657*f8146b88SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_EVENT)) 658*f8146b88SJung-uk Kim { 659*f8146b88SJung-uk Kim return (AE_OK); 660*f8146b88SJung-uk Kim } 661*f8146b88SJung-uk Kim 662*f8146b88SJung-uk Kim /* Ignore predefined names */ 663*f8146b88SJung-uk Kim 664*f8146b88SJung-uk Kim if (Op->Asl.Node->Name.Ascii[0] == '_') 665*f8146b88SJung-uk Kim { 666*f8146b88SJung-uk Kim return (AE_OK); 667*f8146b88SJung-uk Kim } 668*f8146b88SJung-uk Kim 669*f8146b88SJung-uk Kim Node = Op->Asl.Node; 670*f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE); 671*f8146b88SJung-uk Kim 672*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 673*f8146b88SJung-uk Kim "\n[%5u] %-40s %s Declaration\n", 674*f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, ParentPath, 675*f8146b88SJung-uk Kim AcpiUtGetTypeName (Node->Type)); 676*f8146b88SJung-uk Kim ACPI_FREE (ParentPath); 677*f8146b88SJung-uk Kim 678*f8146b88SJung-uk Kim XrefInfo->MethodOp = Op; 679*f8146b88SJung-uk Kim XrefInfo->ThisObjectReferences = 0; 680*f8146b88SJung-uk Kim XrefInfo->TotalObjects = 0; 681*f8146b88SJung-uk Kim 682*f8146b88SJung-uk Kim (void) TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 683*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart3, NULL, XrefInfo); 684*f8146b88SJung-uk Kim 685*f8146b88SJung-uk Kim if (!XrefInfo->ThisObjectReferences) 686*f8146b88SJung-uk Kim { 687*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 688*f8146b88SJung-uk Kim " Zero references to this object in this module\n"); 689*f8146b88SJung-uk Kim XrefInfo->TotalUnreferencedObjects++; 690*f8146b88SJung-uk Kim } 691*f8146b88SJung-uk Kim else 692*f8146b88SJung-uk Kim { 693*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 694*f8146b88SJung-uk Kim " %u references to this object in this module\n", 695*f8146b88SJung-uk Kim XrefInfo->ThisObjectReferences, ParentPath); 696*f8146b88SJung-uk Kim } 697*f8146b88SJung-uk Kim 698*f8146b88SJung-uk Kim return (AE_OK); 699*f8146b88SJung-uk Kim } 700*f8146b88SJung-uk Kim 701*f8146b88SJung-uk Kim 702*f8146b88SJung-uk Kim /******************************************************************************* 703*f8146b88SJung-uk Kim * 704*f8146b88SJung-uk Kim * FUNCTION: OtXrefAnalysisWalkPart3 705*f8146b88SJung-uk Kim * 706*f8146b88SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 707*f8146b88SJung-uk Kim * 708*f8146b88SJung-uk Kim * RETURN: Status 709*f8146b88SJung-uk Kim * 710*f8146b88SJung-uk Kim * DESCRIPTION: Secondary walk for cross-reference part 3. 711*f8146b88SJung-uk Kim * 712*f8146b88SJung-uk Kim ******************************************************************************/ 713*f8146b88SJung-uk Kim 714*f8146b88SJung-uk Kim static ACPI_STATUS 715*f8146b88SJung-uk Kim OtXrefAnalysisWalkPart3 ( 716*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op, 717*f8146b88SJung-uk Kim UINT32 Level, 718*f8146b88SJung-uk Kim void *Context) 719*f8146b88SJung-uk Kim { 720*f8146b88SJung-uk Kim ASL_XREF_INFO *XrefInfo = (ASL_XREF_INFO *) Context; 721*f8146b88SJung-uk Kim char *CallerFullPathname = NULL; 722*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *CallerOp; 723*f8146b88SJung-uk Kim const char *Operator; 724*f8146b88SJung-uk Kim 725*f8146b88SJung-uk Kim 726*f8146b88SJung-uk Kim if (!Op->Asl.Node) 727*f8146b88SJung-uk Kim { 728*f8146b88SJung-uk Kim return (AE_OK); 729*f8146b88SJung-uk Kim } 730*f8146b88SJung-uk Kim 731*f8146b88SJung-uk Kim XrefInfo->TotalObjects++; 732*f8146b88SJung-uk Kim 733*f8146b88SJung-uk Kim /* Ignore Op that actually defined the object */ 734*f8146b88SJung-uk Kim 735*f8146b88SJung-uk Kim if (Op == XrefInfo->MethodOp) 736*f8146b88SJung-uk Kim { 737*f8146b88SJung-uk Kim return (AE_OK); 738*f8146b88SJung-uk Kim } 739*f8146b88SJung-uk Kim 740*f8146b88SJung-uk Kim /* Only interested in Ops that reference the target node */ 741*f8146b88SJung-uk Kim 742*f8146b88SJung-uk Kim if (Op->Asl.Node != XrefInfo->MethodOp->Asl.Node) 743*f8146b88SJung-uk Kim { 744*f8146b88SJung-uk Kim return (AE_OK); 745*f8146b88SJung-uk Kim } 746*f8146b88SJung-uk Kim 747*f8146b88SJung-uk Kim /* Find parent "open scope" object to get method caller namepath */ 748*f8146b88SJung-uk Kim 749*f8146b88SJung-uk Kim CallerOp = Op->Asl.Parent; 750*f8146b88SJung-uk Kim while (CallerOp && 751*f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_NAME) && 752*f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_METHOD) && 753*f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_DEVICE) && 754*f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_POWERRESOURCE) && 755*f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_PROCESSOR) && 756*f8146b88SJung-uk Kim (CallerOp->Asl.ParseOpcode != PARSEOP_THERMALZONE)) 757*f8146b88SJung-uk Kim { 758*f8146b88SJung-uk Kim CallerOp = CallerOp->Asl.Parent; 759*f8146b88SJung-uk Kim } 760*f8146b88SJung-uk Kim 761*f8146b88SJung-uk Kim if (CallerOp == XrefInfo->CurrentMethodOp) 762*f8146b88SJung-uk Kim { 763*f8146b88SJung-uk Kim return (AE_OK); 764*f8146b88SJung-uk Kim } 765*f8146b88SJung-uk Kim 766*f8146b88SJung-uk Kim /* Null CallerOp means the caller is at the namespace root */ 767*f8146b88SJung-uk Kim 768*f8146b88SJung-uk Kim if (CallerOp) 769*f8146b88SJung-uk Kim { 770*f8146b88SJung-uk Kim CallerFullPathname = AcpiNsGetNormalizedPathname ( 771*f8146b88SJung-uk Kim CallerOp->Asl.Node, TRUE); 772*f8146b88SJung-uk Kim } 773*f8146b88SJung-uk Kim 774*f8146b88SJung-uk Kim /* There are some special cases for the oddball operators */ 775*f8146b88SJung-uk Kim 776*f8146b88SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_SCOPE) 777*f8146b88SJung-uk Kim { 778*f8146b88SJung-uk Kim Operator = "Scope"; 779*f8146b88SJung-uk Kim } 780*f8146b88SJung-uk Kim else if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_ALIAS) 781*f8146b88SJung-uk Kim { 782*f8146b88SJung-uk Kim Operator = "Alias"; 783*f8146b88SJung-uk Kim } 784*f8146b88SJung-uk Kim else if (!CallerOp) 785*f8146b88SJung-uk Kim { 786*f8146b88SJung-uk Kim Operator = "ModLevel"; 787*f8146b88SJung-uk Kim } 788*f8146b88SJung-uk Kim else 789*f8146b88SJung-uk Kim { 790*f8146b88SJung-uk Kim Operator = AcpiUtGetTypeName (CallerOp->Asl.Node->Type); 791*f8146b88SJung-uk Kim } 792*f8146b88SJung-uk Kim 793*f8146b88SJung-uk Kim FlPrintFile (ASL_FILE_XREF_OUTPUT, 794*f8146b88SJung-uk Kim "[%5u] %-40s %-8s via path: %s, Operator: %s\n", 795*f8146b88SJung-uk Kim Op->Asl.LogicalLineNumber, 796*f8146b88SJung-uk Kim CallerFullPathname ? CallerFullPathname : "<root>", 797*f8146b88SJung-uk Kim Operator, 798*f8146b88SJung-uk Kim Op->Asl.ExternalName, 799*f8146b88SJung-uk Kim Op->Asl.Parent->Asl.ParseOpName); 800*f8146b88SJung-uk Kim 801*f8146b88SJung-uk Kim if (!CallerOp) 802*f8146b88SJung-uk Kim { 803*f8146b88SJung-uk Kim CallerOp = ACPI_TO_POINTER (0xFFFFFFFF); 804*f8146b88SJung-uk Kim } 805*f8146b88SJung-uk Kim 806*f8146b88SJung-uk Kim if (CallerFullPathname) 807*f8146b88SJung-uk Kim { 808*f8146b88SJung-uk Kim ACPI_FREE (CallerFullPathname); 809*f8146b88SJung-uk Kim } 810*f8146b88SJung-uk Kim 811*f8146b88SJung-uk Kim XrefInfo->CurrentMethodOp = CallerOp; 812*f8146b88SJung-uk Kim XrefInfo->ThisObjectReferences++; 813*f8146b88SJung-uk Kim return (AE_OK); 814*f8146b88SJung-uk Kim } 815