Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / tools / power / acpi / tools / acpidump / apmain.c
1 /******************************************************************************
2  *
3  * Module Name: apmain - Main module for the acpidump 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 #define _DECLARE_GLOBALS
45 #include "acpidump.h"
46
47 /*
48  * acpidump - A portable utility for obtaining system ACPI tables and dumping
49  * them in an ASCII hex format suitable for binary extraction via acpixtract.
50  *
51  * Obtaining the system ACPI tables is an OS-specific operation.
52  *
53  * This utility can be ported to any host operating system by providing a
54  * module containing system-specific versions of these interfaces:
55  *
56  *      acpi_os_get_table_by_address
57  *      acpi_os_get_table_by_index
58  *      acpi_os_get_table_by_name
59  *
60  * See the ACPICA Reference Guide for the exact definitions of these
61  * interfaces. Also, see these ACPICA source code modules for example
62  * implementations:
63  *
64  *      source/os_specific/service_layers/oswintbl.c
65  *      source/os_specific/service_layers/oslinuxtbl.c
66  */
67
68 /* Local prototypes */
69
70 static void ap_display_usage(void);
71
72 static int ap_do_options(int argc, char **argv);
73
74 static int ap_insert_action(char *argument, u32 to_be_done);
75
76 /* Table for deferred actions from command line options */
77
78 struct ap_dump_action action_table[AP_MAX_ACTIONS];
79 u32 current_action = 0;
80
81 #define AP_UTILITY_NAME             "ACPI Binary Table Dump Utility"
82 #define AP_SUPPORTED_OPTIONS        "?a:bc:f:hn:o:r:sv^xz"
83
84 /******************************************************************************
85  *
86  * FUNCTION:    ap_display_usage
87  *
88  * DESCRIPTION: Usage message for the acpi_dump utility
89  *
90  ******************************************************************************/
91
92 static void ap_display_usage(void)
93 {
94
95         ACPI_USAGE_HEADER("acpidump [options]");
96
97         ACPI_OPTION("-b", "Dump tables to binary files");
98         ACPI_OPTION("-h -?", "This help message");
99         ACPI_OPTION("-o <File>", "Redirect output to file");
100         ACPI_OPTION("-r <Address>", "Dump tables from specified RSDP");
101         ACPI_OPTION("-s", "Print table summaries only");
102         ACPI_OPTION("-v", "Display version information");
103         ACPI_OPTION("-vd", "Display build date and time");
104         ACPI_OPTION("-z", "Verbose mode");
105
106         ACPI_USAGE_TEXT("\nTable Options:\n");
107
108         ACPI_OPTION("-a <Address>", "Get table via a physical address");
109         ACPI_OPTION("-c <on|off>", "Turning on/off customized table dumping");
110         ACPI_OPTION("-f <BinaryFile>", "Get table via a binary file");
111         ACPI_OPTION("-n <Signature>", "Get table via a name/signature");
112         ACPI_OPTION("-x", "Do not use but dump XSDT");
113         ACPI_OPTION("-x -x", "Do not use or dump XSDT");
114
115         ACPI_USAGE_TEXT("\n"
116                         "Invocation without parameters dumps all available tables\n"
117                         "Multiple mixed instances of -a, -f, and -n are supported\n\n");
118 }
119
120 /******************************************************************************
121  *
122  * FUNCTION:    ap_insert_action
123  *
124  * PARAMETERS:  argument            - Pointer to the argument for this action
125  *              to_be_done          - What to do to process this action
126  *
127  * RETURN:      Status
128  *
129  * DESCRIPTION: Add an action item to the action table
130  *
131  ******************************************************************************/
132
133 static int ap_insert_action(char *argument, u32 to_be_done)
134 {
135
136         /* Insert action and check for table overflow */
137
138         action_table[current_action].argument = argument;
139         action_table[current_action].to_be_done = to_be_done;
140
141         current_action++;
142         if (current_action > AP_MAX_ACTIONS) {
143                 fprintf(stderr, "Too many table options (max %u)\n",
144                         AP_MAX_ACTIONS);
145                 return (-1);
146         }
147
148         return (0);
149 }
150
151 /******************************************************************************
152  *
153  * FUNCTION:    ap_do_options
154  *
155  * PARAMETERS:  argc/argv           - Standard argc/argv
156  *
157  * RETURN:      Status
158  *
159  * DESCRIPTION: Command line option processing. The main actions for getting
160  *              and dumping tables are deferred via the action table.
161  *
162  *****************************************************************************/
163
164 static int ap_do_options(int argc, char **argv)
165 {
166         int j;
167         acpi_status status;
168
169         /* Command line options */
170
171         while ((j =
172                 acpi_getopt(argc, argv, AP_SUPPORTED_OPTIONS)) != ACPI_OPT_END)
173                 switch (j) {
174                         /*
175                          * Global options
176                          */
177                 case 'b':       /* Dump all input tables to binary files */
178
179                         gbl_binary_mode = TRUE;
180                         continue;
181
182                 case 'c':       /* Dump customized tables */
183
184                         if (!strcmp(acpi_gbl_optarg, "on")) {
185                                 gbl_dump_customized_tables = TRUE;
186                         } else if (!strcmp(acpi_gbl_optarg, "off")) {
187                                 gbl_dump_customized_tables = FALSE;
188                         } else {
189                                 fprintf(stderr,
190                                         "%s: Cannot handle this switch, please use on|off\n",
191                                         acpi_gbl_optarg);
192                                 return (-1);
193                         }
194                         continue;
195
196                 case 'h':
197                 case '?':
198
199                         ap_display_usage();
200                         return (1);
201
202                 case 'o':       /* Redirect output to a single file */
203
204                         if (ap_open_output_file(acpi_gbl_optarg)) {
205                                 return (-1);
206                         }
207                         continue;
208
209                 case 'r':       /* Dump tables from specified RSDP */
210
211                         status =
212                             acpi_ut_strtoul64(acpi_gbl_optarg, &gbl_rsdp_base);
213                         if (ACPI_FAILURE(status)) {
214                                 fprintf(stderr,
215                                         "%s: Could not convert to a physical address\n",
216                                         acpi_gbl_optarg);
217                                 return (-1);
218                         }
219                         continue;
220
221                 case 's':       /* Print table summaries only */
222
223                         gbl_summary_mode = TRUE;
224                         continue;
225
226                 case 'x':       /* Do not use XSDT */
227
228                         if (!acpi_gbl_do_not_use_xsdt) {
229                                 acpi_gbl_do_not_use_xsdt = TRUE;
230                         } else {
231                                 gbl_do_not_dump_xsdt = TRUE;
232                         }
233                         continue;
234
235                 case 'v':       /* -v: (Version): signon already emitted, just exit */
236
237                         switch (acpi_gbl_optarg[0]) {
238                         case '^':       /* -v: (Version) */
239
240                                 fprintf(stderr,
241                                         ACPI_COMMON_SIGNON(AP_UTILITY_NAME));
242                                 return (1);
243
244                         case 'd':
245
246                                 fprintf(stderr,
247                                         ACPI_COMMON_SIGNON(AP_UTILITY_NAME));
248                                 printf(ACPI_COMMON_BUILD_TIME);
249                                 return (1);
250
251                         default:
252
253                                 printf("Unknown option: -v%s\n",
254                                        acpi_gbl_optarg);
255                                 return (-1);
256                         }
257                         break;
258
259                 case 'z':       /* Verbose mode */
260
261                         gbl_verbose_mode = TRUE;
262                         fprintf(stderr, ACPI_COMMON_SIGNON(AP_UTILITY_NAME));
263                         continue;
264
265                         /*
266                          * Table options
267                          */
268                 case 'a':       /* Get table by physical address */
269
270                         if (ap_insert_action
271                             (acpi_gbl_optarg, AP_DUMP_TABLE_BY_ADDRESS)) {
272                                 return (-1);
273                         }
274                         break;
275
276                 case 'f':       /* Get table from a file */
277
278                         if (ap_insert_action
279                             (acpi_gbl_optarg, AP_DUMP_TABLE_BY_FILE)) {
280                                 return (-1);
281                         }
282                         break;
283
284                 case 'n':       /* Get table by input name (signature) */
285
286                         if (ap_insert_action
287                             (acpi_gbl_optarg, AP_DUMP_TABLE_BY_NAME)) {
288                                 return (-1);
289                         }
290                         break;
291
292                 default:
293
294                         ap_display_usage();
295                         return (-1);
296                 }
297
298         /* If there are no actions, this means "get/dump all tables" */
299
300         if (current_action == 0) {
301                 if (ap_insert_action(NULL, AP_DUMP_ALL_TABLES)) {
302                         return (-1);
303                 }
304         }
305
306         return (0);
307 }
308
309 /******************************************************************************
310  *
311  * FUNCTION:    main
312  *
313  * PARAMETERS:  argc/argv           - Standard argc/argv
314  *
315  * RETURN:      Status
316  *
317  * DESCRIPTION: C main function for acpidump utility
318  *
319  ******************************************************************************/
320
321 #if !defined(_GNU_EFI) && !defined(_EDK2_EFI)
322 int ACPI_SYSTEM_XFACE main(int argc, char *argv[])
323 #else
324 int ACPI_SYSTEM_XFACE acpi_main(int argc, char *argv[])
325 #endif
326 {
327         int status = 0;
328         struct ap_dump_action *action;
329         u32 file_size;
330         u32 i;
331
332         ACPI_DEBUG_INITIALIZE();        /* For debug version only */
333         acpi_os_initialize();
334         gbl_output_file = ACPI_FILE_OUT;
335         acpi_gbl_integer_byte_width = 8;
336
337         /* Process command line options */
338
339         status = ap_do_options(argc, argv);
340         if (status > 0) {
341                 return (0);
342         }
343         if (status < 0) {
344                 return (status);
345         }
346
347         /* Get/dump ACPI table(s) as requested */
348
349         for (i = 0; i < current_action; i++) {
350                 action = &action_table[i];
351                 switch (action->to_be_done) {
352                 case AP_DUMP_ALL_TABLES:
353
354                         status = ap_dump_all_tables();
355                         break;
356
357                 case AP_DUMP_TABLE_BY_ADDRESS:
358
359                         status = ap_dump_table_by_address(action->argument);
360                         break;
361
362                 case AP_DUMP_TABLE_BY_NAME:
363
364                         status = ap_dump_table_by_name(action->argument);
365                         break;
366
367                 case AP_DUMP_TABLE_BY_FILE:
368
369                         status = ap_dump_table_from_file(action->argument);
370                         break;
371
372                 default:
373
374                         fprintf(stderr,
375                                 "Internal error, invalid action: 0x%X\n",
376                                 action->to_be_done);
377                         return (-1);
378                 }
379
380                 if (status) {
381                         return (status);
382                 }
383         }
384
385         if (gbl_output_filename) {
386                 if (gbl_verbose_mode) {
387
388                         /* Summary for the output file */
389
390                         file_size = cm_get_file_size(gbl_output_file);
391                         fprintf(stderr,
392                                 "Output file %s contains 0x%X (%u) bytes\n\n",
393                                 gbl_output_filename, file_size, file_size);
394                 }
395
396                 fclose(gbl_output_file);
397         }
398
399         return (status);
400 }