xref: /freebsd/sys/contrib/dev/acpica/compiler/asllookup.c (revision f5f7c05209ca2c3748fd8b27c5e80ffad49120eb)
1 /******************************************************************************
2  *
3  * Module Name: asllookup- Namespace lookup functions
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2013, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 
45 #include <contrib/dev/acpica/compiler/aslcompiler.h>
46 #include "aslcompiler.y.h"
47 #include <contrib/dev/acpica/include/acparser.h>
48 #include <contrib/dev/acpica/include/amlcode.h>
49 #include <contrib/dev/acpica/include/acnamesp.h>
50 #include <contrib/dev/acpica/include/acdispat.h>
51 
52 
53 #define _COMPONENT          ACPI_COMPILER
54         ACPI_MODULE_NAME    ("asllookup")
55 
56 /* Local prototypes */
57 
58 static ACPI_STATUS
59 LkIsObjectUsed (
60     ACPI_HANDLE             ObjHandle,
61     UINT32                  Level,
62     void                    *Context,
63     void                    **ReturnValue);
64 
65 static ACPI_PARSE_OBJECT *
66 LkGetNameOp (
67     ACPI_PARSE_OBJECT       *Op);
68 
69 
70 /*******************************************************************************
71  *
72  * FUNCTION:    LkFindUnreferencedObjects
73  *
74  * PARAMETERS:  None
75  *
76  * RETURN:      None
77  *
78  * DESCRIPTION: Namespace walk to find objects that are not referenced in any
79  *              way. Must be called after the namespace has been cross
80  *              referenced.
81  *
82  ******************************************************************************/
83 
84 void
85 LkFindUnreferencedObjects (
86     void)
87 {
88 
89     /* Walk entire namespace from the supplied root */
90 
91     (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
92                 ACPI_UINT32_MAX, FALSE, LkIsObjectUsed, NULL,
93                 NULL, NULL);
94 }
95 
96 
97 /*******************************************************************************
98  *
99  * FUNCTION:    LkIsObjectUsed
100  *
101  * PARAMETERS:  ACPI_WALK_CALLBACK
102  *
103  * RETURN:      Status
104  *
105  * DESCRIPTION: Check for an unreferenced namespace object and emit a warning.
106  *              We have to be careful, because some types and names are
107  *              typically or always unreferenced, we don't want to issue
108  *              excessive warnings.
109  *
110  ******************************************************************************/
111 
112 static ACPI_STATUS
113 LkIsObjectUsed (
114     ACPI_HANDLE             ObjHandle,
115     UINT32                  Level,
116     void                    *Context,
117     void                    **ReturnValue)
118 {
119     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
120 
121 
122     /* Referenced flag is set during the namespace xref */
123 
124     if (Node->Flags & ANOBJ_IS_REFERENCED)
125     {
126         return (AE_OK);
127     }
128 
129     /*
130      * Ignore names that start with an underscore,
131      * these are the reserved ACPI names and are typically not referenced,
132      * they are called by the host OS.
133      */
134     if (Node->Name.Ascii[0] == '_')
135     {
136         return (AE_OK);
137     }
138 
139     /* There are some types that are typically not referenced, ignore them */
140 
141     switch (Node->Type)
142     {
143     case ACPI_TYPE_DEVICE:
144     case ACPI_TYPE_PROCESSOR:
145     case ACPI_TYPE_POWER:
146     case ACPI_TYPE_LOCAL_RESOURCE:
147         return (AE_OK);
148 
149     default:
150         break;
151     }
152 
153     /* All others are valid unreferenced namespace objects */
154 
155     if (Node->Op)
156     {
157         AslError (ASL_WARNING2, ASL_MSG_NOT_REFERENCED, LkGetNameOp (Node->Op), NULL);
158     }
159     return (AE_OK);
160 }
161 
162 
163 /*******************************************************************************
164  *
165  * FUNCTION:    LkGetNameOp
166  *
167  * PARAMETERS:  Op              - Current Op
168  *
169  * RETURN:      NameOp associated with the input op
170  *
171  * DESCRIPTION: Find the name declaration op associated with the operator
172  *
173  ******************************************************************************/
174 
175 static ACPI_PARSE_OBJECT *
176 LkGetNameOp (
177     ACPI_PARSE_OBJECT       *Op)
178 {
179     const ACPI_OPCODE_INFO  *OpInfo;
180     ACPI_PARSE_OBJECT       *NameOp = Op;
181 
182 
183     OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
184 
185 
186     /* Get the NamePath from the appropriate place */
187 
188     if (OpInfo->Flags & AML_NAMED)
189     {
190         /* For nearly all NAMED operators, the name reference is the first child */
191 
192         NameOp = Op->Asl.Child;
193         if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
194         {
195             /*
196              * ALIAS is the only oddball opcode, the name declaration
197              * (alias name) is the second operand
198              */
199             NameOp = Op->Asl.Child->Asl.Next;
200         }
201     }
202     else if (OpInfo->Flags & AML_CREATE)
203     {
204         /* Name must appear as the last parameter */
205 
206         NameOp = Op->Asl.Child;
207         while (!(NameOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
208         {
209             NameOp = NameOp->Asl.Next;
210         }
211     }
212 
213     return (NameOp);
214 }
215