acpixtract.c revision 1.19 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.9 christos * Module Name: acpixtract - Top level functions to convert ascii/hex
4 1.9 christos * ACPI tables to the original binary tables
5 1.1 jruoho *
6 1.1 jruoho *****************************************************************************/
7 1.1 jruoho
8 1.19 christos /******************************************************************************
9 1.19 christos *
10 1.19 christos * 1. Copyright Notice
11 1.19 christos *
12 1.19 christos * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
13 1.1 jruoho * All rights reserved.
14 1.1 jruoho *
15 1.19 christos * 2. License
16 1.19 christos *
17 1.19 christos * 2.1. This is your license from Intel Corp. under its intellectual property
18 1.19 christos * rights. You may have additional license terms from the party that provided
19 1.19 christos * you this software, covering your right to use that party's intellectual
20 1.19 christos * property rights.
21 1.19 christos *
22 1.19 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 1.19 christos * copy of the source code appearing in this file ("Covered Code") an
24 1.19 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 1.19 christos * base code distributed originally by Intel ("Original Intel Code") to copy,
26 1.19 christos * make derivatives, distribute, use and display any portion of the Covered
27 1.19 christos * Code in any form, with the right to sublicense such rights; and
28 1.19 christos *
29 1.19 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 1.19 christos * license (with the right to sublicense), under only those claims of Intel
31 1.19 christos * patents that are infringed by the Original Intel Code, to make, use, sell,
32 1.19 christos * offer to sell, and import the Covered Code and derivative works thereof
33 1.19 christos * solely to the minimum extent necessary to exercise the above copyright
34 1.19 christos * license, and in no event shall the patent license extend to any additions
35 1.19 christos * to or modifications of the Original Intel Code. No other license or right
36 1.19 christos * is granted directly or by implication, estoppel or otherwise;
37 1.19 christos *
38 1.19 christos * The above copyright and patent license is granted only if the following
39 1.19 christos * conditions are met:
40 1.19 christos *
41 1.19 christos * 3. Conditions
42 1.19 christos *
43 1.19 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 1.19 christos * Redistribution of source code of any substantial portion of the Covered
45 1.19 christos * Code or modification with rights to further distribute source must include
46 1.19 christos * the above Copyright Notice, the above License, this list of Conditions,
47 1.19 christos * and the following Disclaimer and Export Compliance provision. In addition,
48 1.19 christos * Licensee must cause all Covered Code to which Licensee contributes to
49 1.19 christos * contain a file documenting the changes Licensee made to create that Covered
50 1.19 christos * Code and the date of any change. Licensee must include in that file the
51 1.19 christos * documentation of any changes made by any predecessor Licensee. Licensee
52 1.19 christos * must include a prominent statement that the modification is derived,
53 1.19 christos * directly or indirectly, from Original Intel Code.
54 1.19 christos *
55 1.19 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 1.19 christos * Redistribution of source code of any substantial portion of the Covered
57 1.19 christos * Code or modification without rights to further distribute source must
58 1.19 christos * include the following Disclaimer and Export Compliance provision in the
59 1.19 christos * documentation and/or other materials provided with distribution. In
60 1.19 christos * addition, Licensee may not authorize further sublicense of source of any
61 1.19 christos * portion of the Covered Code, and must include terms to the effect that the
62 1.19 christos * license from Licensee to its licensee is limited to the intellectual
63 1.19 christos * property embodied in the software Licensee provides to its licensee, and
64 1.19 christos * not to intellectual property embodied in modifications its licensee may
65 1.19 christos * make.
66 1.19 christos *
67 1.19 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 1.19 christos * substantial portion of the Covered Code or modification must reproduce the
69 1.19 christos * above Copyright Notice, and the following Disclaimer and Export Compliance
70 1.19 christos * provision in the documentation and/or other materials provided with the
71 1.19 christos * distribution.
72 1.19 christos *
73 1.19 christos * 3.4. Intel retains all right, title, and interest in and to the Original
74 1.19 christos * Intel Code.
75 1.19 christos *
76 1.19 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 1.19 christos * Intel shall be used in advertising or otherwise to promote the sale, use or
78 1.19 christos * other dealings in products derived from or relating to the Covered Code
79 1.19 christos * without prior written authorization from Intel.
80 1.19 christos *
81 1.19 christos * 4. Disclaimer and Export Compliance
82 1.19 christos *
83 1.19 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 1.19 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 1.19 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86 1.19 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87 1.19 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88 1.19 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 1.19 christos * PARTICULAR PURPOSE.
90 1.19 christos *
91 1.19 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 1.19 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 1.19 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 1.19 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 1.19 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 1.19 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97 1.19 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 1.19 christos * LIMITED REMEDY.
99 1.19 christos *
100 1.19 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 1.19 christos * software or system incorporating such software without first obtaining any
102 1.19 christos * required license or other approval from the U. S. Department of Commerce or
103 1.19 christos * any other agency or department of the United States Government. In the
104 1.19 christos * event Licensee exports any such software from the United States or
105 1.19 christos * re-exports any such software from a foreign destination, Licensee shall
106 1.19 christos * ensure that the distribution and export/re-export of the software is in
107 1.19 christos * compliance with all laws, regulations, orders, or other restrictions of the
108 1.19 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 1.19 christos * any of its subsidiaries will export/re-export any technical data, process,
110 1.19 christos * software, or service, directly or indirectly, to any country for which the
111 1.19 christos * United States government or any agency thereof requires an export license,
112 1.19 christos * other governmental approval, or letter of assurance, without first obtaining
113 1.19 christos * such license, approval or letter.
114 1.19 christos *
115 1.19 christos *****************************************************************************
116 1.19 christos *
117 1.19 christos * Alternatively, you may choose to be licensed under the terms of the
118 1.19 christos * following license:
119 1.19 christos *
120 1.2 christos * Redistribution and use in source and binary forms, with or without
121 1.2 christos * modification, are permitted provided that the following conditions
122 1.2 christos * are met:
123 1.2 christos * 1. Redistributions of source code must retain the above copyright
124 1.2 christos * notice, this list of conditions, and the following disclaimer,
125 1.2 christos * without modification.
126 1.2 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer
127 1.2 christos * substantially similar to the "NO WARRANTY" disclaimer below
128 1.2 christos * ("Disclaimer") and any redistribution must be conditioned upon
129 1.2 christos * including a substantially similar Disclaimer requirement for further
130 1.2 christos * binary redistribution.
131 1.2 christos * 3. Neither the names of the above-listed copyright holders nor the names
132 1.2 christos * of any contributors may be used to endorse or promote products derived
133 1.2 christos * from this software without specific prior written permission.
134 1.2 christos *
135 1.2 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
136 1.2 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
137 1.14 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
138 1.2 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
139 1.19 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
140 1.19 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
141 1.19 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
142 1.19 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
143 1.19 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
144 1.19 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
145 1.19 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
146 1.19 christos *
147 1.19 christos * Alternatively, you may choose to be licensed under the terms of the
148 1.19 christos * GNU General Public License ("GPL") version 2 as published by the Free
149 1.19 christos * Software Foundation.
150 1.19 christos *
151 1.19 christos *****************************************************************************/
152 1.2 christos
153 1.6 christos #include "acpixtract.h"
154 1.1 jruoho
155 1.1 jruoho
156 1.2 christos /******************************************************************************
157 1.2 christos *
158 1.6 christos * FUNCTION: AxExtractTables
159 1.2 christos *
160 1.6 christos * PARAMETERS: InputPathname - Filename for input acpidump file
161 1.6 christos * Signature - Requested ACPI signature to extract.
162 1.6 christos * NULL means extract ALL tables.
163 1.6 christos * MinimumInstances - Min instances that are acceptable
164 1.2 christos *
165 1.6 christos * RETURN: Status
166 1.2 christos *
167 1.6 christos * DESCRIPTION: Convert text ACPI tables to binary
168 1.2 christos *
169 1.2 christos ******************************************************************************/
170 1.2 christos
171 1.6 christos int
172 1.6 christos AxExtractTables (
173 1.6 christos char *InputPathname,
174 1.6 christos char *Signature,
175 1.6 christos unsigned int MinimumInstances)
176 1.2 christos {
177 1.6 christos FILE *InputFile;
178 1.6 christos FILE *OutputFile = NULL;
179 1.11 christos int BytesConverted;
180 1.11 christos int ThisTableBytesWritten = 0;
181 1.6 christos unsigned int FoundTable = 0;
182 1.6 christos unsigned int Instances = 0;
183 1.6 christos unsigned int ThisInstance;
184 1.7 christos char ThisSignature[5];
185 1.7 christos char UpperSignature[5];
186 1.6 christos int Status = 0;
187 1.6 christos unsigned int State = AX_STATE_FIND_HEADER;
188 1.2 christos
189 1.18 christos memset (UpperSignature, 0, sizeof(UpperSignature));
190 1.2 christos
191 1.6 christos /* Open input in text mode, output is in binary mode */
192 1.2 christos
193 1.8 christos InputFile = fopen (InputPathname, "r");
194 1.6 christos if (!InputFile)
195 1.2 christos {
196 1.6 christos printf ("Could not open input file %s\n", InputPathname);
197 1.6 christos return (-1);
198 1.2 christos }
199 1.2 christos
200 1.7 christos if (!AxIsFileAscii (InputFile))
201 1.7 christos {
202 1.7 christos fclose (InputFile);
203 1.7 christos return (-1);
204 1.7 christos }
205 1.7 christos
206 1.6 christos if (Signature)
207 1.1 jruoho {
208 1.12 christos strncpy (UpperSignature, Signature, ACPI_NAMESEG_SIZE);
209 1.7 christos AcpiUtStrupr (UpperSignature);
210 1.7 christos
211 1.6 christos /* Are there enough instances of the table to continue? */
212 1.1 jruoho
213 1.7 christos AxNormalizeSignature (UpperSignature);
214 1.9 christos Instances = AxCountTableInstances (InputPathname, UpperSignature);
215 1.1 jruoho
216 1.19 christos if (Instances < MinimumInstances ||
217 1.19 christos (Instances == 0 && MinimumInstances == AX_OPTIONAL_TABLES))
218 1.6 christos {
219 1.6 christos printf ("Table [%s] was not found in %s\n",
220 1.7 christos UpperSignature, InputPathname);
221 1.6 christos fclose (InputFile);
222 1.9 christos return (0); /* Don't abort */
223 1.6 christos }
224 1.1 jruoho
225 1.6 christos if (Instances == 0)
226 1.6 christos {
227 1.6 christos fclose (InputFile);
228 1.6 christos return (-1);
229 1.6 christos }
230 1.1 jruoho }
231 1.1 jruoho
232 1.6 christos /* Convert all instances of the table to binary */
233 1.1 jruoho
234 1.6 christos while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile))
235 1.1 jruoho {
236 1.9 christos /*
237 1.9 christos * Check up front if we have a header line of the form:
238 1.9 christos * DSDT @ 0xdfffd0c0 (10999 bytes)
239 1.9 christos */
240 1.9 christos if (AX_IS_TABLE_BLOCK_HEADER &&
241 1.9 christos (State == AX_STATE_EXTRACT_DATA))
242 1.9 christos {
243 1.9 christos /* End of previous table, start of new table */
244 1.9 christos
245 1.9 christos if (ThisTableBytesWritten)
246 1.9 christos {
247 1.9 christos printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten,
248 1.9 christos ThisTableBytesWritten, Gbl_OutputFilename);
249 1.9 christos }
250 1.9 christos else
251 1.9 christos {
252 1.9 christos Gbl_TableCount--;
253 1.9 christos }
254 1.9 christos
255 1.9 christos State = AX_STATE_FIND_HEADER;
256 1.9 christos }
257 1.9 christos
258 1.6 christos switch (State)
259 1.6 christos {
260 1.6 christos case AX_STATE_FIND_HEADER:
261 1.1 jruoho
262 1.6 christos if (!AxIsDataBlockHeader ())
263 1.6 christos {
264 1.6 christos continue;
265 1.6 christos }
266 1.1 jruoho
267 1.12 christos ACPI_COPY_NAMESEG (ThisSignature, Gbl_LineBuffer);
268 1.6 christos if (Signature)
269 1.6 christos {
270 1.6 christos /* Ignore signatures that don't match */
271 1.1 jruoho
272 1.12 christos if (!ACPI_COMPARE_NAMESEG (ThisSignature, UpperSignature))
273 1.6 christos {
274 1.6 christos continue;
275 1.6 christos }
276 1.6 christos }
277 1.1 jruoho
278 1.6 christos /*
279 1.6 christos * Get the instance number for this signature. Only the
280 1.6 christos * SSDT and PSDT tables can have multiple instances.
281 1.6 christos */
282 1.6 christos ThisInstance = AxGetNextInstance (InputPathname, ThisSignature);
283 1.1 jruoho
284 1.6 christos /* Build an output filename and create/open the output file */
285 1.1 jruoho
286 1.6 christos if (ThisInstance > 0)
287 1.6 christos {
288 1.6 christos /* Add instance number to the output filename */
289 1.1 jruoho
290 1.6 christos sprintf (Gbl_OutputFilename, "%4.4s%u.dat",
291 1.6 christos ThisSignature, ThisInstance);
292 1.6 christos }
293 1.6 christos else
294 1.6 christos {
295 1.6 christos sprintf (Gbl_OutputFilename, "%4.4s.dat",
296 1.6 christos ThisSignature);
297 1.6 christos }
298 1.1 jruoho
299 1.6 christos AcpiUtStrlwr (Gbl_OutputFilename);
300 1.6 christos OutputFile = fopen (Gbl_OutputFilename, "w+b");
301 1.6 christos if (!OutputFile)
302 1.6 christos {
303 1.6 christos printf ("Could not open output file %s\n",
304 1.6 christos Gbl_OutputFilename);
305 1.6 christos fclose (InputFile);
306 1.6 christos return (-1);
307 1.6 christos }
308 1.1 jruoho
309 1.6 christos /*
310 1.6 christos * Toss this block header of the form "<sig> @ <addr>" line
311 1.6 christos * and move on to the actual data block
312 1.6 christos */
313 1.6 christos Gbl_TableCount++;
314 1.6 christos FoundTable = 1;
315 1.6 christos ThisTableBytesWritten = 0;
316 1.6 christos State = AX_STATE_EXTRACT_DATA;
317 1.6 christos continue;
318 1.1 jruoho
319 1.6 christos case AX_STATE_EXTRACT_DATA:
320 1.1 jruoho
321 1.9 christos if (!AxIsHexDataLine ())
322 1.9 christos {
323 1.9 christos continue; /* Toss any lines that are not raw hex data */
324 1.9 christos }
325 1.9 christos
326 1.6 christos /* Empty line or non-data line terminates the data block */
327 1.1 jruoho
328 1.11 christos BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature);
329 1.6 christos switch (BytesConverted)
330 1.6 christos {
331 1.6 christos case 0:
332 1.1 jruoho
333 1.6 christos State = AX_STATE_FIND_HEADER; /* No more data block lines */
334 1.6 christos continue;
335 1.1 jruoho
336 1.6 christos case -1:
337 1.1 jruoho
338 1.11 christos Status = -1;
339 1.6 christos goto CleanupAndExit; /* There was a write error */
340 1.1 jruoho
341 1.6 christos default: /* Normal case, get next line */
342 1.1 jruoho
343 1.6 christos ThisTableBytesWritten += BytesConverted;
344 1.6 christos continue;
345 1.6 christos }
346 1.1 jruoho
347 1.6 christos default:
348 1.1 jruoho
349 1.6 christos Status = -1;
350 1.6 christos goto CleanupAndExit;
351 1.1 jruoho }
352 1.1 jruoho }
353 1.1 jruoho
354 1.6 christos if (!FoundTable)
355 1.6 christos {
356 1.7 christos printf ("No ACPI tables were found in %s\n", InputPathname);
357 1.6 christos }
358 1.1 jruoho
359 1.1 jruoho
360 1.6 christos CleanupAndExit:
361 1.1 jruoho
362 1.6 christos if (State == AX_STATE_EXTRACT_DATA)
363 1.1 jruoho {
364 1.6 christos /* Received an input file EOF while extracting data */
365 1.1 jruoho
366 1.9 christos printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten,
367 1.9 christos ThisTableBytesWritten, Gbl_OutputFilename);
368 1.1 jruoho }
369 1.1 jruoho
370 1.6 christos if (OutputFile)
371 1.1 jruoho {
372 1.6 christos fclose (OutputFile);
373 1.1 jruoho }
374 1.1 jruoho
375 1.6 christos fclose (InputFile);
376 1.6 christos return (Status);
377 1.1 jruoho }
378 1.1 jruoho
379 1.1 jruoho
380 1.1 jruoho /******************************************************************************
381 1.1 jruoho *
382 1.6 christos * FUNCTION: AxExtractToMultiAmlFile
383 1.1 jruoho *
384 1.6 christos * PARAMETERS: InputPathname - Filename for input acpidump file
385 1.1 jruoho *
386 1.1 jruoho * RETURN: Status
387 1.1 jruoho *
388 1.6 christos * DESCRIPTION: Convert all DSDT/SSDT tables to binary and append them all
389 1.6 christos * into a single output file. Used to simplify the loading of
390 1.6 christos * multiple/many SSDTs into a utility like acpiexec -- instead
391 1.6 christos * of creating many separate output files.
392 1.1 jruoho *
393 1.1 jruoho ******************************************************************************/
394 1.1 jruoho
395 1.1 jruoho int
396 1.6 christos AxExtractToMultiAmlFile (
397 1.6 christos char *InputPathname)
398 1.1 jruoho {
399 1.1 jruoho FILE *InputFile;
400 1.6 christos FILE *OutputFile;
401 1.6 christos int Status = 0;
402 1.11 christos int TotalBytesWritten = 0;
403 1.11 christos int ThisTableBytesWritten = 0;
404 1.9 christos unsigned int BytesConverted;
405 1.6 christos char ThisSignature[4];
406 1.2 christos unsigned int State = AX_STATE_FIND_HEADER;
407 1.1 jruoho
408 1.1 jruoho
409 1.6 christos strcpy (Gbl_OutputFilename, AX_MULTI_TABLE_FILENAME);
410 1.6 christos
411 1.6 christos /* Open the input file in text mode */
412 1.1 jruoho
413 1.8 christos InputFile = fopen (InputPathname, "r");
414 1.1 jruoho if (!InputFile)
415 1.1 jruoho {
416 1.6 christos printf ("Could not open input file %s\n", InputPathname);
417 1.1 jruoho return (-1);
418 1.1 jruoho }
419 1.1 jruoho
420 1.7 christos if (!AxIsFileAscii (InputFile))
421 1.7 christos {
422 1.7 christos fclose (InputFile);
423 1.7 christos return (-1);
424 1.7 christos }
425 1.7 christos
426 1.6 christos /* Open the output file in binary mode */
427 1.6 christos
428 1.6 christos OutputFile = fopen (Gbl_OutputFilename, "w+b");
429 1.6 christos if (!OutputFile)
430 1.1 jruoho {
431 1.6 christos printf ("Could not open output file %s\n", Gbl_OutputFilename);
432 1.6 christos fclose (InputFile);
433 1.6 christos return (-1);
434 1.1 jruoho }
435 1.1 jruoho
436 1.6 christos /* Convert the DSDT and all SSDTs to binary */
437 1.1 jruoho
438 1.6 christos while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile))
439 1.1 jruoho {
440 1.9 christos /*
441 1.9 christos * Check up front if we have a header line of the form:
442 1.9 christos * DSDT @ 0xdfffd0c0 (10999 bytes)
443 1.9 christos */
444 1.9 christos if (AX_IS_TABLE_BLOCK_HEADER &&
445 1.9 christos (State == AX_STATE_EXTRACT_DATA))
446 1.9 christos {
447 1.9 christos /* End of previous table, start of new table */
448 1.9 christos
449 1.9 christos if (ThisTableBytesWritten)
450 1.9 christos {
451 1.9 christos printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten,
452 1.9 christos ThisTableBytesWritten, Gbl_OutputFilename);
453 1.9 christos }
454 1.9 christos else
455 1.9 christos {
456 1.9 christos Gbl_TableCount--;
457 1.9 christos }
458 1.9 christos
459 1.9 christos State = AX_STATE_FIND_HEADER;
460 1.9 christos }
461 1.9 christos
462 1.1 jruoho switch (State)
463 1.1 jruoho {
464 1.2 christos case AX_STATE_FIND_HEADER:
465 1.2 christos
466 1.6 christos if (!AxIsDataBlockHeader ())
467 1.2 christos {
468 1.2 christos continue;
469 1.2 christos }
470 1.1 jruoho
471 1.12 christos ACPI_COPY_NAMESEG (ThisSignature, Gbl_LineBuffer);
472 1.1 jruoho
473 1.6 christos /* Only want DSDT and SSDTs */
474 1.1 jruoho
475 1.12 christos if (!ACPI_COMPARE_NAMESEG (ThisSignature, ACPI_SIG_DSDT) &&
476 1.12 christos !ACPI_COMPARE_NAMESEG (ThisSignature, ACPI_SIG_SSDT))
477 1.2 christos {
478 1.2 christos continue;
479 1.2 christos }
480 1.2 christos
481 1.1 jruoho /*
482 1.6 christos * Toss this block header of the form "<sig> @ <addr>" line
483 1.6 christos * and move on to the actual data block
484 1.1 jruoho */
485 1.6 christos Gbl_TableCount++;
486 1.6 christos ThisTableBytesWritten = 0;
487 1.2 christos State = AX_STATE_EXTRACT_DATA;
488 1.1 jruoho continue;
489 1.1 jruoho
490 1.2 christos case AX_STATE_EXTRACT_DATA:
491 1.1 jruoho
492 1.9 christos if (!AxIsHexDataLine ())
493 1.9 christos {
494 1.9 christos continue; /* Toss any lines that are not raw hex data */
495 1.9 christos }
496 1.9 christos
497 1.6 christos /* Empty line or non-data line terminates the data block */
498 1.1 jruoho
499 1.11 christos BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature);
500 1.6 christos switch (BytesConverted)
501 1.1 jruoho {
502 1.6 christos case 0:
503 1.1 jruoho
504 1.6 christos State = AX_STATE_FIND_HEADER; /* No more data block lines */
505 1.1 jruoho continue;
506 1.1 jruoho
507 1.6 christos case -1:
508 1.1 jruoho
509 1.11 christos Status = -1;
510 1.6 christos goto CleanupAndExit; /* There was a write error */
511 1.1 jruoho
512 1.6 christos default: /* Normal case, get next line */
513 1.1 jruoho
514 1.6 christos ThisTableBytesWritten += BytesConverted;
515 1.6 christos TotalBytesWritten += BytesConverted;
516 1.6 christos continue;
517 1.1 jruoho }
518 1.1 jruoho
519 1.1 jruoho default:
520 1.2 christos
521 1.1 jruoho Status = -1;
522 1.1 jruoho goto CleanupAndExit;
523 1.1 jruoho }
524 1.1 jruoho }
525 1.1 jruoho
526 1.1 jruoho
527 1.1 jruoho CleanupAndExit:
528 1.1 jruoho
529 1.6 christos if (State == AX_STATE_EXTRACT_DATA)
530 1.1 jruoho {
531 1.6 christos /* Received an input file EOF or error while writing data */
532 1.1 jruoho
533 1.9 christos printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten,
534 1.9 christos ThisTableBytesWritten, Gbl_OutputFilename);
535 1.1 jruoho }
536 1.1 jruoho
537 1.7 christos printf ("\n%u binary ACPI tables extracted and written to %s (%u bytes)\n",
538 1.6 christos Gbl_TableCount, Gbl_OutputFilename, TotalBytesWritten);
539 1.6 christos
540 1.1 jruoho fclose (InputFile);
541 1.6 christos fclose (OutputFile);
542 1.1 jruoho return (Status);
543 1.1 jruoho }
544 1.1 jruoho
545 1.1 jruoho
546 1.1 jruoho /******************************************************************************
547 1.1 jruoho *
548 1.9 christos * FUNCTION: AxListAllTables
549 1.1 jruoho *
550 1.1 jruoho * PARAMETERS: InputPathname - Filename for acpidump file
551 1.1 jruoho *
552 1.1 jruoho * RETURN: Status
553 1.1 jruoho *
554 1.1 jruoho * DESCRIPTION: Display info for all ACPI tables found in input. Does not
555 1.1 jruoho * perform an actual extraction of the tables.
556 1.1 jruoho *
557 1.1 jruoho ******************************************************************************/
558 1.1 jruoho
559 1.1 jruoho int
560 1.9 christos AxListAllTables (
561 1.1 jruoho char *InputPathname)
562 1.1 jruoho {
563 1.1 jruoho FILE *InputFile;
564 1.1 jruoho unsigned char Header[48];
565 1.9 christos UINT32 ByteCount = 0;
566 1.16 christos INT32 ThisLineByteCount;
567 1.9 christos unsigned int State = AX_STATE_FIND_HEADER;
568 1.1 jruoho
569 1.1 jruoho
570 1.1 jruoho /* Open input in text mode, output is in binary mode */
571 1.1 jruoho
572 1.8 christos InputFile = fopen (InputPathname, "r");
573 1.1 jruoho if (!InputFile)
574 1.1 jruoho {
575 1.6 christos printf ("Could not open input file %s\n", InputPathname);
576 1.1 jruoho return (-1);
577 1.1 jruoho }
578 1.1 jruoho
579 1.7 christos if (!AxIsFileAscii (InputFile))
580 1.7 christos {
581 1.7 christos fclose (InputFile);
582 1.7 christos return (-1);
583 1.7 christos }
584 1.7 christos
585 1.9 christos /* Info header */
586 1.9 christos
587 1.9 christos printf ("\n Signature Length Version Oem Oem "
588 1.9 christos "Oem Compiler Compiler\n");
589 1.9 christos printf ( " Id TableId "
590 1.9 christos "RevisionId Name Revision\n");
591 1.9 christos printf ( " _________ __________ ____ ________ __________ "
592 1.9 christos "__________ _______ __________\n\n");
593 1.9 christos
594 1.1 jruoho /* Dump the headers for all tables found in the input file */
595 1.1 jruoho
596 1.6 christos while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile))
597 1.1 jruoho {
598 1.9 christos /* Ignore empty lines */
599 1.1 jruoho
600 1.9 christos if (AxIsEmptyLine (Gbl_LineBuffer))
601 1.1 jruoho {
602 1.1 jruoho continue;
603 1.1 jruoho }
604 1.1 jruoho
605 1.9 christos /*
606 1.9 christos * Check up front if we have a header line of the form:
607 1.9 christos * DSDT @ 0xdfffd0c0 (10999 bytes)
608 1.9 christos */
609 1.9 christos if (AX_IS_TABLE_BLOCK_HEADER &&
610 1.9 christos (State == AX_STATE_EXTRACT_DATA))
611 1.1 jruoho {
612 1.9 christos State = AX_STATE_FIND_HEADER;
613 1.1 jruoho }
614 1.1 jruoho
615 1.9 christos switch (State)
616 1.1 jruoho {
617 1.9 christos case AX_STATE_FIND_HEADER:
618 1.1 jruoho
619 1.9 christos ByteCount = 0;
620 1.9 christos if (!AxIsDataBlockHeader ())
621 1.9 christos {
622 1.9 christos continue;
623 1.9 christos }
624 1.1 jruoho
625 1.9 christos State = AX_STATE_EXTRACT_DATA;
626 1.1 jruoho continue;
627 1.1 jruoho
628 1.9 christos case AX_STATE_EXTRACT_DATA:
629 1.7 christos
630 1.9 christos /* Ignore any lines that don't look like a data line */
631 1.1 jruoho
632 1.9 christos if (!AxIsHexDataLine ())
633 1.9 christos {
634 1.9 christos continue; /* Toss any lines that are not raw hex data */
635 1.9 christos }
636 1.1 jruoho
637 1.9 christos /* Convert header to hex and display it */
638 1.1 jruoho
639 1.11 christos ThisLineByteCount = AxConvertToBinary (Gbl_LineBuffer,
640 1.11 christos &Header[ByteCount]);
641 1.11 christos if (ThisLineByteCount == EOF)
642 1.11 christos {
643 1.11 christos fclose (InputFile);
644 1.11 christos return (-1);
645 1.11 christos }
646 1.11 christos
647 1.11 christos ByteCount += ThisLineByteCount;
648 1.9 christos if (ByteCount >= sizeof (ACPI_TABLE_HEADER))
649 1.9 christos {
650 1.9 christos AxDumpTableHeader (Header);
651 1.9 christos State = AX_STATE_FIND_HEADER;
652 1.9 christos }
653 1.1 jruoho continue;
654 1.9 christos
655 1.9 christos default:
656 1.9 christos break;
657 1.1 jruoho }
658 1.1 jruoho }
659 1.1 jruoho
660 1.7 christos printf ("\nFound %u ACPI tables in %s\n", Gbl_TableCount, InputPathname);
661 1.1 jruoho fclose (InputFile);
662 1.1 jruoho return (0);
663 1.1 jruoho }
664