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