1 /******************************************************************************
2 *
3 * Module Name: ahmain - Main module for the acpi help utility
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2023, 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 MERCHANTABILITY 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 #define DEFINE_AHELP_GLOBALS
45 #include "acpihelp.h"
46
47
48 /* Local prototypes */
49
50 static void
51 AhDisplayUsage (
52 void);
53
54 #define AH_UTILITY_NAME "ACPI Help Utility"
55 #define AH_SUPPORTED_OPTIONS "adeghikmopstuv^x"
56
57
58 #if defined ACPI_OPTION
59 #undef ACPI_OPTION
60 #endif
61
62 #define ACPI_OPTION(Name, Description) \
63 AcpiOsPrintf (" %-24s%s\n", Name, Description);
64
65
66 /******************************************************************************
67 *
68 * FUNCTION: AhDisplayUsage
69 *
70 * DESCRIPTION: Usage message
71 *
72 ******************************************************************************/
73
74 static void
AhDisplayUsage(void)75 AhDisplayUsage (
76 void)
77 {
78
79 ACPI_USAGE_HEADER ("acpihelp <options> [Name/Prefix | HexValue]");
80 ACPI_OPTION ("-h", "Display help");
81 ACPI_OPTION ("-v", "Display version information");
82 ACPI_OPTION ("-vd", "Display build date and time");
83
84 ACPI_USAGE_TEXT ("\nAML Names and Encodings (ACPI Machine Language):\n");
85 ACPI_OPTION ("-a [Name/Prefix | *]", "Display both ASL operator and AML opcode name(s)");
86 ACPI_OPTION ("-g [Name/Prefix | *]", "Display AML grammar elements(s)");
87 ACPI_OPTION ("-m [Name/Prefix | *]", "Display AML opcode name(s)");
88
89 ACPI_USAGE_TEXT ("\nACPI Values:\n");
90 ACPI_OPTION ("-e [HexValue]", "Decode ACPICA exception code");
91 ACPI_OPTION ("-o [HexValue]", "Decode hex AML opcode");
92 ACPI_OPTION ("-x [HexValue]", "Decode iASL exception code");
93
94 ACPI_USAGE_TEXT ("\nASL Names and Symbols (ACPI Source Language):\n");
95 ACPI_OPTION ("-k [Name/Prefix | *]", "Display ASL non-operator keyword(s)");
96 ACPI_OPTION ("-p [Name/Prefix | *]", "Display ASL predefined method name(s)");
97 ACPI_OPTION ("-s [Name/Prefix | *]", "Display ASL operator name(s)");
98
99 ACPI_USAGE_TEXT ("\nOther miscellaneous ACPI Names:\n");
100 ACPI_OPTION ("-i [Name/Prefix | *]", "Display ACPI/PNP Hardware ID(s)");
101 ACPI_OPTION ("-d", "Display iASL Preprocessor directives");
102 ACPI_OPTION ("-t", "Display supported ACPI tables");
103 ACPI_OPTION ("-u", "Display ACPI-related UUIDs");
104
105 ACPI_USAGE_TEXT ("\nName/Prefix or HexValue not specified means \"Display All\"\n");
106 ACPI_USAGE_TEXT ("\nDefault search with valid Name/Prefix and no options:\n");
107 ACPI_USAGE_TEXT (" Find ASL/AML operator names - if NamePrefix does not start with underscore\n");
108 ACPI_USAGE_TEXT (" Find ASL predefined method names - if NamePrefix starts with underscore\n");
109 }
110
111
112 /******************************************************************************
113 *
114 * FUNCTION: main
115 *
116 * DESCRIPTION: C main function for AcpiHelp utility.
117 *
118 ******************************************************************************/
119
120 int ACPI_SYSTEM_XFACE
main(int argc,char * argv[])121 main (
122 int argc,
123 char *argv[])
124 {
125 char *Name;
126 UINT32 DecodeType;
127 int j;
128
129
130 AcpiOsInitialize ();
131 ACPI_DEBUG_INITIALIZE (); /* For debug version only */
132 printf (ACPI_COMMON_SIGNON (AH_UTILITY_NAME));
133 DecodeType = AH_DECODE_DEFAULT;
134
135 if (argc < 2)
136 {
137 AhDisplayUsage ();
138 return (0);
139 }
140
141 /* Command line options */
142
143 while ((j = AcpiGetopt (argc, argv, AH_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
144 {
145 case 'a':
146
147 DecodeType = AH_DECODE_ASL_AML;
148 break;
149
150 case 'd':
151
152 DecodeType = AH_DISPLAY_DIRECTIVES;
153 break;
154
155 case 'e':
156
157 DecodeType = AH_DECODE_EXCEPTION;
158 break;
159
160 case 'g':
161
162 DecodeType = AH_DECODE_AML_TYPE;
163 break;
164
165 case 'i':
166
167 DecodeType = AH_DISPLAY_DEVICE_IDS;
168 break;
169
170 case 'k':
171
172 DecodeType = AH_DECODE_ASL_KEYWORD;
173 break;
174
175 case 'm':
176
177 DecodeType = AH_DECODE_AML;
178 break;
179
180 case 'o':
181
182 DecodeType = AH_DECODE_AML_OPCODE;
183 break;
184
185 case 'p':
186
187 DecodeType = AH_DECODE_PREDEFINED_NAME;
188 break;
189
190 case 's':
191
192 DecodeType = AH_DECODE_ASL;
193 break;
194
195 case 't':
196
197 DecodeType = AH_DISPLAY_TABLES;
198 break;
199
200 case 'u':
201
202 DecodeType = AH_DISPLAY_UUIDS;
203 break;
204
205 case 'x':
206
207 DecodeType = AH_DECODE_ASL_EXCEPTION;
208 break;
209
210 case 'v': /* -v: (Version): signon already emitted, just exit */
211
212 switch (AcpiGbl_Optarg[0])
213 {
214 case '^': /* -v: (Version) */
215
216 return (1);
217
218 case 'd':
219
220 printf (ACPI_COMMON_BUILD_TIME);
221 return (1);
222
223 default:
224
225 printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
226 return (-1);
227 }
228 break;
229
230 case 'h':
231 default:
232
233 AhDisplayUsage ();
234 return (-1);
235 }
236
237 /* Missing (null) name means "display all" */
238
239 Name = argv[AcpiGbl_Optind];
240
241 switch (DecodeType)
242 {
243 case AH_DECODE_ASL_AML:
244
245 AhFindAslAndAmlOperators (Name);
246 break;
247
248 case AH_DECODE_AML:
249
250 AhFindAmlOpcode (Name);
251 break;
252
253 case AH_DECODE_AML_OPCODE:
254
255 AhDecodeAmlOpcode (Name);
256 break;
257
258 case AH_DECODE_AML_TYPE:
259
260 AhFindAmlTypes (Name);
261 break;
262
263 case AH_DECODE_PREDEFINED_NAME:
264
265 AhFindPredefinedNames (Name);
266 break;
267
268 case AH_DECODE_ASL:
269
270 AhFindAslOperators (Name);
271 break;
272
273 case AH_DECODE_ASL_KEYWORD:
274
275 AhFindAslKeywords (Name);
276 break;
277
278 case AH_DISPLAY_DEVICE_IDS:
279
280 AhDisplayDeviceIds (Name);
281 break;
282
283 case AH_DECODE_EXCEPTION:
284
285 AhDecodeException (Name);
286 break;
287
288 case AH_DISPLAY_UUIDS:
289
290 AhDisplayUuids ();
291 break;
292
293 case AH_DISPLAY_TABLES:
294
295 AhDisplayTables ();
296 break;
297
298 case AH_DISPLAY_DIRECTIVES:
299
300 AhDisplayDirectives ();
301 break;
302
303 case AH_DECODE_ASL_EXCEPTION:
304
305 AhDecodeAslException (Name);
306 break;
307
308 default:
309
310 if (!Name)
311 {
312 AhFindAslOperators (Name);
313 break;
314 }
315
316 if (*Name == '_')
317 {
318 AhFindPredefinedNames (Name);
319 }
320 else
321 {
322 AhFindAslAndAmlOperators (Name);
323 }
324 break;
325 }
326
327 return (0);
328 }
329