xref: /freebsd/sys/contrib/dev/acpica/compiler/aslxrefout.c (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
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