]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/contrib/dev/acpica/compiler/aslprune.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / contrib / dev / acpica / compiler / aslprune.c
1 /******************************************************************************
2  *
3  * Module Name: aslprune - Parse tree prune utility
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2015, 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 #include <contrib/dev/acpica/compiler/aslcompiler.h>
45 #include "aslcompiler.y.h"
46 #include <contrib/dev/acpica/include/acapps.h>
47
48 #define _COMPONENT          ACPI_COMPILER
49         ACPI_MODULE_NAME    ("aslprune")
50
51
52 /* Local prototypes */
53
54 static ACPI_STATUS
55 PrTreePruneWalk (
56     ACPI_PARSE_OBJECT       *Op,
57     UINT32                  Level,
58     void                    *Context);
59
60 static void
61 PrPrintObjectAtLevel (
62     UINT32                  Level,
63     const char              *ObjectName);
64
65
66 typedef struct acpi_prune_info
67 {
68     UINT32                  PruneLevel;
69     UINT16                  ParseOpcode;
70     UINT16                  Count;
71
72 } ACPI_PRUNE_INFO;
73
74
75 /*******************************************************************************
76  *
77  * FUNCTION:    AslPruneParseTree
78  *
79  * PARAMETERS:  PruneDepth              - Number of levels to prune
80  *              Type                    - Prune type (Device, Method, etc.)
81  *
82  * RETURN:      None
83  *
84  * DESCRIPTION: Prune off one or more levels of the ASL parse tree
85  *
86  ******************************************************************************/
87
88 void
89 AslPruneParseTree (
90     UINT32                  PruneDepth,
91     UINT32                  Type)
92 {
93     ACPI_PRUNE_INFO         PruneObj;
94
95
96     PruneObj.PruneLevel = PruneDepth;
97     PruneObj.Count = 0;
98
99     switch (Type)
100     {
101     case 0:
102         PruneObj.ParseOpcode = (UINT16) PARSEOP_DEVICE;
103         break;
104
105     case 1:
106         PruneObj.ParseOpcode = (UINT16) PARSEOP_METHOD;
107         break;
108
109     case 2:
110         PruneObj.ParseOpcode = (UINT16) PARSEOP_IF;
111         break;
112
113     default:
114         AcpiOsPrintf ("Unsupported type: %u\n", Type);
115         return;
116     }
117
118     AcpiOsPrintf ("Pruning parse tree, from depth %u\n",
119         PruneDepth);
120
121     AcpiOsPrintf ("\nRemoving Objects:\n");
122
123     TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
124         PrTreePruneWalk, NULL, ACPI_CAST_PTR (void, &PruneObj));
125
126     AcpiOsPrintf ("\n%u Total Objects Removed\n", PruneObj.Count);
127 }
128
129
130 /*******************************************************************************
131  *
132  * FUNCTION:    PrPrintObjectAtLevel
133  *
134  * PARAMETERS:  Level                   - Current nesting level
135  *              ObjectName              - ACPI name for the object
136  *
137  * RETURN:      None
138  *
139  * DESCRIPTION: Print object name with indent
140  *
141  ******************************************************************************/
142
143 static void
144 PrPrintObjectAtLevel (
145     UINT32                  Level,
146     const char              *ObjectName)
147 {
148     UINT32                  i;
149
150
151     for (i = 0; i < Level; i++)
152     {
153         AcpiOsPrintf ("  ");
154     }
155
156     AcpiOsPrintf ("[%s] at Level [%u]\n", ObjectName, Level);
157 }
158
159
160 /*******************************************************************************
161  *
162  * FUNCTION:    PrTreePruneWalk
163  *
164  * PARAMETERS:  Parse tree walk callback
165  *
166  * RETURN:      Status
167  *
168  * DESCRIPTION: Prune off one or more levels of the ASL parse tree
169  *
170  * Current objects that can be pruned are: Devices, Methods, and If/Else
171  * blocks.
172  *
173  ******************************************************************************/
174
175 static ACPI_STATUS
176 PrTreePruneWalk (
177     ACPI_PARSE_OBJECT       *Op,
178     UINT32                  Level,
179     void                    *Context)
180 {
181     ACPI_PRUNE_INFO         *PruneObj = (ACPI_PRUNE_INFO *) Context;
182
183
184     /* We only care about objects below the Prune Level threshold */
185
186     if (Level <= PruneObj->PruneLevel)
187     {
188         return (AE_OK);
189     }
190
191     if ((Op->Asl.ParseOpcode != PruneObj->ParseOpcode) &&
192        !(Op->Asl.ParseOpcode == PARSEOP_ELSE &&
193              PruneObj->ParseOpcode == PARSEOP_IF))
194     {
195         return (AE_OK);
196     }
197
198     switch (Op->Asl.ParseOpcode)
199     {
200     case PARSEOP_METHOD:
201
202         AcpiOsPrintf ("Method");
203         PrPrintObjectAtLevel (Level, Op->Asl.Child->Asl.Value.Name);
204         Op->Asl.Child->Asl.Next->Asl.Next->Asl.Next->Asl.Next->Asl.Next->Asl.Next = NULL;
205         PruneObj->Count++;
206         break;
207
208     case PARSEOP_DEVICE:
209
210         AcpiOsPrintf ("Device");
211         PrPrintObjectAtLevel (Level, Op->Asl.Child->Asl.Value.Name);
212         Op->Asl.Child->Asl.Next = NULL;
213         PruneObj->Count++;
214         break;
215
216     case PARSEOP_IF:
217     case PARSEOP_ELSE:
218
219         if (Op->Asl.ParseOpcode == PARSEOP_ELSE)
220         {
221             PrPrintObjectAtLevel(Level, "Else");
222             Op->Asl.Child = NULL;
223         }
224         else
225         {
226             PrPrintObjectAtLevel(Level, "If");
227             Op->Asl.Child->Asl.Next = NULL;
228         }
229
230         PruneObj->Count++;
231         break;
232
233     default:
234
235         break;
236     }
237
238     return (AE_OK);
239 }