xref: /illumos-gate/usr/src/cmd/acpi/acpidump/apmain.c (revision 3c6b90be1d51de874ba4c1f05537c85375b6ab6e)
1 /******************************************************************************
2  *
3  * Module Name: apmain - Main module for the acpidump utility
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2016, 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 #define _DECLARE_GLOBALS
45 #include "acpidump.h"
46 #include "acapps.h"
47 
48 
49 /*
50  * acpidump - A portable utility for obtaining system ACPI tables and dumping
51  * them in an ASCII hex format suitable for binary extraction via acpixtract.
52  *
53  * Obtaining the system ACPI tables is an OS-specific operation.
54  *
55  * This utility can be ported to any host operating system by providing a
56  * module containing system-specific versions of these interfaces:
57  *
58  *      AcpiOsGetTableByAddress
59  *      AcpiOsGetTableByIndex
60  *      AcpiOsGetTableByName
61  *
62  * See the ACPICA Reference Guide for the exact definitions of these
63  * interfaces. Also, see these ACPICA source code modules for example
64  * implementations:
65  *
66  *      source/os_specific/service_layers/oswintbl.c
67  *      source/os_specific/service_layers/oslinuxtbl.c
68  */
69 
70 
71 /* Local prototypes */
72 
73 static void
74 ApDisplayUsage (
75     void);
76 
77 static int
78 ApDoOptions (
79     int                     argc,
80     char                    **argv);
81 
82 static int
83 ApInsertAction (
84     char                    *Argument,
85     UINT32                  ToBeDone);
86 
87 
88 /* Table for deferred actions from command line options */
89 
90 AP_DUMP_ACTION              ActionTable [AP_MAX_ACTIONS];
91 UINT32                      CurrentAction = 0;
92 
93 
94 #define AP_UTILITY_NAME             "ACPI Binary Table Dump Utility"
95 #define AP_SUPPORTED_OPTIONS        "?a:bc:f:hn:o:r:svxz"
96 
97 
98 /******************************************************************************
99  *
100  * FUNCTION:    ApDisplayUsage
101  *
102  * DESCRIPTION: Usage message for the AcpiDump utility
103  *
104  ******************************************************************************/
105 
106 static void
107 ApDisplayUsage (
108     void)
109 {
110 
111     ACPI_USAGE_HEADER ("acpidump [options]");
112 
113     ACPI_OPTION ("-b",                      "Dump tables to binary files");
114     ACPI_OPTION ("-h -?",                   "This help message");
115     ACPI_OPTION ("-o <File>",               "Redirect output to file");
116     ACPI_OPTION ("-r <Address>",            "Dump tables from specified RSDP");
117     ACPI_OPTION ("-s",                      "Print table summaries only");
118     ACPI_OPTION ("-v",                      "Display version information");
119     ACPI_OPTION ("-z",                      "Verbose mode");
120 
121     ACPI_USAGE_TEXT ("\nTable Options:\n");
122 
123     ACPI_OPTION ("-a <Address>",            "Get table via a physical address");
124     ACPI_OPTION ("-c <on|off>",             "Turning on/off customized table dumping");
125     ACPI_OPTION ("-f <BinaryFile>",         "Get table via a binary file");
126     ACPI_OPTION ("-n <Signature>",          "Get table via a name/signature");
127     ACPI_OPTION ("-x",                      "Do not use but dump XSDT");
128     ACPI_OPTION ("-x -x",                   "Do not use or dump XSDT");
129 
130     ACPI_USAGE_TEXT (
131         "\n"
132         "Invocation without parameters dumps all available tables\n"
133         "Multiple mixed instances of -a, -f, and -n are supported\n\n");
134 }
135 
136 
137 /******************************************************************************
138  *
139  * FUNCTION:    ApInsertAction
140  *
141  * PARAMETERS:  Argument            - Pointer to the argument for this action
142  *              ToBeDone            - What to do to process this action
143  *
144  * RETURN:      Status
145  *
146  * DESCRIPTION: Add an action item to the action table
147  *
148  ******************************************************************************/
149 
150 static int
151 ApInsertAction (
152     char                    *Argument,
153     UINT32                  ToBeDone)
154 {
155 
156     /* Insert action and check for table overflow */
157 
158     ActionTable [CurrentAction].Argument = Argument;
159     ActionTable [CurrentAction].ToBeDone = ToBeDone;
160 
161     CurrentAction++;
162     if (CurrentAction > AP_MAX_ACTIONS)
163     {
164         AcpiLogError ("Too many table options (max %u)\n", AP_MAX_ACTIONS);
165         return (-1);
166     }
167 
168     return (0);
169 }
170 
171 
172 /******************************************************************************
173  *
174  * FUNCTION:    ApDoOptions
175  *
176  * PARAMETERS:  argc/argv           - Standard argc/argv
177  *
178  * RETURN:      Status
179  *
180  * DESCRIPTION: Command line option processing. The main actions for getting
181  *              and dumping tables are deferred via the action table.
182  *
183  *****************************************************************************/
184 
185 static int
186 ApDoOptions (
187     int                     argc,
188     char                    **argv)
189 {
190     int                     j;
191     ACPI_STATUS             Status;
192 
193 
194     /* Command line options */
195 
196     while ((j = AcpiGetopt (argc, argv, AP_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
197     {
198     /*
199      * Global options
200      */
201     case 'b':   /* Dump all input tables to binary files */
202 
203         Gbl_BinaryMode = TRUE;
204         continue;
205 
206     case 'c':   /* Dump customized tables */
207 
208         if (!strcmp (AcpiGbl_Optarg, "on"))
209         {
210             Gbl_DumpCustomizedTables = TRUE;
211         }
212         else if (!strcmp (AcpiGbl_Optarg, "off"))
213         {
214             Gbl_DumpCustomizedTables = FALSE;
215         }
216         else
217         {
218             AcpiLogError ("%s: Cannot handle this switch, please use on|off\n",
219                 AcpiGbl_Optarg);
220             return (-1);
221         }
222         continue;
223 
224     case 'h':
225     case '?':
226 
227         ApDisplayUsage ();
228         return (1);
229 
230     case 'o':   /* Redirect output to a single file */
231 
232         if (ApOpenOutputFile (AcpiGbl_Optarg))
233         {
234             return (-1);
235         }
236         continue;
237 
238     case 'r':   /* Dump tables from specified RSDP */
239 
240         Status = AcpiUtStrtoul64 (AcpiGbl_Optarg, ACPI_ANY_BASE,
241             ACPI_MAX64_BYTE_WIDTH, &Gbl_RsdpBase);
242         if (ACPI_FAILURE (Status))
243         {
244             AcpiLogError ("%s: Could not convert to a physical address\n",
245                 AcpiGbl_Optarg);
246             return (-1);
247         }
248         continue;
249 
250     case 's':   /* Print table summaries only */
251 
252         Gbl_SummaryMode = TRUE;
253         continue;
254 
255     case 'x':   /* Do not use XSDT */
256 
257         if (!AcpiGbl_DoNotUseXsdt)
258         {
259             AcpiGbl_DoNotUseXsdt = TRUE;
260         }
261         else
262         {
263             Gbl_DoNotDumpXsdt = TRUE;
264         }
265         continue;
266 
267     case 'v':   /* Revision/version */
268 
269         AcpiOsPrintf (ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
270         return (1);
271 
272     case 'z':   /* Verbose mode */
273 
274         Gbl_VerboseMode = TRUE;
275         AcpiLogError (ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
276         continue;
277 
278     /*
279      * Table options
280      */
281     case 'a':   /* Get table by physical address */
282 
283         if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_ADDRESS))
284         {
285             return (-1);
286         }
287         break;
288 
289     case 'f':   /* Get table from a file */
290 
291         if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_FILE))
292         {
293             return (-1);
294         }
295         break;
296 
297     case 'n':   /* Get table by input name (signature) */
298 
299         if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_NAME))
300         {
301             return (-1);
302         }
303         break;
304 
305     default:
306 
307         ApDisplayUsage ();
308         return (-1);
309     }
310 
311     /* If there are no actions, this means "get/dump all tables" */
312 
313     if (CurrentAction == 0)
314     {
315         if (ApInsertAction (NULL, AP_DUMP_ALL_TABLES))
316         {
317             return (-1);
318         }
319     }
320 
321     return (0);
322 }
323 
324 
325 /******************************************************************************
326  *
327  * FUNCTION:    main
328  *
329  * PARAMETERS:  argc/argv           - Standard argc/argv
330  *
331  * RETURN:      Status
332  *
333  * DESCRIPTION: C main function for acpidump utility
334  *
335  ******************************************************************************/
336 
337 #ifndef _GNU_EFI
338 int ACPI_SYSTEM_XFACE
339 main (
340     int                     argc,
341     char                    *argv[])
342 #else
343 int ACPI_SYSTEM_XFACE
344 acpi_main (
345     int                     argc,
346     char                    *argv[])
347 #endif
348 {
349     int                     Status = 0;
350     AP_DUMP_ACTION          *Action;
351     UINT32                  FileSize;
352     UINT32                  i;
353 
354 
355     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
356     AcpiOsInitialize ();
357     Gbl_OutputFile = ACPI_FILE_OUT;
358 
359     /* Process command line options */
360 
361     Status = ApDoOptions (argc, argv);
362     if (Status > 0)
363     {
364         return (0);
365     }
366     if (Status < 0)
367     {
368         return (Status);
369     }
370 
371     /* Get/dump ACPI table(s) as requested */
372 
373     for (i = 0; i < CurrentAction; i++)
374     {
375         Action = &ActionTable[i];
376         switch (Action->ToBeDone)
377         {
378         case AP_DUMP_ALL_TABLES:
379 
380             Status = ApDumpAllTables ();
381             break;
382 
383         case AP_DUMP_TABLE_BY_ADDRESS:
384 
385             Status = ApDumpTableByAddress (Action->Argument);
386             break;
387 
388         case AP_DUMP_TABLE_BY_NAME:
389 
390             Status = ApDumpTableByName (Action->Argument);
391             break;
392 
393         case AP_DUMP_TABLE_BY_FILE:
394 
395             Status = ApDumpTableFromFile (Action->Argument);
396             break;
397 
398         default:
399 
400             AcpiLogError ("Internal error, invalid action: 0x%X\n",
401                 Action->ToBeDone);
402             return (-1);
403         }
404 
405         if (Status)
406         {
407             return (Status);
408         }
409     }
410 
411     if (Gbl_OutputFilename)
412     {
413         if (Gbl_VerboseMode)
414         {
415             /* Summary for the output file */
416 
417             FileSize = CmGetFileSize (Gbl_OutputFile);
418             AcpiLogError ("Output file %s contains 0x%X (%u) bytes\n\n",
419                 Gbl_OutputFilename, FileSize, FileSize);
420         }
421 
422         AcpiOsCloseFile (Gbl_OutputFile);
423     }
424 
425     return (Status);
426 }
427