xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision 4c52cad2f9c8cd2b25d156455f9263616da1fb79)
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:",
71*4c52cad2SJung-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  *
14253289f6aSNate Lawson  * FUNCTION:    AcpiPsDisplayConstantOpcodes
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  *
216fba7fc7eSJung-uk Kim  * RETURN:      Event       - 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
307fba7fc7eSJung-uk Kim  *              Buffer          - Pointer to where the hex bytes will be stored
30853289f6aSNate Lawson  *
30953289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
31053289f6aSNate Lawson  *
31153289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
31253289f6aSNate Lawson  *              with "0x"
31353289f6aSNate Lawson  *
31453289f6aSNate Lawson  ******************************************************************************/
31553289f6aSNate Lawson 
31653289f6aSNate Lawson void
31753289f6aSNate Lawson UtConvertByteToHex (
31853289f6aSNate Lawson     UINT8                   RawByte,
31953289f6aSNate Lawson     UINT8                   *Buffer)
32053289f6aSNate Lawson {
32153289f6aSNate Lawson 
32253289f6aSNate Lawson     Buffer[0] = '0';
32353289f6aSNate Lawson     Buffer[1] = 'x';
32453289f6aSNate Lawson 
325d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
326d244b227SJung-uk Kim     Buffer[3] = (UINT8) AslHexLookup[RawByte & 0xF];
32753289f6aSNate Lawson }
32853289f6aSNate Lawson 
32953289f6aSNate Lawson 
33053289f6aSNate Lawson /*******************************************************************************
33153289f6aSNate Lawson  *
33253289f6aSNate Lawson  * FUNCTION:    UtConvertByteToAsmHex
33353289f6aSNate Lawson  *
33453289f6aSNate Lawson  * PARAMETERS:  RawByte         - Binary data
335fba7fc7eSJung-uk Kim  *              Buffer          - Pointer to where the hex bytes will be stored
33653289f6aSNate Lawson  *
33753289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
33853289f6aSNate Lawson  *
33953289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
34053289f6aSNate Lawson  *              with "0x"
34153289f6aSNate Lawson  *
34253289f6aSNate Lawson  ******************************************************************************/
34353289f6aSNate Lawson 
34453289f6aSNate Lawson void
34553289f6aSNate Lawson UtConvertByteToAsmHex (
34653289f6aSNate Lawson     UINT8                   RawByte,
34753289f6aSNate Lawson     UINT8                   *Buffer)
34853289f6aSNate Lawson {
34953289f6aSNate Lawson 
35053289f6aSNate Lawson     Buffer[0] = '0';
351d244b227SJung-uk Kim     Buffer[1] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
352d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[RawByte & 0xF];
35353289f6aSNate Lawson     Buffer[3] = 'h';
35453289f6aSNate Lawson }
35553289f6aSNate Lawson 
35653289f6aSNate Lawson 
35753289f6aSNate Lawson /*******************************************************************************
35853289f6aSNate Lawson  *
35953289f6aSNate Lawson  * FUNCTION:    DbgPrint
36053289f6aSNate Lawson  *
361fba7fc7eSJung-uk Kim  * PARAMETERS:  Type            - Type of output
362fba7fc7eSJung-uk Kim  *              Fmt             - Printf format string
36353289f6aSNate Lawson  *              ...             - variable printf list
36453289f6aSNate Lawson  *
36553289f6aSNate Lawson  * RETURN:      None
36653289f6aSNate Lawson  *
36753289f6aSNate Lawson  * DESCRIPTION: Conditional print statement.  Prints to stderr only if the
36853289f6aSNate Lawson  *              debug flag is set.
36953289f6aSNate Lawson  *
37053289f6aSNate Lawson  ******************************************************************************/
37153289f6aSNate Lawson 
37253289f6aSNate Lawson void
37353289f6aSNate Lawson DbgPrint (
37453289f6aSNate Lawson     UINT32                  Type,
37553289f6aSNate Lawson     char                    *Fmt,
37653289f6aSNate Lawson     ...)
37753289f6aSNate Lawson {
37853289f6aSNate Lawson     va_list                 Args;
37953289f6aSNate Lawson 
38053289f6aSNate Lawson 
38153289f6aSNate Lawson     va_start (Args, Fmt);
38253289f6aSNate Lawson 
38353289f6aSNate Lawson     if (!Gbl_DebugFlag)
38453289f6aSNate Lawson     {
38553289f6aSNate Lawson         return;
38653289f6aSNate Lawson     }
38753289f6aSNate Lawson 
38853289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
38953289f6aSNate Lawson         (!(AslCompilerdebug)))
39053289f6aSNate Lawson     {
39153289f6aSNate Lawson         return;
39253289f6aSNate Lawson     }
39353289f6aSNate Lawson 
39453289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
39553289f6aSNate Lawson     va_end (Args);
39653289f6aSNate Lawson     return;
39753289f6aSNate Lawson }
39853289f6aSNate Lawson 
39953289f6aSNate Lawson 
40053289f6aSNate Lawson /*******************************************************************************
40153289f6aSNate Lawson  *
40253289f6aSNate Lawson  * FUNCTION:    UtPrintFormattedName
40353289f6aSNate Lawson  *
40453289f6aSNate Lawson  * PARAMETERS:  ParseOpcode         - Parser keyword ID
40553289f6aSNate Lawson  *              Level               - Indentation level
40653289f6aSNate Lawson  *
40753289f6aSNate Lawson  * RETURN:      None
40853289f6aSNate Lawson  *
40953289f6aSNate Lawson  * DESCRIPTION: Print the ascii name of the parse opcode.
41053289f6aSNate Lawson  *
41153289f6aSNate Lawson  ******************************************************************************/
41253289f6aSNate Lawson 
41353289f6aSNate Lawson #define TEXT_OFFSET 10
41453289f6aSNate Lawson 
41553289f6aSNate Lawson void
41653289f6aSNate Lawson UtPrintFormattedName (
41753289f6aSNate Lawson     UINT16                  ParseOpcode,
41853289f6aSNate Lawson     UINT32                  Level)
41953289f6aSNate Lawson {
42053289f6aSNate Lawson 
4211a39cfb0SJung-uk Kim     if (Level)
4221a39cfb0SJung-uk Kim     {
42353289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
4241a39cfb0SJung-uk Kim             "%*s", (3 * Level), " ");
4251a39cfb0SJung-uk Kim     }
4261a39cfb0SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT,
4271a39cfb0SJung-uk Kim         " %-20.20s", UtGetOpName (ParseOpcode));
42853289f6aSNate Lawson 
42953289f6aSNate Lawson     if (Level < TEXT_OFFSET)
43053289f6aSNate Lawson     {
43153289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
43253289f6aSNate Lawson             "%*s", (TEXT_OFFSET - Level) * 3, " ");
43353289f6aSNate Lawson     }
43453289f6aSNate Lawson }
43553289f6aSNate Lawson 
43653289f6aSNate Lawson 
43753289f6aSNate Lawson /*******************************************************************************
43853289f6aSNate Lawson  *
43953289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
44053289f6aSNate Lawson  *
44153289f6aSNate Lawson  * PARAMETERS:  Op
44253289f6aSNate Lawson  *
44353289f6aSNate Lawson  * RETURN:      None
44453289f6aSNate Lawson  *
44553289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
44653289f6aSNate Lawson  *
44753289f6aSNate Lawson  ******************************************************************************/
44853289f6aSNate Lawson 
44953289f6aSNate Lawson void
45053289f6aSNate Lawson UtSetParseOpName (
45153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
45253289f6aSNate Lawson {
453fba7fc7eSJung-uk Kim 
4541a39cfb0SJung-uk Kim     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
4551a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
45653289f6aSNate Lawson }
45753289f6aSNate Lawson 
45853289f6aSNate Lawson 
45953289f6aSNate Lawson /*******************************************************************************
46053289f6aSNate Lawson  *
46153289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
46253289f6aSNate Lawson  *
463fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID          - ID of outpout file
46453289f6aSNate Lawson  *
46553289f6aSNate Lawson  * RETURN:      None
46653289f6aSNate Lawson  *
46753289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
46853289f6aSNate Lawson  *
46953289f6aSNate Lawson  ******************************************************************************/
47053289f6aSNate Lawson 
47153289f6aSNate Lawson void
47253289f6aSNate Lawson UtDisplaySummary (
47353289f6aSNate Lawson     UINT32                  FileId)
47453289f6aSNate Lawson {
4753f0275a0SJung-uk Kim     UINT32                  i;
4763f0275a0SJung-uk Kim 
47753289f6aSNate Lawson 
47853289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
47953289f6aSNate Lawson     {
48053289f6aSNate Lawson         /* Compiler name and version number */
48153289f6aSNate Lawson 
4823f0275a0SJung-uk Kim         FlPrintFile (FileId, "%s version %X%s\n\n",
4833c1812acSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH);
48453289f6aSNate Lawson     }
48553289f6aSNate Lawson 
4863f0275a0SJung-uk Kim     /* Summary of main input and output files */
4873f0275a0SJung-uk Kim 
488a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
489a88e22b7SJung-uk Kim     {
490a88e22b7SJung-uk Kim         FlPrintFile (FileId,
4913f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u fields\n",
4923f0275a0SJung-uk Kim             "Table Input:",
493a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
494a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
495a88e22b7SJung-uk Kim 
496a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
497a88e22b7SJung-uk Kim         {
498a88e22b7SJung-uk Kim             FlPrintFile (FileId,
4993f0275a0SJung-uk Kim                 "%-14s %s - %u bytes\n",
5003f0275a0SJung-uk Kim                 "Binary Output:",
501a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
502a88e22b7SJung-uk Kim         }
503a88e22b7SJung-uk Kim     }
504a88e22b7SJung-uk Kim     else
505a88e22b7SJung-uk Kim     {
50653289f6aSNate Lawson         FlPrintFile (FileId,
5073f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u keywords\n",
5083f0275a0SJung-uk Kim             "ASL Input:",
50953289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
51053289f6aSNate Lawson             Gbl_InputByteCount, TotalKeywords);
51153289f6aSNate Lawson 
51253289f6aSNate Lawson         /* AML summary */
51353289f6aSNate Lawson 
51453289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
51553289f6aSNate Lawson         {
51653289f6aSNate Lawson             FlPrintFile (FileId,
5173f0275a0SJung-uk Kim                 "%-14s %s - %u bytes, %u named objects, %u executable opcodes\n",
5183f0275a0SJung-uk Kim                 "AML Output:",
51953289f6aSNate Lawson                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,
52053289f6aSNate Lawson                 TotalNamedObjects, TotalExecutableOpcodes);
52153289f6aSNate Lawson         }
522a88e22b7SJung-uk Kim     }
52353289f6aSNate Lawson 
5243f0275a0SJung-uk Kim     /* Display summary of any optional files */
5253f0275a0SJung-uk Kim 
5263f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
5273f0275a0SJung-uk Kim     {
5283f0275a0SJung-uk Kim         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
5293f0275a0SJung-uk Kim         {
5303f0275a0SJung-uk Kim             continue;
5313f0275a0SJung-uk Kim         }
5323f0275a0SJung-uk Kim 
5333f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
5343f0275a0SJung-uk Kim 
5353f0275a0SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
5363f0275a0SJung-uk Kim         {
5373f0275a0SJung-uk Kim             continue;
5383f0275a0SJung-uk Kim         }
5393f0275a0SJung-uk Kim 
540*4c52cad2SJung-uk Kim         /* .I is a temp file unless specifically requested */
541*4c52cad2SJung-uk Kim 
542*4c52cad2SJung-uk Kim         if ((i == ASL_FILE_PREPROCESSOR) && (!Gbl_PreprocessorOutputFlag))
543*4c52cad2SJung-uk Kim         {
544*4c52cad2SJung-uk Kim             continue;
545*4c52cad2SJung-uk Kim         }
546*4c52cad2SJung-uk Kim 
5473f0275a0SJung-uk Kim         FlPrintFile (FileId, "%14s %s - %u bytes\n",
5483f0275a0SJung-uk Kim             AslFileTypeNames [i],
5493f0275a0SJung-uk Kim             Gbl_Files[i].Filename, FlGetFileSize (i));
5503f0275a0SJung-uk Kim     }
5513f0275a0SJung-uk Kim 
55253289f6aSNate Lawson     /* Error summary */
55353289f6aSNate Lawson 
55453289f6aSNate Lawson     FlPrintFile (FileId,
5553f0275a0SJung-uk Kim         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
55653289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
5571a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
5581a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
5591a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
560a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
561a88e22b7SJung-uk Kim 
562a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
563a88e22b7SJung-uk Kim     {
564a88e22b7SJung-uk Kim         FlPrintFile (FileId,
565a88e22b7SJung-uk Kim             ", %u Optimizations", Gbl_ExceptionCount[ASL_OPTIMIZATION]);
566a88e22b7SJung-uk Kim     }
567a88e22b7SJung-uk Kim 
568a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
56953289f6aSNate Lawson }
57053289f6aSNate Lawson 
57153289f6aSNate Lawson 
57253289f6aSNate Lawson /*******************************************************************************
57353289f6aSNate Lawson  *
57453289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
57553289f6aSNate Lawson  *
57653289f6aSNate Lawson  * PARAMETERS:  Op              - Integer parse node
57753289f6aSNate Lawson  *              LowValue        - Smallest allowed value
57853289f6aSNate Lawson  *              HighValue       - Largest allowed value
57953289f6aSNate Lawson  *
58053289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
58153289f6aSNate Lawson  *
58253289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
58353289f6aSNate Lawson  *
58453289f6aSNate Lawson  ******************************************************************************/
58553289f6aSNate Lawson 
58653289f6aSNate Lawson ACPI_PARSE_OBJECT *
58753289f6aSNate Lawson UtCheckIntegerRange (
58853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
58953289f6aSNate Lawson     UINT32                  LowValue,
59053289f6aSNate Lawson     UINT32                  HighValue)
59153289f6aSNate Lawson {
59253289f6aSNate Lawson     char                    *ParseError = NULL;
59353289f6aSNate Lawson     char                    Buffer[64];
59453289f6aSNate Lawson 
59553289f6aSNate Lawson 
59653289f6aSNate Lawson     if (!Op)
59753289f6aSNate Lawson     {
59853289f6aSNate Lawson         return NULL;
59953289f6aSNate Lawson     }
60053289f6aSNate Lawson 
60153289f6aSNate Lawson     if (Op->Asl.Value.Integer < LowValue)
60253289f6aSNate Lawson     {
60353289f6aSNate Lawson         ParseError = "Value below valid range";
60453289f6aSNate Lawson         Op->Asl.Value.Integer = LowValue;
60553289f6aSNate Lawson     }
60653289f6aSNate Lawson 
60753289f6aSNate Lawson     if (Op->Asl.Value.Integer > HighValue)
60853289f6aSNate Lawson     {
60953289f6aSNate Lawson         ParseError = "Value above valid range";
61053289f6aSNate Lawson         Op->Asl.Value.Integer = HighValue;
61153289f6aSNate Lawson     }
61253289f6aSNate Lawson 
61353289f6aSNate Lawson     if (ParseError)
61453289f6aSNate Lawson     {
61553289f6aSNate Lawson         sprintf (Buffer, "%s 0x%X-0x%X", ParseError, LowValue, HighValue);
61653289f6aSNate Lawson         AslCompilererror (Buffer);
61753289f6aSNate Lawson 
61853289f6aSNate Lawson         return NULL;
61953289f6aSNate Lawson     }
62053289f6aSNate Lawson 
62153289f6aSNate Lawson     return Op;
62253289f6aSNate Lawson }
62353289f6aSNate Lawson 
62453289f6aSNate Lawson 
62553289f6aSNate Lawson /*******************************************************************************
62653289f6aSNate Lawson  *
62753289f6aSNate Lawson  * FUNCTION:    UtGetStringBuffer
62853289f6aSNate Lawson  *
62953289f6aSNate Lawson  * PARAMETERS:  Length          - Size of buffer requested
63053289f6aSNate Lawson  *
63153289f6aSNate Lawson  * RETURN:      Pointer to the buffer.  Aborts on allocation failure
63253289f6aSNate Lawson  *
63353289f6aSNate Lawson  * DESCRIPTION: Allocate a string buffer.  Bypass the local
63453289f6aSNate Lawson  *              dynamic memory manager for performance reasons (This has a
63553289f6aSNate Lawson  *              major impact on the speed of the compiler.)
63653289f6aSNate Lawson  *
63753289f6aSNate Lawson  ******************************************************************************/
63853289f6aSNate Lawson 
63953289f6aSNate Lawson char *
64053289f6aSNate Lawson UtGetStringBuffer (
64153289f6aSNate Lawson     UINT32                  Length)
64253289f6aSNate Lawson {
64353289f6aSNate Lawson     char                    *Buffer;
64453289f6aSNate Lawson 
64553289f6aSNate Lawson 
64653289f6aSNate Lawson     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
64753289f6aSNate Lawson     {
64853289f6aSNate Lawson         Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length);
649fba7fc7eSJung-uk Kim         Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE +
650fba7fc7eSJung-uk Kim                                 Length;
65153289f6aSNate Lawson     }
65253289f6aSNate Lawson 
65353289f6aSNate Lawson     Buffer = Gbl_StringCacheNext;
65453289f6aSNate Lawson     Gbl_StringCacheNext += Length;
65553289f6aSNate Lawson 
65653289f6aSNate Lawson     return (Buffer);
65753289f6aSNate Lawson }
65853289f6aSNate Lawson 
65953289f6aSNate Lawson 
66053289f6aSNate Lawson /*******************************************************************************
66153289f6aSNate Lawson  *
66253289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
66353289f6aSNate Lawson  *
66453289f6aSNate Lawson  * PARAMETERS:  ExternalName            - Name to convert
66553289f6aSNate Lawson  *              ConvertedName           - Where the converted name is returned
66653289f6aSNate Lawson  *
66753289f6aSNate Lawson  * RETURN:      Status
66853289f6aSNate Lawson  *
66953289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
67053289f6aSNate Lawson  *
67153289f6aSNate Lawson  ******************************************************************************/
67253289f6aSNate Lawson 
67353289f6aSNate Lawson ACPI_STATUS
67453289f6aSNate Lawson UtInternalizeName (
67553289f6aSNate Lawson     char                    *ExternalName,
67653289f6aSNate Lawson     char                    **ConvertedName)
67753289f6aSNate Lawson {
67853289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
67953289f6aSNate Lawson     ACPI_STATUS             Status;
68053289f6aSNate Lawson 
68153289f6aSNate Lawson 
68253289f6aSNate Lawson     if (!ExternalName)
68353289f6aSNate Lawson     {
68453289f6aSNate Lawson         return (AE_OK);
68553289f6aSNate Lawson     }
68653289f6aSNate Lawson 
68753289f6aSNate Lawson     /* Get the length of the new internal name */
68853289f6aSNate Lawson 
68953289f6aSNate Lawson     Info.ExternalName = ExternalName;
69053289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
69153289f6aSNate Lawson 
69253289f6aSNate Lawson     /* We need a segment to store the internal  name */
69353289f6aSNate Lawson 
69453289f6aSNate Lawson     Info.InternalName = UtGetStringBuffer (Info.Length);
69553289f6aSNate Lawson     if (!Info.InternalName)
69653289f6aSNate Lawson     {
69753289f6aSNate Lawson         return (AE_NO_MEMORY);
69853289f6aSNate Lawson     }
69953289f6aSNate Lawson 
70053289f6aSNate Lawson     /* Build the name */
70153289f6aSNate Lawson 
70253289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
70353289f6aSNate Lawson     if (ACPI_FAILURE (Status))
70453289f6aSNate Lawson     {
70553289f6aSNate Lawson         return (Status);
70653289f6aSNate Lawson     }
70753289f6aSNate Lawson 
70853289f6aSNate Lawson     *ConvertedName = Info.InternalName;
70953289f6aSNate Lawson     return (AE_OK);
71053289f6aSNate Lawson }
71153289f6aSNate Lawson 
71253289f6aSNate Lawson 
71353289f6aSNate Lawson /*******************************************************************************
71453289f6aSNate Lawson  *
71553289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
71653289f6aSNate Lawson  *
71753289f6aSNate Lawson  * PARAMETERS:  NameSeg         - Input nameseg
71853289f6aSNate Lawson  *              PaddedNameSeg   - Output padded nameseg
71953289f6aSNate Lawson  *
72053289f6aSNate Lawson  * RETURN:      Padded nameseg.
72153289f6aSNate Lawson  *
72253289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
72353289f6aSNate Lawson  *              ACPI_NAME.
72453289f6aSNate Lawson  *
72553289f6aSNate Lawson  ******************************************************************************/
72653289f6aSNate Lawson 
727fba7fc7eSJung-uk Kim static void
72853289f6aSNate Lawson UtPadNameWithUnderscores (
72953289f6aSNate Lawson     char                    *NameSeg,
73053289f6aSNate Lawson     char                    *PaddedNameSeg)
73153289f6aSNate Lawson {
73253289f6aSNate Lawson     UINT32                  i;
73353289f6aSNate Lawson 
73453289f6aSNate Lawson 
73553289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
73653289f6aSNate Lawson     {
73753289f6aSNate Lawson         if (*NameSeg)
73853289f6aSNate Lawson         {
73953289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
74053289f6aSNate Lawson             NameSeg++;
74153289f6aSNate Lawson         }
74253289f6aSNate Lawson         else
74353289f6aSNate Lawson         {
74453289f6aSNate Lawson             *PaddedNameSeg = '_';
74553289f6aSNate Lawson         }
74653289f6aSNate Lawson         PaddedNameSeg++;
74753289f6aSNate Lawson     }
74853289f6aSNate Lawson }
74953289f6aSNate Lawson 
75053289f6aSNate Lawson 
75153289f6aSNate Lawson /*******************************************************************************
75253289f6aSNate Lawson  *
75353289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
75453289f6aSNate Lawson  *
75553289f6aSNate Lawson  * PARAMETERS:  Op              - Parent parse node
75653289f6aSNate Lawson  *              Name            - Full ExternalName
75753289f6aSNate Lawson  *
758fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
75953289f6aSNate Lawson  *
76053289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
76153289f6aSNate Lawson  *              in the NameSeg field of the Op.
76253289f6aSNate Lawson  *
76353289f6aSNate Lawson  ******************************************************************************/
76453289f6aSNate Lawson 
765fba7fc7eSJung-uk Kim static void
76653289f6aSNate Lawson UtAttachNameseg (
76753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
76853289f6aSNate Lawson     char                    *Name)
76953289f6aSNate Lawson {
77053289f6aSNate Lawson     char                    *NameSeg;
77153289f6aSNate Lawson     char                    PaddedNameSeg[4];
77253289f6aSNate Lawson 
77353289f6aSNate Lawson 
77453289f6aSNate Lawson     if (!Name)
77553289f6aSNate Lawson     {
77653289f6aSNate Lawson         return;
77753289f6aSNate Lawson     }
77853289f6aSNate Lawson 
77953289f6aSNate Lawson     /* Look for the last dot in the namepath */
78053289f6aSNate Lawson 
78153289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
78253289f6aSNate Lawson     if (NameSeg)
78353289f6aSNate Lawson     {
78453289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
78553289f6aSNate Lawson 
78653289f6aSNate Lawson         NameSeg++;
78753289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
78853289f6aSNate Lawson     }
78953289f6aSNate Lawson     else
79053289f6aSNate Lawson     {
79153289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
79253289f6aSNate Lawson         /* Handle prefixes */
79353289f6aSNate Lawson 
79453289f6aSNate Lawson         while ((*Name == '\\') || (*Name == '^'))
79553289f6aSNate Lawson         {
79653289f6aSNate Lawson             Name++;
79753289f6aSNate Lawson         }
79853289f6aSNate Lawson 
79953289f6aSNate Lawson         /* Remaing string should be one single nameseg */
80053289f6aSNate Lawson 
80153289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
80253289f6aSNate Lawson     }
80353289f6aSNate Lawson 
80453289f6aSNate Lawson     strncpy (Op->Asl.NameSeg, PaddedNameSeg, 4);
80553289f6aSNate Lawson }
80653289f6aSNate Lawson 
80753289f6aSNate Lawson 
80853289f6aSNate Lawson /*******************************************************************************
80953289f6aSNate Lawson  *
81053289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
81153289f6aSNate Lawson  *
81253289f6aSNate Lawson  * PARAMETERS:  Op            - Parent parse node
81353289f6aSNate Lawson  *              NameOp        - Node that contains the name
81453289f6aSNate Lawson  *
81553289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
81653289f6aSNate Lawson  *
81753289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node:  The original
81853289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
81953289f6aSNate Lawson  *              the ACPI namespace manager.
82053289f6aSNate Lawson  *
82153289f6aSNate Lawson  ******************************************************************************/
82253289f6aSNate Lawson 
82353289f6aSNate Lawson void
82453289f6aSNate Lawson UtAttachNamepathToOwner (
82553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
82653289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
82753289f6aSNate Lawson {
82853289f6aSNate Lawson     ACPI_STATUS             Status;
82953289f6aSNate Lawson 
83053289f6aSNate Lawson 
83153289f6aSNate Lawson     /* Full external path */
83253289f6aSNate Lawson 
83353289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
83453289f6aSNate Lawson 
835fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
836fba7fc7eSJung-uk Kim 
837fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
838fba7fc7eSJung-uk Kim 
83953289f6aSNate Lawson     /* Last nameseg of the path */
84053289f6aSNate Lawson 
84153289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
84253289f6aSNate Lawson 
84353289f6aSNate Lawson     /* Create internalized path */
84453289f6aSNate Lawson 
84553289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
84653289f6aSNate Lawson     if (ACPI_FAILURE (Status))
84753289f6aSNate Lawson     {
84853289f6aSNate Lawson         /* TBD: abort on no memory */
84953289f6aSNate Lawson     }
85053289f6aSNate Lawson }
85153289f6aSNate Lawson 
85253289f6aSNate Lawson 
85353289f6aSNate Lawson /*******************************************************************************
85453289f6aSNate Lawson  *
85553289f6aSNate Lawson  * FUNCTION:    UtDoConstant
85653289f6aSNate Lawson  *
85753289f6aSNate Lawson  * PARAMETERS:  String      - Hex, Octal, or Decimal string
85853289f6aSNate Lawson  *
85953289f6aSNate Lawson  * RETURN:      Converted Integer
86053289f6aSNate Lawson  *
86153289f6aSNate Lawson  * DESCRIPTION: Convert a string to an integer.  With error checking.
86253289f6aSNate Lawson  *
86353289f6aSNate Lawson  ******************************************************************************/
86453289f6aSNate Lawson 
8659a179dd8SJung-uk Kim UINT64
86653289f6aSNate Lawson UtDoConstant (
86753289f6aSNate Lawson     char                    *String)
86853289f6aSNate Lawson {
86953289f6aSNate Lawson     ACPI_STATUS             Status;
8709a179dd8SJung-uk Kim     UINT64                  Converted;
87153289f6aSNate Lawson     char                    ErrBuf[64];
87253289f6aSNate Lawson 
87353289f6aSNate Lawson 
87453289f6aSNate Lawson     Status = UtStrtoul64 (String, 0, &Converted);
87553289f6aSNate Lawson     if (ACPI_FAILURE (Status))
87653289f6aSNate Lawson     {
877fba7fc7eSJung-uk Kim         sprintf (ErrBuf, "%s %s\n", "Conversion error:",
878fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
87953289f6aSNate Lawson         AslCompilererror (ErrBuf);
88053289f6aSNate Lawson     }
88153289f6aSNate Lawson 
88253289f6aSNate Lawson     return (Converted);
88353289f6aSNate Lawson }
88453289f6aSNate Lawson 
88553289f6aSNate Lawson 
886fba7fc7eSJung-uk Kim /* TBD: use version in ACPI CA main code base? */
887fba7fc7eSJung-uk Kim 
88853289f6aSNate Lawson /*******************************************************************************
88953289f6aSNate Lawson  *
89053289f6aSNate Lawson  * FUNCTION:    UtStrtoul64
89153289f6aSNate Lawson  *
89253289f6aSNate Lawson  * PARAMETERS:  String          - Null terminated string
893fba7fc7eSJung-uk Kim  *              Terminater      - Where a pointer to the terminating byte is
894fba7fc7eSJung-uk Kim  *                                returned
89553289f6aSNate Lawson  *              Base            - Radix of the string
89653289f6aSNate Lawson  *
89753289f6aSNate Lawson  * RETURN:      Converted value
89853289f6aSNate Lawson  *
89953289f6aSNate Lawson  * DESCRIPTION: Convert a string into an unsigned value.
90053289f6aSNate Lawson  *
90153289f6aSNate Lawson  ******************************************************************************/
90253289f6aSNate Lawson 
903d052a1ccSJung-uk Kim ACPI_STATUS
90453289f6aSNate Lawson UtStrtoul64 (
90553289f6aSNate Lawson     char                    *String,
90653289f6aSNate Lawson     UINT32                  Base,
9079a179dd8SJung-uk Kim     UINT64                  *RetInteger)
90853289f6aSNate Lawson {
90953289f6aSNate Lawson     UINT32                  Index;
91053289f6aSNate Lawson     UINT32                  Sign;
9119a179dd8SJung-uk Kim     UINT64                  ReturnValue = 0;
91253289f6aSNate Lawson     ACPI_STATUS             Status = AE_OK;
91353289f6aSNate Lawson 
91453289f6aSNate Lawson 
91553289f6aSNate Lawson     *RetInteger = 0;
91653289f6aSNate Lawson 
91753289f6aSNate Lawson     switch (Base)
91853289f6aSNate Lawson     {
91953289f6aSNate Lawson     case 0:
92053289f6aSNate Lawson     case 8:
92153289f6aSNate Lawson     case 10:
92253289f6aSNate Lawson     case 16:
92353289f6aSNate Lawson         break;
92453289f6aSNate Lawson 
92553289f6aSNate Lawson     default:
92653289f6aSNate Lawson         /*
92753289f6aSNate Lawson          * The specified Base parameter is not in the domain of
92853289f6aSNate Lawson          * this function:
92953289f6aSNate Lawson          */
93053289f6aSNate Lawson         return (AE_BAD_PARAMETER);
93153289f6aSNate Lawson     }
93253289f6aSNate Lawson 
933fba7fc7eSJung-uk Kim     /* Skip over any white space in the buffer: */
934fba7fc7eSJung-uk Kim 
9359a179dd8SJung-uk Kim     while (isspace ((int) *String) || *String == '\t')
93653289f6aSNate Lawson     {
93753289f6aSNate Lawson         ++String;
93853289f6aSNate Lawson     }
93953289f6aSNate Lawson 
94053289f6aSNate Lawson     /*
94153289f6aSNate Lawson      * The buffer may contain an optional plus or minus sign.
94253289f6aSNate Lawson      * If it does, then skip over it but remember what is was:
94353289f6aSNate Lawson      */
94453289f6aSNate Lawson     if (*String == '-')
94553289f6aSNate Lawson     {
94653289f6aSNate Lawson         Sign = NEGATIVE;
94753289f6aSNate Lawson         ++String;
94853289f6aSNate Lawson     }
94953289f6aSNate Lawson     else if (*String == '+')
95053289f6aSNate Lawson     {
95153289f6aSNate Lawson         ++String;
95253289f6aSNate Lawson         Sign = POSITIVE;
95353289f6aSNate Lawson     }
95453289f6aSNate Lawson     else
95553289f6aSNate Lawson     {
95653289f6aSNate Lawson         Sign = POSITIVE;
95753289f6aSNate Lawson     }
95853289f6aSNate Lawson 
95953289f6aSNate Lawson     /*
96053289f6aSNate Lawson      * If the input parameter Base is zero, then we need to
96153289f6aSNate Lawson      * determine if it is octal, decimal, or hexadecimal:
96253289f6aSNate Lawson      */
96353289f6aSNate Lawson     if (Base == 0)
96453289f6aSNate Lawson     {
96553289f6aSNate Lawson         if (*String == '0')
96653289f6aSNate Lawson         {
9679a179dd8SJung-uk Kim             if (tolower ((int) *(++String)) == 'x')
96853289f6aSNate Lawson             {
96953289f6aSNate Lawson                 Base = 16;
97053289f6aSNate Lawson                 ++String;
97153289f6aSNate Lawson             }
97253289f6aSNate Lawson             else
97353289f6aSNate Lawson             {
97453289f6aSNate Lawson                 Base = 8;
97553289f6aSNate Lawson             }
97653289f6aSNate Lawson         }
97753289f6aSNate Lawson         else
97853289f6aSNate Lawson         {
97953289f6aSNate Lawson             Base = 10;
98053289f6aSNate Lawson         }
98153289f6aSNate Lawson     }
98253289f6aSNate Lawson 
98353289f6aSNate Lawson     /*
98453289f6aSNate Lawson      * For octal and hexadecimal bases, skip over the leading
98553289f6aSNate Lawson      * 0 or 0x, if they are present.
98653289f6aSNate Lawson      */
98753289f6aSNate Lawson     if (Base == 8 && *String == '0')
98853289f6aSNate Lawson     {
98953289f6aSNate Lawson         String++;
99053289f6aSNate Lawson     }
99153289f6aSNate Lawson 
99253289f6aSNate Lawson     if (Base == 16 &&
99353289f6aSNate Lawson         *String == '0' &&
9949a179dd8SJung-uk Kim         tolower ((int) *(++String)) == 'x')
99553289f6aSNate Lawson     {
99653289f6aSNate Lawson         String++;
99753289f6aSNate Lawson     }
99853289f6aSNate Lawson 
99953289f6aSNate Lawson     /* Main loop: convert the string to an unsigned long */
100053289f6aSNate Lawson 
100153289f6aSNate Lawson     while (*String)
100253289f6aSNate Lawson     {
10039a179dd8SJung-uk Kim         if (isdigit ((int) *String))
100453289f6aSNate Lawson         {
100553289f6aSNate Lawson             Index = ((UINT8) *String) - '0';
100653289f6aSNate Lawson         }
100753289f6aSNate Lawson         else
100853289f6aSNate Lawson         {
10099a179dd8SJung-uk Kim             Index = (UINT8) toupper ((int) *String);
10109a179dd8SJung-uk Kim             if (isupper ((int) Index))
101153289f6aSNate Lawson             {
101253289f6aSNate Lawson                 Index = Index - 'A' + 10;
101353289f6aSNate Lawson             }
101453289f6aSNate Lawson             else
101553289f6aSNate Lawson             {
101653289f6aSNate Lawson                 goto ErrorExit;
101753289f6aSNate Lawson             }
101853289f6aSNate Lawson         }
101953289f6aSNate Lawson 
102053289f6aSNate Lawson         if (Index >= Base)
102153289f6aSNate Lawson         {
102253289f6aSNate Lawson             goto ErrorExit;
102353289f6aSNate Lawson         }
102453289f6aSNate Lawson 
102553289f6aSNate Lawson         /* Check to see if value is out of range: */
102653289f6aSNate Lawson 
10279a179dd8SJung-uk Kim         if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) /
10289a179dd8SJung-uk Kim                             (UINT64) Base))
102953289f6aSNate Lawson         {
103053289f6aSNate Lawson             goto ErrorExit;
103153289f6aSNate Lawson         }
103253289f6aSNate Lawson         else
103353289f6aSNate Lawson         {
103453289f6aSNate Lawson             ReturnValue *= Base;
103553289f6aSNate Lawson             ReturnValue += Index;
103653289f6aSNate Lawson         }
103753289f6aSNate Lawson 
103853289f6aSNate Lawson         ++String;
103953289f6aSNate Lawson     }
104053289f6aSNate Lawson 
104153289f6aSNate Lawson 
1042fba7fc7eSJung-uk Kim     /* If a minus sign was present, then "the conversion is negated": */
1043fba7fc7eSJung-uk Kim 
104453289f6aSNate Lawson     if (Sign == NEGATIVE)
104553289f6aSNate Lawson     {
104653289f6aSNate Lawson         ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
104753289f6aSNate Lawson     }
104853289f6aSNate Lawson 
104953289f6aSNate Lawson     *RetInteger = ReturnValue;
105053289f6aSNate Lawson     return (Status);
105153289f6aSNate Lawson 
105253289f6aSNate Lawson 
105353289f6aSNate Lawson ErrorExit:
105453289f6aSNate Lawson     switch (Base)
105553289f6aSNate Lawson     {
105653289f6aSNate Lawson     case 8:
105753289f6aSNate Lawson         Status = AE_BAD_OCTAL_CONSTANT;
105853289f6aSNate Lawson         break;
105953289f6aSNate Lawson 
106053289f6aSNate Lawson     case 10:
106153289f6aSNate Lawson         Status = AE_BAD_DECIMAL_CONSTANT;
106253289f6aSNate Lawson         break;
106353289f6aSNate Lawson 
106453289f6aSNate Lawson     case 16:
106553289f6aSNate Lawson         Status = AE_BAD_HEX_CONSTANT;
106653289f6aSNate Lawson         break;
106753289f6aSNate Lawson 
106853289f6aSNate Lawson     default:
106953289f6aSNate Lawson         /* Base validated above */
107053289f6aSNate Lawson         break;
107153289f6aSNate Lawson     }
107253289f6aSNate Lawson 
107353289f6aSNate Lawson     return (Status);
107453289f6aSNate Lawson }
107553289f6aSNate Lawson 
107653289f6aSNate Lawson 
1077