1*385cc6b4SJerry Jelinek /******************************************************************************
2*385cc6b4SJerry Jelinek *
3*385cc6b4SJerry Jelinek * Module Name: axutils - Utility functions for acpixtract tool.
4*385cc6b4SJerry Jelinek *
5*385cc6b4SJerry Jelinek *****************************************************************************/
6*385cc6b4SJerry Jelinek
7*385cc6b4SJerry Jelinek /*
8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp.
9*385cc6b4SJerry Jelinek * All rights reserved.
10*385cc6b4SJerry Jelinek *
11*385cc6b4SJerry Jelinek * Redistribution and use in source and binary forms, with or without
12*385cc6b4SJerry Jelinek * modification, are permitted provided that the following conditions
13*385cc6b4SJerry Jelinek * are met:
14*385cc6b4SJerry Jelinek * 1. Redistributions of source code must retain the above copyright
15*385cc6b4SJerry Jelinek * notice, this list of conditions, and the following disclaimer,
16*385cc6b4SJerry Jelinek * without modification.
17*385cc6b4SJerry Jelinek * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*385cc6b4SJerry Jelinek * substantially similar to the "NO WARRANTY" disclaimer below
19*385cc6b4SJerry Jelinek * ("Disclaimer") and any redistribution must be conditioned upon
20*385cc6b4SJerry Jelinek * including a substantially similar Disclaimer requirement for further
21*385cc6b4SJerry Jelinek * binary redistribution.
22*385cc6b4SJerry Jelinek * 3. Neither the names of the above-listed copyright holders nor the names
23*385cc6b4SJerry Jelinek * of any contributors may be used to endorse or promote products derived
24*385cc6b4SJerry Jelinek * from this software without specific prior written permission.
25*385cc6b4SJerry Jelinek *
26*385cc6b4SJerry Jelinek * Alternatively, this software may be distributed under the terms of the
27*385cc6b4SJerry Jelinek * GNU General Public License ("GPL") version 2 as published by the Free
28*385cc6b4SJerry Jelinek * Software Foundation.
29*385cc6b4SJerry Jelinek *
30*385cc6b4SJerry Jelinek * NO WARRANTY
31*385cc6b4SJerry Jelinek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*385cc6b4SJerry Jelinek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*385cc6b4SJerry Jelinek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*385cc6b4SJerry Jelinek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*385cc6b4SJerry Jelinek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*385cc6b4SJerry Jelinek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*385cc6b4SJerry Jelinek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*385cc6b4SJerry Jelinek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*385cc6b4SJerry Jelinek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*385cc6b4SJerry Jelinek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*385cc6b4SJerry Jelinek * POSSIBILITY OF SUCH DAMAGES.
42*385cc6b4SJerry Jelinek */
43*385cc6b4SJerry Jelinek
44*385cc6b4SJerry Jelinek #include "acpixtract.h"
45*385cc6b4SJerry Jelinek
46*385cc6b4SJerry Jelinek
47*385cc6b4SJerry Jelinek /*******************************************************************************
48*385cc6b4SJerry Jelinek *
49*385cc6b4SJerry Jelinek * FUNCTION: AxCheckAscii
50*385cc6b4SJerry Jelinek *
51*385cc6b4SJerry Jelinek * PARAMETERS: Name - Ascii string, at least as long as Count
52*385cc6b4SJerry Jelinek * Count - Number of characters to check
53*385cc6b4SJerry Jelinek *
54*385cc6b4SJerry Jelinek * RETURN: None
55*385cc6b4SJerry Jelinek *
56*385cc6b4SJerry Jelinek * DESCRIPTION: Ensure that the requested number of characters are printable
57*385cc6b4SJerry Jelinek * Ascii characters. Sets non-printable and null chars to <space>.
58*385cc6b4SJerry Jelinek *
59*385cc6b4SJerry Jelinek ******************************************************************************/
60*385cc6b4SJerry Jelinek
61*385cc6b4SJerry Jelinek void
AxCheckAscii(char * Name,int Count)62*385cc6b4SJerry Jelinek AxCheckAscii (
63*385cc6b4SJerry Jelinek char *Name,
64*385cc6b4SJerry Jelinek int Count)
65*385cc6b4SJerry Jelinek {
66*385cc6b4SJerry Jelinek int i;
67*385cc6b4SJerry Jelinek
68*385cc6b4SJerry Jelinek
69*385cc6b4SJerry Jelinek for (i = 0; i < Count; i++)
70*385cc6b4SJerry Jelinek {
71*385cc6b4SJerry Jelinek if (!Name[i] || !isprint ((int) Name[i]))
72*385cc6b4SJerry Jelinek {
73*385cc6b4SJerry Jelinek Name[i] = ' ';
74*385cc6b4SJerry Jelinek }
75*385cc6b4SJerry Jelinek }
76*385cc6b4SJerry Jelinek }
77*385cc6b4SJerry Jelinek
78*385cc6b4SJerry Jelinek
79*385cc6b4SJerry Jelinek /******************************************************************************
80*385cc6b4SJerry Jelinek *
81*385cc6b4SJerry Jelinek * FUNCTION: AxIsEmptyLine
82*385cc6b4SJerry Jelinek *
83*385cc6b4SJerry Jelinek * PARAMETERS: Buffer - Line from input file
84*385cc6b4SJerry Jelinek *
85*385cc6b4SJerry Jelinek * RETURN: TRUE if line is empty (zero or more blanks only)
86*385cc6b4SJerry Jelinek *
87*385cc6b4SJerry Jelinek * DESCRIPTION: Determine if an input line is empty.
88*385cc6b4SJerry Jelinek *
89*385cc6b4SJerry Jelinek ******************************************************************************/
90*385cc6b4SJerry Jelinek
91*385cc6b4SJerry Jelinek int
AxIsEmptyLine(char * Buffer)92*385cc6b4SJerry Jelinek AxIsEmptyLine (
93*385cc6b4SJerry Jelinek char *Buffer)
94*385cc6b4SJerry Jelinek {
95*385cc6b4SJerry Jelinek
96*385cc6b4SJerry Jelinek /* Skip all spaces */
97*385cc6b4SJerry Jelinek
98*385cc6b4SJerry Jelinek while (*Buffer == ' ')
99*385cc6b4SJerry Jelinek {
100*385cc6b4SJerry Jelinek Buffer++;
101*385cc6b4SJerry Jelinek }
102*385cc6b4SJerry Jelinek
103*385cc6b4SJerry Jelinek /* If end-of-line, this line is empty */
104*385cc6b4SJerry Jelinek
105*385cc6b4SJerry Jelinek if (*Buffer == '\n')
106*385cc6b4SJerry Jelinek {
107*385cc6b4SJerry Jelinek return (1);
108*385cc6b4SJerry Jelinek }
109*385cc6b4SJerry Jelinek
110*385cc6b4SJerry Jelinek return (0);
111*385cc6b4SJerry Jelinek }
112*385cc6b4SJerry Jelinek
113*385cc6b4SJerry Jelinek
114*385cc6b4SJerry Jelinek /*******************************************************************************
115*385cc6b4SJerry Jelinek *
116*385cc6b4SJerry Jelinek * FUNCTION: AxNormalizeSignature
117*385cc6b4SJerry Jelinek *
118*385cc6b4SJerry Jelinek * PARAMETERS: Name - Ascii string containing an ACPI signature
119*385cc6b4SJerry Jelinek *
120*385cc6b4SJerry Jelinek * RETURN: None
121*385cc6b4SJerry Jelinek *
122*385cc6b4SJerry Jelinek * DESCRIPTION: Change "RSD PTR" to "RSDP"
123*385cc6b4SJerry Jelinek *
124*385cc6b4SJerry Jelinek ******************************************************************************/
125*385cc6b4SJerry Jelinek
126*385cc6b4SJerry Jelinek void
AxNormalizeSignature(char * Signature)127*385cc6b4SJerry Jelinek AxNormalizeSignature (
128*385cc6b4SJerry Jelinek char *Signature)
129*385cc6b4SJerry Jelinek {
130*385cc6b4SJerry Jelinek
131*385cc6b4SJerry Jelinek if (!strncmp (Signature, "RSD ", 4))
132*385cc6b4SJerry Jelinek {
133*385cc6b4SJerry Jelinek Signature[3] = 'P';
134*385cc6b4SJerry Jelinek }
135*385cc6b4SJerry Jelinek }
136*385cc6b4SJerry Jelinek
137*385cc6b4SJerry Jelinek
138*385cc6b4SJerry Jelinek /******************************************************************************
139*385cc6b4SJerry Jelinek *
140*385cc6b4SJerry Jelinek * FUNCTION: AxConvertLine
141*385cc6b4SJerry Jelinek *
142*385cc6b4SJerry Jelinek * PARAMETERS: InputLine - One line from the input acpidump file
143*385cc6b4SJerry Jelinek * OutputData - Where the converted data is returned
144*385cc6b4SJerry Jelinek *
145*385cc6b4SJerry Jelinek * RETURN: The number of bytes actually converted
146*385cc6b4SJerry Jelinek *
147*385cc6b4SJerry Jelinek * DESCRIPTION: Convert one line of ascii text binary (up to 16 bytes)
148*385cc6b4SJerry Jelinek *
149*385cc6b4SJerry Jelinek ******************************************************************************/
150*385cc6b4SJerry Jelinek
151*385cc6b4SJerry Jelinek size_t
AxConvertLine(char * InputLine,unsigned char * OutputData)152*385cc6b4SJerry Jelinek AxConvertLine (
153*385cc6b4SJerry Jelinek char *InputLine,
154*385cc6b4SJerry Jelinek unsigned char *OutputData)
155*385cc6b4SJerry Jelinek {
156*385cc6b4SJerry Jelinek char *End;
157*385cc6b4SJerry Jelinek int BytesConverted;
158*385cc6b4SJerry Jelinek int Converted[16];
159*385cc6b4SJerry Jelinek int i;
160*385cc6b4SJerry Jelinek
161*385cc6b4SJerry Jelinek
162*385cc6b4SJerry Jelinek /* Terminate the input line at the end of the actual data (for sscanf) */
163*385cc6b4SJerry Jelinek
164*385cc6b4SJerry Jelinek End = strstr (InputLine + 2, " ");
165*385cc6b4SJerry Jelinek if (!End)
166*385cc6b4SJerry Jelinek {
167*385cc6b4SJerry Jelinek return (0); /* Don't understand the format */
168*385cc6b4SJerry Jelinek }
169*385cc6b4SJerry Jelinek *End = 0;
170*385cc6b4SJerry Jelinek
171*385cc6b4SJerry Jelinek /*
172*385cc6b4SJerry Jelinek * Convert one line of table data, of the form:
173*385cc6b4SJerry Jelinek * <offset>: <up to 16 bytes of hex data> <ASCII representation> <newline>
174*385cc6b4SJerry Jelinek *
175*385cc6b4SJerry Jelinek * Example:
176*385cc6b4SJerry Jelinek * 02C0: 5F 53 42 5F 4C 4E 4B 44 00 12 13 04 0C FF FF 08 _SB_LNKD........
177*385cc6b4SJerry Jelinek */
178*385cc6b4SJerry Jelinek BytesConverted = sscanf (InputLine,
179*385cc6b4SJerry Jelinek "%*s %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
180*385cc6b4SJerry Jelinek &Converted[0], &Converted[1], &Converted[2], &Converted[3],
181*385cc6b4SJerry Jelinek &Converted[4], &Converted[5], &Converted[6], &Converted[7],
182*385cc6b4SJerry Jelinek &Converted[8], &Converted[9], &Converted[10], &Converted[11],
183*385cc6b4SJerry Jelinek &Converted[12], &Converted[13], &Converted[14], &Converted[15]);
184*385cc6b4SJerry Jelinek
185*385cc6b4SJerry Jelinek /* Pack converted data into a byte array */
186*385cc6b4SJerry Jelinek
187*385cc6b4SJerry Jelinek for (i = 0; i < BytesConverted; i++)
188*385cc6b4SJerry Jelinek {
189*385cc6b4SJerry Jelinek OutputData[i] = (unsigned char) Converted[i];
190*385cc6b4SJerry Jelinek }
191*385cc6b4SJerry Jelinek
192*385cc6b4SJerry Jelinek return ((size_t) BytesConverted);
193*385cc6b4SJerry Jelinek }
194*385cc6b4SJerry Jelinek
195*385cc6b4SJerry Jelinek
196*385cc6b4SJerry Jelinek /******************************************************************************
197*385cc6b4SJerry Jelinek *
198*385cc6b4SJerry Jelinek * FUNCTION: AxGetTableHeader
199*385cc6b4SJerry Jelinek *
200*385cc6b4SJerry Jelinek * PARAMETERS: InputFile - Handle for the input acpidump file
201*385cc6b4SJerry Jelinek * OutputData - Where the table header is returned
202*385cc6b4SJerry Jelinek *
203*385cc6b4SJerry Jelinek * RETURN: The actual number of bytes converted
204*385cc6b4SJerry Jelinek *
205*385cc6b4SJerry Jelinek * DESCRIPTION: Extract and convert an ACPI table header
206*385cc6b4SJerry Jelinek *
207*385cc6b4SJerry Jelinek ******************************************************************************/
208*385cc6b4SJerry Jelinek
209*385cc6b4SJerry Jelinek size_t
AxGetTableHeader(FILE * InputFile,unsigned char * OutputData)210*385cc6b4SJerry Jelinek AxGetTableHeader (
211*385cc6b4SJerry Jelinek FILE *InputFile,
212*385cc6b4SJerry Jelinek unsigned char *OutputData)
213*385cc6b4SJerry Jelinek {
214*385cc6b4SJerry Jelinek size_t BytesConverted;
215*385cc6b4SJerry Jelinek size_t TotalConverted = 0;
216*385cc6b4SJerry Jelinek int i;
217*385cc6b4SJerry Jelinek
218*385cc6b4SJerry Jelinek
219*385cc6b4SJerry Jelinek /* Get the full 36 byte ACPI table header, requires 3 input text lines */
220*385cc6b4SJerry Jelinek
221*385cc6b4SJerry Jelinek for (i = 0; i < 3; i++)
222*385cc6b4SJerry Jelinek {
223*385cc6b4SJerry Jelinek if (!fgets (Gbl_HeaderBuffer, AX_LINE_BUFFER_SIZE, InputFile))
224*385cc6b4SJerry Jelinek {
225*385cc6b4SJerry Jelinek return (TotalConverted);
226*385cc6b4SJerry Jelinek }
227*385cc6b4SJerry Jelinek
228*385cc6b4SJerry Jelinek BytesConverted = AxConvertLine (Gbl_HeaderBuffer, OutputData);
229*385cc6b4SJerry Jelinek TotalConverted += BytesConverted;
230*385cc6b4SJerry Jelinek OutputData += 16;
231*385cc6b4SJerry Jelinek
232*385cc6b4SJerry Jelinek if (BytesConverted != 16)
233*385cc6b4SJerry Jelinek {
234*385cc6b4SJerry Jelinek return (TotalConverted);
235*385cc6b4SJerry Jelinek }
236*385cc6b4SJerry Jelinek }
237*385cc6b4SJerry Jelinek
238*385cc6b4SJerry Jelinek return (TotalConverted);
239*385cc6b4SJerry Jelinek }
240*385cc6b4SJerry Jelinek
241*385cc6b4SJerry Jelinek
242*385cc6b4SJerry Jelinek /******************************************************************************
243*385cc6b4SJerry Jelinek *
244*385cc6b4SJerry Jelinek * FUNCTION: AxCountTableInstances
245*385cc6b4SJerry Jelinek *
246*385cc6b4SJerry Jelinek * PARAMETERS: InputPathname - Filename for acpidump file
247*385cc6b4SJerry Jelinek * Signature - Requested signature to count
248*385cc6b4SJerry Jelinek *
249*385cc6b4SJerry Jelinek * RETURN: The number of instances of the signature
250*385cc6b4SJerry Jelinek *
251*385cc6b4SJerry Jelinek * DESCRIPTION: Count the instances of tables with the given signature within
252*385cc6b4SJerry Jelinek * the input acpidump file.
253*385cc6b4SJerry Jelinek *
254*385cc6b4SJerry Jelinek ******************************************************************************/
255*385cc6b4SJerry Jelinek
256*385cc6b4SJerry Jelinek unsigned int
AxCountTableInstances(char * InputPathname,char * Signature)257*385cc6b4SJerry Jelinek AxCountTableInstances (
258*385cc6b4SJerry Jelinek char *InputPathname,
259*385cc6b4SJerry Jelinek char *Signature)
260*385cc6b4SJerry Jelinek {
261*385cc6b4SJerry Jelinek FILE *InputFile;
262*385cc6b4SJerry Jelinek unsigned int Instances = 0;
263*385cc6b4SJerry Jelinek
264*385cc6b4SJerry Jelinek
265*385cc6b4SJerry Jelinek InputFile = fopen (InputPathname, "rt");
266*385cc6b4SJerry Jelinek if (!InputFile)
267*385cc6b4SJerry Jelinek {
268*385cc6b4SJerry Jelinek printf ("Could not open input file %s\n", InputPathname);
269*385cc6b4SJerry Jelinek return (0);
270*385cc6b4SJerry Jelinek }
271*385cc6b4SJerry Jelinek
272*385cc6b4SJerry Jelinek /* Count the number of instances of this signature */
273*385cc6b4SJerry Jelinek
274*385cc6b4SJerry Jelinek while (fgets (Gbl_InstanceBuffer, AX_LINE_BUFFER_SIZE, InputFile))
275*385cc6b4SJerry Jelinek {
276*385cc6b4SJerry Jelinek /* Ignore empty lines and lines that start with a space */
277*385cc6b4SJerry Jelinek
278*385cc6b4SJerry Jelinek if (AxIsEmptyLine (Gbl_InstanceBuffer) ||
279*385cc6b4SJerry Jelinek (Gbl_InstanceBuffer[0] == ' '))
280*385cc6b4SJerry Jelinek {
281*385cc6b4SJerry Jelinek continue;
282*385cc6b4SJerry Jelinek }
283*385cc6b4SJerry Jelinek
284*385cc6b4SJerry Jelinek AxNormalizeSignature (Gbl_InstanceBuffer);
285*385cc6b4SJerry Jelinek if (ACPI_COMPARE_NAME (Gbl_InstanceBuffer, Signature))
286*385cc6b4SJerry Jelinek {
287*385cc6b4SJerry Jelinek Instances++;
288*385cc6b4SJerry Jelinek }
289*385cc6b4SJerry Jelinek }
290*385cc6b4SJerry Jelinek
291*385cc6b4SJerry Jelinek fclose (InputFile);
292*385cc6b4SJerry Jelinek return (Instances);
293*385cc6b4SJerry Jelinek }
294*385cc6b4SJerry Jelinek
295*385cc6b4SJerry Jelinek
296*385cc6b4SJerry Jelinek /******************************************************************************
297*385cc6b4SJerry Jelinek *
298*385cc6b4SJerry Jelinek * FUNCTION: AxGetNextInstance
299*385cc6b4SJerry Jelinek *
300*385cc6b4SJerry Jelinek * PARAMETERS: InputPathname - Filename for acpidump file
301*385cc6b4SJerry Jelinek * Signature - Requested ACPI signature
302*385cc6b4SJerry Jelinek *
303*385cc6b4SJerry Jelinek * RETURN: The next instance number for this signature. Zero if this
304*385cc6b4SJerry Jelinek * is the first instance of this signature.
305*385cc6b4SJerry Jelinek *
306*385cc6b4SJerry Jelinek * DESCRIPTION: Get the next instance number of the specified table. If this
307*385cc6b4SJerry Jelinek * is the first instance of the table, create a new instance
308*385cc6b4SJerry Jelinek * block. Note: only SSDT and PSDT tables can have multiple
309*385cc6b4SJerry Jelinek * instances.
310*385cc6b4SJerry Jelinek *
311*385cc6b4SJerry Jelinek ******************************************************************************/
312*385cc6b4SJerry Jelinek
313*385cc6b4SJerry Jelinek unsigned int
AxGetNextInstance(char * InputPathname,char * Signature)314*385cc6b4SJerry Jelinek AxGetNextInstance (
315*385cc6b4SJerry Jelinek char *InputPathname,
316*385cc6b4SJerry Jelinek char *Signature)
317*385cc6b4SJerry Jelinek {
318*385cc6b4SJerry Jelinek AX_TABLE_INFO *Info;
319*385cc6b4SJerry Jelinek
320*385cc6b4SJerry Jelinek
321*385cc6b4SJerry Jelinek Info = Gbl_TableListHead;
322*385cc6b4SJerry Jelinek while (Info)
323*385cc6b4SJerry Jelinek {
324*385cc6b4SJerry Jelinek if (*(UINT32 *) Signature == Info->Signature)
325*385cc6b4SJerry Jelinek {
326*385cc6b4SJerry Jelinek break;
327*385cc6b4SJerry Jelinek }
328*385cc6b4SJerry Jelinek
329*385cc6b4SJerry Jelinek Info = Info->Next;
330*385cc6b4SJerry Jelinek }
331*385cc6b4SJerry Jelinek
332*385cc6b4SJerry Jelinek if (!Info)
333*385cc6b4SJerry Jelinek {
334*385cc6b4SJerry Jelinek /* Signature not found, create new table info block */
335*385cc6b4SJerry Jelinek
336*385cc6b4SJerry Jelinek Info = malloc (sizeof (AX_TABLE_INFO));
337*385cc6b4SJerry Jelinek if (!Info)
338*385cc6b4SJerry Jelinek {
339*385cc6b4SJerry Jelinek printf ("Could not allocate memory (0x%X bytes)\n",
340*385cc6b4SJerry Jelinek (unsigned int) sizeof (AX_TABLE_INFO));
341*385cc6b4SJerry Jelinek exit (0);
342*385cc6b4SJerry Jelinek }
343*385cc6b4SJerry Jelinek
344*385cc6b4SJerry Jelinek Info->Signature = *(UINT32 *) Signature;
345*385cc6b4SJerry Jelinek Info->Instances = AxCountTableInstances (InputPathname, Signature);
346*385cc6b4SJerry Jelinek Info->NextInstance = 1;
347*385cc6b4SJerry Jelinek Info->Next = Gbl_TableListHead;
348*385cc6b4SJerry Jelinek Gbl_TableListHead = Info;
349*385cc6b4SJerry Jelinek }
350*385cc6b4SJerry Jelinek
351*385cc6b4SJerry Jelinek if (Info->Instances > 1)
352*385cc6b4SJerry Jelinek {
353*385cc6b4SJerry Jelinek return (Info->NextInstance++);
354*385cc6b4SJerry Jelinek }
355*385cc6b4SJerry Jelinek
356*385cc6b4SJerry Jelinek return (0);
357*385cc6b4SJerry Jelinek }
358*385cc6b4SJerry Jelinek
359*385cc6b4SJerry Jelinek
360*385cc6b4SJerry Jelinek /******************************************************************************
361*385cc6b4SJerry Jelinek *
362*385cc6b4SJerry Jelinek * FUNCTION: AxIsDataBlockHeader
363*385cc6b4SJerry Jelinek *
364*385cc6b4SJerry Jelinek * PARAMETERS: None
365*385cc6b4SJerry Jelinek *
366*385cc6b4SJerry Jelinek * RETURN: Status. 1 if the table header is valid, 0 otherwise.
367*385cc6b4SJerry Jelinek *
368*385cc6b4SJerry Jelinek * DESCRIPTION: Check if the ACPI table identifier in the input acpidump text
369*385cc6b4SJerry Jelinek * file is valid (of the form: <sig> @ <addr>).
370*385cc6b4SJerry Jelinek *
371*385cc6b4SJerry Jelinek ******************************************************************************/
372*385cc6b4SJerry Jelinek
373*385cc6b4SJerry Jelinek int
AxIsDataBlockHeader(void)374*385cc6b4SJerry Jelinek AxIsDataBlockHeader (
375*385cc6b4SJerry Jelinek void)
376*385cc6b4SJerry Jelinek {
377*385cc6b4SJerry Jelinek
378*385cc6b4SJerry Jelinek /* Ignore lines that are too short to be header lines */
379*385cc6b4SJerry Jelinek
380*385cc6b4SJerry Jelinek if (strlen (Gbl_LineBuffer) < AX_MIN_BLOCK_HEADER_LENGTH)
381*385cc6b4SJerry Jelinek {
382*385cc6b4SJerry Jelinek return (0);
383*385cc6b4SJerry Jelinek }
384*385cc6b4SJerry Jelinek
385*385cc6b4SJerry Jelinek /* Ignore empty lines and lines that start with a space */
386*385cc6b4SJerry Jelinek
387*385cc6b4SJerry Jelinek if (AxIsEmptyLine (Gbl_LineBuffer) ||
388*385cc6b4SJerry Jelinek (Gbl_LineBuffer[0] == ' '))
389*385cc6b4SJerry Jelinek {
390*385cc6b4SJerry Jelinek return (0);
391*385cc6b4SJerry Jelinek }
392*385cc6b4SJerry Jelinek
393*385cc6b4SJerry Jelinek /*
394*385cc6b4SJerry Jelinek * Ignore lines that are not headers of the form <sig> @ <addr>.
395*385cc6b4SJerry Jelinek * Basically, just look for the '@' symbol, surrounded by spaces.
396*385cc6b4SJerry Jelinek *
397*385cc6b4SJerry Jelinek * Examples of headers that must be supported:
398*385cc6b4SJerry Jelinek *
399*385cc6b4SJerry Jelinek * DSDT @ 0x737e4000
400*385cc6b4SJerry Jelinek * XSDT @ 0x737f2fff
401*385cc6b4SJerry Jelinek * RSD PTR @ 0xf6cd0
402*385cc6b4SJerry Jelinek * SSDT @ (nil)
403*385cc6b4SJerry Jelinek */
404*385cc6b4SJerry Jelinek if (!strstr (Gbl_LineBuffer, " @ "))
405*385cc6b4SJerry Jelinek {
406*385cc6b4SJerry Jelinek return (0);
407*385cc6b4SJerry Jelinek }
408*385cc6b4SJerry Jelinek
409*385cc6b4SJerry Jelinek AxNormalizeSignature (Gbl_LineBuffer);
410*385cc6b4SJerry Jelinek return (1);
411*385cc6b4SJerry Jelinek }
412*385cc6b4SJerry Jelinek
413*385cc6b4SJerry Jelinek
414*385cc6b4SJerry Jelinek /******************************************************************************
415*385cc6b4SJerry Jelinek *
416*385cc6b4SJerry Jelinek * FUNCTION: AxProcessOneTextLine
417*385cc6b4SJerry Jelinek *
418*385cc6b4SJerry Jelinek * PARAMETERS: OutputFile - Where to write the binary data
419*385cc6b4SJerry Jelinek * ThisSignature - Signature of current ACPI table
420*385cc6b4SJerry Jelinek * ThisTableBytesWritten - Total count of data written
421*385cc6b4SJerry Jelinek *
422*385cc6b4SJerry Jelinek * RETURN: Length of the converted line
423*385cc6b4SJerry Jelinek *
424*385cc6b4SJerry Jelinek * DESCRIPTION: Convert one line of input hex ascii text to binary, and write
425*385cc6b4SJerry Jelinek * the binary data to the table output file.
426*385cc6b4SJerry Jelinek *
427*385cc6b4SJerry Jelinek ******************************************************************************/
428*385cc6b4SJerry Jelinek
429*385cc6b4SJerry Jelinek long
AxProcessOneTextLine(FILE * OutputFile,char * ThisSignature,unsigned int ThisTableBytesWritten)430*385cc6b4SJerry Jelinek AxProcessOneTextLine (
431*385cc6b4SJerry Jelinek FILE *OutputFile,
432*385cc6b4SJerry Jelinek char *ThisSignature,
433*385cc6b4SJerry Jelinek unsigned int ThisTableBytesWritten)
434*385cc6b4SJerry Jelinek {
435*385cc6b4SJerry Jelinek size_t BytesWritten;
436*385cc6b4SJerry Jelinek size_t BytesConverted;
437*385cc6b4SJerry Jelinek
438*385cc6b4SJerry Jelinek
439*385cc6b4SJerry Jelinek /* Check for the end of this table data block */
440*385cc6b4SJerry Jelinek
441*385cc6b4SJerry Jelinek if (AxIsEmptyLine (Gbl_LineBuffer) ||
442*385cc6b4SJerry Jelinek (Gbl_LineBuffer[0] != ' '))
443*385cc6b4SJerry Jelinek {
444*385cc6b4SJerry Jelinek printf (AX_TABLE_INFO_FORMAT,
445*385cc6b4SJerry Jelinek ThisSignature, ThisTableBytesWritten, Gbl_OutputFilename);
446*385cc6b4SJerry Jelinek return (0);
447*385cc6b4SJerry Jelinek }
448*385cc6b4SJerry Jelinek
449*385cc6b4SJerry Jelinek /* Convert one line of ascii hex data to binary */
450*385cc6b4SJerry Jelinek
451*385cc6b4SJerry Jelinek BytesConverted = AxConvertLine (Gbl_LineBuffer, Gbl_BinaryData);
452*385cc6b4SJerry Jelinek
453*385cc6b4SJerry Jelinek /* Write the binary data */
454*385cc6b4SJerry Jelinek
455*385cc6b4SJerry Jelinek BytesWritten = fwrite (Gbl_BinaryData, 1, BytesConverted, OutputFile);
456*385cc6b4SJerry Jelinek if (BytesWritten != BytesConverted)
457*385cc6b4SJerry Jelinek {
458*385cc6b4SJerry Jelinek printf ("Error while writing file %s\n", Gbl_OutputFilename);
459*385cc6b4SJerry Jelinek return (-1);
460*385cc6b4SJerry Jelinek }
461*385cc6b4SJerry Jelinek
462*385cc6b4SJerry Jelinek return (BytesWritten);
463*385cc6b4SJerry Jelinek }
464