xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision 8ef1a33100b9364527b3e522c24b39609e1dae22)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: aslutils -- compiler utilities
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
7d244b227SJung-uk Kim /*
8ec3fc72fSJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
953289f6aSNate Lawson  * All rights reserved.
1053289f6aSNate Lawson  *
11d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
13d244b227SJung-uk Kim  * are met:
14d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16d244b227SJung-uk Kim  *    without modification.
17d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21d244b227SJung-uk Kim  *    binary redistribution.
22d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24d244b227SJung-uk Kim  *    from this software without specific prior written permission.
2553289f6aSNate Lawson  *
26d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28d244b227SJung-uk Kim  * Software Foundation.
2953289f6aSNate Lawson  *
30d244b227SJung-uk Kim  * NO WARRANTY
31d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42d244b227SJung-uk Kim  */
4353289f6aSNate Lawson 
4453289f6aSNate Lawson 
45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
4653289f6aSNate Lawson #include "aslcompiler.y.h"
47a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
503c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
5153289f6aSNate Lawson 
5253289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
5353289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslutils")
5453289f6aSNate Lawson 
553f0275a0SJung-uk Kim 
56fba7fc7eSJung-uk Kim /* Local prototypes */
5753289f6aSNate Lawson 
58fba7fc7eSJung-uk Kim static void
59fba7fc7eSJung-uk Kim UtPadNameWithUnderscores (
60fba7fc7eSJung-uk Kim     char                    *NameSeg,
61fba7fc7eSJung-uk Kim     char                    *PaddedNameSeg);
62fba7fc7eSJung-uk Kim 
63fba7fc7eSJung-uk Kim static void
64fba7fc7eSJung-uk Kim UtAttachNameseg (
65fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
66fba7fc7eSJung-uk Kim     char                    *Name);
6753289f6aSNate Lawson 
6853289f6aSNate Lawson 
6953289f6aSNate Lawson /*******************************************************************************
7053289f6aSNate Lawson  *
71a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
72a88e22b7SJung-uk Kim  *
73a88e22b7SJung-uk Kim  * PARAMETERS:  None
74a88e22b7SJung-uk Kim  *
75a88e22b7SJung-uk Kim  * RETURN:      None
76a88e22b7SJung-uk Kim  *
77a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
78a88e22b7SJung-uk Kim  *
79a88e22b7SJung-uk Kim  ******************************************************************************/
80a88e22b7SJung-uk Kim 
811df130f1SJung-uk Kim #define ACPI_TABLE_HELP_FORMAT  "%8u) %s    %s\n"
821df130f1SJung-uk Kim 
83a88e22b7SJung-uk Kim void
84a88e22b7SJung-uk Kim UtDisplaySupportedTables (
85a88e22b7SJung-uk Kim     void)
86a88e22b7SJung-uk Kim {
87a88e22b7SJung-uk Kim     ACPI_DMTABLE_DATA       *TableData;
881df130f1SJung-uk Kim     UINT32                  i;
89a88e22b7SJung-uk Kim 
90a88e22b7SJung-uk Kim 
911df130f1SJung-uk Kim     printf ("\nACPI tables supported by iASL version %8.8X:\n"
921df130f1SJung-uk Kim         "  (Compiler, Disassembler, Template Generator)\n\n",
931df130f1SJung-uk Kim         ACPI_CA_VERSION);
94a88e22b7SJung-uk Kim 
95a88e22b7SJung-uk Kim     /* Special tables */
96a88e22b7SJung-uk Kim 
971df130f1SJung-uk Kim     printf ("  Special tables and AML tables:\n");
981df130f1SJung-uk Kim     printf (ACPI_TABLE_HELP_FORMAT, 1, ACPI_RSDP_NAME, "Root System Description Pointer");
991df130f1SJung-uk Kim     printf (ACPI_TABLE_HELP_FORMAT, 2, ACPI_SIG_FACS, "Firmware ACPI Control Structure");
1001df130f1SJung-uk Kim     printf (ACPI_TABLE_HELP_FORMAT, 3, ACPI_SIG_DSDT, "Differentiated System Description Table");
1011df130f1SJung-uk Kim     printf (ACPI_TABLE_HELP_FORMAT, 4, ACPI_SIG_SSDT, "Secondary System Description Table");
102a88e22b7SJung-uk Kim 
103a88e22b7SJung-uk Kim     /* All data tables with common table header */
104a88e22b7SJung-uk Kim 
1051df130f1SJung-uk Kim     printf ("\n  Standard ACPI data tables:\n");
1061df130f1SJung-uk Kim     for (TableData = AcpiDmTableData, i = 5; TableData->Signature; TableData++, i++)
107a88e22b7SJung-uk Kim     {
1081df130f1SJung-uk Kim         printf (ACPI_TABLE_HELP_FORMAT, i, TableData->Signature, TableData->Name);
109a88e22b7SJung-uk Kim     }
110a88e22b7SJung-uk Kim }
111a88e22b7SJung-uk Kim 
112a88e22b7SJung-uk Kim 
113a88e22b7SJung-uk Kim /*******************************************************************************
114a88e22b7SJung-uk Kim  *
115f38b0f21SJung-uk Kim  * FUNCTION:    UtDisplayConstantOpcodes
11653289f6aSNate Lawson  *
11753289f6aSNate Lawson  * PARAMETERS:  None
11853289f6aSNate Lawson  *
11953289f6aSNate Lawson  * RETURN:      None
12053289f6aSNate Lawson  *
12153289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
12253289f6aSNate Lawson  *
12353289f6aSNate Lawson  ******************************************************************************/
12453289f6aSNate Lawson 
12553289f6aSNate Lawson void
12653289f6aSNate Lawson UtDisplayConstantOpcodes (
12753289f6aSNate Lawson     void)
12853289f6aSNate Lawson {
12953289f6aSNate Lawson     UINT32                  i;
13053289f6aSNate Lawson 
131fba7fc7eSJung-uk Kim 
13253289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
13353289f6aSNate Lawson 
13453289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
13553289f6aSNate Lawson     {
13653289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
13753289f6aSNate Lawson         {
13853289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
13953289f6aSNate Lawson         }
14053289f6aSNate Lawson     }
14153289f6aSNate Lawson }
14253289f6aSNate Lawson 
14353289f6aSNate Lawson 
14453289f6aSNate Lawson /*******************************************************************************
14553289f6aSNate Lawson  *
14653289f6aSNate Lawson  * FUNCTION:    UtLocalCalloc
14753289f6aSNate Lawson  *
14853289f6aSNate Lawson  * PARAMETERS:  Size                - Bytes to be allocated
14953289f6aSNate Lawson  *
15053289f6aSNate Lawson  * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
15153289f6aSNate Lawson  *
15253289f6aSNate Lawson  * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
15353289f6aSNate Lawson  *              allocation failure, on the assumption that nothing more can be
15453289f6aSNate Lawson  *              accomplished.
15553289f6aSNate Lawson  *
15653289f6aSNate Lawson  ******************************************************************************/
15753289f6aSNate Lawson 
15853289f6aSNate Lawson void *
15953289f6aSNate Lawson UtLocalCalloc (
16053289f6aSNate Lawson     UINT32                  Size)
16153289f6aSNate Lawson {
16253289f6aSNate Lawson     void                    *Allocated;
16353289f6aSNate Lawson 
16453289f6aSNate Lawson 
1651a39cfb0SJung-uk Kim     Allocated = ACPI_ALLOCATE_ZEROED (Size);
16653289f6aSNate Lawson     if (!Allocated)
16753289f6aSNate Lawson     {
16853289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
16953289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
17053289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
17153289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
172a88e22b7SJung-uk Kim 
173a88e22b7SJung-uk Kim         CmCleanupAndExit ();
17453289f6aSNate Lawson         exit (1);
17553289f6aSNate Lawson     }
17653289f6aSNate Lawson 
17753289f6aSNate Lawson     TotalAllocations++;
17853289f6aSNate Lawson     TotalAllocated += Size;
1791a39cfb0SJung-uk Kim     return (Allocated);
18053289f6aSNate Lawson }
18153289f6aSNate Lawson 
18253289f6aSNate Lawson 
18353289f6aSNate Lawson /*******************************************************************************
18453289f6aSNate Lawson  *
18553289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
18653289f6aSNate Lawson  *
187fba7fc7eSJung-uk Kim  * PARAMETERS:  Name                - Ascii name of this event
18853289f6aSNate Lawson  *
189f38b0f21SJung-uk Kim  * RETURN:      Event number (integer index)
19053289f6aSNate Lawson  *
19153289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
19253289f6aSNate Lawson  *
19353289f6aSNate Lawson  ******************************************************************************/
19453289f6aSNate Lawson 
195fba7fc7eSJung-uk Kim UINT8
19653289f6aSNate Lawson UtBeginEvent (
19753289f6aSNate Lawson     char                    *Name)
19853289f6aSNate Lawson {
19953289f6aSNate Lawson 
200fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
201fba7fc7eSJung-uk Kim     {
202fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
203fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
204fba7fc7eSJung-uk Kim     }
205fba7fc7eSJung-uk Kim 
206fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
207fba7fc7eSJung-uk Kim 
208fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
209fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
210fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
211fba7fc7eSJung-uk Kim 
212fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
21353289f6aSNate Lawson }
21453289f6aSNate Lawson 
21553289f6aSNate Lawson 
21653289f6aSNate Lawson /*******************************************************************************
21753289f6aSNate Lawson  *
21853289f6aSNate Lawson  * FUNCTION:    UtEndEvent
21953289f6aSNate Lawson  *
22053289f6aSNate Lawson  * PARAMETERS:  Event               - Event number (integer index)
22153289f6aSNate Lawson  *
22253289f6aSNate Lawson  * RETURN:      None
22353289f6aSNate Lawson  *
22453289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
22553289f6aSNate Lawson  *
22653289f6aSNate Lawson  ******************************************************************************/
22753289f6aSNate Lawson 
22853289f6aSNate Lawson void
22953289f6aSNate Lawson UtEndEvent (
230fba7fc7eSJung-uk Kim     UINT8                   Event)
23153289f6aSNate Lawson {
23253289f6aSNate Lawson 
233fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
234fba7fc7eSJung-uk Kim     {
235fba7fc7eSJung-uk Kim         return;
236fba7fc7eSJung-uk Kim     }
237fba7fc7eSJung-uk Kim 
238fba7fc7eSJung-uk Kim     /* Insert end time for event */
239fba7fc7eSJung-uk Kim 
240fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
24153289f6aSNate Lawson }
24253289f6aSNate Lawson 
24353289f6aSNate Lawson 
24453289f6aSNate Lawson /*******************************************************************************
24553289f6aSNate Lawson  *
24653289f6aSNate Lawson  * FUNCTION:    UtHexCharToValue
24753289f6aSNate Lawson  *
248fba7fc7eSJung-uk Kim  * PARAMETERS:  HexChar             - Hex character in Ascii
24953289f6aSNate Lawson  *
25053289f6aSNate Lawson  * RETURN:      The binary value of the hex character
25153289f6aSNate Lawson  *
25253289f6aSNate Lawson  * DESCRIPTION: Perform ascii-to-hex translation
25353289f6aSNate Lawson  *
25453289f6aSNate Lawson  ******************************************************************************/
25553289f6aSNate Lawson 
25653289f6aSNate Lawson UINT8
25753289f6aSNate Lawson UtHexCharToValue (
258fba7fc7eSJung-uk Kim     int                     HexChar)
25953289f6aSNate Lawson {
26053289f6aSNate Lawson 
261fba7fc7eSJung-uk Kim     if (HexChar <= 0x39)
26253289f6aSNate Lawson     {
263fba7fc7eSJung-uk Kim         return ((UINT8) (HexChar - 0x30));
26453289f6aSNate Lawson     }
26553289f6aSNate Lawson 
266fba7fc7eSJung-uk Kim     if (HexChar <= 0x46)
26753289f6aSNate Lawson     {
268fba7fc7eSJung-uk Kim         return ((UINT8) (HexChar - 0x37));
26953289f6aSNate Lawson     }
27053289f6aSNate Lawson 
271fba7fc7eSJung-uk Kim     return ((UINT8) (HexChar - 0x57));
27253289f6aSNate Lawson }
27353289f6aSNate Lawson 
27453289f6aSNate Lawson 
27553289f6aSNate Lawson /*******************************************************************************
27653289f6aSNate Lawson  *
27753289f6aSNate Lawson  * FUNCTION:    UtConvertByteToHex
27853289f6aSNate Lawson  *
27953289f6aSNate Lawson  * PARAMETERS:  RawByte             - Binary data
280f38b0f21SJung-uk Kim  *              Buffer              - Pointer to where the hex bytes will be
281f38b0f21SJung-uk Kim  *                                    stored
28253289f6aSNate Lawson  *
28353289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
28453289f6aSNate Lawson  *
28553289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
28653289f6aSNate Lawson  *              with "0x"
28753289f6aSNate Lawson  *
28853289f6aSNate Lawson  ******************************************************************************/
28953289f6aSNate Lawson 
29053289f6aSNate Lawson void
29153289f6aSNate Lawson UtConvertByteToHex (
29253289f6aSNate Lawson     UINT8                   RawByte,
29353289f6aSNate Lawson     UINT8                   *Buffer)
29453289f6aSNate Lawson {
29553289f6aSNate Lawson 
29653289f6aSNate Lawson     Buffer[0] = '0';
29753289f6aSNate Lawson     Buffer[1] = 'x';
29853289f6aSNate Lawson 
299d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
300d244b227SJung-uk Kim     Buffer[3] = (UINT8) AslHexLookup[RawByte & 0xF];
30153289f6aSNate Lawson }
30253289f6aSNate Lawson 
30353289f6aSNate Lawson 
30453289f6aSNate Lawson /*******************************************************************************
30553289f6aSNate Lawson  *
30653289f6aSNate Lawson  * FUNCTION:    UtConvertByteToAsmHex
30753289f6aSNate Lawson  *
30853289f6aSNate Lawson  * PARAMETERS:  RawByte             - Binary data
309f38b0f21SJung-uk Kim  *              Buffer              - Pointer to where the hex bytes will be
310f38b0f21SJung-uk Kim  *                                    stored
31153289f6aSNate Lawson  *
31253289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
31353289f6aSNate Lawson  *
31453289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
31553289f6aSNate Lawson  *              with "0x"
31653289f6aSNate Lawson  *
31753289f6aSNate Lawson  ******************************************************************************/
31853289f6aSNate Lawson 
31953289f6aSNate Lawson void
32053289f6aSNate Lawson UtConvertByteToAsmHex (
32153289f6aSNate Lawson     UINT8                   RawByte,
32253289f6aSNate Lawson     UINT8                   *Buffer)
32353289f6aSNate Lawson {
32453289f6aSNate Lawson 
32553289f6aSNate Lawson     Buffer[0] = '0';
326d244b227SJung-uk Kim     Buffer[1] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
327d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[RawByte & 0xF];
32853289f6aSNate Lawson     Buffer[3] = 'h';
32953289f6aSNate Lawson }
33053289f6aSNate Lawson 
33153289f6aSNate Lawson 
33253289f6aSNate Lawson /*******************************************************************************
33353289f6aSNate Lawson  *
33453289f6aSNate Lawson  * FUNCTION:    DbgPrint
33553289f6aSNate Lawson  *
336fba7fc7eSJung-uk Kim  * PARAMETERS:  Type                - Type of output
337fba7fc7eSJung-uk Kim  *              Fmt                 - Printf format string
33853289f6aSNate Lawson  *              ...                 - variable printf list
33953289f6aSNate Lawson  *
34053289f6aSNate Lawson  * RETURN:      None
34153289f6aSNate Lawson  *
34253289f6aSNate Lawson  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
34353289f6aSNate Lawson  *              debug flag is set.
34453289f6aSNate Lawson  *
34553289f6aSNate Lawson  ******************************************************************************/
34653289f6aSNate Lawson 
34753289f6aSNate Lawson void
34853289f6aSNate Lawson DbgPrint (
34953289f6aSNate Lawson     UINT32                  Type,
35053289f6aSNate Lawson     char                    *Fmt,
35153289f6aSNate Lawson     ...)
35253289f6aSNate Lawson {
35353289f6aSNate Lawson     va_list                 Args;
35453289f6aSNate Lawson 
35553289f6aSNate Lawson 
35653289f6aSNate Lawson     va_start (Args, Fmt);
35753289f6aSNate Lawson 
35853289f6aSNate Lawson     if (!Gbl_DebugFlag)
35953289f6aSNate Lawson     {
36053289f6aSNate Lawson         return;
36153289f6aSNate Lawson     }
36253289f6aSNate Lawson 
36353289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
36453289f6aSNate Lawson         (!(AslCompilerdebug)))
36553289f6aSNate Lawson     {
36653289f6aSNate Lawson         return;
36753289f6aSNate Lawson     }
36853289f6aSNate Lawson 
36953289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
37053289f6aSNate Lawson     va_end (Args);
37153289f6aSNate Lawson     return;
37253289f6aSNate Lawson }
37353289f6aSNate Lawson 
37453289f6aSNate Lawson 
37553289f6aSNate Lawson /*******************************************************************************
37653289f6aSNate Lawson  *
37753289f6aSNate Lawson  * FUNCTION:    UtPrintFormattedName
37853289f6aSNate Lawson  *
37953289f6aSNate Lawson  * PARAMETERS:  ParseOpcode         - Parser keyword ID
38053289f6aSNate Lawson  *              Level               - Indentation level
38153289f6aSNate Lawson  *
38253289f6aSNate Lawson  * RETURN:      None
38353289f6aSNate Lawson  *
38453289f6aSNate Lawson  * DESCRIPTION: Print the ascii name of the parse opcode.
38553289f6aSNate Lawson  *
38653289f6aSNate Lawson  ******************************************************************************/
38753289f6aSNate Lawson 
38853289f6aSNate Lawson #define TEXT_OFFSET 10
38953289f6aSNate Lawson 
39053289f6aSNate Lawson void
39153289f6aSNate Lawson UtPrintFormattedName (
39253289f6aSNate Lawson     UINT16                  ParseOpcode,
39353289f6aSNate Lawson     UINT32                  Level)
39453289f6aSNate Lawson {
39553289f6aSNate Lawson 
3961a39cfb0SJung-uk Kim     if (Level)
3971a39cfb0SJung-uk Kim     {
39853289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
3991a39cfb0SJung-uk Kim             "%*s", (3 * Level), " ");
4001a39cfb0SJung-uk Kim     }
4011a39cfb0SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT,
4021a39cfb0SJung-uk Kim         " %-20.20s", UtGetOpName (ParseOpcode));
40353289f6aSNate Lawson 
40453289f6aSNate Lawson     if (Level < TEXT_OFFSET)
40553289f6aSNate Lawson     {
40653289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
40753289f6aSNate Lawson             "%*s", (TEXT_OFFSET - Level) * 3, " ");
40853289f6aSNate Lawson     }
40953289f6aSNate Lawson }
41053289f6aSNate Lawson 
41153289f6aSNate Lawson 
41253289f6aSNate Lawson /*******************************************************************************
41353289f6aSNate Lawson  *
41453289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
41553289f6aSNate Lawson  *
416f38b0f21SJung-uk Kim  * PARAMETERS:  Op                  - Parse op to be named.
41753289f6aSNate Lawson  *
41853289f6aSNate Lawson  * RETURN:      None
41953289f6aSNate Lawson  *
42053289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
42153289f6aSNate Lawson  *
42253289f6aSNate Lawson  ******************************************************************************/
42353289f6aSNate Lawson 
42453289f6aSNate Lawson void
42553289f6aSNate Lawson UtSetParseOpName (
42653289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
42753289f6aSNate Lawson {
428fba7fc7eSJung-uk Kim 
4291a39cfb0SJung-uk Kim     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
4301a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
43153289f6aSNate Lawson }
43253289f6aSNate Lawson 
43353289f6aSNate Lawson 
43453289f6aSNate Lawson /*******************************************************************************
43553289f6aSNate Lawson  *
43653289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
43753289f6aSNate Lawson  *
438fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
43953289f6aSNate Lawson  *
44053289f6aSNate Lawson  * RETURN:      None
44153289f6aSNate Lawson  *
44253289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
44353289f6aSNate Lawson  *
44453289f6aSNate Lawson  ******************************************************************************/
44553289f6aSNate Lawson 
44653289f6aSNate Lawson void
44753289f6aSNate Lawson UtDisplaySummary (
44853289f6aSNate Lawson     UINT32                  FileId)
44953289f6aSNate Lawson {
4503f0275a0SJung-uk Kim     UINT32                  i;
4513f0275a0SJung-uk Kim 
45253289f6aSNate Lawson 
45353289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
45453289f6aSNate Lawson     {
45553289f6aSNate Lawson         /* Compiler name and version number */
45653289f6aSNate Lawson 
4573f0275a0SJung-uk Kim         FlPrintFile (FileId, "%s version %X%s\n\n",
4583c1812acSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH);
45953289f6aSNate Lawson     }
46053289f6aSNate Lawson 
4613f0275a0SJung-uk Kim     /* Summary of main input and output files */
4623f0275a0SJung-uk Kim 
463a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
464a88e22b7SJung-uk Kim     {
465a88e22b7SJung-uk Kim         FlPrintFile (FileId,
4663f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u fields\n",
4673f0275a0SJung-uk Kim             "Table Input:",
468a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
469a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
470a88e22b7SJung-uk Kim 
471a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
472a88e22b7SJung-uk Kim         {
473a88e22b7SJung-uk Kim             FlPrintFile (FileId,
4743f0275a0SJung-uk Kim                 "%-14s %s - %u bytes\n",
4753f0275a0SJung-uk Kim                 "Binary Output:",
476a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
477a88e22b7SJung-uk Kim         }
478a88e22b7SJung-uk Kim     }
479a88e22b7SJung-uk Kim     else
480a88e22b7SJung-uk Kim     {
48153289f6aSNate Lawson         FlPrintFile (FileId,
4823f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u keywords\n",
4833f0275a0SJung-uk Kim             "ASL Input:",
48453289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
48553289f6aSNate Lawson             Gbl_InputByteCount, TotalKeywords);
48653289f6aSNate Lawson 
48753289f6aSNate Lawson         /* AML summary */
48853289f6aSNate Lawson 
48953289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
49053289f6aSNate Lawson         {
49153289f6aSNate Lawson             FlPrintFile (FileId,
4923f0275a0SJung-uk Kim                 "%-14s %s - %u bytes, %u named objects, %u executable opcodes\n",
4933f0275a0SJung-uk Kim                 "AML Output:",
49453289f6aSNate Lawson                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,
49553289f6aSNate Lawson                 TotalNamedObjects, TotalExecutableOpcodes);
49653289f6aSNate Lawson         }
497a88e22b7SJung-uk Kim     }
49853289f6aSNate Lawson 
4993f0275a0SJung-uk Kim     /* Display summary of any optional files */
5003f0275a0SJung-uk Kim 
5013f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
5023f0275a0SJung-uk Kim     {
5033f0275a0SJung-uk Kim         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
5043f0275a0SJung-uk Kim         {
5053f0275a0SJung-uk Kim             continue;
5063f0275a0SJung-uk Kim         }
5073f0275a0SJung-uk Kim 
5083f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
5093f0275a0SJung-uk Kim 
5103f0275a0SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
5113f0275a0SJung-uk Kim         {
5123f0275a0SJung-uk Kim             continue;
5133f0275a0SJung-uk Kim         }
5143f0275a0SJung-uk Kim 
5154c52cad2SJung-uk Kim         /* .I is a temp file unless specifically requested */
5164c52cad2SJung-uk Kim 
5174c52cad2SJung-uk Kim         if ((i == ASL_FILE_PREPROCESSOR) && (!Gbl_PreprocessorOutputFlag))
5184c52cad2SJung-uk Kim         {
5194c52cad2SJung-uk Kim             continue;
5204c52cad2SJung-uk Kim         }
5214c52cad2SJung-uk Kim 
5223f0275a0SJung-uk Kim         FlPrintFile (FileId, "%14s %s - %u bytes\n",
523042ff955SJung-uk Kim             Gbl_Files[i].ShortDescription,
5243f0275a0SJung-uk Kim             Gbl_Files[i].Filename, FlGetFileSize (i));
5253f0275a0SJung-uk Kim     }
5263f0275a0SJung-uk Kim 
52753289f6aSNate Lawson     /* Error summary */
52853289f6aSNate Lawson 
52953289f6aSNate Lawson     FlPrintFile (FileId,
5303f0275a0SJung-uk Kim         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
53153289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
5321a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
5331a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
5341a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
535a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
536a88e22b7SJung-uk Kim 
537a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
538a88e22b7SJung-uk Kim     {
539a88e22b7SJung-uk Kim         FlPrintFile (FileId,
540a88e22b7SJung-uk Kim             ", %u Optimizations", Gbl_ExceptionCount[ASL_OPTIMIZATION]);
541a88e22b7SJung-uk Kim     }
542a88e22b7SJung-uk Kim 
543a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
54453289f6aSNate Lawson }
54553289f6aSNate Lawson 
54653289f6aSNate Lawson 
54753289f6aSNate Lawson /*******************************************************************************
54853289f6aSNate Lawson  *
549f38b0f21SJung-uk Kim  * FUNCTION:    UtCheckIntegerRange
55053289f6aSNate Lawson  *
55153289f6aSNate Lawson  * PARAMETERS:  Op                  - Integer parse node
55253289f6aSNate Lawson  *              LowValue            - Smallest allowed value
55353289f6aSNate Lawson  *              HighValue           - Largest allowed value
55453289f6aSNate Lawson  *
55553289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
55653289f6aSNate Lawson  *
55753289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
55853289f6aSNate Lawson  *
55953289f6aSNate Lawson  ******************************************************************************/
56053289f6aSNate Lawson 
56153289f6aSNate Lawson ACPI_PARSE_OBJECT *
56253289f6aSNate Lawson UtCheckIntegerRange (
56353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
56453289f6aSNate Lawson     UINT32                  LowValue,
56553289f6aSNate Lawson     UINT32                  HighValue)
56653289f6aSNate Lawson {
56753289f6aSNate Lawson 
56853289f6aSNate Lawson     if (!Op)
56953289f6aSNate Lawson     {
570*8ef1a331SJung-uk Kim         return (NULL);
57153289f6aSNate Lawson     }
57253289f6aSNate Lawson 
5731df130f1SJung-uk Kim     if ((Op->Asl.Value.Integer < LowValue) ||
5741df130f1SJung-uk Kim         (Op->Asl.Value.Integer > HighValue))
57553289f6aSNate Lawson     {
5761df130f1SJung-uk Kim         sprintf (MsgBuffer, "0x%X, allowable: 0x%X-0x%X",
5771df130f1SJung-uk Kim             (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
5781df130f1SJung-uk Kim 
5791df130f1SJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RANGE, Op, MsgBuffer);
5801df130f1SJung-uk Kim         return (NULL);
58153289f6aSNate Lawson     }
58253289f6aSNate Lawson 
5831df130f1SJung-uk Kim     return (Op);
58453289f6aSNate Lawson }
58553289f6aSNate Lawson 
58653289f6aSNate Lawson 
58753289f6aSNate Lawson /*******************************************************************************
58853289f6aSNate Lawson  *
58953289f6aSNate Lawson  * FUNCTION:    UtGetStringBuffer
59053289f6aSNate Lawson  *
59153289f6aSNate Lawson  * PARAMETERS:  Length              - Size of buffer requested
59253289f6aSNate Lawson  *
59353289f6aSNate Lawson  * RETURN:      Pointer to the buffer. Aborts on allocation failure
59453289f6aSNate Lawson  *
59553289f6aSNate Lawson  * DESCRIPTION: Allocate a string buffer. Bypass the local
59653289f6aSNate Lawson  *              dynamic memory manager for performance reasons (This has a
59753289f6aSNate Lawson  *              major impact on the speed of the compiler.)
59853289f6aSNate Lawson  *
59953289f6aSNate Lawson  ******************************************************************************/
60053289f6aSNate Lawson 
60153289f6aSNate Lawson char *
60253289f6aSNate Lawson UtGetStringBuffer (
60353289f6aSNate Lawson     UINT32                  Length)
60453289f6aSNate Lawson {
60553289f6aSNate Lawson     char                    *Buffer;
60653289f6aSNate Lawson 
60753289f6aSNate Lawson 
60853289f6aSNate Lawson     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
60953289f6aSNate Lawson     {
61053289f6aSNate Lawson         Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length);
611fba7fc7eSJung-uk Kim         Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE +
612fba7fc7eSJung-uk Kim                                 Length;
61353289f6aSNate Lawson     }
61453289f6aSNate Lawson 
61553289f6aSNate Lawson     Buffer = Gbl_StringCacheNext;
61653289f6aSNate Lawson     Gbl_StringCacheNext += Length;
61753289f6aSNate Lawson 
61853289f6aSNate Lawson     return (Buffer);
61953289f6aSNate Lawson }
62053289f6aSNate Lawson 
62153289f6aSNate Lawson 
622042ff955SJung-uk Kim /******************************************************************************
623042ff955SJung-uk Kim  *
624042ff955SJung-uk Kim  * FUNCTION:    UtExpandLineBuffers
625042ff955SJung-uk Kim  *
626042ff955SJung-uk Kim  * PARAMETERS:  None. Updates global line buffer pointers.
627042ff955SJung-uk Kim  *
628042ff955SJung-uk Kim  * RETURN:      None. Reallocates the global line buffers
629042ff955SJung-uk Kim  *
630042ff955SJung-uk Kim  * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates
631042ff955SJung-uk Kim  *              all global line buffers and updates Gbl_LineBufferSize. NOTE:
632042ff955SJung-uk Kim  *              Also used for the initial allocation of the buffers, when
633042ff955SJung-uk Kim  *              all of the buffer pointers are NULL. Initial allocations are
634042ff955SJung-uk Kim  *              of size ASL_DEFAULT_LINE_BUFFER_SIZE
635042ff955SJung-uk Kim  *
636042ff955SJung-uk Kim  *****************************************************************************/
637042ff955SJung-uk Kim 
638042ff955SJung-uk Kim void
639042ff955SJung-uk Kim UtExpandLineBuffers (
640042ff955SJung-uk Kim     void)
641042ff955SJung-uk Kim {
642042ff955SJung-uk Kim     UINT32                  NewSize;
643042ff955SJung-uk Kim 
644042ff955SJung-uk Kim 
645042ff955SJung-uk Kim     /* Attempt to double the size of all line buffers */
646042ff955SJung-uk Kim 
647042ff955SJung-uk Kim     NewSize = Gbl_LineBufferSize * 2;
648042ff955SJung-uk Kim     if (Gbl_CurrentLineBuffer)
649042ff955SJung-uk Kim     {
650042ff955SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT,"Increasing line buffer size from %u to %u\n",
651042ff955SJung-uk Kim             Gbl_LineBufferSize, NewSize);
652042ff955SJung-uk Kim     }
653042ff955SJung-uk Kim 
654042ff955SJung-uk Kim     Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
655042ff955SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
656042ff955SJung-uk Kim     if (!Gbl_CurrentLineBuffer)
657042ff955SJung-uk Kim     {
658042ff955SJung-uk Kim         goto ErrorExit;
659042ff955SJung-uk Kim     }
660042ff955SJung-uk Kim 
661042ff955SJung-uk Kim     Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
662042ff955SJung-uk Kim     if (!Gbl_MainTokenBuffer)
663042ff955SJung-uk Kim     {
664042ff955SJung-uk Kim         goto ErrorExit;
665042ff955SJung-uk Kim     }
666042ff955SJung-uk Kim 
667042ff955SJung-uk Kim     Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
668042ff955SJung-uk Kim     if (!Gbl_MacroTokenBuffer)
669042ff955SJung-uk Kim     {
670042ff955SJung-uk Kim         goto ErrorExit;
671042ff955SJung-uk Kim     }
672042ff955SJung-uk Kim 
673042ff955SJung-uk Kim     Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
674042ff955SJung-uk Kim     if (!Gbl_ExpressionTokenBuffer)
675042ff955SJung-uk Kim     {
676042ff955SJung-uk Kim         goto ErrorExit;
677042ff955SJung-uk Kim     }
678042ff955SJung-uk Kim 
679042ff955SJung-uk Kim     Gbl_LineBufferSize = NewSize;
680042ff955SJung-uk Kim     return;
681042ff955SJung-uk Kim 
682042ff955SJung-uk Kim 
683042ff955SJung-uk Kim     /* On error above, simply issue error messages and abort, cannot continue */
684042ff955SJung-uk Kim 
685042ff955SJung-uk Kim ErrorExit:
686042ff955SJung-uk Kim     printf ("Could not increase line buffer size from %u to %u\n",
687042ff955SJung-uk Kim         Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
688042ff955SJung-uk Kim 
689042ff955SJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
690042ff955SJung-uk Kim         NULL, NULL);
691042ff955SJung-uk Kim     AslAbort ();
692042ff955SJung-uk Kim }
693042ff955SJung-uk Kim 
694042ff955SJung-uk Kim 
69553289f6aSNate Lawson /*******************************************************************************
69653289f6aSNate Lawson  *
69753289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
69853289f6aSNate Lawson  *
69953289f6aSNate Lawson  * PARAMETERS:  ExternalName        - Name to convert
70053289f6aSNate Lawson  *              ConvertedName       - Where the converted name is returned
70153289f6aSNate Lawson  *
70253289f6aSNate Lawson  * RETURN:      Status
70353289f6aSNate Lawson  *
70453289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
70553289f6aSNate Lawson  *
70653289f6aSNate Lawson  ******************************************************************************/
70753289f6aSNate Lawson 
70853289f6aSNate Lawson ACPI_STATUS
70953289f6aSNate Lawson UtInternalizeName (
71053289f6aSNate Lawson     char                    *ExternalName,
71153289f6aSNate Lawson     char                    **ConvertedName)
71253289f6aSNate Lawson {
71353289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
71453289f6aSNate Lawson     ACPI_STATUS             Status;
71553289f6aSNate Lawson 
71653289f6aSNate Lawson 
71753289f6aSNate Lawson     if (!ExternalName)
71853289f6aSNate Lawson     {
71953289f6aSNate Lawson         return (AE_OK);
72053289f6aSNate Lawson     }
72153289f6aSNate Lawson 
72253289f6aSNate Lawson     /* Get the length of the new internal name */
72353289f6aSNate Lawson 
72453289f6aSNate Lawson     Info.ExternalName = ExternalName;
72553289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
72653289f6aSNate Lawson 
72753289f6aSNate Lawson     /* We need a segment to store the internal  name */
72853289f6aSNate Lawson 
72953289f6aSNate Lawson     Info.InternalName = UtGetStringBuffer (Info.Length);
73053289f6aSNate Lawson     if (!Info.InternalName)
73153289f6aSNate Lawson     {
73253289f6aSNate Lawson         return (AE_NO_MEMORY);
73353289f6aSNate Lawson     }
73453289f6aSNate Lawson 
73553289f6aSNate Lawson     /* Build the name */
73653289f6aSNate Lawson 
73753289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
73853289f6aSNate Lawson     if (ACPI_FAILURE (Status))
73953289f6aSNate Lawson     {
74053289f6aSNate Lawson         return (Status);
74153289f6aSNate Lawson     }
74253289f6aSNate Lawson 
74353289f6aSNate Lawson     *ConvertedName = Info.InternalName;
74453289f6aSNate Lawson     return (AE_OK);
74553289f6aSNate Lawson }
74653289f6aSNate Lawson 
74753289f6aSNate Lawson 
74853289f6aSNate Lawson /*******************************************************************************
74953289f6aSNate Lawson  *
75053289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
75153289f6aSNate Lawson  *
75253289f6aSNate Lawson  * PARAMETERS:  NameSeg             - Input nameseg
75353289f6aSNate Lawson  *              PaddedNameSeg       - Output padded nameseg
75453289f6aSNate Lawson  *
75553289f6aSNate Lawson  * RETURN:      Padded nameseg.
75653289f6aSNate Lawson  *
75753289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
75853289f6aSNate Lawson  *              ACPI_NAME.
75953289f6aSNate Lawson  *
76053289f6aSNate Lawson  ******************************************************************************/
76153289f6aSNate Lawson 
762fba7fc7eSJung-uk Kim static void
76353289f6aSNate Lawson UtPadNameWithUnderscores (
76453289f6aSNate Lawson     char                    *NameSeg,
76553289f6aSNate Lawson     char                    *PaddedNameSeg)
76653289f6aSNate Lawson {
76753289f6aSNate Lawson     UINT32                  i;
76853289f6aSNate Lawson 
76953289f6aSNate Lawson 
77053289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
77153289f6aSNate Lawson     {
77253289f6aSNate Lawson         if (*NameSeg)
77353289f6aSNate Lawson         {
77453289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
77553289f6aSNate Lawson             NameSeg++;
77653289f6aSNate Lawson         }
77753289f6aSNate Lawson         else
77853289f6aSNate Lawson         {
77953289f6aSNate Lawson             *PaddedNameSeg = '_';
78053289f6aSNate Lawson         }
78153289f6aSNate Lawson         PaddedNameSeg++;
78253289f6aSNate Lawson     }
78353289f6aSNate Lawson }
78453289f6aSNate Lawson 
78553289f6aSNate Lawson 
78653289f6aSNate Lawson /*******************************************************************************
78753289f6aSNate Lawson  *
78853289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
78953289f6aSNate Lawson  *
79053289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
79153289f6aSNate Lawson  *              Name                - Full ExternalName
79253289f6aSNate Lawson  *
793fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
79453289f6aSNate Lawson  *
79553289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
79653289f6aSNate Lawson  *              in the NameSeg field of the Op.
79753289f6aSNate Lawson  *
79853289f6aSNate Lawson  ******************************************************************************/
79953289f6aSNate Lawson 
800fba7fc7eSJung-uk Kim static void
80153289f6aSNate Lawson UtAttachNameseg (
80253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
80353289f6aSNate Lawson     char                    *Name)
80453289f6aSNate Lawson {
80553289f6aSNate Lawson     char                    *NameSeg;
80653289f6aSNate Lawson     char                    PaddedNameSeg[4];
80753289f6aSNate Lawson 
80853289f6aSNate Lawson 
80953289f6aSNate Lawson     if (!Name)
81053289f6aSNate Lawson     {
81153289f6aSNate Lawson         return;
81253289f6aSNate Lawson     }
81353289f6aSNate Lawson 
81453289f6aSNate Lawson     /* Look for the last dot in the namepath */
81553289f6aSNate Lawson 
81653289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
81753289f6aSNate Lawson     if (NameSeg)
81853289f6aSNate Lawson     {
81953289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
82053289f6aSNate Lawson 
82153289f6aSNate Lawson         NameSeg++;
82253289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
82353289f6aSNate Lawson     }
82453289f6aSNate Lawson     else
82553289f6aSNate Lawson     {
82653289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
82753289f6aSNate Lawson         /* Handle prefixes */
82853289f6aSNate Lawson 
82953289f6aSNate Lawson         while ((*Name == '\\') || (*Name == '^'))
83053289f6aSNate Lawson         {
83153289f6aSNate Lawson             Name++;
83253289f6aSNate Lawson         }
83353289f6aSNate Lawson 
834*8ef1a331SJung-uk Kim         /* Remaining string should be one single nameseg */
83553289f6aSNate Lawson 
83653289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
83753289f6aSNate Lawson     }
83853289f6aSNate Lawson 
839*8ef1a331SJung-uk Kim     ACPI_MOVE_NAME (Op->Asl.NameSeg, PaddedNameSeg);
84053289f6aSNate Lawson }
84153289f6aSNate Lawson 
84253289f6aSNate Lawson 
84353289f6aSNate Lawson /*******************************************************************************
84453289f6aSNate Lawson  *
84553289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
84653289f6aSNate Lawson  *
84753289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
84853289f6aSNate Lawson  *              NameOp              - Node that contains the name
84953289f6aSNate Lawson  *
85053289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
85153289f6aSNate Lawson  *
85253289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node: The original
85353289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
85453289f6aSNate Lawson  *              the ACPI namespace manager.
85553289f6aSNate Lawson  *
85653289f6aSNate Lawson  ******************************************************************************/
85753289f6aSNate Lawson 
85853289f6aSNate Lawson void
85953289f6aSNate Lawson UtAttachNamepathToOwner (
86053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
86153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
86253289f6aSNate Lawson {
86353289f6aSNate Lawson     ACPI_STATUS             Status;
86453289f6aSNate Lawson 
86553289f6aSNate Lawson 
86653289f6aSNate Lawson     /* Full external path */
86753289f6aSNate Lawson 
86853289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
86953289f6aSNate Lawson 
870fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
871fba7fc7eSJung-uk Kim 
872fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
873fba7fc7eSJung-uk Kim 
87453289f6aSNate Lawson     /* Last nameseg of the path */
87553289f6aSNate Lawson 
87653289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
87753289f6aSNate Lawson 
87853289f6aSNate Lawson     /* Create internalized path */
87953289f6aSNate Lawson 
88053289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
88153289f6aSNate Lawson     if (ACPI_FAILURE (Status))
88253289f6aSNate Lawson     {
88353289f6aSNate Lawson         /* TBD: abort on no memory */
88453289f6aSNate Lawson     }
88553289f6aSNate Lawson }
88653289f6aSNate Lawson 
88753289f6aSNate Lawson 
88853289f6aSNate Lawson /*******************************************************************************
88953289f6aSNate Lawson  *
89053289f6aSNate Lawson  * FUNCTION:    UtDoConstant
89153289f6aSNate Lawson  *
89253289f6aSNate Lawson  * PARAMETERS:  String              - Hex, Octal, or Decimal string
89353289f6aSNate Lawson  *
89453289f6aSNate Lawson  * RETURN:      Converted Integer
89553289f6aSNate Lawson  *
896f38b0f21SJung-uk Kim  * DESCRIPTION: Convert a string to an integer, with error checking.
89753289f6aSNate Lawson  *
89853289f6aSNate Lawson  ******************************************************************************/
89953289f6aSNate Lawson 
9009a179dd8SJung-uk Kim UINT64
90153289f6aSNate Lawson UtDoConstant (
90253289f6aSNate Lawson     char                    *String)
90353289f6aSNate Lawson {
90453289f6aSNate Lawson     ACPI_STATUS             Status;
9059a179dd8SJung-uk Kim     UINT64                  Converted;
90653289f6aSNate Lawson     char                    ErrBuf[64];
90753289f6aSNate Lawson 
90853289f6aSNate Lawson 
90953289f6aSNate Lawson     Status = UtStrtoul64 (String, 0, &Converted);
91053289f6aSNate Lawson     if (ACPI_FAILURE (Status))
91153289f6aSNate Lawson     {
912fba7fc7eSJung-uk Kim         sprintf (ErrBuf, "%s %s\n", "Conversion error:",
913fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
91453289f6aSNate Lawson         AslCompilererror (ErrBuf);
91553289f6aSNate Lawson     }
91653289f6aSNate Lawson 
91753289f6aSNate Lawson     return (Converted);
91853289f6aSNate Lawson }
91953289f6aSNate Lawson 
92053289f6aSNate Lawson 
921fba7fc7eSJung-uk Kim /* TBD: use version in ACPI CA main code base? */
922fba7fc7eSJung-uk Kim 
92353289f6aSNate Lawson /*******************************************************************************
92453289f6aSNate Lawson  *
92553289f6aSNate Lawson  * FUNCTION:    UtStrtoul64
92653289f6aSNate Lawson  *
92753289f6aSNate Lawson  * PARAMETERS:  String              - Null terminated string
928f38b0f21SJung-uk Kim  *              Terminater          - Where a pointer to the terminating byte
929f38b0f21SJung-uk Kim  *                                    is returned
93053289f6aSNate Lawson  *              Base                - Radix of the string
93153289f6aSNate Lawson  *
93253289f6aSNate Lawson  * RETURN:      Converted value
93353289f6aSNate Lawson  *
93453289f6aSNate Lawson  * DESCRIPTION: Convert a string into an unsigned value.
93553289f6aSNate Lawson  *
93653289f6aSNate Lawson  ******************************************************************************/
93753289f6aSNate Lawson 
938d052a1ccSJung-uk Kim ACPI_STATUS
93953289f6aSNate Lawson UtStrtoul64 (
94053289f6aSNate Lawson     char                    *String,
94153289f6aSNate Lawson     UINT32                  Base,
9429a179dd8SJung-uk Kim     UINT64                  *RetInteger)
94353289f6aSNate Lawson {
94453289f6aSNate Lawson     UINT32                  Index;
94553289f6aSNate Lawson     UINT32                  Sign;
9469a179dd8SJung-uk Kim     UINT64                  ReturnValue = 0;
94753289f6aSNate Lawson     ACPI_STATUS             Status = AE_OK;
94853289f6aSNate Lawson 
94953289f6aSNate Lawson 
95053289f6aSNate Lawson     *RetInteger = 0;
95153289f6aSNate Lawson 
95253289f6aSNate Lawson     switch (Base)
95353289f6aSNate Lawson     {
95453289f6aSNate Lawson     case 0:
95553289f6aSNate Lawson     case 8:
95653289f6aSNate Lawson     case 10:
95753289f6aSNate Lawson     case 16:
95853289f6aSNate Lawson         break;
95953289f6aSNate Lawson 
96053289f6aSNate Lawson     default:
96153289f6aSNate Lawson         /*
96253289f6aSNate Lawson          * The specified Base parameter is not in the domain of
96353289f6aSNate Lawson          * this function:
96453289f6aSNate Lawson          */
96553289f6aSNate Lawson         return (AE_BAD_PARAMETER);
96653289f6aSNate Lawson     }
96753289f6aSNate Lawson 
968fba7fc7eSJung-uk Kim     /* Skip over any white space in the buffer: */
969fba7fc7eSJung-uk Kim 
9709a179dd8SJung-uk Kim     while (isspace ((int) *String) || *String == '\t')
97153289f6aSNate Lawson     {
97253289f6aSNate Lawson         ++String;
97353289f6aSNate Lawson     }
97453289f6aSNate Lawson 
97553289f6aSNate Lawson     /*
97653289f6aSNate Lawson      * The buffer may contain an optional plus or minus sign.
97753289f6aSNate Lawson      * If it does, then skip over it but remember what is was:
97853289f6aSNate Lawson      */
97953289f6aSNate Lawson     if (*String == '-')
98053289f6aSNate Lawson     {
98153289f6aSNate Lawson         Sign = NEGATIVE;
98253289f6aSNate Lawson         ++String;
98353289f6aSNate Lawson     }
98453289f6aSNate Lawson     else if (*String == '+')
98553289f6aSNate Lawson     {
98653289f6aSNate Lawson         ++String;
98753289f6aSNate Lawson         Sign = POSITIVE;
98853289f6aSNate Lawson     }
98953289f6aSNate Lawson     else
99053289f6aSNate Lawson     {
99153289f6aSNate Lawson         Sign = POSITIVE;
99253289f6aSNate Lawson     }
99353289f6aSNate Lawson 
99453289f6aSNate Lawson     /*
99553289f6aSNate Lawson      * If the input parameter Base is zero, then we need to
99653289f6aSNate Lawson      * determine if it is octal, decimal, or hexadecimal:
99753289f6aSNate Lawson      */
99853289f6aSNate Lawson     if (Base == 0)
99953289f6aSNate Lawson     {
100053289f6aSNate Lawson         if (*String == '0')
100153289f6aSNate Lawson         {
10029a179dd8SJung-uk Kim             if (tolower ((int) *(++String)) == 'x')
100353289f6aSNate Lawson             {
100453289f6aSNate Lawson                 Base = 16;
100553289f6aSNate Lawson                 ++String;
100653289f6aSNate Lawson             }
100753289f6aSNate Lawson             else
100853289f6aSNate Lawson             {
100953289f6aSNate Lawson                 Base = 8;
101053289f6aSNate Lawson             }
101153289f6aSNate Lawson         }
101253289f6aSNate Lawson         else
101353289f6aSNate Lawson         {
101453289f6aSNate Lawson             Base = 10;
101553289f6aSNate Lawson         }
101653289f6aSNate Lawson     }
101753289f6aSNate Lawson 
101853289f6aSNate Lawson     /*
101953289f6aSNate Lawson      * For octal and hexadecimal bases, skip over the leading
102053289f6aSNate Lawson      * 0 or 0x, if they are present.
102153289f6aSNate Lawson      */
102253289f6aSNate Lawson     if (Base == 8 && *String == '0')
102353289f6aSNate Lawson     {
102453289f6aSNate Lawson         String++;
102553289f6aSNate Lawson     }
102653289f6aSNate Lawson 
102753289f6aSNate Lawson     if (Base == 16 &&
102853289f6aSNate Lawson         *String == '0' &&
10299a179dd8SJung-uk Kim         tolower ((int) *(++String)) == 'x')
103053289f6aSNate Lawson     {
103153289f6aSNate Lawson         String++;
103253289f6aSNate Lawson     }
103353289f6aSNate Lawson 
103453289f6aSNate Lawson     /* Main loop: convert the string to an unsigned long */
103553289f6aSNate Lawson 
103653289f6aSNate Lawson     while (*String)
103753289f6aSNate Lawson     {
10389a179dd8SJung-uk Kim         if (isdigit ((int) *String))
103953289f6aSNate Lawson         {
104053289f6aSNate Lawson             Index = ((UINT8) *String) - '0';
104153289f6aSNate Lawson         }
104253289f6aSNate Lawson         else
104353289f6aSNate Lawson         {
10449a179dd8SJung-uk Kim             Index = (UINT8) toupper ((int) *String);
10459a179dd8SJung-uk Kim             if (isupper ((int) Index))
104653289f6aSNate Lawson             {
104753289f6aSNate Lawson                 Index = Index - 'A' + 10;
104853289f6aSNate Lawson             }
104953289f6aSNate Lawson             else
105053289f6aSNate Lawson             {
105153289f6aSNate Lawson                 goto ErrorExit;
105253289f6aSNate Lawson             }
105353289f6aSNate Lawson         }
105453289f6aSNate Lawson 
105553289f6aSNate Lawson         if (Index >= Base)
105653289f6aSNate Lawson         {
105753289f6aSNate Lawson             goto ErrorExit;
105853289f6aSNate Lawson         }
105953289f6aSNate Lawson 
106053289f6aSNate Lawson         /* Check to see if value is out of range: */
106153289f6aSNate Lawson 
10629a179dd8SJung-uk Kim         if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) /
10639a179dd8SJung-uk Kim                             (UINT64) Base))
106453289f6aSNate Lawson         {
106553289f6aSNate Lawson             goto ErrorExit;
106653289f6aSNate Lawson         }
106753289f6aSNate Lawson         else
106853289f6aSNate Lawson         {
106953289f6aSNate Lawson             ReturnValue *= Base;
107053289f6aSNate Lawson             ReturnValue += Index;
107153289f6aSNate Lawson         }
107253289f6aSNate Lawson 
107353289f6aSNate Lawson         ++String;
107453289f6aSNate Lawson     }
107553289f6aSNate Lawson 
107653289f6aSNate Lawson 
1077fba7fc7eSJung-uk Kim     /* If a minus sign was present, then "the conversion is negated": */
1078fba7fc7eSJung-uk Kim 
107953289f6aSNate Lawson     if (Sign == NEGATIVE)
108053289f6aSNate Lawson     {
108153289f6aSNate Lawson         ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
108253289f6aSNate Lawson     }
108353289f6aSNate Lawson 
108453289f6aSNate Lawson     *RetInteger = ReturnValue;
108553289f6aSNate Lawson     return (Status);
108653289f6aSNate Lawson 
108753289f6aSNate Lawson 
108853289f6aSNate Lawson ErrorExit:
108953289f6aSNate Lawson     switch (Base)
109053289f6aSNate Lawson     {
109153289f6aSNate Lawson     case 8:
109253289f6aSNate Lawson         Status = AE_BAD_OCTAL_CONSTANT;
109353289f6aSNate Lawson         break;
109453289f6aSNate Lawson 
109553289f6aSNate Lawson     case 10:
109653289f6aSNate Lawson         Status = AE_BAD_DECIMAL_CONSTANT;
109753289f6aSNate Lawson         break;
109853289f6aSNate Lawson 
109953289f6aSNate Lawson     case 16:
110053289f6aSNate Lawson         Status = AE_BAD_HEX_CONSTANT;
110153289f6aSNate Lawson         break;
110253289f6aSNate Lawson 
110353289f6aSNate Lawson     default:
110453289f6aSNate Lawson         /* Base validated above */
110553289f6aSNate Lawson         break;
110653289f6aSNate Lawson     }
110753289f6aSNate Lawson 
110853289f6aSNate Lawson     return (Status);
110953289f6aSNate Lawson }
1110