xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision 3f0275a0331d5d477f9d8dc5accbba3533ac4cbf)
153289f6aSNate Lawson 
253289f6aSNate Lawson /******************************************************************************
353289f6aSNate Lawson  *
453289f6aSNate Lawson  * Module Name: aslutils -- compiler utilities
553289f6aSNate Lawson  *
653289f6aSNate Lawson  *****************************************************************************/
753289f6aSNate Lawson 
8d244b227SJung-uk Kim /*
9d244b227SJung-uk Kim  * Copyright (C) 2000 - 2011, Intel Corp.
1053289f6aSNate Lawson  * All rights reserved.
1153289f6aSNate Lawson  *
12d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
13d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
14d244b227SJung-uk Kim  * are met:
15d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
16d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
17d244b227SJung-uk Kim  *    without modification.
18d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
20d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
21d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
22d244b227SJung-uk Kim  *    binary redistribution.
23d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
24d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
25d244b227SJung-uk Kim  *    from this software without specific prior written permission.
2653289f6aSNate Lawson  *
27d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
28d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
29d244b227SJung-uk Kim  * Software Foundation.
3053289f6aSNate Lawson  *
31d244b227SJung-uk Kim  * NO WARRANTY
32d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
43d244b227SJung-uk Kim  */
4453289f6aSNate Lawson 
4553289f6aSNate Lawson 
46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
4753289f6aSNate Lawson #include "aslcompiler.y.h"
48a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
513c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
5253289f6aSNate Lawson 
5353289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
5453289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslutils")
5553289f6aSNate Lawson 
56*3f0275a0SJung-uk Kim 
57d244b227SJung-uk Kim char                        AslHexLookup[] =
58a9f12690SJung-uk Kim {
59a9f12690SJung-uk Kim     '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
60a9f12690SJung-uk Kim };
61a9f12690SJung-uk Kim 
62*3f0275a0SJung-uk Kim /* Table below must match ASL_FILE_TYPES in asltypes.h */
63*3f0275a0SJung-uk Kim 
64*3f0275a0SJung-uk Kim static const char       *AslFileTypeNames [ASL_NUM_FILES] =
65*3f0275a0SJung-uk Kim {
66*3f0275a0SJung-uk Kim     "stdout:       ",
67*3f0275a0SJung-uk Kim     "stderr:       ",
68*3f0275a0SJung-uk Kim     "Table Input:  ",
69*3f0275a0SJung-uk Kim     "Binary Output:",
70*3f0275a0SJung-uk Kim     "Source Output:",
71*3f0275a0SJung-uk Kim     "Listing File: ",
72*3f0275a0SJung-uk Kim     "Hex Dump:     ",
73*3f0275a0SJung-uk Kim     "Namespace:    ",
74*3f0275a0SJung-uk Kim     "Debug File:   ",
75*3f0275a0SJung-uk Kim     "ASM Source:   ",
76*3f0275a0SJung-uk Kim     "C Source:     ",
77*3f0275a0SJung-uk Kim     "ASM Include:  ",
78*3f0275a0SJung-uk Kim     "C Include:    "
79*3f0275a0SJung-uk Kim };
80*3f0275a0SJung-uk Kim 
81a9f12690SJung-uk Kim 
82fba7fc7eSJung-uk Kim /* Local prototypes */
8353289f6aSNate Lawson 
84fba7fc7eSJung-uk Kim static void
85fba7fc7eSJung-uk Kim UtPadNameWithUnderscores (
86fba7fc7eSJung-uk Kim     char                    *NameSeg,
87fba7fc7eSJung-uk Kim     char                    *PaddedNameSeg);
88fba7fc7eSJung-uk Kim 
89fba7fc7eSJung-uk Kim static void
90fba7fc7eSJung-uk Kim UtAttachNameseg (
91fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
92fba7fc7eSJung-uk Kim     char                    *Name);
9353289f6aSNate Lawson 
9453289f6aSNate Lawson 
9553289f6aSNate Lawson /*******************************************************************************
9653289f6aSNate Lawson  *
97a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
98a88e22b7SJung-uk Kim  *
99a88e22b7SJung-uk Kim  * PARAMETERS:  None
100a88e22b7SJung-uk Kim  *
101a88e22b7SJung-uk Kim  * RETURN:      None
102a88e22b7SJung-uk Kim  *
103a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
104a88e22b7SJung-uk Kim  *
105a88e22b7SJung-uk Kim  ******************************************************************************/
106a88e22b7SJung-uk Kim 
107a88e22b7SJung-uk Kim void
108a88e22b7SJung-uk Kim UtDisplaySupportedTables (
109a88e22b7SJung-uk Kim     void)
110a88e22b7SJung-uk Kim {
111a88e22b7SJung-uk Kim     ACPI_DMTABLE_DATA       *TableData;
112a88e22b7SJung-uk Kim     UINT32                  i = 6;
113a88e22b7SJung-uk Kim 
114a88e22b7SJung-uk Kim 
115a88e22b7SJung-uk Kim     printf ("\nACPI tables supported by iASL subsystems in "
116a88e22b7SJung-uk Kim         "version %8.8X:\n"
117a88e22b7SJung-uk Kim         "  ASL and Data Table compilers\n"
118a88e22b7SJung-uk Kim         "  AML and Data Table disassemblers\n"
119a88e22b7SJung-uk Kim         "  ACPI table template generator\n\n", ACPI_CA_VERSION);
120a88e22b7SJung-uk Kim 
121a88e22b7SJung-uk Kim     /* Special tables */
122a88e22b7SJung-uk Kim 
123a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 1, ACPI_SIG_DSDT, "Differentiated System Description Table");
124a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 2, ACPI_SIG_SSDT, "Secondary System Description Table");
125a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 3, ACPI_SIG_FADT, "Fixed ACPI Description Table (FADT)");
126a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 4, ACPI_SIG_FACS, "Firmware ACPI Control Structure");
127a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 5, ACPI_RSDP_NAME, "Root System Description Pointer");
128a88e22b7SJung-uk Kim 
129a88e22b7SJung-uk Kim     /* All data tables with common table header */
130a88e22b7SJung-uk Kim 
131a88e22b7SJung-uk Kim     for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
132a88e22b7SJung-uk Kim     {
133a88e22b7SJung-uk Kim         printf ("%8u) %s    %s\n", i, TableData->Signature, TableData->Name);
134a88e22b7SJung-uk Kim         i++;
135a88e22b7SJung-uk Kim     }
136a88e22b7SJung-uk Kim }
137a88e22b7SJung-uk Kim 
138a88e22b7SJung-uk Kim 
139a88e22b7SJung-uk Kim /*******************************************************************************
140a88e22b7SJung-uk Kim  *
14153289f6aSNate Lawson  * FUNCTION:    AcpiPsDisplayConstantOpcodes
14253289f6aSNate Lawson  *
14353289f6aSNate Lawson  * PARAMETERS:  None
14453289f6aSNate Lawson  *
14553289f6aSNate Lawson  * RETURN:      None
14653289f6aSNate Lawson  *
14753289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
14853289f6aSNate Lawson  *
14953289f6aSNate Lawson  ******************************************************************************/
15053289f6aSNate Lawson 
15153289f6aSNate Lawson void
15253289f6aSNate Lawson UtDisplayConstantOpcodes (
15353289f6aSNate Lawson     void)
15453289f6aSNate Lawson {
15553289f6aSNate Lawson     UINT32                  i;
15653289f6aSNate Lawson 
157fba7fc7eSJung-uk Kim 
15853289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
15953289f6aSNate Lawson 
16053289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
16153289f6aSNate Lawson     {
16253289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
16353289f6aSNate Lawson         {
16453289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
16553289f6aSNate Lawson         }
16653289f6aSNate Lawson     }
16753289f6aSNate Lawson }
16853289f6aSNate Lawson 
16953289f6aSNate Lawson 
17053289f6aSNate Lawson /*******************************************************************************
17153289f6aSNate Lawson  *
17253289f6aSNate Lawson  * FUNCTION:    UtLocalCalloc
17353289f6aSNate Lawson  *
17453289f6aSNate Lawson  * PARAMETERS:  Size        - Bytes to be allocated
17553289f6aSNate Lawson  *
17653289f6aSNate Lawson  * RETURN:      Pointer to the allocated memory.  Guaranteed to be valid.
17753289f6aSNate Lawson  *
17853289f6aSNate Lawson  * DESCRIPTION: Allocate zero-initialized memory.  Aborts the compile on an
17953289f6aSNate Lawson  *              allocation failure, on the assumption that nothing more can be
18053289f6aSNate Lawson  *              accomplished.
18153289f6aSNate Lawson  *
18253289f6aSNate Lawson  ******************************************************************************/
18353289f6aSNate Lawson 
18453289f6aSNate Lawson void *
18553289f6aSNate Lawson UtLocalCalloc (
18653289f6aSNate Lawson     UINT32                  Size)
18753289f6aSNate Lawson {
18853289f6aSNate Lawson     void                    *Allocated;
18953289f6aSNate Lawson 
19053289f6aSNate Lawson 
1911a39cfb0SJung-uk Kim     Allocated = ACPI_ALLOCATE_ZEROED (Size);
19253289f6aSNate Lawson     if (!Allocated)
19353289f6aSNate Lawson     {
19453289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
19553289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
19653289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
19753289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
198a88e22b7SJung-uk Kim 
199a88e22b7SJung-uk Kim         CmCleanupAndExit ();
20053289f6aSNate Lawson         exit (1);
20153289f6aSNate Lawson     }
20253289f6aSNate Lawson 
20353289f6aSNate Lawson     TotalAllocations++;
20453289f6aSNate Lawson     TotalAllocated += Size;
2051a39cfb0SJung-uk Kim     return (Allocated);
20653289f6aSNate Lawson }
20753289f6aSNate Lawson 
20853289f6aSNate Lawson 
20953289f6aSNate Lawson /*******************************************************************************
21053289f6aSNate Lawson  *
21153289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
21253289f6aSNate Lawson  *
213fba7fc7eSJung-uk Kim  * PARAMETERS:  Name        - Ascii name of this event
21453289f6aSNate Lawson  *
215fba7fc7eSJung-uk Kim  * RETURN:      Event       - Event number (integer index)
21653289f6aSNate Lawson  *
21753289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
21853289f6aSNate Lawson  *
21953289f6aSNate Lawson  ******************************************************************************/
22053289f6aSNate Lawson 
221fba7fc7eSJung-uk Kim UINT8
22253289f6aSNate Lawson UtBeginEvent (
22353289f6aSNate Lawson     char                    *Name)
22453289f6aSNate Lawson {
22553289f6aSNate Lawson 
226fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
227fba7fc7eSJung-uk Kim     {
228fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
229fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
230fba7fc7eSJung-uk Kim     }
231fba7fc7eSJung-uk Kim 
232fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
233fba7fc7eSJung-uk Kim 
234fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
235fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
236fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
237fba7fc7eSJung-uk Kim 
238fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
23953289f6aSNate Lawson }
24053289f6aSNate Lawson 
24153289f6aSNate Lawson 
24253289f6aSNate Lawson /*******************************************************************************
24353289f6aSNate Lawson  *
24453289f6aSNate Lawson  * FUNCTION:    UtEndEvent
24553289f6aSNate Lawson  *
24653289f6aSNate Lawson  * PARAMETERS:  Event       - Event number (integer index)
24753289f6aSNate Lawson  *
24853289f6aSNate Lawson  * RETURN:      None
24953289f6aSNate Lawson  *
25053289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
25153289f6aSNate Lawson  *
25253289f6aSNate Lawson  ******************************************************************************/
25353289f6aSNate Lawson 
25453289f6aSNate Lawson void
25553289f6aSNate Lawson UtEndEvent (
256fba7fc7eSJung-uk Kim     UINT8                  Event)
25753289f6aSNate Lawson {
25853289f6aSNate Lawson 
259fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
260fba7fc7eSJung-uk Kim     {
261fba7fc7eSJung-uk Kim         return;
262fba7fc7eSJung-uk Kim     }
263fba7fc7eSJung-uk Kim 
264fba7fc7eSJung-uk Kim     /* Insert end time for event */
265fba7fc7eSJung-uk Kim 
266fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
26753289f6aSNate Lawson }
26853289f6aSNate Lawson 
26953289f6aSNate Lawson 
27053289f6aSNate Lawson /*******************************************************************************
27153289f6aSNate Lawson  *
27253289f6aSNate Lawson  * FUNCTION:    UtHexCharToValue
27353289f6aSNate Lawson  *
274fba7fc7eSJung-uk Kim  * PARAMETERS:  HexChar         - Hex character in Ascii
27553289f6aSNate Lawson  *
27653289f6aSNate Lawson  * RETURN:      The binary value of the hex character
27753289f6aSNate Lawson  *
27853289f6aSNate Lawson  * DESCRIPTION: Perform ascii-to-hex translation
27953289f6aSNate Lawson  *
28053289f6aSNate Lawson  ******************************************************************************/
28153289f6aSNate Lawson 
28253289f6aSNate Lawson UINT8
28353289f6aSNate Lawson UtHexCharToValue (
284fba7fc7eSJung-uk Kim     int                     HexChar)
28553289f6aSNate Lawson {
28653289f6aSNate Lawson 
287fba7fc7eSJung-uk Kim     if (HexChar <= 0x39)
28853289f6aSNate Lawson     {
289fba7fc7eSJung-uk Kim         return ((UINT8) (HexChar - 0x30));
29053289f6aSNate Lawson     }
29153289f6aSNate Lawson 
292fba7fc7eSJung-uk Kim     if (HexChar <= 0x46)
29353289f6aSNate Lawson     {
294fba7fc7eSJung-uk Kim         return ((UINT8) (HexChar - 0x37));
29553289f6aSNate Lawson     }
29653289f6aSNate Lawson 
297fba7fc7eSJung-uk Kim     return ((UINT8) (HexChar - 0x57));
29853289f6aSNate Lawson }
29953289f6aSNate Lawson 
30053289f6aSNate Lawson 
30153289f6aSNate Lawson /*******************************************************************************
30253289f6aSNate Lawson  *
30353289f6aSNate Lawson  * FUNCTION:    UtConvertByteToHex
30453289f6aSNate Lawson  *
30553289f6aSNate Lawson  * PARAMETERS:  RawByte         - Binary data
306fba7fc7eSJung-uk Kim  *              Buffer          - Pointer to where the hex bytes will be stored
30753289f6aSNate Lawson  *
30853289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
30953289f6aSNate Lawson  *
31053289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
31153289f6aSNate Lawson  *              with "0x"
31253289f6aSNate Lawson  *
31353289f6aSNate Lawson  ******************************************************************************/
31453289f6aSNate Lawson 
31553289f6aSNate Lawson void
31653289f6aSNate Lawson UtConvertByteToHex (
31753289f6aSNate Lawson     UINT8                   RawByte,
31853289f6aSNate Lawson     UINT8                   *Buffer)
31953289f6aSNate Lawson {
32053289f6aSNate Lawson 
32153289f6aSNate Lawson     Buffer[0] = '0';
32253289f6aSNate Lawson     Buffer[1] = 'x';
32353289f6aSNate Lawson 
324d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
325d244b227SJung-uk Kim     Buffer[3] = (UINT8) AslHexLookup[RawByte & 0xF];
32653289f6aSNate Lawson }
32753289f6aSNate Lawson 
32853289f6aSNate Lawson 
32953289f6aSNate Lawson /*******************************************************************************
33053289f6aSNate Lawson  *
33153289f6aSNate Lawson  * FUNCTION:    UtConvertByteToAsmHex
33253289f6aSNate Lawson  *
33353289f6aSNate Lawson  * PARAMETERS:  RawByte         - Binary data
334fba7fc7eSJung-uk Kim  *              Buffer          - Pointer to where the hex bytes will be stored
33553289f6aSNate Lawson  *
33653289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
33753289f6aSNate Lawson  *
33853289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
33953289f6aSNate Lawson  *              with "0x"
34053289f6aSNate Lawson  *
34153289f6aSNate Lawson  ******************************************************************************/
34253289f6aSNate Lawson 
34353289f6aSNate Lawson void
34453289f6aSNate Lawson UtConvertByteToAsmHex (
34553289f6aSNate Lawson     UINT8                   RawByte,
34653289f6aSNate Lawson     UINT8                   *Buffer)
34753289f6aSNate Lawson {
34853289f6aSNate Lawson 
34953289f6aSNate Lawson     Buffer[0] = '0';
350d244b227SJung-uk Kim     Buffer[1] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
351d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[RawByte & 0xF];
35253289f6aSNate Lawson     Buffer[3] = 'h';
35353289f6aSNate Lawson }
35453289f6aSNate Lawson 
35553289f6aSNate Lawson 
35653289f6aSNate Lawson /*******************************************************************************
35753289f6aSNate Lawson  *
35853289f6aSNate Lawson  * FUNCTION:    DbgPrint
35953289f6aSNate Lawson  *
360fba7fc7eSJung-uk Kim  * PARAMETERS:  Type            - Type of output
361fba7fc7eSJung-uk Kim  *              Fmt             - Printf format string
36253289f6aSNate Lawson  *              ...             - variable printf list
36353289f6aSNate Lawson  *
36453289f6aSNate Lawson  * RETURN:      None
36553289f6aSNate Lawson  *
36653289f6aSNate Lawson  * DESCRIPTION: Conditional print statement.  Prints to stderr only if the
36753289f6aSNate Lawson  *              debug flag is set.
36853289f6aSNate Lawson  *
36953289f6aSNate Lawson  ******************************************************************************/
37053289f6aSNate Lawson 
37153289f6aSNate Lawson void
37253289f6aSNate Lawson DbgPrint (
37353289f6aSNate Lawson     UINT32                  Type,
37453289f6aSNate Lawson     char                    *Fmt,
37553289f6aSNate Lawson     ...)
37653289f6aSNate Lawson {
37753289f6aSNate Lawson     va_list                 Args;
37853289f6aSNate Lawson 
37953289f6aSNate Lawson 
38053289f6aSNate Lawson     va_start (Args, Fmt);
38153289f6aSNate Lawson 
38253289f6aSNate Lawson     if (!Gbl_DebugFlag)
38353289f6aSNate Lawson     {
38453289f6aSNate Lawson         return;
38553289f6aSNate Lawson     }
38653289f6aSNate Lawson 
38753289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
38853289f6aSNate Lawson         (!(AslCompilerdebug)))
38953289f6aSNate Lawson     {
39053289f6aSNate Lawson         return;
39153289f6aSNate Lawson     }
39253289f6aSNate Lawson 
39353289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
39453289f6aSNate Lawson     va_end (Args);
39553289f6aSNate Lawson     return;
39653289f6aSNate Lawson }
39753289f6aSNate Lawson 
39853289f6aSNate Lawson 
39953289f6aSNate Lawson /*******************************************************************************
40053289f6aSNate Lawson  *
40153289f6aSNate Lawson  * FUNCTION:    UtPrintFormattedName
40253289f6aSNate Lawson  *
40353289f6aSNate Lawson  * PARAMETERS:  ParseOpcode         - Parser keyword ID
40453289f6aSNate Lawson  *              Level               - Indentation level
40553289f6aSNate Lawson  *
40653289f6aSNate Lawson  * RETURN:      None
40753289f6aSNate Lawson  *
40853289f6aSNate Lawson  * DESCRIPTION: Print the ascii name of the parse opcode.
40953289f6aSNate Lawson  *
41053289f6aSNate Lawson  ******************************************************************************/
41153289f6aSNate Lawson 
41253289f6aSNate Lawson #define TEXT_OFFSET 10
41353289f6aSNate Lawson 
41453289f6aSNate Lawson void
41553289f6aSNate Lawson UtPrintFormattedName (
41653289f6aSNate Lawson     UINT16                  ParseOpcode,
41753289f6aSNate Lawson     UINT32                  Level)
41853289f6aSNate Lawson {
41953289f6aSNate Lawson 
4201a39cfb0SJung-uk Kim     if (Level)
4211a39cfb0SJung-uk Kim     {
42253289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
4231a39cfb0SJung-uk Kim             "%*s", (3 * Level), " ");
4241a39cfb0SJung-uk Kim     }
4251a39cfb0SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT,
4261a39cfb0SJung-uk Kim         " %-20.20s", UtGetOpName (ParseOpcode));
42753289f6aSNate Lawson 
42853289f6aSNate Lawson     if (Level < TEXT_OFFSET)
42953289f6aSNate Lawson     {
43053289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
43153289f6aSNate Lawson             "%*s", (TEXT_OFFSET - Level) * 3, " ");
43253289f6aSNate Lawson     }
43353289f6aSNate Lawson }
43453289f6aSNate Lawson 
43553289f6aSNate Lawson 
43653289f6aSNate Lawson /*******************************************************************************
43753289f6aSNate Lawson  *
43853289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
43953289f6aSNate Lawson  *
44053289f6aSNate Lawson  * PARAMETERS:  Op
44153289f6aSNate Lawson  *
44253289f6aSNate Lawson  * RETURN:      None
44353289f6aSNate Lawson  *
44453289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
44553289f6aSNate Lawson  *
44653289f6aSNate Lawson  ******************************************************************************/
44753289f6aSNate Lawson 
44853289f6aSNate Lawson void
44953289f6aSNate Lawson UtSetParseOpName (
45053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
45153289f6aSNate Lawson {
452fba7fc7eSJung-uk Kim 
4531a39cfb0SJung-uk Kim     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
4541a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
45553289f6aSNate Lawson }
45653289f6aSNate Lawson 
45753289f6aSNate Lawson 
45853289f6aSNate Lawson /*******************************************************************************
45953289f6aSNate Lawson  *
46053289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
46153289f6aSNate Lawson  *
462fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID          - ID of outpout file
46353289f6aSNate Lawson  *
46453289f6aSNate Lawson  * RETURN:      None
46553289f6aSNate Lawson  *
46653289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
46753289f6aSNate Lawson  *
46853289f6aSNate Lawson  ******************************************************************************/
46953289f6aSNate Lawson 
47053289f6aSNate Lawson void
47153289f6aSNate Lawson UtDisplaySummary (
47253289f6aSNate Lawson     UINT32                  FileId)
47353289f6aSNate Lawson {
474*3f0275a0SJung-uk Kim     UINT32                  i;
475*3f0275a0SJung-uk Kim 
47653289f6aSNate Lawson 
47753289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
47853289f6aSNate Lawson     {
47953289f6aSNate Lawson         /* Compiler name and version number */
48053289f6aSNate Lawson 
481*3f0275a0SJung-uk Kim         FlPrintFile (FileId, "%s version %X%s\n\n",
4823c1812acSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH);
48353289f6aSNate Lawson     }
48453289f6aSNate Lawson 
485*3f0275a0SJung-uk Kim     /* Summary of main input and output files */
486*3f0275a0SJung-uk Kim 
487a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
488a88e22b7SJung-uk Kim     {
489a88e22b7SJung-uk Kim         FlPrintFile (FileId,
490*3f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u fields\n",
491*3f0275a0SJung-uk Kim             "Table Input:",
492a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
493a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
494a88e22b7SJung-uk Kim 
495a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
496a88e22b7SJung-uk Kim         {
497a88e22b7SJung-uk Kim             FlPrintFile (FileId,
498*3f0275a0SJung-uk Kim                 "%-14s %s - %u bytes\n",
499*3f0275a0SJung-uk Kim                 "Binary Output:",
500a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
501a88e22b7SJung-uk Kim         }
502a88e22b7SJung-uk Kim     }
503a88e22b7SJung-uk Kim     else
504a88e22b7SJung-uk Kim     {
50553289f6aSNate Lawson         FlPrintFile (FileId,
506*3f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u keywords\n",
507*3f0275a0SJung-uk Kim             "ASL Input:",
50853289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
50953289f6aSNate Lawson             Gbl_InputByteCount, TotalKeywords);
51053289f6aSNate Lawson 
51153289f6aSNate Lawson         /* AML summary */
51253289f6aSNate Lawson 
51353289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
51453289f6aSNate Lawson         {
51553289f6aSNate Lawson             FlPrintFile (FileId,
516*3f0275a0SJung-uk Kim                 "%-14s %s - %u bytes, %u named objects, %u executable opcodes\n",
517*3f0275a0SJung-uk Kim                 "AML Output:",
51853289f6aSNate Lawson                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,
51953289f6aSNate Lawson                 TotalNamedObjects, TotalExecutableOpcodes);
52053289f6aSNate Lawson         }
521a88e22b7SJung-uk Kim     }
52253289f6aSNate Lawson 
523*3f0275a0SJung-uk Kim     /* Display summary of any optional files */
524*3f0275a0SJung-uk Kim 
525*3f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
526*3f0275a0SJung-uk Kim     {
527*3f0275a0SJung-uk Kim         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
528*3f0275a0SJung-uk Kim         {
529*3f0275a0SJung-uk Kim             continue;
530*3f0275a0SJung-uk Kim         }
531*3f0275a0SJung-uk Kim 
532*3f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
533*3f0275a0SJung-uk Kim 
534*3f0275a0SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
535*3f0275a0SJung-uk Kim         {
536*3f0275a0SJung-uk Kim             continue;
537*3f0275a0SJung-uk Kim         }
538*3f0275a0SJung-uk Kim 
539*3f0275a0SJung-uk Kim         FlPrintFile (FileId, "%14s %s - %u bytes\n",
540*3f0275a0SJung-uk Kim             AslFileTypeNames [i],
541*3f0275a0SJung-uk Kim             Gbl_Files[i].Filename, FlGetFileSize (i));
542*3f0275a0SJung-uk Kim     }
543*3f0275a0SJung-uk Kim 
54453289f6aSNate Lawson     /* Error summary */
54553289f6aSNate Lawson 
54653289f6aSNate Lawson     FlPrintFile (FileId,
547*3f0275a0SJung-uk Kim         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
54853289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
5491a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
5501a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
5511a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
552a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
553a88e22b7SJung-uk Kim 
554a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
555a88e22b7SJung-uk Kim     {
556a88e22b7SJung-uk Kim         FlPrintFile (FileId,
557a88e22b7SJung-uk Kim             ", %u Optimizations", Gbl_ExceptionCount[ASL_OPTIMIZATION]);
558a88e22b7SJung-uk Kim     }
559a88e22b7SJung-uk Kim 
560a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
56153289f6aSNate Lawson }
56253289f6aSNate Lawson 
56353289f6aSNate Lawson 
56453289f6aSNate Lawson /*******************************************************************************
56553289f6aSNate Lawson  *
56653289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
56753289f6aSNate Lawson  *
56853289f6aSNate Lawson  * PARAMETERS:  Op              - Integer parse node
56953289f6aSNate Lawson  *              LowValue        - Smallest allowed value
57053289f6aSNate Lawson  *              HighValue       - Largest allowed value
57153289f6aSNate Lawson  *
57253289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
57353289f6aSNate Lawson  *
57453289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
57553289f6aSNate Lawson  *
57653289f6aSNate Lawson  ******************************************************************************/
57753289f6aSNate Lawson 
57853289f6aSNate Lawson ACPI_PARSE_OBJECT *
57953289f6aSNate Lawson UtCheckIntegerRange (
58053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
58153289f6aSNate Lawson     UINT32                  LowValue,
58253289f6aSNate Lawson     UINT32                  HighValue)
58353289f6aSNate Lawson {
58453289f6aSNate Lawson     char                    *ParseError = NULL;
58553289f6aSNate Lawson     char                    Buffer[64];
58653289f6aSNate Lawson 
58753289f6aSNate Lawson 
58853289f6aSNate Lawson     if (!Op)
58953289f6aSNate Lawson     {
59053289f6aSNate Lawson         return NULL;
59153289f6aSNate Lawson     }
59253289f6aSNate Lawson 
59353289f6aSNate Lawson     if (Op->Asl.Value.Integer < LowValue)
59453289f6aSNate Lawson     {
59553289f6aSNate Lawson         ParseError = "Value below valid range";
59653289f6aSNate Lawson         Op->Asl.Value.Integer = LowValue;
59753289f6aSNate Lawson     }
59853289f6aSNate Lawson 
59953289f6aSNate Lawson     if (Op->Asl.Value.Integer > HighValue)
60053289f6aSNate Lawson     {
60153289f6aSNate Lawson         ParseError = "Value above valid range";
60253289f6aSNate Lawson         Op->Asl.Value.Integer = HighValue;
60353289f6aSNate Lawson     }
60453289f6aSNate Lawson 
60553289f6aSNate Lawson     if (ParseError)
60653289f6aSNate Lawson     {
60753289f6aSNate Lawson         sprintf (Buffer, "%s 0x%X-0x%X", ParseError, LowValue, HighValue);
60853289f6aSNate Lawson         AslCompilererror (Buffer);
60953289f6aSNate Lawson 
61053289f6aSNate Lawson         return NULL;
61153289f6aSNate Lawson     }
61253289f6aSNate Lawson 
61353289f6aSNate Lawson     return Op;
61453289f6aSNate Lawson }
61553289f6aSNate Lawson 
61653289f6aSNate Lawson 
61753289f6aSNate Lawson /*******************************************************************************
61853289f6aSNate Lawson  *
61953289f6aSNate Lawson  * FUNCTION:    UtGetStringBuffer
62053289f6aSNate Lawson  *
62153289f6aSNate Lawson  * PARAMETERS:  Length          - Size of buffer requested
62253289f6aSNate Lawson  *
62353289f6aSNate Lawson  * RETURN:      Pointer to the buffer.  Aborts on allocation failure
62453289f6aSNate Lawson  *
62553289f6aSNate Lawson  * DESCRIPTION: Allocate a string buffer.  Bypass the local
62653289f6aSNate Lawson  *              dynamic memory manager for performance reasons (This has a
62753289f6aSNate Lawson  *              major impact on the speed of the compiler.)
62853289f6aSNate Lawson  *
62953289f6aSNate Lawson  ******************************************************************************/
63053289f6aSNate Lawson 
63153289f6aSNate Lawson char *
63253289f6aSNate Lawson UtGetStringBuffer (
63353289f6aSNate Lawson     UINT32                  Length)
63453289f6aSNate Lawson {
63553289f6aSNate Lawson     char                    *Buffer;
63653289f6aSNate Lawson 
63753289f6aSNate Lawson 
63853289f6aSNate Lawson     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
63953289f6aSNate Lawson     {
64053289f6aSNate Lawson         Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length);
641fba7fc7eSJung-uk Kim         Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE +
642fba7fc7eSJung-uk Kim                                 Length;
64353289f6aSNate Lawson     }
64453289f6aSNate Lawson 
64553289f6aSNate Lawson     Buffer = Gbl_StringCacheNext;
64653289f6aSNate Lawson     Gbl_StringCacheNext += Length;
64753289f6aSNate Lawson 
64853289f6aSNate Lawson     return (Buffer);
64953289f6aSNate Lawson }
65053289f6aSNate Lawson 
65153289f6aSNate Lawson 
65253289f6aSNate Lawson /*******************************************************************************
65353289f6aSNate Lawson  *
65453289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
65553289f6aSNate Lawson  *
65653289f6aSNate Lawson  * PARAMETERS:  ExternalName            - Name to convert
65753289f6aSNate Lawson  *              ConvertedName           - Where the converted name is returned
65853289f6aSNate Lawson  *
65953289f6aSNate Lawson  * RETURN:      Status
66053289f6aSNate Lawson  *
66153289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
66253289f6aSNate Lawson  *
66353289f6aSNate Lawson  ******************************************************************************/
66453289f6aSNate Lawson 
66553289f6aSNate Lawson ACPI_STATUS
66653289f6aSNate Lawson UtInternalizeName (
66753289f6aSNate Lawson     char                    *ExternalName,
66853289f6aSNate Lawson     char                    **ConvertedName)
66953289f6aSNate Lawson {
67053289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
67153289f6aSNate Lawson     ACPI_STATUS             Status;
67253289f6aSNate Lawson 
67353289f6aSNate Lawson 
67453289f6aSNate Lawson     if (!ExternalName)
67553289f6aSNate Lawson     {
67653289f6aSNate Lawson         return (AE_OK);
67753289f6aSNate Lawson     }
67853289f6aSNate Lawson 
67953289f6aSNate Lawson     /* Get the length of the new internal name */
68053289f6aSNate Lawson 
68153289f6aSNate Lawson     Info.ExternalName = ExternalName;
68253289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
68353289f6aSNate Lawson 
68453289f6aSNate Lawson     /* We need a segment to store the internal  name */
68553289f6aSNate Lawson 
68653289f6aSNate Lawson     Info.InternalName = UtGetStringBuffer (Info.Length);
68753289f6aSNate Lawson     if (!Info.InternalName)
68853289f6aSNate Lawson     {
68953289f6aSNate Lawson         return (AE_NO_MEMORY);
69053289f6aSNate Lawson     }
69153289f6aSNate Lawson 
69253289f6aSNate Lawson     /* Build the name */
69353289f6aSNate Lawson 
69453289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
69553289f6aSNate Lawson     if (ACPI_FAILURE (Status))
69653289f6aSNate Lawson     {
69753289f6aSNate Lawson         return (Status);
69853289f6aSNate Lawson     }
69953289f6aSNate Lawson 
70053289f6aSNate Lawson     *ConvertedName = Info.InternalName;
70153289f6aSNate Lawson     return (AE_OK);
70253289f6aSNate Lawson }
70353289f6aSNate Lawson 
70453289f6aSNate Lawson 
70553289f6aSNate Lawson /*******************************************************************************
70653289f6aSNate Lawson  *
70753289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
70853289f6aSNate Lawson  *
70953289f6aSNate Lawson  * PARAMETERS:  NameSeg         - Input nameseg
71053289f6aSNate Lawson  *              PaddedNameSeg   - Output padded nameseg
71153289f6aSNate Lawson  *
71253289f6aSNate Lawson  * RETURN:      Padded nameseg.
71353289f6aSNate Lawson  *
71453289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
71553289f6aSNate Lawson  *              ACPI_NAME.
71653289f6aSNate Lawson  *
71753289f6aSNate Lawson  ******************************************************************************/
71853289f6aSNate Lawson 
719fba7fc7eSJung-uk Kim static void
72053289f6aSNate Lawson UtPadNameWithUnderscores (
72153289f6aSNate Lawson     char                    *NameSeg,
72253289f6aSNate Lawson     char                    *PaddedNameSeg)
72353289f6aSNate Lawson {
72453289f6aSNate Lawson     UINT32                  i;
72553289f6aSNate Lawson 
72653289f6aSNate Lawson 
72753289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
72853289f6aSNate Lawson     {
72953289f6aSNate Lawson         if (*NameSeg)
73053289f6aSNate Lawson         {
73153289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
73253289f6aSNate Lawson             NameSeg++;
73353289f6aSNate Lawson         }
73453289f6aSNate Lawson         else
73553289f6aSNate Lawson         {
73653289f6aSNate Lawson             *PaddedNameSeg = '_';
73753289f6aSNate Lawson         }
73853289f6aSNate Lawson         PaddedNameSeg++;
73953289f6aSNate Lawson     }
74053289f6aSNate Lawson }
74153289f6aSNate Lawson 
74253289f6aSNate Lawson 
74353289f6aSNate Lawson /*******************************************************************************
74453289f6aSNate Lawson  *
74553289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
74653289f6aSNate Lawson  *
74753289f6aSNate Lawson  * PARAMETERS:  Op              - Parent parse node
74853289f6aSNate Lawson  *              Name            - Full ExternalName
74953289f6aSNate Lawson  *
750fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
75153289f6aSNate Lawson  *
75253289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
75353289f6aSNate Lawson  *              in the NameSeg field of the Op.
75453289f6aSNate Lawson  *
75553289f6aSNate Lawson  ******************************************************************************/
75653289f6aSNate Lawson 
757fba7fc7eSJung-uk Kim static void
75853289f6aSNate Lawson UtAttachNameseg (
75953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
76053289f6aSNate Lawson     char                    *Name)
76153289f6aSNate Lawson {
76253289f6aSNate Lawson     char                    *NameSeg;
76353289f6aSNate Lawson     char                    PaddedNameSeg[4];
76453289f6aSNate Lawson 
76553289f6aSNate Lawson 
76653289f6aSNate Lawson     if (!Name)
76753289f6aSNate Lawson     {
76853289f6aSNate Lawson         return;
76953289f6aSNate Lawson     }
77053289f6aSNate Lawson 
77153289f6aSNate Lawson     /* Look for the last dot in the namepath */
77253289f6aSNate Lawson 
77353289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
77453289f6aSNate Lawson     if (NameSeg)
77553289f6aSNate Lawson     {
77653289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
77753289f6aSNate Lawson 
77853289f6aSNate Lawson         NameSeg++;
77953289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
78053289f6aSNate Lawson     }
78153289f6aSNate Lawson     else
78253289f6aSNate Lawson     {
78353289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
78453289f6aSNate Lawson         /* Handle prefixes */
78553289f6aSNate Lawson 
78653289f6aSNate Lawson         while ((*Name == '\\') || (*Name == '^'))
78753289f6aSNate Lawson         {
78853289f6aSNate Lawson             Name++;
78953289f6aSNate Lawson         }
79053289f6aSNate Lawson 
79153289f6aSNate Lawson         /* Remaing string should be one single nameseg */
79253289f6aSNate Lawson 
79353289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
79453289f6aSNate Lawson     }
79553289f6aSNate Lawson 
79653289f6aSNate Lawson     strncpy (Op->Asl.NameSeg, PaddedNameSeg, 4);
79753289f6aSNate Lawson }
79853289f6aSNate Lawson 
79953289f6aSNate Lawson 
80053289f6aSNate Lawson /*******************************************************************************
80153289f6aSNate Lawson  *
80253289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
80353289f6aSNate Lawson  *
80453289f6aSNate Lawson  * PARAMETERS:  Op            - Parent parse node
80553289f6aSNate Lawson  *              NameOp        - Node that contains the name
80653289f6aSNate Lawson  *
80753289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
80853289f6aSNate Lawson  *
80953289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node:  The original
81053289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
81153289f6aSNate Lawson  *              the ACPI namespace manager.
81253289f6aSNate Lawson  *
81353289f6aSNate Lawson  ******************************************************************************/
81453289f6aSNate Lawson 
81553289f6aSNate Lawson void
81653289f6aSNate Lawson UtAttachNamepathToOwner (
81753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
81853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
81953289f6aSNate Lawson {
82053289f6aSNate Lawson     ACPI_STATUS             Status;
82153289f6aSNate Lawson 
82253289f6aSNate Lawson 
82353289f6aSNate Lawson     /* Full external path */
82453289f6aSNate Lawson 
82553289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
82653289f6aSNate Lawson 
827fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
828fba7fc7eSJung-uk Kim 
829fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
830fba7fc7eSJung-uk Kim 
83153289f6aSNate Lawson     /* Last nameseg of the path */
83253289f6aSNate Lawson 
83353289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
83453289f6aSNate Lawson 
83553289f6aSNate Lawson     /* Create internalized path */
83653289f6aSNate Lawson 
83753289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
83853289f6aSNate Lawson     if (ACPI_FAILURE (Status))
83953289f6aSNate Lawson     {
84053289f6aSNate Lawson         /* TBD: abort on no memory */
84153289f6aSNate Lawson     }
84253289f6aSNate Lawson }
84353289f6aSNate Lawson 
84453289f6aSNate Lawson 
84553289f6aSNate Lawson /*******************************************************************************
84653289f6aSNate Lawson  *
84753289f6aSNate Lawson  * FUNCTION:    UtDoConstant
84853289f6aSNate Lawson  *
84953289f6aSNate Lawson  * PARAMETERS:  String      - Hex, Octal, or Decimal string
85053289f6aSNate Lawson  *
85153289f6aSNate Lawson  * RETURN:      Converted Integer
85253289f6aSNate Lawson  *
85353289f6aSNate Lawson  * DESCRIPTION: Convert a string to an integer.  With error checking.
85453289f6aSNate Lawson  *
85553289f6aSNate Lawson  ******************************************************************************/
85653289f6aSNate Lawson 
8579a179dd8SJung-uk Kim UINT64
85853289f6aSNate Lawson UtDoConstant (
85953289f6aSNate Lawson     char                    *String)
86053289f6aSNate Lawson {
86153289f6aSNate Lawson     ACPI_STATUS             Status;
8629a179dd8SJung-uk Kim     UINT64                  Converted;
86353289f6aSNate Lawson     char                    ErrBuf[64];
86453289f6aSNate Lawson 
86553289f6aSNate Lawson 
86653289f6aSNate Lawson     Status = UtStrtoul64 (String, 0, &Converted);
86753289f6aSNate Lawson     if (ACPI_FAILURE (Status))
86853289f6aSNate Lawson     {
869fba7fc7eSJung-uk Kim         sprintf (ErrBuf, "%s %s\n", "Conversion error:",
870fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
87153289f6aSNate Lawson         AslCompilererror (ErrBuf);
87253289f6aSNate Lawson     }
87353289f6aSNate Lawson 
87453289f6aSNate Lawson     return (Converted);
87553289f6aSNate Lawson }
87653289f6aSNate Lawson 
87753289f6aSNate Lawson 
878fba7fc7eSJung-uk Kim /* TBD: use version in ACPI CA main code base? */
879fba7fc7eSJung-uk Kim 
88053289f6aSNate Lawson /*******************************************************************************
88153289f6aSNate Lawson  *
88253289f6aSNate Lawson  * FUNCTION:    UtStrtoul64
88353289f6aSNate Lawson  *
88453289f6aSNate Lawson  * PARAMETERS:  String          - Null terminated string
885fba7fc7eSJung-uk Kim  *              Terminater      - Where a pointer to the terminating byte is
886fba7fc7eSJung-uk Kim  *                                returned
88753289f6aSNate Lawson  *              Base            - Radix of the string
88853289f6aSNate Lawson  *
88953289f6aSNate Lawson  * RETURN:      Converted value
89053289f6aSNate Lawson  *
89153289f6aSNate Lawson  * DESCRIPTION: Convert a string into an unsigned value.
89253289f6aSNate Lawson  *
89353289f6aSNate Lawson  ******************************************************************************/
89453289f6aSNate Lawson 
895d052a1ccSJung-uk Kim ACPI_STATUS
89653289f6aSNate Lawson UtStrtoul64 (
89753289f6aSNate Lawson     char                    *String,
89853289f6aSNate Lawson     UINT32                  Base,
8999a179dd8SJung-uk Kim     UINT64                  *RetInteger)
90053289f6aSNate Lawson {
90153289f6aSNate Lawson     UINT32                  Index;
90253289f6aSNate Lawson     UINT32                  Sign;
9039a179dd8SJung-uk Kim     UINT64                  ReturnValue = 0;
90453289f6aSNate Lawson     ACPI_STATUS             Status = AE_OK;
90553289f6aSNate Lawson 
90653289f6aSNate Lawson 
90753289f6aSNate Lawson     *RetInteger = 0;
90853289f6aSNate Lawson 
90953289f6aSNate Lawson     switch (Base)
91053289f6aSNate Lawson     {
91153289f6aSNate Lawson     case 0:
91253289f6aSNate Lawson     case 8:
91353289f6aSNate Lawson     case 10:
91453289f6aSNate Lawson     case 16:
91553289f6aSNate Lawson         break;
91653289f6aSNate Lawson 
91753289f6aSNate Lawson     default:
91853289f6aSNate Lawson         /*
91953289f6aSNate Lawson          * The specified Base parameter is not in the domain of
92053289f6aSNate Lawson          * this function:
92153289f6aSNate Lawson          */
92253289f6aSNate Lawson         return (AE_BAD_PARAMETER);
92353289f6aSNate Lawson     }
92453289f6aSNate Lawson 
925fba7fc7eSJung-uk Kim     /* Skip over any white space in the buffer: */
926fba7fc7eSJung-uk Kim 
9279a179dd8SJung-uk Kim     while (isspace ((int) *String) || *String == '\t')
92853289f6aSNate Lawson     {
92953289f6aSNate Lawson         ++String;
93053289f6aSNate Lawson     }
93153289f6aSNate Lawson 
93253289f6aSNate Lawson     /*
93353289f6aSNate Lawson      * The buffer may contain an optional plus or minus sign.
93453289f6aSNate Lawson      * If it does, then skip over it but remember what is was:
93553289f6aSNate Lawson      */
93653289f6aSNate Lawson     if (*String == '-')
93753289f6aSNate Lawson     {
93853289f6aSNate Lawson         Sign = NEGATIVE;
93953289f6aSNate Lawson         ++String;
94053289f6aSNate Lawson     }
94153289f6aSNate Lawson     else if (*String == '+')
94253289f6aSNate Lawson     {
94353289f6aSNate Lawson         ++String;
94453289f6aSNate Lawson         Sign = POSITIVE;
94553289f6aSNate Lawson     }
94653289f6aSNate Lawson     else
94753289f6aSNate Lawson     {
94853289f6aSNate Lawson         Sign = POSITIVE;
94953289f6aSNate Lawson     }
95053289f6aSNate Lawson 
95153289f6aSNate Lawson     /*
95253289f6aSNate Lawson      * If the input parameter Base is zero, then we need to
95353289f6aSNate Lawson      * determine if it is octal, decimal, or hexadecimal:
95453289f6aSNate Lawson      */
95553289f6aSNate Lawson     if (Base == 0)
95653289f6aSNate Lawson     {
95753289f6aSNate Lawson         if (*String == '0')
95853289f6aSNate Lawson         {
9599a179dd8SJung-uk Kim             if (tolower ((int) *(++String)) == 'x')
96053289f6aSNate Lawson             {
96153289f6aSNate Lawson                 Base = 16;
96253289f6aSNate Lawson                 ++String;
96353289f6aSNate Lawson             }
96453289f6aSNate Lawson             else
96553289f6aSNate Lawson             {
96653289f6aSNate Lawson                 Base = 8;
96753289f6aSNate Lawson             }
96853289f6aSNate Lawson         }
96953289f6aSNate Lawson         else
97053289f6aSNate Lawson         {
97153289f6aSNate Lawson             Base = 10;
97253289f6aSNate Lawson         }
97353289f6aSNate Lawson     }
97453289f6aSNate Lawson 
97553289f6aSNate Lawson     /*
97653289f6aSNate Lawson      * For octal and hexadecimal bases, skip over the leading
97753289f6aSNate Lawson      * 0 or 0x, if they are present.
97853289f6aSNate Lawson      */
97953289f6aSNate Lawson     if (Base == 8 && *String == '0')
98053289f6aSNate Lawson     {
98153289f6aSNate Lawson         String++;
98253289f6aSNate Lawson     }
98353289f6aSNate Lawson 
98453289f6aSNate Lawson     if (Base == 16 &&
98553289f6aSNate Lawson         *String == '0' &&
9869a179dd8SJung-uk Kim         tolower ((int) *(++String)) == 'x')
98753289f6aSNate Lawson     {
98853289f6aSNate Lawson         String++;
98953289f6aSNate Lawson     }
99053289f6aSNate Lawson 
99153289f6aSNate Lawson     /* Main loop: convert the string to an unsigned long */
99253289f6aSNate Lawson 
99353289f6aSNate Lawson     while (*String)
99453289f6aSNate Lawson     {
9959a179dd8SJung-uk Kim         if (isdigit ((int) *String))
99653289f6aSNate Lawson         {
99753289f6aSNate Lawson             Index = ((UINT8) *String) - '0';
99853289f6aSNate Lawson         }
99953289f6aSNate Lawson         else
100053289f6aSNate Lawson         {
10019a179dd8SJung-uk Kim             Index = (UINT8) toupper ((int) *String);
10029a179dd8SJung-uk Kim             if (isupper ((int) Index))
100353289f6aSNate Lawson             {
100453289f6aSNate Lawson                 Index = Index - 'A' + 10;
100553289f6aSNate Lawson             }
100653289f6aSNate Lawson             else
100753289f6aSNate Lawson             {
100853289f6aSNate Lawson                 goto ErrorExit;
100953289f6aSNate Lawson             }
101053289f6aSNate Lawson         }
101153289f6aSNate Lawson 
101253289f6aSNate Lawson         if (Index >= Base)
101353289f6aSNate Lawson         {
101453289f6aSNate Lawson             goto ErrorExit;
101553289f6aSNate Lawson         }
101653289f6aSNate Lawson 
101753289f6aSNate Lawson         /* Check to see if value is out of range: */
101853289f6aSNate Lawson 
10199a179dd8SJung-uk Kim         if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) /
10209a179dd8SJung-uk Kim                             (UINT64) Base))
102153289f6aSNate Lawson         {
102253289f6aSNate Lawson             goto ErrorExit;
102353289f6aSNate Lawson         }
102453289f6aSNate Lawson         else
102553289f6aSNate Lawson         {
102653289f6aSNate Lawson             ReturnValue *= Base;
102753289f6aSNate Lawson             ReturnValue += Index;
102853289f6aSNate Lawson         }
102953289f6aSNate Lawson 
103053289f6aSNate Lawson         ++String;
103153289f6aSNate Lawson     }
103253289f6aSNate Lawson 
103353289f6aSNate Lawson 
1034fba7fc7eSJung-uk Kim     /* If a minus sign was present, then "the conversion is negated": */
1035fba7fc7eSJung-uk Kim 
103653289f6aSNate Lawson     if (Sign == NEGATIVE)
103753289f6aSNate Lawson     {
103853289f6aSNate Lawson         ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
103953289f6aSNate Lawson     }
104053289f6aSNate Lawson 
104153289f6aSNate Lawson     *RetInteger = ReturnValue;
104253289f6aSNate Lawson     return (Status);
104353289f6aSNate Lawson 
104453289f6aSNate Lawson 
104553289f6aSNate Lawson ErrorExit:
104653289f6aSNate Lawson     switch (Base)
104753289f6aSNate Lawson     {
104853289f6aSNate Lawson     case 8:
104953289f6aSNate Lawson         Status = AE_BAD_OCTAL_CONSTANT;
105053289f6aSNate Lawson         break;
105153289f6aSNate Lawson 
105253289f6aSNate Lawson     case 10:
105353289f6aSNate Lawson         Status = AE_BAD_DECIMAL_CONSTANT;
105453289f6aSNate Lawson         break;
105553289f6aSNate Lawson 
105653289f6aSNate Lawson     case 16:
105753289f6aSNate Lawson         Status = AE_BAD_HEX_CONSTANT;
105853289f6aSNate Lawson         break;
105953289f6aSNate Lawson 
106053289f6aSNate Lawson     default:
106153289f6aSNate Lawson         /* Base validated above */
106253289f6aSNate Lawson         break;
106353289f6aSNate Lawson     }
106453289f6aSNate Lawson 
106553289f6aSNate Lawson     return (Status);
106653289f6aSNate Lawson }
106753289f6aSNate Lawson 
106853289f6aSNate Lawson 
1069