1 /******************************************************************************
2  *
3  * Module Name: ahasl - ASL operator decoding for acpihelp utility
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2017, 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 "acpihelp.h"
45 
46 
47 /* Local prototypes */
48 
49 static void
50 AhDisplayAslOperator (
51     const AH_ASL_OPERATOR   *Op);
52 
53 static void
54 AhDisplayOperatorKeywords (
55     const AH_ASL_OPERATOR   *Op);
56 
57 static void
58 AhDisplayAslKeyword (
59     const AH_ASL_KEYWORD    *Op);
60 
61 
62 /*******************************************************************************
63  *
64  * FUNCTION:    AhFindAslKeywords (entry point for ASL keyword search)
65  *
66  * PARAMETERS:  Name                - Name or prefix for an ASL keyword.
67  *                                    NULL means "find all"
68  *
69  * RETURN:      None
70  *
71  * DESCRIPTION: Find all ASL keywords that match the input Name or name
72  *              prefix.
73  *
74  ******************************************************************************/
75 
76 void
77 AhFindAslKeywords (
78     char                    *Name)
79 {
80     const AH_ASL_KEYWORD    *Keyword;
81     BOOLEAN                 Found = FALSE;
82 
83 
84     AcpiUtStrupr (Name);
85 
86     for (Keyword = Gbl_AslKeywordInfo; Keyword->Name; Keyword++)
87     {
88         if (!Name || (Name[0] == '*'))
89         {
90             AhDisplayAslKeyword (Keyword);
91             Found = TRUE;
92             continue;
93         }
94 
95         /* Upper case the operator name before substring compare */
96 
97         strcpy (Gbl_Buffer, Keyword->Name);
98         AcpiUtStrupr (Gbl_Buffer);
99 
100         if (strstr (Gbl_Buffer, Name) == Gbl_Buffer)
101         {
102             AhDisplayAslKeyword (Keyword);
103             Found = TRUE;
104         }
105     }
106 
107     if (!Found)
108     {
109         printf ("%s, no matching ASL keywords\n", Name);
110     }
111 }
112 
113 
114 /*******************************************************************************
115  *
116  * FUNCTION:    AhDisplayAslKeyword
117  *
118  * PARAMETERS:  Op                  - Pointer to ASL keyword with syntax info
119  *
120  * RETURN:      None
121  *
122  * DESCRIPTION: Format and display syntax info for an ASL keyword. Splits
123  *              long lines appropriately for reading.
124  *
125  ******************************************************************************/
126 
127 static void
128 AhDisplayAslKeyword (
129     const AH_ASL_KEYWORD    *Op)
130 {
131 
132     /* ASL keyword name and description */
133 
134     printf ("%22s: %s\n", Op->Name, Op->Description);
135     if (!Op->KeywordList)
136     {
137         return;
138     }
139 
140     /* List of actual keywords */
141 
142     AhPrintOneField (24, 0, AH_MAX_ASL_LINE_LENGTH, Op->KeywordList);
143     printf ("\n");
144 }
145 
146 
147 /*******************************************************************************
148  *
149  * FUNCTION:    AhFindAslAndAmlOperators
150  *
151  * PARAMETERS:  Name                - Name or prefix for an ASL operator.
152  *                                    NULL means "find all"
153  *
154  * RETURN:      None
155  *
156  * DESCRIPTION: Find all ASL operators that match the input Name or name
157  *              prefix. Also displays the AML information if only one entry
158  *              matches.
159  *
160  ******************************************************************************/
161 
162 void
163 AhFindAslAndAmlOperators (
164     char                    *Name)
165 {
166     UINT32                  MatchCount;
167 
168 
169     MatchCount = AhFindAslOperators (Name);
170     if (MatchCount == 1)
171     {
172         AhFindAmlOpcode (Name);
173     }
174 }
175 
176 
177 /*******************************************************************************
178  *
179  * FUNCTION:    AhFindAslOperators (entry point for ASL operator search)
180  *
181  * PARAMETERS:  Name                - Name or prefix for an ASL operator.
182  *                                    NULL means "find all"
183  *
184  * RETURN:      Number of operators that matched the name prefix.
185  *
186  * DESCRIPTION: Find all ASL operators that match the input Name or name
187  *              prefix.
188  *
189  ******************************************************************************/
190 
191 UINT32
192 AhFindAslOperators (
193     char                    *Name)
194 {
195     const AH_ASL_OPERATOR   *Operator;
196     BOOLEAN                 MatchCount = 0;
197 
198 
199     AcpiUtStrupr (Name);
200 
201     /* Find/display all names that match the input name prefix */
202 
203     for (Operator = Gbl_AslOperatorInfo; Operator->Name; Operator++)
204     {
205         if (!Name || (Name[0] == '*'))
206         {
207             AhDisplayAslOperator (Operator);
208             MatchCount++;
209             continue;
210         }
211 
212         /* Upper case the operator name before substring compare */
213 
214         strcpy (Gbl_Buffer, Operator->Name);
215         AcpiUtStrupr (Gbl_Buffer);
216 
217         if (strstr (Gbl_Buffer, Name) == Gbl_Buffer)
218         {
219             AhDisplayAslOperator (Operator);
220             MatchCount++;
221         }
222     }
223 
224     if (!MatchCount)
225     {
226         printf ("%s, no matching ASL operators\n", Name);
227     }
228 
229     return (MatchCount);
230 }
231 
232 
233 /*******************************************************************************
234  *
235  * FUNCTION:    AhDisplayAslOperator
236  *
237  * PARAMETERS:  Op                  - Pointer to ASL operator with syntax info
238  *
239  * RETURN:      None
240  *
241  * DESCRIPTION: Format and display syntax info for an ASL operator. Splits
242  *              long lines appropriately for reading.
243  *
244  ******************************************************************************/
245 
246 static void
247 AhDisplayAslOperator (
248     const AH_ASL_OPERATOR   *Op)
249 {
250 
251     /* ASL operator name and description */
252 
253     printf ("%16s: %s\n", Op->Name, Op->Description);
254     if (!Op->Syntax)
255     {
256         return;
257     }
258 
259     /* Syntax for the operator */
260 
261     AhPrintOneField (18, 0, AH_MAX_ASL_LINE_LENGTH, Op->Syntax);
262     printf ("\n");
263 
264     AhDisplayOperatorKeywords (Op);
265     printf ("\n");
266 }
267 
268 
269 /*******************************************************************************
270  *
271  * FUNCTION:    AhDisplayOperatorKeywords
272  *
273  * PARAMETERS:  Op                  - Pointer to ASL keyword with syntax info
274  *
275  * RETURN:      None
276  *
277  * DESCRIPTION: Display any/all keywords that are associated with the ASL
278  *              operator.
279  *
280  ******************************************************************************/
281 
282 static void
283 AhDisplayOperatorKeywords (
284     const AH_ASL_OPERATOR   *Op)
285 {
286     char                    *Token;
287     char                    *Separators = "(){}, ";
288     BOOLEAN                 FirstKeyword = TRUE;
289 
290 
291     if (!Op || !Op->Syntax)
292     {
293         return;
294     }
295 
296     /*
297      * Find all parameters that have the word "keyword" within, and then
298      * display the info about that keyword
299      */
300     strcpy (Gbl_LineBuffer, Op->Syntax);
301     Token = strtok (Gbl_LineBuffer, Separators);
302     while (Token)
303     {
304         if (strstr (Token, "Keyword"))
305         {
306             if (FirstKeyword)
307             {
308                 printf ("\n");
309                 FirstKeyword = FALSE;
310             }
311 
312             /* Found a keyword, display keyword information */
313 
314             AhFindAslKeywords (Token);
315         }
316 
317         Token = strtok (NULL, Separators);
318     }
319 }
320