xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision f38b0f210c6bea0082638e94935c778fa5c5079f)
153289f6aSNate Lawson 
253289f6aSNate Lawson /******************************************************************************
353289f6aSNate Lawson  *
453289f6aSNate Lawson  * Module Name: aslutils -- compiler utilities
553289f6aSNate Lawson  *
653289f6aSNate Lawson  *****************************************************************************/
753289f6aSNate Lawson 
8d244b227SJung-uk Kim /*
9ec3fc72fSJung-uk Kim  * Copyright (C) 2000 - 2012, 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 
563f0275a0SJung-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 
623f0275a0SJung-uk Kim /* Table below must match ASL_FILE_TYPES in asltypes.h */
633f0275a0SJung-uk Kim 
643f0275a0SJung-uk Kim static const char       *AslFileTypeNames [ASL_NUM_FILES] =
653f0275a0SJung-uk Kim {
663f0275a0SJung-uk Kim     "stdout:       ",
673f0275a0SJung-uk Kim     "stderr:       ",
683f0275a0SJung-uk Kim     "Table Input:  ",
693f0275a0SJung-uk Kim     "Binary Output:",
703f0275a0SJung-uk Kim     "Source Output:",
714c52cad2SJung-uk Kim     "Preprocessor: ",
723f0275a0SJung-uk Kim     "Listing File: ",
733f0275a0SJung-uk Kim     "Hex Dump:     ",
743f0275a0SJung-uk Kim     "Namespace:    ",
753f0275a0SJung-uk Kim     "Debug File:   ",
763f0275a0SJung-uk Kim     "ASM Source:   ",
773f0275a0SJung-uk Kim     "C Source:     ",
783f0275a0SJung-uk Kim     "ASM Include:  ",
793f0275a0SJung-uk Kim     "C Include:    "
803f0275a0SJung-uk Kim };
813f0275a0SJung-uk Kim 
82a9f12690SJung-uk Kim 
83fba7fc7eSJung-uk Kim /* Local prototypes */
8453289f6aSNate Lawson 
85fba7fc7eSJung-uk Kim static void
86fba7fc7eSJung-uk Kim UtPadNameWithUnderscores (
87fba7fc7eSJung-uk Kim     char                    *NameSeg,
88fba7fc7eSJung-uk Kim     char                    *PaddedNameSeg);
89fba7fc7eSJung-uk Kim 
90fba7fc7eSJung-uk Kim static void
91fba7fc7eSJung-uk Kim UtAttachNameseg (
92fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
93fba7fc7eSJung-uk Kim     char                    *Name);
9453289f6aSNate Lawson 
9553289f6aSNate Lawson 
9653289f6aSNate Lawson /*******************************************************************************
9753289f6aSNate Lawson  *
98a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
99a88e22b7SJung-uk Kim  *
100a88e22b7SJung-uk Kim  * PARAMETERS:  None
101a88e22b7SJung-uk Kim  *
102a88e22b7SJung-uk Kim  * RETURN:      None
103a88e22b7SJung-uk Kim  *
104a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
105a88e22b7SJung-uk Kim  *
106a88e22b7SJung-uk Kim  ******************************************************************************/
107a88e22b7SJung-uk Kim 
108a88e22b7SJung-uk Kim void
109a88e22b7SJung-uk Kim UtDisplaySupportedTables (
110a88e22b7SJung-uk Kim     void)
111a88e22b7SJung-uk Kim {
112a88e22b7SJung-uk Kim     ACPI_DMTABLE_DATA       *TableData;
113a88e22b7SJung-uk Kim     UINT32                  i = 6;
114a88e22b7SJung-uk Kim 
115a88e22b7SJung-uk Kim 
116a88e22b7SJung-uk Kim     printf ("\nACPI tables supported by iASL subsystems in "
117a88e22b7SJung-uk Kim         "version %8.8X:\n"
118a88e22b7SJung-uk Kim         "  ASL and Data Table compilers\n"
119a88e22b7SJung-uk Kim         "  AML and Data Table disassemblers\n"
120a88e22b7SJung-uk Kim         "  ACPI table template generator\n\n", ACPI_CA_VERSION);
121a88e22b7SJung-uk Kim 
122a88e22b7SJung-uk Kim     /* Special tables */
123a88e22b7SJung-uk Kim 
124a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 1, ACPI_SIG_DSDT, "Differentiated System Description Table");
125a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 2, ACPI_SIG_SSDT, "Secondary System Description Table");
126a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 3, ACPI_SIG_FADT, "Fixed ACPI Description Table (FADT)");
127a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 4, ACPI_SIG_FACS, "Firmware ACPI Control Structure");
128a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 5, ACPI_RSDP_NAME, "Root System Description Pointer");
129a88e22b7SJung-uk Kim 
130a88e22b7SJung-uk Kim     /* All data tables with common table header */
131a88e22b7SJung-uk Kim 
132a88e22b7SJung-uk Kim     for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
133a88e22b7SJung-uk Kim     {
134a88e22b7SJung-uk Kim         printf ("%8u) %s    %s\n", i, TableData->Signature, TableData->Name);
135a88e22b7SJung-uk Kim         i++;
136a88e22b7SJung-uk Kim     }
137a88e22b7SJung-uk Kim }
138a88e22b7SJung-uk Kim 
139a88e22b7SJung-uk Kim 
140a88e22b7SJung-uk Kim /*******************************************************************************
141a88e22b7SJung-uk Kim  *
142*f38b0f21SJung-uk Kim  * FUNCTION:    UtDisplayConstantOpcodes
14353289f6aSNate Lawson  *
14453289f6aSNate Lawson  * PARAMETERS:  None
14553289f6aSNate Lawson  *
14653289f6aSNate Lawson  * RETURN:      None
14753289f6aSNate Lawson  *
14853289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
14953289f6aSNate Lawson  *
15053289f6aSNate Lawson  ******************************************************************************/
15153289f6aSNate Lawson 
15253289f6aSNate Lawson void
15353289f6aSNate Lawson UtDisplayConstantOpcodes (
15453289f6aSNate Lawson     void)
15553289f6aSNate Lawson {
15653289f6aSNate Lawson     UINT32                  i;
15753289f6aSNate Lawson 
158fba7fc7eSJung-uk Kim 
15953289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
16053289f6aSNate Lawson 
16153289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
16253289f6aSNate Lawson     {
16353289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
16453289f6aSNate Lawson         {
16553289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
16653289f6aSNate Lawson         }
16753289f6aSNate Lawson     }
16853289f6aSNate Lawson }
16953289f6aSNate Lawson 
17053289f6aSNate Lawson 
17153289f6aSNate Lawson /*******************************************************************************
17253289f6aSNate Lawson  *
17353289f6aSNate Lawson  * FUNCTION:    UtLocalCalloc
17453289f6aSNate Lawson  *
17553289f6aSNate Lawson  * PARAMETERS:  Size                - Bytes to be allocated
17653289f6aSNate Lawson  *
17753289f6aSNate Lawson  * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
17853289f6aSNate Lawson  *
17953289f6aSNate Lawson  * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
18053289f6aSNate Lawson  *              allocation failure, on the assumption that nothing more can be
18153289f6aSNate Lawson  *              accomplished.
18253289f6aSNate Lawson  *
18353289f6aSNate Lawson  ******************************************************************************/
18453289f6aSNate Lawson 
18553289f6aSNate Lawson void *
18653289f6aSNate Lawson UtLocalCalloc (
18753289f6aSNate Lawson     UINT32                  Size)
18853289f6aSNate Lawson {
18953289f6aSNate Lawson     void                    *Allocated;
19053289f6aSNate Lawson 
19153289f6aSNate Lawson 
1921a39cfb0SJung-uk Kim     Allocated = ACPI_ALLOCATE_ZEROED (Size);
19353289f6aSNate Lawson     if (!Allocated)
19453289f6aSNate Lawson     {
19553289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
19653289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
19753289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
19853289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
199a88e22b7SJung-uk Kim 
200a88e22b7SJung-uk Kim         CmCleanupAndExit ();
20153289f6aSNate Lawson         exit (1);
20253289f6aSNate Lawson     }
20353289f6aSNate Lawson 
20453289f6aSNate Lawson     TotalAllocations++;
20553289f6aSNate Lawson     TotalAllocated += Size;
2061a39cfb0SJung-uk Kim     return (Allocated);
20753289f6aSNate Lawson }
20853289f6aSNate Lawson 
20953289f6aSNate Lawson 
21053289f6aSNate Lawson /*******************************************************************************
21153289f6aSNate Lawson  *
21253289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
21353289f6aSNate Lawson  *
214fba7fc7eSJung-uk Kim  * PARAMETERS:  Name                - Ascii name of this event
21553289f6aSNate Lawson  *
216*f38b0f21SJung-uk Kim  * RETURN:      Event number (integer index)
21753289f6aSNate Lawson  *
21853289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
21953289f6aSNate Lawson  *
22053289f6aSNate Lawson  ******************************************************************************/
22153289f6aSNate Lawson 
222fba7fc7eSJung-uk Kim UINT8
22353289f6aSNate Lawson UtBeginEvent (
22453289f6aSNate Lawson     char                    *Name)
22553289f6aSNate Lawson {
22653289f6aSNate Lawson 
227fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
228fba7fc7eSJung-uk Kim     {
229fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
230fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
231fba7fc7eSJung-uk Kim     }
232fba7fc7eSJung-uk Kim 
233fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
234fba7fc7eSJung-uk Kim 
235fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
236fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
237fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
238fba7fc7eSJung-uk Kim 
239fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
24053289f6aSNate Lawson }
24153289f6aSNate Lawson 
24253289f6aSNate Lawson 
24353289f6aSNate Lawson /*******************************************************************************
24453289f6aSNate Lawson  *
24553289f6aSNate Lawson  * FUNCTION:    UtEndEvent
24653289f6aSNate Lawson  *
24753289f6aSNate Lawson  * PARAMETERS:  Event               - Event number (integer index)
24853289f6aSNate Lawson  *
24953289f6aSNate Lawson  * RETURN:      None
25053289f6aSNate Lawson  *
25153289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
25253289f6aSNate Lawson  *
25353289f6aSNate Lawson  ******************************************************************************/
25453289f6aSNate Lawson 
25553289f6aSNate Lawson void
25653289f6aSNate Lawson UtEndEvent (
257fba7fc7eSJung-uk Kim     UINT8                   Event)
25853289f6aSNate Lawson {
25953289f6aSNate Lawson 
260fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
261fba7fc7eSJung-uk Kim     {
262fba7fc7eSJung-uk Kim         return;
263fba7fc7eSJung-uk Kim     }
264fba7fc7eSJung-uk Kim 
265fba7fc7eSJung-uk Kim     /* Insert end time for event */
266fba7fc7eSJung-uk Kim 
267fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
26853289f6aSNate Lawson }
26953289f6aSNate Lawson 
27053289f6aSNate Lawson 
27153289f6aSNate Lawson /*******************************************************************************
27253289f6aSNate Lawson  *
27353289f6aSNate Lawson  * FUNCTION:    UtHexCharToValue
27453289f6aSNate Lawson  *
275fba7fc7eSJung-uk Kim  * PARAMETERS:  HexChar             - Hex character in Ascii
27653289f6aSNate Lawson  *
27753289f6aSNate Lawson  * RETURN:      The binary value of the hex character
27853289f6aSNate Lawson  *
27953289f6aSNate Lawson  * DESCRIPTION: Perform ascii-to-hex translation
28053289f6aSNate Lawson  *
28153289f6aSNate Lawson  ******************************************************************************/
28253289f6aSNate Lawson 
28353289f6aSNate Lawson UINT8
28453289f6aSNate Lawson UtHexCharToValue (
285fba7fc7eSJung-uk Kim     int                     HexChar)
28653289f6aSNate Lawson {
28753289f6aSNate Lawson 
288fba7fc7eSJung-uk Kim     if (HexChar <= 0x39)
28953289f6aSNate Lawson     {
290fba7fc7eSJung-uk Kim         return ((UINT8) (HexChar - 0x30));
29153289f6aSNate Lawson     }
29253289f6aSNate Lawson 
293fba7fc7eSJung-uk Kim     if (HexChar <= 0x46)
29453289f6aSNate Lawson     {
295fba7fc7eSJung-uk Kim         return ((UINT8) (HexChar - 0x37));
29653289f6aSNate Lawson     }
29753289f6aSNate Lawson 
298fba7fc7eSJung-uk Kim     return ((UINT8) (HexChar - 0x57));
29953289f6aSNate Lawson }
30053289f6aSNate Lawson 
30153289f6aSNate Lawson 
30253289f6aSNate Lawson /*******************************************************************************
30353289f6aSNate Lawson  *
30453289f6aSNate Lawson  * FUNCTION:    UtConvertByteToHex
30553289f6aSNate Lawson  *
30653289f6aSNate Lawson  * PARAMETERS:  RawByte             - Binary data
307*f38b0f21SJung-uk Kim  *              Buffer              - Pointer to where the hex bytes will be
308*f38b0f21SJung-uk Kim  *                                    stored
30953289f6aSNate Lawson  *
31053289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
31153289f6aSNate Lawson  *
31253289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
31353289f6aSNate Lawson  *              with "0x"
31453289f6aSNate Lawson  *
31553289f6aSNate Lawson  ******************************************************************************/
31653289f6aSNate Lawson 
31753289f6aSNate Lawson void
31853289f6aSNate Lawson UtConvertByteToHex (
31953289f6aSNate Lawson     UINT8                   RawByte,
32053289f6aSNate Lawson     UINT8                   *Buffer)
32153289f6aSNate Lawson {
32253289f6aSNate Lawson 
32353289f6aSNate Lawson     Buffer[0] = '0';
32453289f6aSNate Lawson     Buffer[1] = 'x';
32553289f6aSNate Lawson 
326d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
327d244b227SJung-uk Kim     Buffer[3] = (UINT8) AslHexLookup[RawByte & 0xF];
32853289f6aSNate Lawson }
32953289f6aSNate Lawson 
33053289f6aSNate Lawson 
33153289f6aSNate Lawson /*******************************************************************************
33253289f6aSNate Lawson  *
33353289f6aSNate Lawson  * FUNCTION:    UtConvertByteToAsmHex
33453289f6aSNate Lawson  *
33553289f6aSNate Lawson  * PARAMETERS:  RawByte             - Binary data
336*f38b0f21SJung-uk Kim  *              Buffer              - Pointer to where the hex bytes will be
337*f38b0f21SJung-uk Kim  *                                    stored
33853289f6aSNate Lawson  *
33953289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
34053289f6aSNate Lawson  *
34153289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
34253289f6aSNate Lawson  *              with "0x"
34353289f6aSNate Lawson  *
34453289f6aSNate Lawson  ******************************************************************************/
34553289f6aSNate Lawson 
34653289f6aSNate Lawson void
34753289f6aSNate Lawson UtConvertByteToAsmHex (
34853289f6aSNate Lawson     UINT8                   RawByte,
34953289f6aSNate Lawson     UINT8                   *Buffer)
35053289f6aSNate Lawson {
35153289f6aSNate Lawson 
35253289f6aSNate Lawson     Buffer[0] = '0';
353d244b227SJung-uk Kim     Buffer[1] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
354d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[RawByte & 0xF];
35553289f6aSNate Lawson     Buffer[3] = 'h';
35653289f6aSNate Lawson }
35753289f6aSNate Lawson 
35853289f6aSNate Lawson 
35953289f6aSNate Lawson /*******************************************************************************
36053289f6aSNate Lawson  *
36153289f6aSNate Lawson  * FUNCTION:    DbgPrint
36253289f6aSNate Lawson  *
363fba7fc7eSJung-uk Kim  * PARAMETERS:  Type                - Type of output
364fba7fc7eSJung-uk Kim  *              Fmt                 - Printf format string
36553289f6aSNate Lawson  *              ...                 - variable printf list
36653289f6aSNate Lawson  *
36753289f6aSNate Lawson  * RETURN:      None
36853289f6aSNate Lawson  *
36953289f6aSNate Lawson  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
37053289f6aSNate Lawson  *              debug flag is set.
37153289f6aSNate Lawson  *
37253289f6aSNate Lawson  ******************************************************************************/
37353289f6aSNate Lawson 
37453289f6aSNate Lawson void
37553289f6aSNate Lawson DbgPrint (
37653289f6aSNate Lawson     UINT32                  Type,
37753289f6aSNate Lawson     char                    *Fmt,
37853289f6aSNate Lawson     ...)
37953289f6aSNate Lawson {
38053289f6aSNate Lawson     va_list                 Args;
38153289f6aSNate Lawson 
38253289f6aSNate Lawson 
38353289f6aSNate Lawson     va_start (Args, Fmt);
38453289f6aSNate Lawson 
38553289f6aSNate Lawson     if (!Gbl_DebugFlag)
38653289f6aSNate Lawson     {
38753289f6aSNate Lawson         return;
38853289f6aSNate Lawson     }
38953289f6aSNate Lawson 
39053289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
39153289f6aSNate Lawson         (!(AslCompilerdebug)))
39253289f6aSNate Lawson     {
39353289f6aSNate Lawson         return;
39453289f6aSNate Lawson     }
39553289f6aSNate Lawson 
39653289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
39753289f6aSNate Lawson     va_end (Args);
39853289f6aSNate Lawson     return;
39953289f6aSNate Lawson }
40053289f6aSNate Lawson 
40153289f6aSNate Lawson 
40253289f6aSNate Lawson /*******************************************************************************
40353289f6aSNate Lawson  *
40453289f6aSNate Lawson  * FUNCTION:    UtPrintFormattedName
40553289f6aSNate Lawson  *
40653289f6aSNate Lawson  * PARAMETERS:  ParseOpcode         - Parser keyword ID
40753289f6aSNate Lawson  *              Level               - Indentation level
40853289f6aSNate Lawson  *
40953289f6aSNate Lawson  * RETURN:      None
41053289f6aSNate Lawson  *
41153289f6aSNate Lawson  * DESCRIPTION: Print the ascii name of the parse opcode.
41253289f6aSNate Lawson  *
41353289f6aSNate Lawson  ******************************************************************************/
41453289f6aSNate Lawson 
41553289f6aSNate Lawson #define TEXT_OFFSET 10
41653289f6aSNate Lawson 
41753289f6aSNate Lawson void
41853289f6aSNate Lawson UtPrintFormattedName (
41953289f6aSNate Lawson     UINT16                  ParseOpcode,
42053289f6aSNate Lawson     UINT32                  Level)
42153289f6aSNate Lawson {
42253289f6aSNate Lawson 
4231a39cfb0SJung-uk Kim     if (Level)
4241a39cfb0SJung-uk Kim     {
42553289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
4261a39cfb0SJung-uk Kim             "%*s", (3 * Level), " ");
4271a39cfb0SJung-uk Kim     }
4281a39cfb0SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT,
4291a39cfb0SJung-uk Kim         " %-20.20s", UtGetOpName (ParseOpcode));
43053289f6aSNate Lawson 
43153289f6aSNate Lawson     if (Level < TEXT_OFFSET)
43253289f6aSNate Lawson     {
43353289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
43453289f6aSNate Lawson             "%*s", (TEXT_OFFSET - Level) * 3, " ");
43553289f6aSNate Lawson     }
43653289f6aSNate Lawson }
43753289f6aSNate Lawson 
43853289f6aSNate Lawson 
43953289f6aSNate Lawson /*******************************************************************************
44053289f6aSNate Lawson  *
44153289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
44253289f6aSNate Lawson  *
443*f38b0f21SJung-uk Kim  * PARAMETERS:  Op                  - Parse op to be named.
44453289f6aSNate Lawson  *
44553289f6aSNate Lawson  * RETURN:      None
44653289f6aSNate Lawson  *
44753289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
44853289f6aSNate Lawson  *
44953289f6aSNate Lawson  ******************************************************************************/
45053289f6aSNate Lawson 
45153289f6aSNate Lawson void
45253289f6aSNate Lawson UtSetParseOpName (
45353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
45453289f6aSNate Lawson {
455fba7fc7eSJung-uk Kim 
4561a39cfb0SJung-uk Kim     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
4571a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
45853289f6aSNate Lawson }
45953289f6aSNate Lawson 
46053289f6aSNate Lawson 
46153289f6aSNate Lawson /*******************************************************************************
46253289f6aSNate Lawson  *
46353289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
46453289f6aSNate Lawson  *
465fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
46653289f6aSNate Lawson  *
46753289f6aSNate Lawson  * RETURN:      None
46853289f6aSNate Lawson  *
46953289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
47053289f6aSNate Lawson  *
47153289f6aSNate Lawson  ******************************************************************************/
47253289f6aSNate Lawson 
47353289f6aSNate Lawson void
47453289f6aSNate Lawson UtDisplaySummary (
47553289f6aSNate Lawson     UINT32                  FileId)
47653289f6aSNate Lawson {
4773f0275a0SJung-uk Kim     UINT32                  i;
4783f0275a0SJung-uk Kim 
47953289f6aSNate Lawson 
48053289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
48153289f6aSNate Lawson     {
48253289f6aSNate Lawson         /* Compiler name and version number */
48353289f6aSNate Lawson 
4843f0275a0SJung-uk Kim         FlPrintFile (FileId, "%s version %X%s\n\n",
4853c1812acSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH);
48653289f6aSNate Lawson     }
48753289f6aSNate Lawson 
4883f0275a0SJung-uk Kim     /* Summary of main input and output files */
4893f0275a0SJung-uk Kim 
490a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
491a88e22b7SJung-uk Kim     {
492a88e22b7SJung-uk Kim         FlPrintFile (FileId,
4933f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u fields\n",
4943f0275a0SJung-uk Kim             "Table Input:",
495a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
496a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
497a88e22b7SJung-uk Kim 
498a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
499a88e22b7SJung-uk Kim         {
500a88e22b7SJung-uk Kim             FlPrintFile (FileId,
5013f0275a0SJung-uk Kim                 "%-14s %s - %u bytes\n",
5023f0275a0SJung-uk Kim                 "Binary Output:",
503a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
504a88e22b7SJung-uk Kim         }
505a88e22b7SJung-uk Kim     }
506a88e22b7SJung-uk Kim     else
507a88e22b7SJung-uk Kim     {
50853289f6aSNate Lawson         FlPrintFile (FileId,
5093f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u keywords\n",
5103f0275a0SJung-uk Kim             "ASL Input:",
51153289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
51253289f6aSNate Lawson             Gbl_InputByteCount, TotalKeywords);
51353289f6aSNate Lawson 
51453289f6aSNate Lawson         /* AML summary */
51553289f6aSNate Lawson 
51653289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
51753289f6aSNate Lawson         {
51853289f6aSNate Lawson             FlPrintFile (FileId,
5193f0275a0SJung-uk Kim                 "%-14s %s - %u bytes, %u named objects, %u executable opcodes\n",
5203f0275a0SJung-uk Kim                 "AML Output:",
52153289f6aSNate Lawson                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,
52253289f6aSNate Lawson                 TotalNamedObjects, TotalExecutableOpcodes);
52353289f6aSNate Lawson         }
524a88e22b7SJung-uk Kim     }
52553289f6aSNate Lawson 
5263f0275a0SJung-uk Kim     /* Display summary of any optional files */
5273f0275a0SJung-uk Kim 
5283f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
5293f0275a0SJung-uk Kim     {
5303f0275a0SJung-uk Kim         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
5313f0275a0SJung-uk Kim         {
5323f0275a0SJung-uk Kim             continue;
5333f0275a0SJung-uk Kim         }
5343f0275a0SJung-uk Kim 
5353f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
5363f0275a0SJung-uk Kim 
5373f0275a0SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
5383f0275a0SJung-uk Kim         {
5393f0275a0SJung-uk Kim             continue;
5403f0275a0SJung-uk Kim         }
5413f0275a0SJung-uk Kim 
5424c52cad2SJung-uk Kim         /* .I is a temp file unless specifically requested */
5434c52cad2SJung-uk Kim 
5444c52cad2SJung-uk Kim         if ((i == ASL_FILE_PREPROCESSOR) && (!Gbl_PreprocessorOutputFlag))
5454c52cad2SJung-uk Kim         {
5464c52cad2SJung-uk Kim             continue;
5474c52cad2SJung-uk Kim         }
5484c52cad2SJung-uk Kim 
5493f0275a0SJung-uk Kim         FlPrintFile (FileId, "%14s %s - %u bytes\n",
5503f0275a0SJung-uk Kim             AslFileTypeNames [i],
5513f0275a0SJung-uk Kim             Gbl_Files[i].Filename, FlGetFileSize (i));
5523f0275a0SJung-uk Kim     }
5533f0275a0SJung-uk Kim 
55453289f6aSNate Lawson     /* Error summary */
55553289f6aSNate Lawson 
55653289f6aSNate Lawson     FlPrintFile (FileId,
5573f0275a0SJung-uk Kim         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
55853289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
5591a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
5601a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
5611a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
562a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
563a88e22b7SJung-uk Kim 
564a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
565a88e22b7SJung-uk Kim     {
566a88e22b7SJung-uk Kim         FlPrintFile (FileId,
567a88e22b7SJung-uk Kim             ", %u Optimizations", Gbl_ExceptionCount[ASL_OPTIMIZATION]);
568a88e22b7SJung-uk Kim     }
569a88e22b7SJung-uk Kim 
570a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
57153289f6aSNate Lawson }
57253289f6aSNate Lawson 
57353289f6aSNate Lawson 
57453289f6aSNate Lawson /*******************************************************************************
57553289f6aSNate Lawson  *
576*f38b0f21SJung-uk Kim  * FUNCTION:    UtCheckIntegerRange
57753289f6aSNate Lawson  *
57853289f6aSNate Lawson  * PARAMETERS:  Op                  - Integer parse node
57953289f6aSNate Lawson  *              LowValue            - Smallest allowed value
58053289f6aSNate Lawson  *              HighValue           - Largest allowed value
58153289f6aSNate Lawson  *
58253289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
58353289f6aSNate Lawson  *
58453289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
58553289f6aSNate Lawson  *
58653289f6aSNate Lawson  ******************************************************************************/
58753289f6aSNate Lawson 
58853289f6aSNate Lawson ACPI_PARSE_OBJECT *
58953289f6aSNate Lawson UtCheckIntegerRange (
59053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
59153289f6aSNate Lawson     UINT32                  LowValue,
59253289f6aSNate Lawson     UINT32                  HighValue)
59353289f6aSNate Lawson {
59453289f6aSNate Lawson     char                    *ParseError = NULL;
59553289f6aSNate Lawson     char                    Buffer[64];
59653289f6aSNate Lawson 
59753289f6aSNate Lawson 
59853289f6aSNate Lawson     if (!Op)
59953289f6aSNate Lawson     {
60053289f6aSNate Lawson         return NULL;
60153289f6aSNate Lawson     }
60253289f6aSNate Lawson 
60353289f6aSNate Lawson     if (Op->Asl.Value.Integer < LowValue)
60453289f6aSNate Lawson     {
60553289f6aSNate Lawson         ParseError = "Value below valid range";
60653289f6aSNate Lawson         Op->Asl.Value.Integer = LowValue;
60753289f6aSNate Lawson     }
60853289f6aSNate Lawson 
60953289f6aSNate Lawson     if (Op->Asl.Value.Integer > HighValue)
61053289f6aSNate Lawson     {
61153289f6aSNate Lawson         ParseError = "Value above valid range";
61253289f6aSNate Lawson         Op->Asl.Value.Integer = HighValue;
61353289f6aSNate Lawson     }
61453289f6aSNate Lawson 
61553289f6aSNate Lawson     if (ParseError)
61653289f6aSNate Lawson     {
61753289f6aSNate Lawson         sprintf (Buffer, "%s 0x%X-0x%X", ParseError, LowValue, HighValue);
61853289f6aSNate Lawson         AslCompilererror (Buffer);
61953289f6aSNate Lawson 
62053289f6aSNate Lawson         return NULL;
62153289f6aSNate Lawson     }
62253289f6aSNate Lawson 
62353289f6aSNate Lawson     return Op;
62453289f6aSNate Lawson }
62553289f6aSNate Lawson 
62653289f6aSNate Lawson 
62753289f6aSNate Lawson /*******************************************************************************
62853289f6aSNate Lawson  *
62953289f6aSNate Lawson  * FUNCTION:    UtGetStringBuffer
63053289f6aSNate Lawson  *
63153289f6aSNate Lawson  * PARAMETERS:  Length              - Size of buffer requested
63253289f6aSNate Lawson  *
63353289f6aSNate Lawson  * RETURN:      Pointer to the buffer. Aborts on allocation failure
63453289f6aSNate Lawson  *
63553289f6aSNate Lawson  * DESCRIPTION: Allocate a string buffer. Bypass the local
63653289f6aSNate Lawson  *              dynamic memory manager for performance reasons (This has a
63753289f6aSNate Lawson  *              major impact on the speed of the compiler.)
63853289f6aSNate Lawson  *
63953289f6aSNate Lawson  ******************************************************************************/
64053289f6aSNate Lawson 
64153289f6aSNate Lawson char *
64253289f6aSNate Lawson UtGetStringBuffer (
64353289f6aSNate Lawson     UINT32                  Length)
64453289f6aSNate Lawson {
64553289f6aSNate Lawson     char                    *Buffer;
64653289f6aSNate Lawson 
64753289f6aSNate Lawson 
64853289f6aSNate Lawson     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
64953289f6aSNate Lawson     {
65053289f6aSNate Lawson         Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length);
651fba7fc7eSJung-uk Kim         Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE +
652fba7fc7eSJung-uk Kim                                 Length;
65353289f6aSNate Lawson     }
65453289f6aSNate Lawson 
65553289f6aSNate Lawson     Buffer = Gbl_StringCacheNext;
65653289f6aSNate Lawson     Gbl_StringCacheNext += Length;
65753289f6aSNate Lawson 
65853289f6aSNate Lawson     return (Buffer);
65953289f6aSNate Lawson }
66053289f6aSNate Lawson 
66153289f6aSNate Lawson 
66253289f6aSNate Lawson /*******************************************************************************
66353289f6aSNate Lawson  *
66453289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
66553289f6aSNate Lawson  *
66653289f6aSNate Lawson  * PARAMETERS:  ExternalName        - Name to convert
66753289f6aSNate Lawson  *              ConvertedName       - Where the converted name is returned
66853289f6aSNate Lawson  *
66953289f6aSNate Lawson  * RETURN:      Status
67053289f6aSNate Lawson  *
67153289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
67253289f6aSNate Lawson  *
67353289f6aSNate Lawson  ******************************************************************************/
67453289f6aSNate Lawson 
67553289f6aSNate Lawson ACPI_STATUS
67653289f6aSNate Lawson UtInternalizeName (
67753289f6aSNate Lawson     char                    *ExternalName,
67853289f6aSNate Lawson     char                    **ConvertedName)
67953289f6aSNate Lawson {
68053289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
68153289f6aSNate Lawson     ACPI_STATUS             Status;
68253289f6aSNate Lawson 
68353289f6aSNate Lawson 
68453289f6aSNate Lawson     if (!ExternalName)
68553289f6aSNate Lawson     {
68653289f6aSNate Lawson         return (AE_OK);
68753289f6aSNate Lawson     }
68853289f6aSNate Lawson 
68953289f6aSNate Lawson     /* Get the length of the new internal name */
69053289f6aSNate Lawson 
69153289f6aSNate Lawson     Info.ExternalName = ExternalName;
69253289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
69353289f6aSNate Lawson 
69453289f6aSNate Lawson     /* We need a segment to store the internal  name */
69553289f6aSNate Lawson 
69653289f6aSNate Lawson     Info.InternalName = UtGetStringBuffer (Info.Length);
69753289f6aSNate Lawson     if (!Info.InternalName)
69853289f6aSNate Lawson     {
69953289f6aSNate Lawson         return (AE_NO_MEMORY);
70053289f6aSNate Lawson     }
70153289f6aSNate Lawson 
70253289f6aSNate Lawson     /* Build the name */
70353289f6aSNate Lawson 
70453289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
70553289f6aSNate Lawson     if (ACPI_FAILURE (Status))
70653289f6aSNate Lawson     {
70753289f6aSNate Lawson         return (Status);
70853289f6aSNate Lawson     }
70953289f6aSNate Lawson 
71053289f6aSNate Lawson     *ConvertedName = Info.InternalName;
71153289f6aSNate Lawson     return (AE_OK);
71253289f6aSNate Lawson }
71353289f6aSNate Lawson 
71453289f6aSNate Lawson 
71553289f6aSNate Lawson /*******************************************************************************
71653289f6aSNate Lawson  *
71753289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
71853289f6aSNate Lawson  *
71953289f6aSNate Lawson  * PARAMETERS:  NameSeg             - Input nameseg
72053289f6aSNate Lawson  *              PaddedNameSeg       - Output padded nameseg
72153289f6aSNate Lawson  *
72253289f6aSNate Lawson  * RETURN:      Padded nameseg.
72353289f6aSNate Lawson  *
72453289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
72553289f6aSNate Lawson  *              ACPI_NAME.
72653289f6aSNate Lawson  *
72753289f6aSNate Lawson  ******************************************************************************/
72853289f6aSNate Lawson 
729fba7fc7eSJung-uk Kim static void
73053289f6aSNate Lawson UtPadNameWithUnderscores (
73153289f6aSNate Lawson     char                    *NameSeg,
73253289f6aSNate Lawson     char                    *PaddedNameSeg)
73353289f6aSNate Lawson {
73453289f6aSNate Lawson     UINT32                  i;
73553289f6aSNate Lawson 
73653289f6aSNate Lawson 
73753289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
73853289f6aSNate Lawson     {
73953289f6aSNate Lawson         if (*NameSeg)
74053289f6aSNate Lawson         {
74153289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
74253289f6aSNate Lawson             NameSeg++;
74353289f6aSNate Lawson         }
74453289f6aSNate Lawson         else
74553289f6aSNate Lawson         {
74653289f6aSNate Lawson             *PaddedNameSeg = '_';
74753289f6aSNate Lawson         }
74853289f6aSNate Lawson         PaddedNameSeg++;
74953289f6aSNate Lawson     }
75053289f6aSNate Lawson }
75153289f6aSNate Lawson 
75253289f6aSNate Lawson 
75353289f6aSNate Lawson /*******************************************************************************
75453289f6aSNate Lawson  *
75553289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
75653289f6aSNate Lawson  *
75753289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
75853289f6aSNate Lawson  *              Name                - Full ExternalName
75953289f6aSNate Lawson  *
760fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
76153289f6aSNate Lawson  *
76253289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
76353289f6aSNate Lawson  *              in the NameSeg field of the Op.
76453289f6aSNate Lawson  *
76553289f6aSNate Lawson  ******************************************************************************/
76653289f6aSNate Lawson 
767fba7fc7eSJung-uk Kim static void
76853289f6aSNate Lawson UtAttachNameseg (
76953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
77053289f6aSNate Lawson     char                    *Name)
77153289f6aSNate Lawson {
77253289f6aSNate Lawson     char                    *NameSeg;
77353289f6aSNate Lawson     char                    PaddedNameSeg[4];
77453289f6aSNate Lawson 
77553289f6aSNate Lawson 
77653289f6aSNate Lawson     if (!Name)
77753289f6aSNate Lawson     {
77853289f6aSNate Lawson         return;
77953289f6aSNate Lawson     }
78053289f6aSNate Lawson 
78153289f6aSNate Lawson     /* Look for the last dot in the namepath */
78253289f6aSNate Lawson 
78353289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
78453289f6aSNate Lawson     if (NameSeg)
78553289f6aSNate Lawson     {
78653289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
78753289f6aSNate Lawson 
78853289f6aSNate Lawson         NameSeg++;
78953289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
79053289f6aSNate Lawson     }
79153289f6aSNate Lawson     else
79253289f6aSNate Lawson     {
79353289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
79453289f6aSNate Lawson         /* Handle prefixes */
79553289f6aSNate Lawson 
79653289f6aSNate Lawson         while ((*Name == '\\') || (*Name == '^'))
79753289f6aSNate Lawson         {
79853289f6aSNate Lawson             Name++;
79953289f6aSNate Lawson         }
80053289f6aSNate Lawson 
80153289f6aSNate Lawson         /* Remaing string should be one single nameseg */
80253289f6aSNate Lawson 
80353289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
80453289f6aSNate Lawson     }
80553289f6aSNate Lawson 
80653289f6aSNate Lawson     strncpy (Op->Asl.NameSeg, PaddedNameSeg, 4);
80753289f6aSNate Lawson }
80853289f6aSNate Lawson 
80953289f6aSNate Lawson 
81053289f6aSNate Lawson /*******************************************************************************
81153289f6aSNate Lawson  *
81253289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
81353289f6aSNate Lawson  *
81453289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
81553289f6aSNate Lawson  *              NameOp              - Node that contains the name
81653289f6aSNate Lawson  *
81753289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
81853289f6aSNate Lawson  *
81953289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node: The original
82053289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
82153289f6aSNate Lawson  *              the ACPI namespace manager.
82253289f6aSNate Lawson  *
82353289f6aSNate Lawson  ******************************************************************************/
82453289f6aSNate Lawson 
82553289f6aSNate Lawson void
82653289f6aSNate Lawson UtAttachNamepathToOwner (
82753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
82853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
82953289f6aSNate Lawson {
83053289f6aSNate Lawson     ACPI_STATUS             Status;
83153289f6aSNate Lawson 
83253289f6aSNate Lawson 
83353289f6aSNate Lawson     /* Full external path */
83453289f6aSNate Lawson 
83553289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
83653289f6aSNate Lawson 
837fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
838fba7fc7eSJung-uk Kim 
839fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
840fba7fc7eSJung-uk Kim 
84153289f6aSNate Lawson     /* Last nameseg of the path */
84253289f6aSNate Lawson 
84353289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
84453289f6aSNate Lawson 
84553289f6aSNate Lawson     /* Create internalized path */
84653289f6aSNate Lawson 
84753289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
84853289f6aSNate Lawson     if (ACPI_FAILURE (Status))
84953289f6aSNate Lawson     {
85053289f6aSNate Lawson         /* TBD: abort on no memory */
85153289f6aSNate Lawson     }
85253289f6aSNate Lawson }
85353289f6aSNate Lawson 
85453289f6aSNate Lawson 
85553289f6aSNate Lawson /*******************************************************************************
85653289f6aSNate Lawson  *
85753289f6aSNate Lawson  * FUNCTION:    UtDoConstant
85853289f6aSNate Lawson  *
85953289f6aSNate Lawson  * PARAMETERS:  String              - Hex, Octal, or Decimal string
86053289f6aSNate Lawson  *
86153289f6aSNate Lawson  * RETURN:      Converted Integer
86253289f6aSNate Lawson  *
863*f38b0f21SJung-uk Kim  * DESCRIPTION: Convert a string to an integer, with error checking.
86453289f6aSNate Lawson  *
86553289f6aSNate Lawson  ******************************************************************************/
86653289f6aSNate Lawson 
8679a179dd8SJung-uk Kim UINT64
86853289f6aSNate Lawson UtDoConstant (
86953289f6aSNate Lawson     char                    *String)
87053289f6aSNate Lawson {
87153289f6aSNate Lawson     ACPI_STATUS             Status;
8729a179dd8SJung-uk Kim     UINT64                  Converted;
87353289f6aSNate Lawson     char                    ErrBuf[64];
87453289f6aSNate Lawson 
87553289f6aSNate Lawson 
87653289f6aSNate Lawson     Status = UtStrtoul64 (String, 0, &Converted);
87753289f6aSNate Lawson     if (ACPI_FAILURE (Status))
87853289f6aSNate Lawson     {
879fba7fc7eSJung-uk Kim         sprintf (ErrBuf, "%s %s\n", "Conversion error:",
880fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
88153289f6aSNate Lawson         AslCompilererror (ErrBuf);
88253289f6aSNate Lawson     }
88353289f6aSNate Lawson 
88453289f6aSNate Lawson     return (Converted);
88553289f6aSNate Lawson }
88653289f6aSNate Lawson 
88753289f6aSNate Lawson 
888fba7fc7eSJung-uk Kim /* TBD: use version in ACPI CA main code base? */
889fba7fc7eSJung-uk Kim 
89053289f6aSNate Lawson /*******************************************************************************
89153289f6aSNate Lawson  *
89253289f6aSNate Lawson  * FUNCTION:    UtStrtoul64
89353289f6aSNate Lawson  *
89453289f6aSNate Lawson  * PARAMETERS:  String              - Null terminated string
895*f38b0f21SJung-uk Kim  *              Terminater          - Where a pointer to the terminating byte
896*f38b0f21SJung-uk Kim  *                                    is returned
89753289f6aSNate Lawson  *              Base                - Radix of the string
89853289f6aSNate Lawson  *
89953289f6aSNate Lawson  * RETURN:      Converted value
90053289f6aSNate Lawson  *
90153289f6aSNate Lawson  * DESCRIPTION: Convert a string into an unsigned value.
90253289f6aSNate Lawson  *
90353289f6aSNate Lawson  ******************************************************************************/
90453289f6aSNate Lawson 
905d052a1ccSJung-uk Kim ACPI_STATUS
90653289f6aSNate Lawson UtStrtoul64 (
90753289f6aSNate Lawson     char                    *String,
90853289f6aSNate Lawson     UINT32                  Base,
9099a179dd8SJung-uk Kim     UINT64                  *RetInteger)
91053289f6aSNate Lawson {
91153289f6aSNate Lawson     UINT32                  Index;
91253289f6aSNate Lawson     UINT32                  Sign;
9139a179dd8SJung-uk Kim     UINT64                  ReturnValue = 0;
91453289f6aSNate Lawson     ACPI_STATUS             Status = AE_OK;
91553289f6aSNate Lawson 
91653289f6aSNate Lawson 
91753289f6aSNate Lawson     *RetInteger = 0;
91853289f6aSNate Lawson 
91953289f6aSNate Lawson     switch (Base)
92053289f6aSNate Lawson     {
92153289f6aSNate Lawson     case 0:
92253289f6aSNate Lawson     case 8:
92353289f6aSNate Lawson     case 10:
92453289f6aSNate Lawson     case 16:
92553289f6aSNate Lawson         break;
92653289f6aSNate Lawson 
92753289f6aSNate Lawson     default:
92853289f6aSNate Lawson         /*
92953289f6aSNate Lawson          * The specified Base parameter is not in the domain of
93053289f6aSNate Lawson          * this function:
93153289f6aSNate Lawson          */
93253289f6aSNate Lawson         return (AE_BAD_PARAMETER);
93353289f6aSNate Lawson     }
93453289f6aSNate Lawson 
935fba7fc7eSJung-uk Kim     /* Skip over any white space in the buffer: */
936fba7fc7eSJung-uk Kim 
9379a179dd8SJung-uk Kim     while (isspace ((int) *String) || *String == '\t')
93853289f6aSNate Lawson     {
93953289f6aSNate Lawson         ++String;
94053289f6aSNate Lawson     }
94153289f6aSNate Lawson 
94253289f6aSNate Lawson     /*
94353289f6aSNate Lawson      * The buffer may contain an optional plus or minus sign.
94453289f6aSNate Lawson      * If it does, then skip over it but remember what is was:
94553289f6aSNate Lawson      */
94653289f6aSNate Lawson     if (*String == '-')
94753289f6aSNate Lawson     {
94853289f6aSNate Lawson         Sign = NEGATIVE;
94953289f6aSNate Lawson         ++String;
95053289f6aSNate Lawson     }
95153289f6aSNate Lawson     else if (*String == '+')
95253289f6aSNate Lawson     {
95353289f6aSNate Lawson         ++String;
95453289f6aSNate Lawson         Sign = POSITIVE;
95553289f6aSNate Lawson     }
95653289f6aSNate Lawson     else
95753289f6aSNate Lawson     {
95853289f6aSNate Lawson         Sign = POSITIVE;
95953289f6aSNate Lawson     }
96053289f6aSNate Lawson 
96153289f6aSNate Lawson     /*
96253289f6aSNate Lawson      * If the input parameter Base is zero, then we need to
96353289f6aSNate Lawson      * determine if it is octal, decimal, or hexadecimal:
96453289f6aSNate Lawson      */
96553289f6aSNate Lawson     if (Base == 0)
96653289f6aSNate Lawson     {
96753289f6aSNate Lawson         if (*String == '0')
96853289f6aSNate Lawson         {
9699a179dd8SJung-uk Kim             if (tolower ((int) *(++String)) == 'x')
97053289f6aSNate Lawson             {
97153289f6aSNate Lawson                 Base = 16;
97253289f6aSNate Lawson                 ++String;
97353289f6aSNate Lawson             }
97453289f6aSNate Lawson             else
97553289f6aSNate Lawson             {
97653289f6aSNate Lawson                 Base = 8;
97753289f6aSNate Lawson             }
97853289f6aSNate Lawson         }
97953289f6aSNate Lawson         else
98053289f6aSNate Lawson         {
98153289f6aSNate Lawson             Base = 10;
98253289f6aSNate Lawson         }
98353289f6aSNate Lawson     }
98453289f6aSNate Lawson 
98553289f6aSNate Lawson     /*
98653289f6aSNate Lawson      * For octal and hexadecimal bases, skip over the leading
98753289f6aSNate Lawson      * 0 or 0x, if they are present.
98853289f6aSNate Lawson      */
98953289f6aSNate Lawson     if (Base == 8 && *String == '0')
99053289f6aSNate Lawson     {
99153289f6aSNate Lawson         String++;
99253289f6aSNate Lawson     }
99353289f6aSNate Lawson 
99453289f6aSNate Lawson     if (Base == 16 &&
99553289f6aSNate Lawson         *String == '0' &&
9969a179dd8SJung-uk Kim         tolower ((int) *(++String)) == 'x')
99753289f6aSNate Lawson     {
99853289f6aSNate Lawson         String++;
99953289f6aSNate Lawson     }
100053289f6aSNate Lawson 
100153289f6aSNate Lawson     /* Main loop: convert the string to an unsigned long */
100253289f6aSNate Lawson 
100353289f6aSNate Lawson     while (*String)
100453289f6aSNate Lawson     {
10059a179dd8SJung-uk Kim         if (isdigit ((int) *String))
100653289f6aSNate Lawson         {
100753289f6aSNate Lawson             Index = ((UINT8) *String) - '0';
100853289f6aSNate Lawson         }
100953289f6aSNate Lawson         else
101053289f6aSNate Lawson         {
10119a179dd8SJung-uk Kim             Index = (UINT8) toupper ((int) *String);
10129a179dd8SJung-uk Kim             if (isupper ((int) Index))
101353289f6aSNate Lawson             {
101453289f6aSNate Lawson                 Index = Index - 'A' + 10;
101553289f6aSNate Lawson             }
101653289f6aSNate Lawson             else
101753289f6aSNate Lawson             {
101853289f6aSNate Lawson                 goto ErrorExit;
101953289f6aSNate Lawson             }
102053289f6aSNate Lawson         }
102153289f6aSNate Lawson 
102253289f6aSNate Lawson         if (Index >= Base)
102353289f6aSNate Lawson         {
102453289f6aSNate Lawson             goto ErrorExit;
102553289f6aSNate Lawson         }
102653289f6aSNate Lawson 
102753289f6aSNate Lawson         /* Check to see if value is out of range: */
102853289f6aSNate Lawson 
10299a179dd8SJung-uk Kim         if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) /
10309a179dd8SJung-uk Kim                             (UINT64) Base))
103153289f6aSNate Lawson         {
103253289f6aSNate Lawson             goto ErrorExit;
103353289f6aSNate Lawson         }
103453289f6aSNate Lawson         else
103553289f6aSNate Lawson         {
103653289f6aSNate Lawson             ReturnValue *= Base;
103753289f6aSNate Lawson             ReturnValue += Index;
103853289f6aSNate Lawson         }
103953289f6aSNate Lawson 
104053289f6aSNate Lawson         ++String;
104153289f6aSNate Lawson     }
104253289f6aSNate Lawson 
104353289f6aSNate Lawson 
1044fba7fc7eSJung-uk Kim     /* If a minus sign was present, then "the conversion is negated": */
1045fba7fc7eSJung-uk Kim 
104653289f6aSNate Lawson     if (Sign == NEGATIVE)
104753289f6aSNate Lawson     {
104853289f6aSNate Lawson         ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
104953289f6aSNate Lawson     }
105053289f6aSNate Lawson 
105153289f6aSNate Lawson     *RetInteger = ReturnValue;
105253289f6aSNate Lawson     return (Status);
105353289f6aSNate Lawson 
105453289f6aSNate Lawson 
105553289f6aSNate Lawson ErrorExit:
105653289f6aSNate Lawson     switch (Base)
105753289f6aSNate Lawson     {
105853289f6aSNate Lawson     case 8:
105953289f6aSNate Lawson         Status = AE_BAD_OCTAL_CONSTANT;
106053289f6aSNate Lawson         break;
106153289f6aSNate Lawson 
106253289f6aSNate Lawson     case 10:
106353289f6aSNate Lawson         Status = AE_BAD_DECIMAL_CONSTANT;
106453289f6aSNate Lawson         break;
106553289f6aSNate Lawson 
106653289f6aSNate Lawson     case 16:
106753289f6aSNate Lawson         Status = AE_BAD_HEX_CONSTANT;
106853289f6aSNate Lawson         break;
106953289f6aSNate Lawson 
107053289f6aSNate Lawson     default:
107153289f6aSNate Lawson         /* Base validated above */
107253289f6aSNate Lawson         break;
107353289f6aSNate Lawson     }
107453289f6aSNate Lawson 
107553289f6aSNate Lawson     return (Status);
107653289f6aSNate Lawson }
1077