xref: /freebsd/sys/contrib/dev/acpica/compiler/dtutils.c (revision 58308fadece25ae4c12bd2f4dce3d73d9c23be43)
1a88e22b7SJung-uk Kim /******************************************************************************
2a88e22b7SJung-uk Kim  *
3a88e22b7SJung-uk Kim  * Module Name: dtutils.c - Utility routines for the data table compiler
4a88e22b7SJung-uk Kim  *
5a88e22b7SJung-uk Kim  *****************************************************************************/
6a88e22b7SJung-uk Kim 
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim  *
90d84335fSJung-uk Kim  * 1. Copyright Notice
100d84335fSJung-uk Kim  *
11*58308fadSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
12a88e22b7SJung-uk Kim  * All rights reserved.
13a88e22b7SJung-uk Kim  *
140d84335fSJung-uk Kim  * 2. License
150d84335fSJung-uk Kim  *
160d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim  * property rights.
200d84335fSJung-uk Kim  *
210d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim  *
280d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim  *
370d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim  * conditions are met:
390d84335fSJung-uk Kim  *
400d84335fSJung-uk Kim  * 3. Conditions
410d84335fSJung-uk Kim  *
420d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim  *
540d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim  * make.
650d84335fSJung-uk Kim  *
660d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim  * distribution.
710d84335fSJung-uk Kim  *
720d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim  * Intel Code.
740d84335fSJung-uk Kim  *
750d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim  * without prior written authorization from Intel.
790d84335fSJung-uk Kim  *
800d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim  *
820d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim  *
900d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim  * LIMITED REMEDY.
980d84335fSJung-uk Kim  *
990d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim  * such license, approval or letter.
1130d84335fSJung-uk Kim  *
1140d84335fSJung-uk Kim  *****************************************************************************
1150d84335fSJung-uk Kim  *
1160d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim  * following license:
1180d84335fSJung-uk Kim  *
119d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
120d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
121d244b227SJung-uk Kim  * are met:
122d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
123d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
124d244b227SJung-uk Kim  *    without modification.
125d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
127d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
128d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
129d244b227SJung-uk Kim  *    binary redistribution.
130d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
131d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
132d244b227SJung-uk Kim  *    from this software without specific prior written permission.
133a88e22b7SJung-uk Kim  *
1340d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim  *
1460d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
147d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
148d244b227SJung-uk Kim  * Software Foundation.
149a88e22b7SJung-uk Kim  *
1500d84335fSJung-uk Kim  *****************************************************************************/
151a88e22b7SJung-uk Kim 
152a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
153a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/actables.h>
154a88e22b7SJung-uk Kim 
155a88e22b7SJung-uk Kim #define _COMPONENT          DT_COMPILER
156a88e22b7SJung-uk Kim         ACPI_MODULE_NAME    ("dtutils")
157a88e22b7SJung-uk Kim 
158a88e22b7SJung-uk Kim /* Local prototypes */
159a88e22b7SJung-uk Kim 
160a88e22b7SJung-uk Kim static void
161a88e22b7SJung-uk Kim DtSum (
162a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
163a88e22b7SJung-uk Kim     void                    *Context,
164a88e22b7SJung-uk Kim     void                    *ReturnValue);
165a88e22b7SJung-uk Kim 
166a88e22b7SJung-uk Kim 
167a88e22b7SJung-uk Kim /******************************************************************************
168a88e22b7SJung-uk Kim  *
169a88e22b7SJung-uk Kim  * FUNCTION:    DtError
170a88e22b7SJung-uk Kim  *
171a88e22b7SJung-uk Kim  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
172a88e22b7SJung-uk Kim  *              MessageId           - Index into global message buffer
173a88e22b7SJung-uk Kim  *              Op                  - Parse node where error happened
174a88e22b7SJung-uk Kim  *              ExtraMessage        - additional error message
175a88e22b7SJung-uk Kim  *
176a88e22b7SJung-uk Kim  * RETURN:      None
177a88e22b7SJung-uk Kim  *
178a88e22b7SJung-uk Kim  * DESCRIPTION: Common error interface for data table compiler
179a88e22b7SJung-uk Kim  *
180a88e22b7SJung-uk Kim  *****************************************************************************/
181a88e22b7SJung-uk Kim 
182a88e22b7SJung-uk Kim void
DtError(UINT8 Level,UINT16 MessageId,DT_FIELD * FieldObject,char * ExtraMessage)183a88e22b7SJung-uk Kim DtError (
184a88e22b7SJung-uk Kim     UINT8                   Level,
185313a0c13SJung-uk Kim     UINT16                  MessageId,
186a88e22b7SJung-uk Kim     DT_FIELD                *FieldObject,
187a88e22b7SJung-uk Kim     char                    *ExtraMessage)
188a88e22b7SJung-uk Kim {
18908ddfe86SJung-uk Kim     UINT32                  Line = 0;
19008ddfe86SJung-uk Kim 
19108ddfe86SJung-uk Kim 
19208ddfe86SJung-uk Kim     /* Field object could be NULL */
19308ddfe86SJung-uk Kim 
19408ddfe86SJung-uk Kim     if (FieldObject)
19508ddfe86SJung-uk Kim     {
19608ddfe86SJung-uk Kim         Line = FieldObject->Line;
19708ddfe86SJung-uk Kim     }
198a88e22b7SJung-uk Kim 
199a9d8d09cSJung-uk Kim     /* Check if user wants to ignore this exception */
200a9d8d09cSJung-uk Kim 
2013ee58df5SJung-uk Kim     if (AslIsExceptionIgnored (AslGbl_Files[ASL_FILE_INPUT].Filename,
20208ddfe86SJung-uk Kim         Line, Level, MessageId))
203a88e22b7SJung-uk Kim     {
204a88e22b7SJung-uk Kim         return;
205a88e22b7SJung-uk Kim     }
206a88e22b7SJung-uk Kim 
207a88e22b7SJung-uk Kim     if (FieldObject)
208a88e22b7SJung-uk Kim     {
209a88e22b7SJung-uk Kim         AslCommonError (Level, MessageId,
210a88e22b7SJung-uk Kim             FieldObject->Line,
211a88e22b7SJung-uk Kim             FieldObject->Line,
212a88e22b7SJung-uk Kim             FieldObject->ByteOffset,
213a88e22b7SJung-uk Kim             FieldObject->Column,
2146f1f1a63SJung-uk Kim             AslGbl_Files[ASL_FILE_INPUT].Filename, ExtraMessage);
215a88e22b7SJung-uk Kim     }
216a88e22b7SJung-uk Kim     else
217a88e22b7SJung-uk Kim     {
218a88e22b7SJung-uk Kim         AslCommonError (Level, MessageId, 0,
219a88e22b7SJung-uk Kim             0, 0, 0, 0, ExtraMessage);
220a88e22b7SJung-uk Kim     }
221a88e22b7SJung-uk Kim }
222a88e22b7SJung-uk Kim 
223a88e22b7SJung-uk Kim 
224a88e22b7SJung-uk Kim /******************************************************************************
225a88e22b7SJung-uk Kim  *
226a88e22b7SJung-uk Kim  * FUNCTION:    DtNameError
227a88e22b7SJung-uk Kim  *
228a88e22b7SJung-uk Kim  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
229a88e22b7SJung-uk Kim  *              MessageId           - Index into global message buffer
230a88e22b7SJung-uk Kim  *              Op                  - Parse node where error happened
231a88e22b7SJung-uk Kim  *              ExtraMessage        - additional error message
232a88e22b7SJung-uk Kim  *
233a88e22b7SJung-uk Kim  * RETURN:      None
234a88e22b7SJung-uk Kim  *
235a88e22b7SJung-uk Kim  * DESCRIPTION: Error interface for named objects
236a88e22b7SJung-uk Kim  *
237a88e22b7SJung-uk Kim  *****************************************************************************/
238a88e22b7SJung-uk Kim 
239a88e22b7SJung-uk Kim void
DtNameError(UINT8 Level,UINT16 MessageId,DT_FIELD * FieldObject,char * ExtraMessage)240a88e22b7SJung-uk Kim DtNameError (
241a88e22b7SJung-uk Kim     UINT8                   Level,
242313a0c13SJung-uk Kim     UINT16                  MessageId,
243a88e22b7SJung-uk Kim     DT_FIELD                *FieldObject,
244a88e22b7SJung-uk Kim     char                    *ExtraMessage)
245a88e22b7SJung-uk Kim {
246a88e22b7SJung-uk Kim 
247a88e22b7SJung-uk Kim     switch (Level)
248a88e22b7SJung-uk Kim     {
249a88e22b7SJung-uk Kim     case ASL_WARNING2:
250a88e22b7SJung-uk Kim     case ASL_WARNING3:
251a9d8d09cSJung-uk Kim 
2526f1f1a63SJung-uk Kim         if (AslGbl_WarningLevel < Level)
253a88e22b7SJung-uk Kim         {
254a88e22b7SJung-uk Kim             return;
255a88e22b7SJung-uk Kim         }
256a88e22b7SJung-uk Kim         break;
257a88e22b7SJung-uk Kim 
258a88e22b7SJung-uk Kim     default:
259a9d8d09cSJung-uk Kim 
260a88e22b7SJung-uk Kim         break;
261a88e22b7SJung-uk Kim     }
262a88e22b7SJung-uk Kim 
263a88e22b7SJung-uk Kim     if (FieldObject)
264a88e22b7SJung-uk Kim     {
265a88e22b7SJung-uk Kim         AslCommonError (Level, MessageId,
266a88e22b7SJung-uk Kim             FieldObject->Line,
267a88e22b7SJung-uk Kim             FieldObject->Line,
268a88e22b7SJung-uk Kim             FieldObject->ByteOffset,
269a88e22b7SJung-uk Kim             FieldObject->NameColumn,
2706f1f1a63SJung-uk Kim             AslGbl_Files[ASL_FILE_INPUT].Filename, ExtraMessage);
271a88e22b7SJung-uk Kim     }
272a88e22b7SJung-uk Kim     else
273a88e22b7SJung-uk Kim     {
274a88e22b7SJung-uk Kim         AslCommonError (Level, MessageId, 0,
275a88e22b7SJung-uk Kim             0, 0, 0, 0, ExtraMessage);
276a88e22b7SJung-uk Kim     }
277a88e22b7SJung-uk Kim }
278a88e22b7SJung-uk Kim 
279a88e22b7SJung-uk Kim 
280a88e22b7SJung-uk Kim /*******************************************************************************
281a88e22b7SJung-uk Kim  *
282a88e22b7SJung-uk Kim  * FUNCTION:    DtFatal
283a88e22b7SJung-uk Kim  *
284a88e22b7SJung-uk Kim  * PARAMETERS:  None
285a88e22b7SJung-uk Kim  *
286a88e22b7SJung-uk Kim  * RETURN:      None
287a88e22b7SJung-uk Kim  *
288a88e22b7SJung-uk Kim  * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
289a88e22b7SJung-uk Kim  *              compile or I/O errors
290a88e22b7SJung-uk Kim  *
291a88e22b7SJung-uk Kim  ******************************************************************************/
292a88e22b7SJung-uk Kim 
293a88e22b7SJung-uk Kim void
DtFatal(UINT16 MessageId,DT_FIELD * FieldObject,char * ExtraMessage)294a88e22b7SJung-uk Kim DtFatal (
295313a0c13SJung-uk Kim     UINT16                  MessageId,
296a88e22b7SJung-uk Kim     DT_FIELD                *FieldObject,
297a88e22b7SJung-uk Kim     char                    *ExtraMessage)
298a88e22b7SJung-uk Kim {
299a88e22b7SJung-uk Kim 
300a88e22b7SJung-uk Kim     DtError (ASL_ERROR, MessageId, FieldObject, ExtraMessage);
301a88e22b7SJung-uk Kim 
302d052a1ccSJung-uk Kim /*
303d052a1ccSJung-uk Kim  * TBD: remove this entire function, DtFatal
304d052a1ccSJung-uk Kim  *
305d052a1ccSJung-uk Kim  * We cannot abort the compiler on error, because we may be compiling a
306d052a1ccSJung-uk Kim  * list of files. We must move on to the next file.
307d052a1ccSJung-uk Kim  */
308d052a1ccSJung-uk Kim #ifdef __OBSOLETE
309a88e22b7SJung-uk Kim     CmCleanupAndExit ();
310a88e22b7SJung-uk Kim     exit (1);
311d052a1ccSJung-uk Kim #endif
312a88e22b7SJung-uk Kim }
313a88e22b7SJung-uk Kim 
314a88e22b7SJung-uk Kim 
3152f6a1a81SJung-uk Kim /*******************************************************************************
3162f6a1a81SJung-uk Kim  *
3172f6a1a81SJung-uk Kim  * FUNCTION:    DtDoConstant
3182f6a1a81SJung-uk Kim  *
3192f6a1a81SJung-uk Kim  * PARAMETERS:  String              - Only hex constants are supported,
3202f6a1a81SJung-uk Kim  *                                    regardless of whether the 0x prefix
3212f6a1a81SJung-uk Kim  *                                    is used
3222f6a1a81SJung-uk Kim  *
3232f6a1a81SJung-uk Kim  * RETURN:      Converted Integer
3242f6a1a81SJung-uk Kim  *
3252f6a1a81SJung-uk Kim  * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
3262f6a1a81SJung-uk Kim  *
3272f6a1a81SJung-uk Kim  ******************************************************************************/
3282f6a1a81SJung-uk Kim 
3292f6a1a81SJung-uk Kim UINT64
DtDoConstant(char * String)3302f6a1a81SJung-uk Kim DtDoConstant (
3312f6a1a81SJung-uk Kim     char                    *String)
3322f6a1a81SJung-uk Kim {
3332f6a1a81SJung-uk Kim     UINT64                  ConvertedInteger;
3342f6a1a81SJung-uk Kim 
3352f6a1a81SJung-uk Kim 
3362f6a1a81SJung-uk Kim     /*
3372f6a1a81SJung-uk Kim      * TBD: The ImplicitStrtoul64 function does not report overflow
3382f6a1a81SJung-uk Kim      * conditions. The input string is simply truncated. If it is
3392f6a1a81SJung-uk Kim      * desired to report overflow to the table compiler, this should
3402f6a1a81SJung-uk Kim      * somehow be added here. Note: integers that are prefixed with 0x
3412f6a1a81SJung-uk Kim      * or not are both hex integers.
3422f6a1a81SJung-uk Kim      */
3432f6a1a81SJung-uk Kim     ConvertedInteger = AcpiUtImplicitStrtoul64 (String);
3442f6a1a81SJung-uk Kim     return (ConvertedInteger);
3452f6a1a81SJung-uk Kim }
3462f6a1a81SJung-uk Kim 
347a88e22b7SJung-uk Kim /******************************************************************************
348a88e22b7SJung-uk Kim  *
349a88e22b7SJung-uk Kim  * FUNCTION:    DtGetFieldValue
350a88e22b7SJung-uk Kim  *
351a88e22b7SJung-uk Kim  * PARAMETERS:  Field               - Current field list pointer
352a88e22b7SJung-uk Kim  *
353a88e22b7SJung-uk Kim  * RETURN:      Field value
354a88e22b7SJung-uk Kim  *
355a88e22b7SJung-uk Kim  * DESCRIPTION: Get field value
356a88e22b7SJung-uk Kim  *
357a88e22b7SJung-uk Kim  *****************************************************************************/
358a88e22b7SJung-uk Kim 
359a88e22b7SJung-uk Kim char *
DtGetFieldValue(DT_FIELD * Field)360a88e22b7SJung-uk Kim DtGetFieldValue (
361d052a1ccSJung-uk Kim     DT_FIELD                *Field)
362a88e22b7SJung-uk Kim {
363d052a1ccSJung-uk Kim     if (!Field)
364a88e22b7SJung-uk Kim     {
365a88e22b7SJung-uk Kim         return (NULL);
366a88e22b7SJung-uk Kim     }
367a88e22b7SJung-uk Kim 
368d052a1ccSJung-uk Kim     return (Field->Value);
369d052a1ccSJung-uk Kim }
370d052a1ccSJung-uk Kim 
371a88e22b7SJung-uk Kim 
372a88e22b7SJung-uk Kim /******************************************************************************
373a88e22b7SJung-uk Kim  *
374a88e22b7SJung-uk Kim  * FUNCTION:    DtGetFieldType
375a88e22b7SJung-uk Kim  *
376a88e22b7SJung-uk Kim  * PARAMETERS:  Info                - Data table info
377a88e22b7SJung-uk Kim  *
378a88e22b7SJung-uk Kim  * RETURN:      Field type
379a88e22b7SJung-uk Kim  *
380a88e22b7SJung-uk Kim  * DESCRIPTION: Get field type
381a88e22b7SJung-uk Kim  *
382a88e22b7SJung-uk Kim  *****************************************************************************/
383a88e22b7SJung-uk Kim 
384a88e22b7SJung-uk Kim UINT8
DtGetFieldType(ACPI_DMTABLE_INFO * Info)385a88e22b7SJung-uk Kim DtGetFieldType (
386a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *Info)
387a88e22b7SJung-uk Kim {
388a88e22b7SJung-uk Kim     UINT8                   Type;
389a88e22b7SJung-uk Kim 
390a88e22b7SJung-uk Kim 
391a88e22b7SJung-uk Kim     /* DT_FLAG means that this is the start of a block of flag bits */
392a88e22b7SJung-uk Kim     /* TBD - we can make these a separate opcode later */
393a88e22b7SJung-uk Kim 
394a88e22b7SJung-uk Kim     if (Info->Flags & DT_FLAG)
395a88e22b7SJung-uk Kim     {
396a88e22b7SJung-uk Kim         return (DT_FIELD_TYPE_FLAGS_INTEGER);
397a88e22b7SJung-uk Kim     }
398a88e22b7SJung-uk Kim 
399a88e22b7SJung-uk Kim     /* Type is based upon the opcode for this field in the info table */
400a88e22b7SJung-uk Kim 
401a88e22b7SJung-uk Kim     switch (Info->Opcode)
402a88e22b7SJung-uk Kim     {
403a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG0:
404a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG1:
405a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG2:
406a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG3:
407a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG4:
408a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG5:
409a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG6:
410a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG7:
411a88e22b7SJung-uk Kim     case ACPI_DMT_FLAGS0:
4123f0275a0SJung-uk Kim     case ACPI_DMT_FLAGS1:
413a88e22b7SJung-uk Kim     case ACPI_DMT_FLAGS2:
414ab71bbb7SJung-uk Kim     case ACPI_DMT_FLAGS8_2:
4153f0275a0SJung-uk Kim     case ACPI_DMT_FLAGS4:
416af051161SJung-uk Kim     case ACPI_DMT_FLAGS4_0:
417af051161SJung-uk Kim     case ACPI_DMT_FLAGS4_4:
418af051161SJung-uk Kim     case ACPI_DMT_FLAGS4_8:
419af051161SJung-uk Kim     case ACPI_DMT_FLAGS4_12:
420af051161SJung-uk Kim     case ACPI_DMT_FLAGS16_16:
421a9d8d09cSJung-uk Kim 
422a88e22b7SJung-uk Kim         Type = DT_FIELD_TYPE_FLAG;
423a88e22b7SJung-uk Kim         break;
424a88e22b7SJung-uk Kim 
425a88e22b7SJung-uk Kim     case ACPI_DMT_NAME4:
426a88e22b7SJung-uk Kim     case ACPI_DMT_SIG:
427a88e22b7SJung-uk Kim     case ACPI_DMT_NAME6:
428a88e22b7SJung-uk Kim     case ACPI_DMT_NAME8:
429a88e22b7SJung-uk Kim     case ACPI_DMT_STRING:
4301970d693SJung-uk Kim     case ACPI_DMT_IVRS_UNTERMINATED_STRING:
431a9d8d09cSJung-uk Kim 
432a88e22b7SJung-uk Kim         Type = DT_FIELD_TYPE_STRING;
433a88e22b7SJung-uk Kim         break;
434a88e22b7SJung-uk Kim 
435a88e22b7SJung-uk Kim     case ACPI_DMT_BUFFER:
4367cf3e94aSJung-uk Kim     case ACPI_DMT_RAW_BUFFER:
4370b94ba42SJung-uk Kim     case ACPI_DMT_BUF7:
4388d744e47SJung-uk Kim     case ACPI_DMT_BUF10:
439*58308fadSJung-uk Kim     case ACPI_DMT_BUF11:
440493deb39SJung-uk Kim     case ACPI_DMT_BUF12:
441a88e22b7SJung-uk Kim     case ACPI_DMT_BUF16:
442ab71bbb7SJung-uk Kim     case ACPI_DMT_BUF18:
443*58308fadSJung-uk Kim     case ACPI_DMT_BUF24:
444*58308fadSJung-uk Kim     case ACPI_DMT_BUF26:
44592f570c3SJung-uk Kim     case ACPI_DMT_BUF32:
44692f570c3SJung-uk Kim     case ACPI_DMT_BUF112:
447dcbce41eSJung-uk Kim     case ACPI_DMT_BUF128:
448a88e22b7SJung-uk Kim     case ACPI_DMT_PCI_PATH:
449cfd1ed46SJung-uk Kim     case ACPI_DMT_PMTT_VENDOR:
450a9d8d09cSJung-uk Kim 
451a88e22b7SJung-uk Kim         Type = DT_FIELD_TYPE_BUFFER;
452a88e22b7SJung-uk Kim         break;
453a88e22b7SJung-uk Kim 
454a88e22b7SJung-uk Kim     case ACPI_DMT_GAS:
455a88e22b7SJung-uk Kim     case ACPI_DMT_HESTNTFY:
456a371a5fdSJung-uk Kim     case ACPI_DMT_IORTMEM:
457a9d8d09cSJung-uk Kim 
458a88e22b7SJung-uk Kim         Type = DT_FIELD_TYPE_INLINE_SUBTABLE;
459a88e22b7SJung-uk Kim         break;
460a88e22b7SJung-uk Kim 
461d244b227SJung-uk Kim     case ACPI_DMT_UNICODE:
46297c0b5abSJung-uk Kim     case ACPI_DMT_WPBT_UNICODE:
463a9d8d09cSJung-uk Kim 
464d244b227SJung-uk Kim         Type = DT_FIELD_TYPE_UNICODE;
465d244b227SJung-uk Kim         break;
466d244b227SJung-uk Kim 
467d244b227SJung-uk Kim     case ACPI_DMT_UUID:
468a9d8d09cSJung-uk Kim 
469d244b227SJung-uk Kim         Type = DT_FIELD_TYPE_UUID;
470d244b227SJung-uk Kim         break;
471d244b227SJung-uk Kim 
472d244b227SJung-uk Kim     case ACPI_DMT_DEVICE_PATH:
473a9d8d09cSJung-uk Kim 
474d244b227SJung-uk Kim         Type = DT_FIELD_TYPE_DEVICE_PATH;
475d244b227SJung-uk Kim         break;
476d244b227SJung-uk Kim 
4770b94ba42SJung-uk Kim     case ACPI_DMT_LABEL:
478a9d8d09cSJung-uk Kim 
4790b94ba42SJung-uk Kim         Type = DT_FIELD_TYPE_LABEL;
4800b94ba42SJung-uk Kim         break;
4810b94ba42SJung-uk Kim 
482a88e22b7SJung-uk Kim     default:
483a9d8d09cSJung-uk Kim 
484a88e22b7SJung-uk Kim         Type = DT_FIELD_TYPE_INTEGER;
485a88e22b7SJung-uk Kim         break;
486a88e22b7SJung-uk Kim     }
487a88e22b7SJung-uk Kim 
488a88e22b7SJung-uk Kim     return (Type);
489a88e22b7SJung-uk Kim }
490a88e22b7SJung-uk Kim 
491a88e22b7SJung-uk Kim 
492a88e22b7SJung-uk Kim /******************************************************************************
493a88e22b7SJung-uk Kim  *
494a88e22b7SJung-uk Kim  * FUNCTION:    DtGetBufferLength
495a88e22b7SJung-uk Kim  *
496a88e22b7SJung-uk Kim  * PARAMETERS:  Buffer              - List of integers,
497a88e22b7SJung-uk Kim  *                                    for example "10 3A 4F 2E"
498a88e22b7SJung-uk Kim  *
499a88e22b7SJung-uk Kim  * RETURN:      Count of integer
500a88e22b7SJung-uk Kim  *
501a88e22b7SJung-uk Kim  * DESCRIPTION: Get length of bytes needed to store the integers
502a88e22b7SJung-uk Kim  *
503a88e22b7SJung-uk Kim  *****************************************************************************/
504a88e22b7SJung-uk Kim 
505a88e22b7SJung-uk Kim UINT32
DtGetBufferLength(char * Buffer)506a88e22b7SJung-uk Kim DtGetBufferLength (
507a88e22b7SJung-uk Kim     char                    *Buffer)
508a88e22b7SJung-uk Kim {
509a88e22b7SJung-uk Kim     UINT32                  ByteLength = 0;
510a88e22b7SJung-uk Kim 
511a88e22b7SJung-uk Kim 
512a88e22b7SJung-uk Kim     while (*Buffer)
513a88e22b7SJung-uk Kim     {
514a88e22b7SJung-uk Kim         if (*Buffer == ' ')
515a88e22b7SJung-uk Kim         {
516a88e22b7SJung-uk Kim             ByteLength++;
517a88e22b7SJung-uk Kim 
518a88e22b7SJung-uk Kim             while (*Buffer == ' ')
519a88e22b7SJung-uk Kim             {
520a88e22b7SJung-uk Kim                 Buffer++;
521a88e22b7SJung-uk Kim             }
522a88e22b7SJung-uk Kim         }
523a88e22b7SJung-uk Kim 
524a88e22b7SJung-uk Kim         Buffer++;
525a88e22b7SJung-uk Kim     }
526a88e22b7SJung-uk Kim 
527a88e22b7SJung-uk Kim     return (++ByteLength);
528a88e22b7SJung-uk Kim }
529a88e22b7SJung-uk Kim 
530a88e22b7SJung-uk Kim 
531a88e22b7SJung-uk Kim /******************************************************************************
532a88e22b7SJung-uk Kim  *
533a88e22b7SJung-uk Kim  * FUNCTION:    DtGetFieldLength
534a88e22b7SJung-uk Kim  *
535d052a1ccSJung-uk Kim  * PARAMETERS:  Field               - Current field
536a88e22b7SJung-uk Kim  *              Info                - Data table info
537a88e22b7SJung-uk Kim  *
538a88e22b7SJung-uk Kim  * RETURN:      Field length
539a88e22b7SJung-uk Kim  *
540a88e22b7SJung-uk Kim  * DESCRIPTION: Get length of bytes needed to compile the field
541a88e22b7SJung-uk Kim  *
542a88e22b7SJung-uk Kim  * Note: This function must remain in sync with AcpiDmDumpTable.
543a88e22b7SJung-uk Kim  *
544a88e22b7SJung-uk Kim  *****************************************************************************/
545a88e22b7SJung-uk Kim 
546a88e22b7SJung-uk Kim UINT32
DtGetFieldLength(DT_FIELD * Field,ACPI_DMTABLE_INFO * Info)547a88e22b7SJung-uk Kim DtGetFieldLength (
548a88e22b7SJung-uk Kim     DT_FIELD                *Field,
549a88e22b7SJung-uk Kim     ACPI_DMTABLE_INFO       *Info)
550a88e22b7SJung-uk Kim {
551a88e22b7SJung-uk Kim     UINT32                  ByteLength = 0;
552a88e22b7SJung-uk Kim     char                    *Value;
553a88e22b7SJung-uk Kim 
554a88e22b7SJung-uk Kim 
555a88e22b7SJung-uk Kim     /* Length is based upon the opcode for this field in the info table */
556a88e22b7SJung-uk Kim 
557a88e22b7SJung-uk Kim     switch (Info->Opcode)
558a88e22b7SJung-uk Kim     {
559a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG0:
560a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG1:
561a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG2:
562a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG3:
563a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG4:
564a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG5:
565a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG6:
566a88e22b7SJung-uk Kim     case ACPI_DMT_FLAG7:
567a88e22b7SJung-uk Kim     case ACPI_DMT_FLAGS0:
5683f0275a0SJung-uk Kim     case ACPI_DMT_FLAGS1:
569a88e22b7SJung-uk Kim     case ACPI_DMT_FLAGS2:
570ab71bbb7SJung-uk Kim     case ACPI_DMT_FLAGS8_2:
5713f0275a0SJung-uk Kim     case ACPI_DMT_FLAGS4:
572af051161SJung-uk Kim     case ACPI_DMT_FLAGS4_0:
573af051161SJung-uk Kim     case ACPI_DMT_FLAGS4_4:
574af051161SJung-uk Kim     case ACPI_DMT_FLAGS4_8:
575af051161SJung-uk Kim     case ACPI_DMT_FLAGS4_12:
576af051161SJung-uk Kim     case ACPI_DMT_FLAGS16_16:
5770b94ba42SJung-uk Kim     case ACPI_DMT_LABEL:
5783f0275a0SJung-uk Kim     case ACPI_DMT_EXTRA_TEXT:
579a9d8d09cSJung-uk Kim 
580a88e22b7SJung-uk Kim         ByteLength = 0;
581a88e22b7SJung-uk Kim         break;
582a88e22b7SJung-uk Kim 
583a88e22b7SJung-uk Kim     case ACPI_DMT_UINT8:
584a88e22b7SJung-uk Kim     case ACPI_DMT_CHKSUM:
585a88e22b7SJung-uk Kim     case ACPI_DMT_SPACEID:
5865a77b11bSJung-uk Kim     case ACPI_DMT_ACCWIDTH:
587cfd1ed46SJung-uk Kim     case ACPI_DMT_CEDT:
588a88e22b7SJung-uk Kim     case ACPI_DMT_IVRS:
5891970d693SJung-uk Kim     case ACPI_DMT_IVRS_DE:
590313a0c13SJung-uk Kim     case ACPI_DMT_GTDT:
591a88e22b7SJung-uk Kim     case ACPI_DMT_MADT:
592722b1667SJung-uk Kim     case ACPI_DMT_MPAM_LOCATOR:
593313a0c13SJung-uk Kim     case ACPI_DMT_PCCT:
5943f0275a0SJung-uk Kim     case ACPI_DMT_PMTT:
595af051161SJung-uk Kim     case ACPI_DMT_PPTT:
5961970d693SJung-uk Kim     case ACPI_DMT_RGRT:
59767d9aa44SJung-uk Kim     case ACPI_DMT_SDEV:
598a88e22b7SJung-uk Kim     case ACPI_DMT_SRAT:
59997c0b5abSJung-uk Kim     case ACPI_DMT_AEST:
60097c0b5abSJung-uk Kim     case ACPI_DMT_AEST_RES:
60197c0b5abSJung-uk Kim     case ACPI_DMT_AEST_XFACE:
60297c0b5abSJung-uk Kim     case ACPI_DMT_AEST_XRUPT:
603a88e22b7SJung-uk Kim     case ACPI_DMT_ASF:
6049a4bc520SJung-uk Kim     case ACPI_DMT_CDAT:
605a88e22b7SJung-uk Kim     case ACPI_DMT_HESTNTYP:
606a88e22b7SJung-uk Kim     case ACPI_DMT_FADTPM:
607a88e22b7SJung-uk Kim     case ACPI_DMT_EINJACT:
608a88e22b7SJung-uk Kim     case ACPI_DMT_EINJINST:
609a88e22b7SJung-uk Kim     case ACPI_DMT_ERSTACT:
610a88e22b7SJung-uk Kim     case ACPI_DMT_ERSTINST:
611313a0c13SJung-uk Kim     case ACPI_DMT_DMAR_SCOPE:
612cfd1ed46SJung-uk Kim     case ACPI_DMT_VIOT:
613a9d8d09cSJung-uk Kim 
614a88e22b7SJung-uk Kim         ByteLength = 1;
615a88e22b7SJung-uk Kim         break;
616a88e22b7SJung-uk Kim 
617722b1667SJung-uk Kim     case ACPI_DMT_ASPT:
618a88e22b7SJung-uk Kim     case ACPI_DMT_UINT16:
619a88e22b7SJung-uk Kim     case ACPI_DMT_DMAR:
620*58308fadSJung-uk Kim     case ACPI_DMT_ERDT:
621a88e22b7SJung-uk Kim     case ACPI_DMT_HEST:
622af051161SJung-uk Kim     case ACPI_DMT_HMAT:
623a371a5fdSJung-uk Kim     case ACPI_DMT_NFIT:
624a88e22b7SJung-uk Kim     case ACPI_DMT_PCI_PATH:
625cfd1ed46SJung-uk Kim     case ACPI_DMT_PHAT:
626a9d8d09cSJung-uk Kim 
627a88e22b7SJung-uk Kim         ByteLength = 2;
628a88e22b7SJung-uk Kim         break;
629a88e22b7SJung-uk Kim 
630a88e22b7SJung-uk Kim     case ACPI_DMT_UINT24:
631a9d8d09cSJung-uk Kim 
632a88e22b7SJung-uk Kim         ByteLength = 3;
633a88e22b7SJung-uk Kim         break;
634a88e22b7SJung-uk Kim 
635a88e22b7SJung-uk Kim     case ACPI_DMT_UINT32:
63697c0b5abSJung-uk Kim     case ACPI_DMT_AEST_CACHE:
63797c0b5abSJung-uk Kim     case ACPI_DMT_AEST_GIC:
638a88e22b7SJung-uk Kim     case ACPI_DMT_NAME4:
639a88e22b7SJung-uk Kim     case ACPI_DMT_SIG:
640313a0c13SJung-uk Kim     case ACPI_DMT_LPIT:
64167d9aa44SJung-uk Kim     case ACPI_DMT_TPM2:
642a9d8d09cSJung-uk Kim 
643a88e22b7SJung-uk Kim         ByteLength = 4;
644a88e22b7SJung-uk Kim         break;
645a88e22b7SJung-uk Kim 
6463f0275a0SJung-uk Kim     case ACPI_DMT_UINT40:
647a9d8d09cSJung-uk Kim 
6483f0275a0SJung-uk Kim         ByteLength = 5;
6493f0275a0SJung-uk Kim         break;
6503f0275a0SJung-uk Kim 
6513f0275a0SJung-uk Kim     case ACPI_DMT_UINT48:
652a88e22b7SJung-uk Kim     case ACPI_DMT_NAME6:
653a9d8d09cSJung-uk Kim 
654a88e22b7SJung-uk Kim         ByteLength = 6;
655a88e22b7SJung-uk Kim         break;
656a88e22b7SJung-uk Kim 
657a88e22b7SJung-uk Kim     case ACPI_DMT_UINT56:
6580b94ba42SJung-uk Kim     case ACPI_DMT_BUF7:
659a9d8d09cSJung-uk Kim 
660a88e22b7SJung-uk Kim         ByteLength = 7;
661a88e22b7SJung-uk Kim         break;
662a88e22b7SJung-uk Kim 
663a88e22b7SJung-uk Kim     case ACPI_DMT_UINT64:
664a88e22b7SJung-uk Kim     case ACPI_DMT_NAME8:
665a9d8d09cSJung-uk Kim 
666a88e22b7SJung-uk Kim         ByteLength = 8;
667a88e22b7SJung-uk Kim         break;
668a88e22b7SJung-uk Kim 
669a88e22b7SJung-uk Kim     case ACPI_DMT_STRING:
670a9d8d09cSJung-uk Kim 
671d052a1ccSJung-uk Kim         Value = DtGetFieldValue (Field);
672d244b227SJung-uk Kim         if (Value)
673d244b227SJung-uk Kim         {
6745ef50723SJung-uk Kim             ByteLength = strlen (Value) + 1;
675d244b227SJung-uk Kim         }
676d244b227SJung-uk Kim         else
677d244b227SJung-uk Kim         {   /* At this point, this is a fatal error */
678d244b227SJung-uk Kim 
6796f1f1a63SJung-uk Kim             sprintf (AslGbl_MsgBuffer, "Expected \"%s\"", Info->Name);
6806f1f1a63SJung-uk Kim             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, AslGbl_MsgBuffer);
681d052a1ccSJung-uk Kim             return (0);
682d244b227SJung-uk Kim         }
683a88e22b7SJung-uk Kim         break;
684a88e22b7SJung-uk Kim 
6851970d693SJung-uk Kim     case ACPI_DMT_IVRS_UNTERMINATED_STRING:
6861970d693SJung-uk Kim 
6871970d693SJung-uk Kim         Value = DtGetFieldValue (Field);
6881970d693SJung-uk Kim         if (Value)
6891970d693SJung-uk Kim         {
6901970d693SJung-uk Kim             ByteLength = strlen (Value);
6911970d693SJung-uk Kim         }
6921970d693SJung-uk Kim         else
6931970d693SJung-uk Kim         {   /* At this point, this is a fatal error */
6941970d693SJung-uk Kim 
6951970d693SJung-uk Kim             sprintf (AslGbl_MsgBuffer, "Expected \"%s\"", Info->Name);
6961970d693SJung-uk Kim             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, AslGbl_MsgBuffer);
6971970d693SJung-uk Kim             return (0);
6981970d693SJung-uk Kim         }
6991970d693SJung-uk Kim         break;
7001970d693SJung-uk Kim 
701a88e22b7SJung-uk Kim     case ACPI_DMT_GAS:
702a9d8d09cSJung-uk Kim 
703a88e22b7SJung-uk Kim         ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
704a88e22b7SJung-uk Kim         break;
705a88e22b7SJung-uk Kim 
706a88e22b7SJung-uk Kim     case ACPI_DMT_HESTNTFY:
707a9d8d09cSJung-uk Kim 
708a88e22b7SJung-uk Kim         ByteLength = sizeof (ACPI_HEST_NOTIFY);
709a88e22b7SJung-uk Kim         break;
710a88e22b7SJung-uk Kim 
711a371a5fdSJung-uk Kim     case ACPI_DMT_IORTMEM:
712a371a5fdSJung-uk Kim 
713a371a5fdSJung-uk Kim         ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
714a371a5fdSJung-uk Kim         break;
715a371a5fdSJung-uk Kim 
716a88e22b7SJung-uk Kim     case ACPI_DMT_BUFFER:
7177cf3e94aSJung-uk Kim     case ACPI_DMT_RAW_BUFFER:
718cfd1ed46SJung-uk Kim     case ACPI_DMT_PMTT_VENDOR:
719a9d8d09cSJung-uk Kim 
720d052a1ccSJung-uk Kim         Value = DtGetFieldValue (Field);
721a88e22b7SJung-uk Kim         if (Value)
722a88e22b7SJung-uk Kim         {
723a88e22b7SJung-uk Kim             ByteLength = DtGetBufferLength (Value);
724a88e22b7SJung-uk Kim         }
725a88e22b7SJung-uk Kim         else
726a88e22b7SJung-uk Kim         {   /* At this point, this is a fatal error */
727a88e22b7SJung-uk Kim 
7286f1f1a63SJung-uk Kim             sprintf (AslGbl_MsgBuffer, "Expected \"%s\"", Info->Name);
7296f1f1a63SJung-uk Kim             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, AslGbl_MsgBuffer);
730d052a1ccSJung-uk Kim             return (0);
731a88e22b7SJung-uk Kim         }
732a88e22b7SJung-uk Kim         break;
733a88e22b7SJung-uk Kim 
7348d744e47SJung-uk Kim     case ACPI_DMT_BUF10:
7358d744e47SJung-uk Kim 
7368d744e47SJung-uk Kim         ByteLength = 10;
7378d744e47SJung-uk Kim         break;
7388d744e47SJung-uk Kim 
739*58308fadSJung-uk Kim     case ACPI_DMT_BUF11:
740*58308fadSJung-uk Kim 
741*58308fadSJung-uk Kim         ByteLength = 11;
742*58308fadSJung-uk Kim         break;
743*58308fadSJung-uk Kim 
744493deb39SJung-uk Kim     case ACPI_DMT_BUF12:
745493deb39SJung-uk Kim 
746493deb39SJung-uk Kim         ByteLength = 12;
747493deb39SJung-uk Kim         break;
748493deb39SJung-uk Kim 
749a88e22b7SJung-uk Kim     case ACPI_DMT_BUF16:
750d244b227SJung-uk Kim     case ACPI_DMT_UUID:
751a9d8d09cSJung-uk Kim 
752a88e22b7SJung-uk Kim         ByteLength = 16;
753a88e22b7SJung-uk Kim         break;
754a88e22b7SJung-uk Kim 
755ab71bbb7SJung-uk Kim     case ACPI_DMT_BUF18:
756ab71bbb7SJung-uk Kim 
757ab71bbb7SJung-uk Kim         ByteLength = 18;
758ab71bbb7SJung-uk Kim         break;
759ab71bbb7SJung-uk Kim 
760*58308fadSJung-uk Kim     case ACPI_DMT_BUF24:
761*58308fadSJung-uk Kim 
762*58308fadSJung-uk Kim         ByteLength = 24;
763*58308fadSJung-uk Kim         break;
764*58308fadSJung-uk Kim 
765*58308fadSJung-uk Kim     case ACPI_DMT_BUF26:
766*58308fadSJung-uk Kim 
767*58308fadSJung-uk Kim         ByteLength = 26;
768*58308fadSJung-uk Kim         break;
769*58308fadSJung-uk Kim 
77092f570c3SJung-uk Kim     case ACPI_DMT_BUF32:
77192f570c3SJung-uk Kim 
77292f570c3SJung-uk Kim         ByteLength = 32;
77392f570c3SJung-uk Kim         break;
77492f570c3SJung-uk Kim 
77592f570c3SJung-uk Kim     case ACPI_DMT_BUF112:
77692f570c3SJung-uk Kim 
77792f570c3SJung-uk Kim         ByteLength = 112;
77892f570c3SJung-uk Kim         break;
77992f570c3SJung-uk Kim 
780dcbce41eSJung-uk Kim     case ACPI_DMT_BUF128:
781a9d8d09cSJung-uk Kim 
782dcbce41eSJung-uk Kim         ByteLength = 128;
783dcbce41eSJung-uk Kim         break;
784dcbce41eSJung-uk Kim 
785d244b227SJung-uk Kim     case ACPI_DMT_UNICODE:
78697c0b5abSJung-uk Kim     case ACPI_DMT_WPBT_UNICODE:
787a9d8d09cSJung-uk Kim 
788d052a1ccSJung-uk Kim         Value = DtGetFieldValue (Field);
789d244b227SJung-uk Kim 
790d244b227SJung-uk Kim         /* TBD: error if Value is NULL? (as below?) */
791d244b227SJung-uk Kim 
7925ef50723SJung-uk Kim         ByteLength = (strlen (Value) + 1) * sizeof (UINT16);
793d244b227SJung-uk Kim         break;
794d244b227SJung-uk Kim 
795a88e22b7SJung-uk Kim     default:
796a9d8d09cSJung-uk Kim 
797a88e22b7SJung-uk Kim         DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid table opcode");
798d052a1ccSJung-uk Kim         return (0);
799a88e22b7SJung-uk Kim     }
800a88e22b7SJung-uk Kim 
801a88e22b7SJung-uk Kim     return (ByteLength);
802a88e22b7SJung-uk Kim }
803a88e22b7SJung-uk Kim 
804a88e22b7SJung-uk Kim 
805a88e22b7SJung-uk Kim /******************************************************************************
806a88e22b7SJung-uk Kim  *
807a88e22b7SJung-uk Kim  * FUNCTION:    DtSum
808a88e22b7SJung-uk Kim  *
809a88e22b7SJung-uk Kim  * PARAMETERS:  DT_WALK_CALLBACK:
810a88e22b7SJung-uk Kim  *              Subtable            - Subtable
811a88e22b7SJung-uk Kim  *              Context             - Unused
812a88e22b7SJung-uk Kim  *              ReturnValue         - Store the checksum of subtable
813a88e22b7SJung-uk Kim  *
814a88e22b7SJung-uk Kim  * RETURN:      Status
815a88e22b7SJung-uk Kim  *
816a88e22b7SJung-uk Kim  * DESCRIPTION: Get the checksum of subtable
817a88e22b7SJung-uk Kim  *
818a88e22b7SJung-uk Kim  *****************************************************************************/
819a88e22b7SJung-uk Kim 
820a88e22b7SJung-uk Kim static void
DtSum(DT_SUBTABLE * Subtable,void * Context,void * ReturnValue)821a88e22b7SJung-uk Kim DtSum (
822a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
823a88e22b7SJung-uk Kim     void                    *Context,
824a88e22b7SJung-uk Kim     void                    *ReturnValue)
825a88e22b7SJung-uk Kim {
826a88e22b7SJung-uk Kim     UINT8                   Checksum;
827a88e22b7SJung-uk Kim     UINT8                   *Sum = ReturnValue;
828a88e22b7SJung-uk Kim 
829a88e22b7SJung-uk Kim 
8309a4bc520SJung-uk Kim     Checksum = AcpiUtChecksum (Subtable->Buffer, Subtable->Length);
831a88e22b7SJung-uk Kim     *Sum = (UINT8) (*Sum + Checksum);
832a88e22b7SJung-uk Kim }
833a88e22b7SJung-uk Kim 
834a88e22b7SJung-uk Kim 
835a88e22b7SJung-uk Kim /******************************************************************************
836a88e22b7SJung-uk Kim  *
837a88e22b7SJung-uk Kim  * FUNCTION:    DtSetTableChecksum
838a88e22b7SJung-uk Kim  *
839a88e22b7SJung-uk Kim  * PARAMETERS:  ChecksumPointer     - Where to return the checksum
840a88e22b7SJung-uk Kim  *
841a88e22b7SJung-uk Kim  * RETURN:      None
842a88e22b7SJung-uk Kim  *
843a88e22b7SJung-uk Kim  * DESCRIPTION: Set checksum of the whole data table into the checksum field
844a88e22b7SJung-uk Kim  *
845a88e22b7SJung-uk Kim  *****************************************************************************/
846a88e22b7SJung-uk Kim 
847a88e22b7SJung-uk Kim void
DtSetTableChecksum(UINT8 * ChecksumPointer)848a88e22b7SJung-uk Kim DtSetTableChecksum (
849a88e22b7SJung-uk Kim     UINT8                   *ChecksumPointer)
850a88e22b7SJung-uk Kim {
851a88e22b7SJung-uk Kim     UINT8                   Checksum = 0;
852a88e22b7SJung-uk Kim     UINT8                   OldSum;
853a88e22b7SJung-uk Kim 
854a88e22b7SJung-uk Kim 
8556f1f1a63SJung-uk Kim     DtWalkTableTree (AslGbl_RootTable, DtSum, NULL, &Checksum);
856a88e22b7SJung-uk Kim 
857a88e22b7SJung-uk Kim     OldSum = *ChecksumPointer;
858a88e22b7SJung-uk Kim     Checksum = (UINT8) (Checksum - OldSum);
859a88e22b7SJung-uk Kim 
860a88e22b7SJung-uk Kim     /* Compute the final checksum */
861a88e22b7SJung-uk Kim 
862a88e22b7SJung-uk Kim     Checksum = (UINT8) (0 - Checksum);
863a88e22b7SJung-uk Kim     *ChecksumPointer = Checksum;
864a88e22b7SJung-uk Kim }
865a88e22b7SJung-uk Kim 
866a88e22b7SJung-uk Kim 
867a88e22b7SJung-uk Kim /******************************************************************************
868a88e22b7SJung-uk Kim  *
869a88e22b7SJung-uk Kim  * FUNCTION:    DtSetTableLength
870a88e22b7SJung-uk Kim  *
871a88e22b7SJung-uk Kim  * PARAMETERS:  None
872a88e22b7SJung-uk Kim  *
873a88e22b7SJung-uk Kim  * RETURN:      None
874a88e22b7SJung-uk Kim  *
875a88e22b7SJung-uk Kim  * DESCRIPTION: Walk the subtables and set all the length fields
876a88e22b7SJung-uk Kim  *
877a88e22b7SJung-uk Kim  *****************************************************************************/
878a88e22b7SJung-uk Kim 
879a88e22b7SJung-uk Kim void
DtSetTableLength(void)880a88e22b7SJung-uk Kim DtSetTableLength (
881a88e22b7SJung-uk Kim     void)
882a88e22b7SJung-uk Kim {
883a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
884a88e22b7SJung-uk Kim     DT_SUBTABLE             *ChildTable;
885a88e22b7SJung-uk Kim 
886a88e22b7SJung-uk Kim 
8876f1f1a63SJung-uk Kim     ParentTable = AslGbl_RootTable;
888a88e22b7SJung-uk Kim     ChildTable = NULL;
889a88e22b7SJung-uk Kim 
890a88e22b7SJung-uk Kim     if (!ParentTable)
891a88e22b7SJung-uk Kim     {
892a88e22b7SJung-uk Kim         return;
893a88e22b7SJung-uk Kim     }
894a88e22b7SJung-uk Kim 
895a88e22b7SJung-uk Kim     DtSetSubtableLength (ParentTable);
896a88e22b7SJung-uk Kim 
897a88e22b7SJung-uk Kim     while (1)
898a88e22b7SJung-uk Kim     {
899a88e22b7SJung-uk Kim         ChildTable = DtGetNextSubtable (ParentTable, ChildTable);
900a88e22b7SJung-uk Kim         if (ChildTable)
901a88e22b7SJung-uk Kim         {
902a88e22b7SJung-uk Kim             if (ChildTable->LengthField)
903a88e22b7SJung-uk Kim             {
904a88e22b7SJung-uk Kim                 DtSetSubtableLength (ChildTable);
905a88e22b7SJung-uk Kim             }
906a88e22b7SJung-uk Kim 
907a88e22b7SJung-uk Kim             if (ChildTable->Child)
908a88e22b7SJung-uk Kim             {
909a88e22b7SJung-uk Kim                 ParentTable = ChildTable;
910a88e22b7SJung-uk Kim                 ChildTable = NULL;
911a88e22b7SJung-uk Kim             }
912a88e22b7SJung-uk Kim             else
913a88e22b7SJung-uk Kim             {
914a88e22b7SJung-uk Kim                 ParentTable->TotalLength += ChildTable->TotalLength;
915a88e22b7SJung-uk Kim                 if (ParentTable->LengthField)
916a88e22b7SJung-uk Kim                 {
917a88e22b7SJung-uk Kim                     DtSetSubtableLength (ParentTable);
918a88e22b7SJung-uk Kim                 }
919a88e22b7SJung-uk Kim             }
920a88e22b7SJung-uk Kim         }
921a88e22b7SJung-uk Kim         else
922a88e22b7SJung-uk Kim         {
923a88e22b7SJung-uk Kim             ChildTable = ParentTable;
924a88e22b7SJung-uk Kim 
9256f1f1a63SJung-uk Kim             if (ChildTable == AslGbl_RootTable)
926a88e22b7SJung-uk Kim             {
927a88e22b7SJung-uk Kim                 break;
928a88e22b7SJung-uk Kim             }
929a88e22b7SJung-uk Kim 
930a88e22b7SJung-uk Kim             ParentTable = DtGetParentSubtable (ParentTable);
931a88e22b7SJung-uk Kim 
932a88e22b7SJung-uk Kim             ParentTable->TotalLength += ChildTable->TotalLength;
933a88e22b7SJung-uk Kim             if (ParentTable->LengthField)
934a88e22b7SJung-uk Kim             {
935a88e22b7SJung-uk Kim                 DtSetSubtableLength (ParentTable);
936a88e22b7SJung-uk Kim             }
937a88e22b7SJung-uk Kim         }
938a88e22b7SJung-uk Kim     }
939a88e22b7SJung-uk Kim }
940a88e22b7SJung-uk Kim 
941a88e22b7SJung-uk Kim 
942a88e22b7SJung-uk Kim /******************************************************************************
943a88e22b7SJung-uk Kim  *
944a88e22b7SJung-uk Kim  * FUNCTION:    DtWalkTableTree
945a88e22b7SJung-uk Kim  *
946a88e22b7SJung-uk Kim  * PARAMETERS:  StartTable          - Subtable in the tree where walking begins
947a88e22b7SJung-uk Kim  *              UserFunction        - Called during the walk
948a88e22b7SJung-uk Kim  *              Context             - Passed to user function
949a88e22b7SJung-uk Kim  *              ReturnValue         - The return value of UserFunction
950a88e22b7SJung-uk Kim  *
951a88e22b7SJung-uk Kim  * RETURN:      None
952a88e22b7SJung-uk Kim  *
953a88e22b7SJung-uk Kim  * DESCRIPTION: Performs a depth-first walk of the subtable tree
954a88e22b7SJung-uk Kim  *
955a88e22b7SJung-uk Kim  *****************************************************************************/
956a88e22b7SJung-uk Kim 
957a88e22b7SJung-uk Kim void
DtWalkTableTree(DT_SUBTABLE * StartTable,DT_WALK_CALLBACK UserFunction,void * Context,void * ReturnValue)958a88e22b7SJung-uk Kim DtWalkTableTree (
959a88e22b7SJung-uk Kim     DT_SUBTABLE             *StartTable,
960a88e22b7SJung-uk Kim     DT_WALK_CALLBACK        UserFunction,
961a88e22b7SJung-uk Kim     void                    *Context,
962a88e22b7SJung-uk Kim     void                    *ReturnValue)
963a88e22b7SJung-uk Kim {
964a88e22b7SJung-uk Kim     DT_SUBTABLE             *ParentTable;
965a88e22b7SJung-uk Kim     DT_SUBTABLE             *ChildTable;
966a88e22b7SJung-uk Kim 
967a88e22b7SJung-uk Kim 
968a88e22b7SJung-uk Kim     ParentTable = StartTable;
969a88e22b7SJung-uk Kim     ChildTable = NULL;
970a88e22b7SJung-uk Kim 
971a88e22b7SJung-uk Kim     if (!ParentTable)
972a88e22b7SJung-uk Kim     {
973a88e22b7SJung-uk Kim         return;
974a88e22b7SJung-uk Kim     }
975a88e22b7SJung-uk Kim 
976a88e22b7SJung-uk Kim     UserFunction (ParentTable, Context, ReturnValue);
977a88e22b7SJung-uk Kim 
978a88e22b7SJung-uk Kim     while (1)
979a88e22b7SJung-uk Kim     {
980a88e22b7SJung-uk Kim         ChildTable = DtGetNextSubtable (ParentTable, ChildTable);
981a88e22b7SJung-uk Kim         if (ChildTable)
982a88e22b7SJung-uk Kim         {
983a88e22b7SJung-uk Kim             UserFunction (ChildTable, Context, ReturnValue);
984a88e22b7SJung-uk Kim 
985a88e22b7SJung-uk Kim             if (ChildTable->Child)
986a88e22b7SJung-uk Kim             {
987a88e22b7SJung-uk Kim                 ParentTable = ChildTable;
988a88e22b7SJung-uk Kim                 ChildTable = NULL;
989a88e22b7SJung-uk Kim             }
990a88e22b7SJung-uk Kim         }
991a88e22b7SJung-uk Kim         else
992a88e22b7SJung-uk Kim         {
993a88e22b7SJung-uk Kim             ChildTable = ParentTable;
9946f1f1a63SJung-uk Kim             if (ChildTable == AslGbl_RootTable)
995a88e22b7SJung-uk Kim             {
996a88e22b7SJung-uk Kim                 break;
997a88e22b7SJung-uk Kim             }
998a88e22b7SJung-uk Kim 
999a88e22b7SJung-uk Kim             ParentTable = DtGetParentSubtable (ParentTable);
1000a88e22b7SJung-uk Kim 
1001a88e22b7SJung-uk Kim             if (ChildTable->Peer == StartTable)
1002a88e22b7SJung-uk Kim             {
1003a88e22b7SJung-uk Kim                 break;
1004a88e22b7SJung-uk Kim             }
1005a88e22b7SJung-uk Kim         }
1006a88e22b7SJung-uk Kim     }
1007a88e22b7SJung-uk Kim }
1008