xref: /titanic_52/usr/src/cmd/acpi/acpixtract/axutils.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
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
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
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
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
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
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
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
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
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
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