xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision 835b56bfeb8a590b8ac923f4a3ca1c0d5fd43a66)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: aslutils -- compiler utilities
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim  *
90d84335fSJung-uk Kim  * 1. Copyright Notice
100d84335fSJung-uk Kim  *
1132ac4016SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
1253289f6aSNate Lawson  * All rights reserved.
1353289f6aSNate Lawson  *
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.
13353289f6aSNate Lawson  *
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.
14953289f6aSNate Lawson  *
1500d84335fSJung-uk Kim  *****************************************************************************/
15153289f6aSNate Lawson 
152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
15353289f6aSNate Lawson #include "aslcompiler.y.h"
154a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
155ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
156ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
1573c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
158f8146b88SJung-uk Kim #include <sys/stat.h>
159f8146b88SJung-uk Kim 
16053289f6aSNate Lawson 
16153289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
16253289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslutils")
16353289f6aSNate Lawson 
1643f0275a0SJung-uk Kim 
165fba7fc7eSJung-uk Kim /* Local prototypes */
16653289f6aSNate Lawson 
167fba7fc7eSJung-uk Kim static void
168fba7fc7eSJung-uk Kim UtPadNameWithUnderscores (
169fba7fc7eSJung-uk Kim     char                    *NameSeg,
170fba7fc7eSJung-uk Kim     char                    *PaddedNameSeg);
171fba7fc7eSJung-uk Kim 
172fba7fc7eSJung-uk Kim static void
173fba7fc7eSJung-uk Kim UtAttachNameseg (
174fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
175fba7fc7eSJung-uk Kim     char                    *Name);
17653289f6aSNate Lawson 
17753289f6aSNate Lawson 
17853289f6aSNate Lawson /*******************************************************************************
17953289f6aSNate Lawson  *
180f8146b88SJung-uk Kim  * FUNCTION:    UtIsBigEndianMachine
181f8146b88SJung-uk Kim  *
182f8146b88SJung-uk Kim  * PARAMETERS:  None
183f8146b88SJung-uk Kim  *
184f8146b88SJung-uk Kim  * RETURN:      TRUE if machine is big endian
185f8146b88SJung-uk Kim  *              FALSE if machine is little endian
186f8146b88SJung-uk Kim  *
187f8146b88SJung-uk Kim  * DESCRIPTION: Detect whether machine is little endian or big endian.
188f8146b88SJung-uk Kim  *
189f8146b88SJung-uk Kim  ******************************************************************************/
190f8146b88SJung-uk Kim 
191f8146b88SJung-uk Kim UINT8
192f8146b88SJung-uk Kim UtIsBigEndianMachine (
193f8146b88SJung-uk Kim     void)
194f8146b88SJung-uk Kim {
195f8146b88SJung-uk Kim     union {
196f8146b88SJung-uk Kim         UINT32              Integer;
197f8146b88SJung-uk Kim         UINT8               Bytes[4];
198f8146b88SJung-uk Kim     } Overlay =                 {0xFF000000};
199f8146b88SJung-uk Kim 
200f8146b88SJung-uk Kim 
201f8146b88SJung-uk Kim     return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */
202f8146b88SJung-uk Kim }
203f8146b88SJung-uk Kim 
204f8146b88SJung-uk Kim 
205f8146b88SJung-uk Kim /******************************************************************************
206f8146b88SJung-uk Kim  *
207f8146b88SJung-uk Kim  * FUNCTION:    UtQueryForOverwrite
208f8146b88SJung-uk Kim  *
209f8146b88SJung-uk Kim  * PARAMETERS:  Pathname            - Output filename
210f8146b88SJung-uk Kim  *
211f8146b88SJung-uk Kim  * RETURN:      TRUE if file does not exist or overwrite is authorized
212f8146b88SJung-uk Kim  *
213f8146b88SJung-uk Kim  * DESCRIPTION: Query for file overwrite if it already exists.
214f8146b88SJung-uk Kim  *
215f8146b88SJung-uk Kim  ******************************************************************************/
216f8146b88SJung-uk Kim 
217f8146b88SJung-uk Kim BOOLEAN
218f8146b88SJung-uk Kim UtQueryForOverwrite (
219f8146b88SJung-uk Kim     char                    *Pathname)
220f8146b88SJung-uk Kim {
221f8146b88SJung-uk Kim     struct stat             StatInfo;
222f8146b88SJung-uk Kim 
223f8146b88SJung-uk Kim 
224f8146b88SJung-uk Kim     if (!stat (Pathname, &StatInfo))
225f8146b88SJung-uk Kim     {
226f8146b88SJung-uk Kim         fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ",
227f8146b88SJung-uk Kim             Pathname);
228f8146b88SJung-uk Kim 
229f8146b88SJung-uk Kim         if (getchar () != 'y')
230f8146b88SJung-uk Kim         {
231f8146b88SJung-uk Kim             return (FALSE);
232f8146b88SJung-uk Kim         }
233f8146b88SJung-uk Kim     }
234f8146b88SJung-uk Kim 
235f8146b88SJung-uk Kim     return (TRUE);
236f8146b88SJung-uk Kim }
237f8146b88SJung-uk Kim 
238f8146b88SJung-uk Kim 
239f8146b88SJung-uk Kim /*******************************************************************************
240f8146b88SJung-uk Kim  *
241*835b56bfSJung-uk Kim  * FUNCTION:    UtNodeIsDescendantOf
242*835b56bfSJung-uk Kim  *
243*835b56bfSJung-uk Kim  * PARAMETERS:  Node1                   - Child node
244*835b56bfSJung-uk Kim  *              Node2                   - Possible parent node
245*835b56bfSJung-uk Kim  *
246*835b56bfSJung-uk Kim  * RETURN:      Boolean
247*835b56bfSJung-uk Kim  *
248*835b56bfSJung-uk Kim  * DESCRIPTION: Returns TRUE if Node1 is a descendant of Node2. Otherwise,
249*835b56bfSJung-uk Kim  *              return FALSE. Note, we assume a NULL Node2 element to be the
250*835b56bfSJung-uk Kim  *              topmost (root) scope. All nodes are descendants of the root.
251*835b56bfSJung-uk Kim  *              Note: Nodes at the same level (siblings) are not considered
252*835b56bfSJung-uk Kim  *              descendants.
253*835b56bfSJung-uk Kim  *
254*835b56bfSJung-uk Kim  ******************************************************************************/
255*835b56bfSJung-uk Kim 
256*835b56bfSJung-uk Kim BOOLEAN
257*835b56bfSJung-uk Kim UtNodeIsDescendantOf (
258*835b56bfSJung-uk Kim     ACPI_NAMESPACE_NODE     *Node1,
259*835b56bfSJung-uk Kim     ACPI_NAMESPACE_NODE     *Node2)
260*835b56bfSJung-uk Kim {
261*835b56bfSJung-uk Kim 
262*835b56bfSJung-uk Kim     if (Node1 == Node2)
263*835b56bfSJung-uk Kim     {
264*835b56bfSJung-uk Kim         return (FALSE);
265*835b56bfSJung-uk Kim     }
266*835b56bfSJung-uk Kim 
267*835b56bfSJung-uk Kim     if (!Node2)
268*835b56bfSJung-uk Kim     {
269*835b56bfSJung-uk Kim         return (TRUE); /* All nodes descend from the root */
270*835b56bfSJung-uk Kim     }
271*835b56bfSJung-uk Kim 
272*835b56bfSJung-uk Kim     /* Walk upward until the root is reached or parent is found */
273*835b56bfSJung-uk Kim 
274*835b56bfSJung-uk Kim     while (Node1)
275*835b56bfSJung-uk Kim     {
276*835b56bfSJung-uk Kim         if (Node1 == Node2)
277*835b56bfSJung-uk Kim         {
278*835b56bfSJung-uk Kim             return (TRUE);
279*835b56bfSJung-uk Kim         }
280*835b56bfSJung-uk Kim 
281*835b56bfSJung-uk Kim         Node1 = Node1->Parent;
282*835b56bfSJung-uk Kim     }
283*835b56bfSJung-uk Kim 
284*835b56bfSJung-uk Kim     return (FALSE);
285*835b56bfSJung-uk Kim }
286*835b56bfSJung-uk Kim 
287*835b56bfSJung-uk Kim 
288*835b56bfSJung-uk Kim /*******************************************************************************
289*835b56bfSJung-uk Kim  *
290*835b56bfSJung-uk Kim  * FUNCTION:    UtGetParentMethod
291*835b56bfSJung-uk Kim  *
292*835b56bfSJung-uk Kim  * PARAMETERS:  Node                    - Namespace node for any object
293*835b56bfSJung-uk Kim  *
294*835b56bfSJung-uk Kim  * RETURN:      Namespace node for the parent method
295*835b56bfSJung-uk Kim  *              NULL - object is not within a method
296*835b56bfSJung-uk Kim  *
297*835b56bfSJung-uk Kim  * DESCRIPTION: Find the parent (owning) method node for a namespace object
298*835b56bfSJung-uk Kim  *
299*835b56bfSJung-uk Kim  ******************************************************************************/
300*835b56bfSJung-uk Kim 
301*835b56bfSJung-uk Kim void *
302*835b56bfSJung-uk Kim UtGetParentMethod (
303*835b56bfSJung-uk Kim     ACPI_NAMESPACE_NODE     *Node)
304*835b56bfSJung-uk Kim {
305*835b56bfSJung-uk Kim     ACPI_NAMESPACE_NODE     *ParentNode;
306*835b56bfSJung-uk Kim 
307*835b56bfSJung-uk Kim 
308*835b56bfSJung-uk Kim     if (!Node)
309*835b56bfSJung-uk Kim     {
310*835b56bfSJung-uk Kim         return (NULL);
311*835b56bfSJung-uk Kim     }
312*835b56bfSJung-uk Kim 
313*835b56bfSJung-uk Kim     /* Walk upward until a method is found, or the root is reached */
314*835b56bfSJung-uk Kim 
315*835b56bfSJung-uk Kim     ParentNode = Node->Parent;
316*835b56bfSJung-uk Kim     while (ParentNode)
317*835b56bfSJung-uk Kim     {
318*835b56bfSJung-uk Kim         if (ParentNode->Type == ACPI_TYPE_METHOD)
319*835b56bfSJung-uk Kim         {
320*835b56bfSJung-uk Kim             return (ParentNode);
321*835b56bfSJung-uk Kim         }
322*835b56bfSJung-uk Kim 
323*835b56bfSJung-uk Kim         ParentNode = ParentNode->Parent;
324*835b56bfSJung-uk Kim     }
325*835b56bfSJung-uk Kim 
326*835b56bfSJung-uk Kim     return (NULL); /* Object is not within a control method */
327*835b56bfSJung-uk Kim }
328*835b56bfSJung-uk Kim 
329*835b56bfSJung-uk Kim 
330*835b56bfSJung-uk Kim /*******************************************************************************
331*835b56bfSJung-uk Kim  *
332a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
333a88e22b7SJung-uk Kim  *
334a88e22b7SJung-uk Kim  * PARAMETERS:  None
335a88e22b7SJung-uk Kim  *
336a88e22b7SJung-uk Kim  * RETURN:      None
337a88e22b7SJung-uk Kim  *
338a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
339a88e22b7SJung-uk Kim  *
340a88e22b7SJung-uk Kim  ******************************************************************************/
341a88e22b7SJung-uk Kim 
342a88e22b7SJung-uk Kim void
343a88e22b7SJung-uk Kim UtDisplaySupportedTables (
344a88e22b7SJung-uk Kim     void)
345a88e22b7SJung-uk Kim {
346a371a5fdSJung-uk Kim     const AH_TABLE          *TableData;
3471df130f1SJung-uk Kim     UINT32                  i;
348a88e22b7SJung-uk Kim 
349a88e22b7SJung-uk Kim 
3501df130f1SJung-uk Kim     printf ("\nACPI tables supported by iASL version %8.8X:\n"
3511df130f1SJung-uk Kim         "  (Compiler, Disassembler, Template Generator)\n\n",
3521df130f1SJung-uk Kim         ACPI_CA_VERSION);
353a88e22b7SJung-uk Kim 
354a371a5fdSJung-uk Kim     /* All ACPI tables with the common table header */
355a88e22b7SJung-uk Kim 
356a371a5fdSJung-uk Kim     printf ("\n  Supported ACPI tables:\n");
35728482948SJung-uk Kim     for (TableData = Gbl_AcpiSupportedTables, i = 1;
358a371a5fdSJung-uk Kim          TableData->Signature; TableData++, i++)
359a88e22b7SJung-uk Kim     {
360a371a5fdSJung-uk Kim         printf ("%8u) %s    %s\n", i,
361a371a5fdSJung-uk Kim             TableData->Signature, TableData->Description);
362a88e22b7SJung-uk Kim     }
363a88e22b7SJung-uk Kim }
364a88e22b7SJung-uk Kim 
365a88e22b7SJung-uk Kim 
366a88e22b7SJung-uk Kim /*******************************************************************************
367a88e22b7SJung-uk Kim  *
368f38b0f21SJung-uk Kim  * FUNCTION:    UtDisplayConstantOpcodes
36953289f6aSNate Lawson  *
37053289f6aSNate Lawson  * PARAMETERS:  None
37153289f6aSNate Lawson  *
37253289f6aSNate Lawson  * RETURN:      None
37353289f6aSNate Lawson  *
37453289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
37553289f6aSNate Lawson  *
37653289f6aSNate Lawson  ******************************************************************************/
37753289f6aSNate Lawson 
37853289f6aSNate Lawson void
37953289f6aSNate Lawson UtDisplayConstantOpcodes (
38053289f6aSNate Lawson     void)
38153289f6aSNate Lawson {
38253289f6aSNate Lawson     UINT32                  i;
38353289f6aSNate Lawson 
384fba7fc7eSJung-uk Kim 
38553289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
38653289f6aSNate Lawson 
38753289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
38853289f6aSNate Lawson     {
38953289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
39053289f6aSNate Lawson         {
39153289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
39253289f6aSNate Lawson         }
39353289f6aSNate Lawson     }
39453289f6aSNate Lawson }
39553289f6aSNate Lawson 
39653289f6aSNate Lawson 
39753289f6aSNate Lawson /*******************************************************************************
39853289f6aSNate Lawson  *
39953289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
40053289f6aSNate Lawson  *
401fba7fc7eSJung-uk Kim  * PARAMETERS:  Name                - Ascii name of this event
40253289f6aSNate Lawson  *
403f38b0f21SJung-uk Kim  * RETURN:      Event number (integer index)
40453289f6aSNate Lawson  *
40553289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
40653289f6aSNate Lawson  *
40753289f6aSNate Lawson  ******************************************************************************/
40853289f6aSNate Lawson 
409fba7fc7eSJung-uk Kim UINT8
41053289f6aSNate Lawson UtBeginEvent (
41153289f6aSNate Lawson     char                    *Name)
41253289f6aSNate Lawson {
41353289f6aSNate Lawson 
414fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
415fba7fc7eSJung-uk Kim     {
416fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
417fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
418fba7fc7eSJung-uk Kim     }
419fba7fc7eSJung-uk Kim 
420fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
421fba7fc7eSJung-uk Kim 
422fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
423fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
424fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
425fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
42653289f6aSNate Lawson }
42753289f6aSNate Lawson 
42853289f6aSNate Lawson 
42953289f6aSNate Lawson /*******************************************************************************
43053289f6aSNate Lawson  *
43153289f6aSNate Lawson  * FUNCTION:    UtEndEvent
43253289f6aSNate Lawson  *
43353289f6aSNate Lawson  * PARAMETERS:  Event               - Event number (integer index)
43453289f6aSNate Lawson  *
43553289f6aSNate Lawson  * RETURN:      None
43653289f6aSNate Lawson  *
43753289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
43853289f6aSNate Lawson  *
43953289f6aSNate Lawson  ******************************************************************************/
44053289f6aSNate Lawson 
44153289f6aSNate Lawson void
44253289f6aSNate Lawson UtEndEvent (
443fba7fc7eSJung-uk Kim     UINT8                   Event)
44453289f6aSNate Lawson {
44553289f6aSNate Lawson 
446fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
447fba7fc7eSJung-uk Kim     {
448fba7fc7eSJung-uk Kim         return;
449fba7fc7eSJung-uk Kim     }
450fba7fc7eSJung-uk Kim 
451fba7fc7eSJung-uk Kim     /* Insert end time for event */
452fba7fc7eSJung-uk Kim 
453fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
45453289f6aSNate Lawson }
45553289f6aSNate Lawson 
45653289f6aSNate Lawson 
45753289f6aSNate Lawson /*******************************************************************************
45853289f6aSNate Lawson  *
45953289f6aSNate Lawson  * FUNCTION:    DbgPrint
46053289f6aSNate Lawson  *
461fba7fc7eSJung-uk Kim  * PARAMETERS:  Type                - Type of output
462fba7fc7eSJung-uk Kim  *              Fmt                 - Printf format string
46353289f6aSNate Lawson  *              ...                 - variable printf list
46453289f6aSNate Lawson  *
46553289f6aSNate Lawson  * RETURN:      None
46653289f6aSNate Lawson  *
46753289f6aSNate Lawson  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
46853289f6aSNate Lawson  *              debug flag is set.
46953289f6aSNate Lawson  *
47053289f6aSNate Lawson  ******************************************************************************/
47153289f6aSNate Lawson 
47253289f6aSNate Lawson void
47353289f6aSNate Lawson DbgPrint (
47453289f6aSNate Lawson     UINT32                  Type,
47553289f6aSNate Lawson     char                    *Fmt,
47653289f6aSNate Lawson     ...)
47753289f6aSNate Lawson {
47853289f6aSNate Lawson     va_list                 Args;
47953289f6aSNate Lawson 
48053289f6aSNate Lawson 
48153289f6aSNate Lawson     if (!Gbl_DebugFlag)
48253289f6aSNate Lawson     {
48353289f6aSNate Lawson         return;
48453289f6aSNate Lawson     }
48553289f6aSNate Lawson 
48653289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
48753289f6aSNate Lawson         (!(AslCompilerdebug)))
48853289f6aSNate Lawson     {
48953289f6aSNate Lawson         return;
49053289f6aSNate Lawson     }
49153289f6aSNate Lawson 
4928d744e47SJung-uk Kim     va_start (Args, Fmt);
49353289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
49453289f6aSNate Lawson     va_end (Args);
49553289f6aSNate Lawson     return;
49653289f6aSNate Lawson }
49753289f6aSNate Lawson 
49853289f6aSNate Lawson 
49953289f6aSNate Lawson /*******************************************************************************
50053289f6aSNate Lawson  *
50153289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
50253289f6aSNate Lawson  *
503f38b0f21SJung-uk Kim  * PARAMETERS:  Op                  - Parse op to be named.
50453289f6aSNate Lawson  *
50553289f6aSNate Lawson  * RETURN:      None
50653289f6aSNate Lawson  *
50753289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
50853289f6aSNate Lawson  *
50953289f6aSNate Lawson  ******************************************************************************/
51053289f6aSNate Lawson 
51153289f6aSNate Lawson void
51253289f6aSNate Lawson UtSetParseOpName (
51353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
51453289f6aSNate Lawson {
515fba7fc7eSJung-uk Kim 
516f1db5ef7SJung-uk Kim     AcpiUtSafeStrncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
5171a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
51853289f6aSNate Lawson }
51953289f6aSNate Lawson 
52053289f6aSNate Lawson 
52153289f6aSNate Lawson /*******************************************************************************
52253289f6aSNate Lawson  *
52353289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
52453289f6aSNate Lawson  *
525fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
52653289f6aSNate Lawson  *
52753289f6aSNate Lawson  * RETURN:      None
52853289f6aSNate Lawson  *
52953289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
53053289f6aSNate Lawson  *
53153289f6aSNate Lawson  ******************************************************************************/
53253289f6aSNate Lawson 
53353289f6aSNate Lawson void
53453289f6aSNate Lawson UtDisplaySummary (
53553289f6aSNate Lawson     UINT32                  FileId)
53653289f6aSNate Lawson {
5373f0275a0SJung-uk Kim     UINT32                  i;
5383f0275a0SJung-uk Kim 
53953289f6aSNate Lawson 
54053289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
54153289f6aSNate Lawson     {
54253289f6aSNate Lawson         /* Compiler name and version number */
54353289f6aSNate Lawson 
54461673a1fSJung-uk Kim         FlPrintFile (FileId, "%s version %X\n\n",
54561673a1fSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION);
54653289f6aSNate Lawson     }
54753289f6aSNate Lawson 
5483f0275a0SJung-uk Kim     /* Summary of main input and output files */
5493f0275a0SJung-uk Kim 
550a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
551a88e22b7SJung-uk Kim     {
552a88e22b7SJung-uk Kim         FlPrintFile (FileId,
5533f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u fields\n",
5543f0275a0SJung-uk Kim             "Table Input:",
555a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
556a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
557a88e22b7SJung-uk Kim 
558a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
559a88e22b7SJung-uk Kim         {
560a88e22b7SJung-uk Kim             FlPrintFile (FileId,
5613f0275a0SJung-uk Kim                 "%-14s %s - %u bytes\n",
5623f0275a0SJung-uk Kim                 "Binary Output:",
563a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
564a88e22b7SJung-uk Kim         }
565a88e22b7SJung-uk Kim     }
566a88e22b7SJung-uk Kim     else
567a88e22b7SJung-uk Kim     {
56853289f6aSNate Lawson         FlPrintFile (FileId,
5693f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u keywords\n",
5703f0275a0SJung-uk Kim             "ASL Input:",
57153289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
5725ef50723SJung-uk Kim             Gbl_OriginalInputFileSize, TotalKeywords);
57353289f6aSNate Lawson 
57453289f6aSNate Lawson         /* AML summary */
57553289f6aSNate Lawson 
57653289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
57753289f6aSNate Lawson         {
5785ef50723SJung-uk Kim             if (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
5795ef50723SJung-uk Kim             {
58053289f6aSNate Lawson                 FlPrintFile (FileId,
581f8146b88SJung-uk Kim                     "%-14s %s - %u bytes, %u named objects, "
582f8146b88SJung-uk Kim                     "%u executable opcodes\n",
5833f0275a0SJung-uk Kim                     "AML Output:",
584f8146b88SJung-uk Kim                     Gbl_Files[ASL_FILE_AML_OUTPUT].Filename,
585f8146b88SJung-uk Kim                     FlGetFileSize (ASL_FILE_AML_OUTPUT),
58653289f6aSNate Lawson                     TotalNamedObjects, TotalExecutableOpcodes);
58753289f6aSNate Lawson             }
588a88e22b7SJung-uk Kim         }
5895ef50723SJung-uk Kim     }
59053289f6aSNate Lawson 
5913f0275a0SJung-uk Kim     /* Display summary of any optional files */
5923f0275a0SJung-uk Kim 
5933f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
5943f0275a0SJung-uk Kim     {
5953f0275a0SJung-uk Kim         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
5963f0275a0SJung-uk Kim         {
5973f0275a0SJung-uk Kim             continue;
5983f0275a0SJung-uk Kim         }
5993f0275a0SJung-uk Kim 
6003f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
6013f0275a0SJung-uk Kim 
6023f0275a0SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
6033f0275a0SJung-uk Kim         {
6043f0275a0SJung-uk Kim             continue;
6053f0275a0SJung-uk Kim         }
6063f0275a0SJung-uk Kim 
6075ef50723SJung-uk Kim         /* .PRE is the preprocessor intermediate file */
6084c52cad2SJung-uk Kim 
6095ef50723SJung-uk Kim         if ((i == ASL_FILE_PREPROCESSOR)  && (!Gbl_KeepPreprocessorTempFile))
6104c52cad2SJung-uk Kim         {
6114c52cad2SJung-uk Kim             continue;
6124c52cad2SJung-uk Kim         }
6134c52cad2SJung-uk Kim 
6143f0275a0SJung-uk Kim         FlPrintFile (FileId, "%14s %s - %u bytes\n",
615042ff955SJung-uk Kim             Gbl_Files[i].ShortDescription,
6163f0275a0SJung-uk Kim             Gbl_Files[i].Filename, FlGetFileSize (i));
6173f0275a0SJung-uk Kim     }
6183f0275a0SJung-uk Kim 
61953289f6aSNate Lawson     /* Error summary */
62053289f6aSNate Lawson 
62153289f6aSNate Lawson     FlPrintFile (FileId,
6223f0275a0SJung-uk Kim         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
62353289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
6241a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
6251a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
6261a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
627a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
628a88e22b7SJung-uk Kim 
629a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
630a88e22b7SJung-uk Kim     {
6317cf3e94aSJung-uk Kim         FlPrintFile (FileId, ", %u Optimizations",
6327cf3e94aSJung-uk Kim             Gbl_ExceptionCount[ASL_OPTIMIZATION]);
6337cf3e94aSJung-uk Kim 
6347cf3e94aSJung-uk Kim         if (TotalFolds)
6357cf3e94aSJung-uk Kim         {
6367cf3e94aSJung-uk Kim             FlPrintFile (FileId, ", %u Constants Folded", TotalFolds);
6377cf3e94aSJung-uk Kim         }
638a88e22b7SJung-uk Kim     }
639a88e22b7SJung-uk Kim 
640a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
64153289f6aSNate Lawson }
64253289f6aSNate Lawson 
64353289f6aSNate Lawson 
64453289f6aSNate Lawson /*******************************************************************************
64553289f6aSNate Lawson  *
646f38b0f21SJung-uk Kim  * FUNCTION:    UtCheckIntegerRange
64753289f6aSNate Lawson  *
64853289f6aSNate Lawson  * PARAMETERS:  Op                  - Integer parse node
64953289f6aSNate Lawson  *              LowValue            - Smallest allowed value
65053289f6aSNate Lawson  *              HighValue           - Largest allowed value
65153289f6aSNate Lawson  *
65253289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
65353289f6aSNate Lawson  *
65453289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
65553289f6aSNate Lawson  *
65653289f6aSNate Lawson  ******************************************************************************/
65753289f6aSNate Lawson 
65853289f6aSNate Lawson ACPI_PARSE_OBJECT *
65953289f6aSNate Lawson UtCheckIntegerRange (
66053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
66153289f6aSNate Lawson     UINT32                  LowValue,
66253289f6aSNate Lawson     UINT32                  HighValue)
66353289f6aSNate Lawson {
66453289f6aSNate Lawson 
66553289f6aSNate Lawson     if (!Op)
66653289f6aSNate Lawson     {
6678ef1a331SJung-uk Kim         return (NULL);
66853289f6aSNate Lawson     }
66953289f6aSNate Lawson 
6701df130f1SJung-uk Kim     if ((Op->Asl.Value.Integer < LowValue) ||
6711df130f1SJung-uk Kim         (Op->Asl.Value.Integer > HighValue))
67253289f6aSNate Lawson     {
6731df130f1SJung-uk Kim         sprintf (MsgBuffer, "0x%X, allowable: 0x%X-0x%X",
6741df130f1SJung-uk Kim             (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
6751df130f1SJung-uk Kim 
6761df130f1SJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RANGE, Op, MsgBuffer);
6771df130f1SJung-uk Kim         return (NULL);
67853289f6aSNate Lawson     }
67953289f6aSNate Lawson 
6801df130f1SJung-uk Kim     return (Op);
68153289f6aSNate Lawson }
68253289f6aSNate Lawson 
68353289f6aSNate Lawson 
68453289f6aSNate Lawson /*******************************************************************************
68553289f6aSNate Lawson  *
68653289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
68753289f6aSNate Lawson  *
68853289f6aSNate Lawson  * PARAMETERS:  ExternalName        - Name to convert
68953289f6aSNate Lawson  *              ConvertedName       - Where the converted name is returned
69053289f6aSNate Lawson  *
69153289f6aSNate Lawson  * RETURN:      Status
69253289f6aSNate Lawson  *
69353289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
69453289f6aSNate Lawson  *
69553289f6aSNate Lawson  ******************************************************************************/
69653289f6aSNate Lawson 
69753289f6aSNate Lawson ACPI_STATUS
69853289f6aSNate Lawson UtInternalizeName (
69953289f6aSNate Lawson     char                    *ExternalName,
70053289f6aSNate Lawson     char                    **ConvertedName)
70153289f6aSNate Lawson {
70253289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
70353289f6aSNate Lawson     ACPI_STATUS             Status;
70453289f6aSNate Lawson 
70553289f6aSNate Lawson 
70653289f6aSNate Lawson     if (!ExternalName)
70753289f6aSNate Lawson     {
70853289f6aSNate Lawson         return (AE_OK);
70953289f6aSNate Lawson     }
71053289f6aSNate Lawson 
71153289f6aSNate Lawson     /* Get the length of the new internal name */
71253289f6aSNate Lawson 
71353289f6aSNate Lawson     Info.ExternalName = ExternalName;
71453289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
71553289f6aSNate Lawson 
71653289f6aSNate Lawson     /* We need a segment to store the internal name */
71753289f6aSNate Lawson 
71867d9aa44SJung-uk Kim     Info.InternalName = UtLocalCacheCalloc (Info.Length);
71953289f6aSNate Lawson 
72053289f6aSNate Lawson     /* Build the name */
72153289f6aSNate Lawson 
72253289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
72353289f6aSNate Lawson     if (ACPI_FAILURE (Status))
72453289f6aSNate Lawson     {
72553289f6aSNate Lawson         return (Status);
72653289f6aSNate Lawson     }
72753289f6aSNate Lawson 
72853289f6aSNate Lawson     *ConvertedName = Info.InternalName;
72953289f6aSNate Lawson     return (AE_OK);
73053289f6aSNate Lawson }
73153289f6aSNate Lawson 
73253289f6aSNate Lawson 
73353289f6aSNate Lawson /*******************************************************************************
73453289f6aSNate Lawson  *
73553289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
73653289f6aSNate Lawson  *
73753289f6aSNate Lawson  * PARAMETERS:  NameSeg             - Input nameseg
73853289f6aSNate Lawson  *              PaddedNameSeg       - Output padded nameseg
73953289f6aSNate Lawson  *
74053289f6aSNate Lawson  * RETURN:      Padded nameseg.
74153289f6aSNate Lawson  *
74253289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
74353289f6aSNate Lawson  *              ACPI_NAME.
74453289f6aSNate Lawson  *
74553289f6aSNate Lawson  ******************************************************************************/
74653289f6aSNate Lawson 
747fba7fc7eSJung-uk Kim static void
74853289f6aSNate Lawson UtPadNameWithUnderscores (
74953289f6aSNate Lawson     char                    *NameSeg,
75053289f6aSNate Lawson     char                    *PaddedNameSeg)
75153289f6aSNate Lawson {
75253289f6aSNate Lawson     UINT32                  i;
75353289f6aSNate Lawson 
75453289f6aSNate Lawson 
75553289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
75653289f6aSNate Lawson     {
75753289f6aSNate Lawson         if (*NameSeg)
75853289f6aSNate Lawson         {
75953289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
76053289f6aSNate Lawson             NameSeg++;
76153289f6aSNate Lawson         }
76253289f6aSNate Lawson         else
76353289f6aSNate Lawson         {
76453289f6aSNate Lawson             *PaddedNameSeg = '_';
76553289f6aSNate Lawson         }
766f8146b88SJung-uk Kim 
76753289f6aSNate Lawson         PaddedNameSeg++;
76853289f6aSNate Lawson     }
76953289f6aSNate Lawson }
77053289f6aSNate Lawson 
77153289f6aSNate Lawson 
77253289f6aSNate Lawson /*******************************************************************************
77353289f6aSNate Lawson  *
77453289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
77553289f6aSNate Lawson  *
77653289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
77753289f6aSNate Lawson  *              Name                - Full ExternalName
77853289f6aSNate Lawson  *
779fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
78053289f6aSNate Lawson  *
78153289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
78253289f6aSNate Lawson  *              in the NameSeg field of the Op.
78353289f6aSNate Lawson  *
78453289f6aSNate Lawson  ******************************************************************************/
78553289f6aSNate Lawson 
786fba7fc7eSJung-uk Kim static void
78753289f6aSNate Lawson UtAttachNameseg (
78853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
78953289f6aSNate Lawson     char                    *Name)
79053289f6aSNate Lawson {
79153289f6aSNate Lawson     char                    *NameSeg;
79253289f6aSNate Lawson     char                    PaddedNameSeg[4];
79353289f6aSNate Lawson 
79453289f6aSNate Lawson 
79553289f6aSNate Lawson     if (!Name)
79653289f6aSNate Lawson     {
79753289f6aSNate Lawson         return;
79853289f6aSNate Lawson     }
79953289f6aSNate Lawson 
80053289f6aSNate Lawson     /* Look for the last dot in the namepath */
80153289f6aSNate Lawson 
80253289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
80353289f6aSNate Lawson     if (NameSeg)
80453289f6aSNate Lawson     {
80553289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
80653289f6aSNate Lawson 
80753289f6aSNate Lawson         NameSeg++;
80853289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
80953289f6aSNate Lawson     }
81053289f6aSNate Lawson     else
81153289f6aSNate Lawson     {
81253289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
81353289f6aSNate Lawson         /* Handle prefixes */
81453289f6aSNate Lawson 
815efcc2a30SJung-uk Kim         while (ACPI_IS_ROOT_PREFIX (*Name) ||
816efcc2a30SJung-uk Kim                ACPI_IS_PARENT_PREFIX (*Name))
81753289f6aSNate Lawson         {
81853289f6aSNate Lawson             Name++;
81953289f6aSNate Lawson         }
82053289f6aSNate Lawson 
8218ef1a331SJung-uk Kim         /* Remaining string should be one single nameseg */
82253289f6aSNate Lawson 
82353289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
82453289f6aSNate Lawson     }
82553289f6aSNate Lawson 
8268ef1a331SJung-uk Kim     ACPI_MOVE_NAME (Op->Asl.NameSeg, PaddedNameSeg);
82753289f6aSNate Lawson }
82853289f6aSNate Lawson 
82953289f6aSNate Lawson 
83053289f6aSNate Lawson /*******************************************************************************
83153289f6aSNate Lawson  *
83253289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
83353289f6aSNate Lawson  *
83453289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
83553289f6aSNate Lawson  *              NameOp              - Node that contains the name
83653289f6aSNate Lawson  *
83753289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
83853289f6aSNate Lawson  *
83953289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node: The original
84053289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
84153289f6aSNate Lawson  *              the ACPI namespace manager.
84253289f6aSNate Lawson  *
84353289f6aSNate Lawson  ******************************************************************************/
84453289f6aSNate Lawson 
84553289f6aSNate Lawson void
84653289f6aSNate Lawson UtAttachNamepathToOwner (
84753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
84853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
84953289f6aSNate Lawson {
85053289f6aSNate Lawson     ACPI_STATUS             Status;
85153289f6aSNate Lawson 
85253289f6aSNate Lawson 
85353289f6aSNate Lawson     /* Full external path */
85453289f6aSNate Lawson 
85553289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
85653289f6aSNate Lawson 
857fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
858fba7fc7eSJung-uk Kim 
859fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
860fba7fc7eSJung-uk Kim 
86153289f6aSNate Lawson     /* Last nameseg of the path */
86253289f6aSNate Lawson 
86353289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
86453289f6aSNate Lawson 
86553289f6aSNate Lawson     /* Create internalized path */
86653289f6aSNate Lawson 
86753289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
86853289f6aSNate Lawson     if (ACPI_FAILURE (Status))
86953289f6aSNate Lawson     {
87053289f6aSNate Lawson         /* TBD: abort on no memory */
87153289f6aSNate Lawson     }
87253289f6aSNate Lawson }
87353289f6aSNate Lawson 
87453289f6aSNate Lawson 
87553289f6aSNate Lawson /*******************************************************************************
87653289f6aSNate Lawson  *
87753289f6aSNate Lawson  * FUNCTION:    UtDoConstant
87853289f6aSNate Lawson  *
8792f6a1a81SJung-uk Kim  * PARAMETERS:  String              - Hex/Decimal/Octal
88053289f6aSNate Lawson  *
88153289f6aSNate Lawson  * RETURN:      Converted Integer
88253289f6aSNate Lawson  *
8832f6a1a81SJung-uk Kim  * DESCRIPTION: Convert a string to an integer, with overflow/error checking.
88453289f6aSNate Lawson  *
88553289f6aSNate Lawson  ******************************************************************************/
88653289f6aSNate Lawson 
8879a179dd8SJung-uk Kim UINT64
88853289f6aSNate Lawson UtDoConstant (
88953289f6aSNate Lawson     char                    *String)
89053289f6aSNate Lawson {
89153289f6aSNate Lawson     ACPI_STATUS             Status;
8922f6a1a81SJung-uk Kim     UINT64                  ConvertedInteger;
89353289f6aSNate Lawson     char                    ErrBuf[64];
89453289f6aSNate Lawson 
89553289f6aSNate Lawson 
8962f6a1a81SJung-uk Kim     Status = AcpiUtStrtoul64 (String, &ConvertedInteger);
89753289f6aSNate Lawson     if (ACPI_FAILURE (Status))
89853289f6aSNate Lawson     {
8992f6a1a81SJung-uk Kim         sprintf (ErrBuf, "While creating 64-bit constant: %s\n",
900fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
9012f6a1a81SJung-uk Kim 
9022f6a1a81SJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
9032f6a1a81SJung-uk Kim             Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
9042f6a1a81SJung-uk Kim             Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename, ErrBuf);
90553289f6aSNate Lawson     }
90653289f6aSNate Lawson 
9072f6a1a81SJung-uk Kim     return (ConvertedInteger);
90853289f6aSNate Lawson }
909