xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision 7cf3e94a41ba78bb319589610ad72bf914dc75c1)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: aslutils -- compiler utilities
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
7d244b227SJung-uk Kim /*
81c0e1b6dSJung-uk Kim  * Copyright (C) 2000 - 2015, 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 
44ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
4553289f6aSNate Lawson #include "aslcompiler.y.h"
46a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
493c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
5053289f6aSNate Lawson 
5153289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
5253289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslutils")
5353289f6aSNate Lawson 
543f0275a0SJung-uk Kim 
55fba7fc7eSJung-uk Kim /* Local prototypes */
5653289f6aSNate Lawson 
57fba7fc7eSJung-uk Kim static void
58fba7fc7eSJung-uk Kim UtPadNameWithUnderscores (
59fba7fc7eSJung-uk Kim     char                    *NameSeg,
60fba7fc7eSJung-uk Kim     char                    *PaddedNameSeg);
61fba7fc7eSJung-uk Kim 
62fba7fc7eSJung-uk Kim static void
63fba7fc7eSJung-uk Kim UtAttachNameseg (
64fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
65fba7fc7eSJung-uk Kim     char                    *Name);
6653289f6aSNate Lawson 
6753289f6aSNate Lawson 
6853289f6aSNate Lawson /*******************************************************************************
6953289f6aSNate Lawson  *
70a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
71a88e22b7SJung-uk Kim  *
72a88e22b7SJung-uk Kim  * PARAMETERS:  None
73a88e22b7SJung-uk Kim  *
74a88e22b7SJung-uk Kim  * RETURN:      None
75a88e22b7SJung-uk Kim  *
76a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
77a88e22b7SJung-uk Kim  *
78a88e22b7SJung-uk Kim  ******************************************************************************/
79a88e22b7SJung-uk Kim 
801df130f1SJung-uk Kim #define ACPI_TABLE_HELP_FORMAT  "%8u) %s    %s\n"
811df130f1SJung-uk Kim 
82a88e22b7SJung-uk Kim void
83a88e22b7SJung-uk Kim UtDisplaySupportedTables (
84a88e22b7SJung-uk Kim     void)
85a88e22b7SJung-uk Kim {
86a88e22b7SJung-uk Kim     ACPI_DMTABLE_DATA       *TableData;
871df130f1SJung-uk Kim     UINT32                  i;
88a88e22b7SJung-uk Kim 
89a88e22b7SJung-uk Kim 
901df130f1SJung-uk Kim     printf ("\nACPI tables supported by iASL version %8.8X:\n"
911df130f1SJung-uk Kim         "  (Compiler, Disassembler, Template Generator)\n\n",
921df130f1SJung-uk Kim         ACPI_CA_VERSION);
93a88e22b7SJung-uk Kim 
94a88e22b7SJung-uk Kim     /* Special tables */
95a88e22b7SJung-uk Kim 
961df130f1SJung-uk Kim     printf ("  Special tables and AML tables:\n");
971df130f1SJung-uk Kim     printf (ACPI_TABLE_HELP_FORMAT, 1, ACPI_RSDP_NAME, "Root System Description Pointer");
981df130f1SJung-uk Kim     printf (ACPI_TABLE_HELP_FORMAT, 2, ACPI_SIG_FACS, "Firmware ACPI Control Structure");
991df130f1SJung-uk Kim     printf (ACPI_TABLE_HELP_FORMAT, 3, ACPI_SIG_DSDT, "Differentiated System Description Table");
1001df130f1SJung-uk Kim     printf (ACPI_TABLE_HELP_FORMAT, 4, ACPI_SIG_SSDT, "Secondary System Description Table");
101a88e22b7SJung-uk Kim 
102a88e22b7SJung-uk Kim     /* All data tables with common table header */
103a88e22b7SJung-uk Kim 
1041df130f1SJung-uk Kim     printf ("\n  Standard ACPI data tables:\n");
1051df130f1SJung-uk Kim     for (TableData = AcpiDmTableData, i = 5; TableData->Signature; TableData++, i++)
106a88e22b7SJung-uk Kim     {
1071df130f1SJung-uk Kim         printf (ACPI_TABLE_HELP_FORMAT, i, TableData->Signature, TableData->Name);
108a88e22b7SJung-uk Kim     }
109a88e22b7SJung-uk Kim }
110a88e22b7SJung-uk Kim 
111a88e22b7SJung-uk Kim 
112a88e22b7SJung-uk Kim /*******************************************************************************
113a88e22b7SJung-uk Kim  *
114f38b0f21SJung-uk Kim  * FUNCTION:    UtDisplayConstantOpcodes
11553289f6aSNate Lawson  *
11653289f6aSNate Lawson  * PARAMETERS:  None
11753289f6aSNate Lawson  *
11853289f6aSNate Lawson  * RETURN:      None
11953289f6aSNate Lawson  *
12053289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
12153289f6aSNate Lawson  *
12253289f6aSNate Lawson  ******************************************************************************/
12353289f6aSNate Lawson 
12453289f6aSNate Lawson void
12553289f6aSNate Lawson UtDisplayConstantOpcodes (
12653289f6aSNate Lawson     void)
12753289f6aSNate Lawson {
12853289f6aSNate Lawson     UINT32                  i;
12953289f6aSNate Lawson 
130fba7fc7eSJung-uk Kim 
13153289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
13253289f6aSNate Lawson 
13353289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
13453289f6aSNate Lawson     {
13553289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
13653289f6aSNate Lawson         {
13753289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
13853289f6aSNate Lawson         }
13953289f6aSNate Lawson     }
14053289f6aSNate Lawson }
14153289f6aSNate Lawson 
14253289f6aSNate Lawson 
14353289f6aSNate Lawson /*******************************************************************************
14453289f6aSNate Lawson  *
14553289f6aSNate Lawson  * FUNCTION:    UtLocalCalloc
14653289f6aSNate Lawson  *
14753289f6aSNate Lawson  * PARAMETERS:  Size                - Bytes to be allocated
14853289f6aSNate Lawson  *
14953289f6aSNate Lawson  * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
15053289f6aSNate Lawson  *
15153289f6aSNate Lawson  * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
15253289f6aSNate Lawson  *              allocation failure, on the assumption that nothing more can be
15353289f6aSNate Lawson  *              accomplished.
15453289f6aSNate Lawson  *
15553289f6aSNate Lawson  ******************************************************************************/
15653289f6aSNate Lawson 
15753289f6aSNate Lawson void *
15853289f6aSNate Lawson UtLocalCalloc (
15953289f6aSNate Lawson     UINT32                  Size)
16053289f6aSNate Lawson {
16153289f6aSNate Lawson     void                    *Allocated;
16253289f6aSNate Lawson 
16353289f6aSNate Lawson 
1641a39cfb0SJung-uk Kim     Allocated = ACPI_ALLOCATE_ZEROED (Size);
16553289f6aSNate Lawson     if (!Allocated)
16653289f6aSNate Lawson     {
16753289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
16853289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
16953289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
17053289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
171a88e22b7SJung-uk Kim 
172a88e22b7SJung-uk Kim         CmCleanupAndExit ();
17353289f6aSNate Lawson         exit (1);
17453289f6aSNate Lawson     }
17553289f6aSNate Lawson 
17653289f6aSNate Lawson     TotalAllocations++;
17753289f6aSNate Lawson     TotalAllocated += Size;
1781a39cfb0SJung-uk Kim     return (Allocated);
17953289f6aSNate Lawson }
18053289f6aSNate Lawson 
18153289f6aSNate Lawson 
18253289f6aSNate Lawson /*******************************************************************************
18353289f6aSNate Lawson  *
18453289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
18553289f6aSNate Lawson  *
186fba7fc7eSJung-uk Kim  * PARAMETERS:  Name                - Ascii name of this event
18753289f6aSNate Lawson  *
188f38b0f21SJung-uk Kim  * RETURN:      Event number (integer index)
18953289f6aSNate Lawson  *
19053289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
19153289f6aSNate Lawson  *
19253289f6aSNate Lawson  ******************************************************************************/
19353289f6aSNate Lawson 
194fba7fc7eSJung-uk Kim UINT8
19553289f6aSNate Lawson UtBeginEvent (
19653289f6aSNate Lawson     char                    *Name)
19753289f6aSNate Lawson {
19853289f6aSNate Lawson 
199fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
200fba7fc7eSJung-uk Kim     {
201fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
202fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
203fba7fc7eSJung-uk Kim     }
204fba7fc7eSJung-uk Kim 
205fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
206fba7fc7eSJung-uk Kim 
207fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
208fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
209fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
210fba7fc7eSJung-uk Kim 
211fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
21253289f6aSNate Lawson }
21353289f6aSNate Lawson 
21453289f6aSNate Lawson 
21553289f6aSNate Lawson /*******************************************************************************
21653289f6aSNate Lawson  *
21753289f6aSNate Lawson  * FUNCTION:    UtEndEvent
21853289f6aSNate Lawson  *
21953289f6aSNate Lawson  * PARAMETERS:  Event               - Event number (integer index)
22053289f6aSNate Lawson  *
22153289f6aSNate Lawson  * RETURN:      None
22253289f6aSNate Lawson  *
22353289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
22453289f6aSNate Lawson  *
22553289f6aSNate Lawson  ******************************************************************************/
22653289f6aSNate Lawson 
22753289f6aSNate Lawson void
22853289f6aSNate Lawson UtEndEvent (
229fba7fc7eSJung-uk Kim     UINT8                   Event)
23053289f6aSNate Lawson {
23153289f6aSNate Lawson 
232fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
233fba7fc7eSJung-uk Kim     {
234fba7fc7eSJung-uk Kim         return;
235fba7fc7eSJung-uk Kim     }
236fba7fc7eSJung-uk Kim 
237fba7fc7eSJung-uk Kim     /* Insert end time for event */
238fba7fc7eSJung-uk Kim 
239fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
24053289f6aSNate Lawson }
24153289f6aSNate Lawson 
24253289f6aSNate Lawson 
24353289f6aSNate Lawson /*******************************************************************************
24453289f6aSNate Lawson  *
24553289f6aSNate Lawson  * FUNCTION:    UtConvertByteToHex
24653289f6aSNate Lawson  *
24753289f6aSNate Lawson  * PARAMETERS:  RawByte             - Binary data
248f38b0f21SJung-uk Kim  *              Buffer              - Pointer to where the hex bytes will be
249f38b0f21SJung-uk Kim  *                                    stored
25053289f6aSNate Lawson  *
25153289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
25253289f6aSNate Lawson  *
25353289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
25453289f6aSNate Lawson  *              with "0x"
25553289f6aSNate Lawson  *
25653289f6aSNate Lawson  ******************************************************************************/
25753289f6aSNate Lawson 
25853289f6aSNate Lawson void
25953289f6aSNate Lawson UtConvertByteToHex (
26053289f6aSNate Lawson     UINT8                   RawByte,
26153289f6aSNate Lawson     UINT8                   *Buffer)
26253289f6aSNate Lawson {
26353289f6aSNate Lawson 
26453289f6aSNate Lawson     Buffer[0] = '0';
26553289f6aSNate Lawson     Buffer[1] = 'x';
26653289f6aSNate Lawson 
267313a0c13SJung-uk Kim     Buffer[2] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 4);
268313a0c13SJung-uk Kim     Buffer[3] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 0);
26953289f6aSNate Lawson }
27053289f6aSNate Lawson 
27153289f6aSNate Lawson 
27253289f6aSNate Lawson /*******************************************************************************
27353289f6aSNate Lawson  *
27453289f6aSNate Lawson  * FUNCTION:    UtConvertByteToAsmHex
27553289f6aSNate Lawson  *
27653289f6aSNate Lawson  * PARAMETERS:  RawByte             - Binary data
277f38b0f21SJung-uk Kim  *              Buffer              - Pointer to where the hex bytes will be
278f38b0f21SJung-uk Kim  *                                    stored
27953289f6aSNate Lawson  *
28053289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
28153289f6aSNate Lawson  *
28253289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
283313a0c13SJung-uk Kim  *              with '0', and a trailing 'h' is added.
28453289f6aSNate Lawson  *
28553289f6aSNate Lawson  ******************************************************************************/
28653289f6aSNate Lawson 
28753289f6aSNate Lawson void
28853289f6aSNate Lawson UtConvertByteToAsmHex (
28953289f6aSNate Lawson     UINT8                   RawByte,
29053289f6aSNate Lawson     UINT8                   *Buffer)
29153289f6aSNate Lawson {
29253289f6aSNate Lawson 
29353289f6aSNate Lawson     Buffer[0] = '0';
294313a0c13SJung-uk Kim     Buffer[1] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 4);
295313a0c13SJung-uk Kim     Buffer[2] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 0);
29653289f6aSNate Lawson     Buffer[3] = 'h';
29753289f6aSNate Lawson }
29853289f6aSNate Lawson 
29953289f6aSNate Lawson 
30053289f6aSNate Lawson /*******************************************************************************
30153289f6aSNate Lawson  *
30253289f6aSNate Lawson  * FUNCTION:    DbgPrint
30353289f6aSNate Lawson  *
304fba7fc7eSJung-uk Kim  * PARAMETERS:  Type                - Type of output
305fba7fc7eSJung-uk Kim  *              Fmt                 - Printf format string
30653289f6aSNate Lawson  *              ...                 - variable printf list
30753289f6aSNate Lawson  *
30853289f6aSNate Lawson  * RETURN:      None
30953289f6aSNate Lawson  *
31053289f6aSNate Lawson  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
31153289f6aSNate Lawson  *              debug flag is set.
31253289f6aSNate Lawson  *
31353289f6aSNate Lawson  ******************************************************************************/
31453289f6aSNate Lawson 
31553289f6aSNate Lawson void
31653289f6aSNate Lawson DbgPrint (
31753289f6aSNate Lawson     UINT32                  Type,
31853289f6aSNate Lawson     char                    *Fmt,
31953289f6aSNate Lawson     ...)
32053289f6aSNate Lawson {
32153289f6aSNate Lawson     va_list                 Args;
32253289f6aSNate Lawson 
32353289f6aSNate Lawson 
32453289f6aSNate Lawson     if (!Gbl_DebugFlag)
32553289f6aSNate Lawson     {
32653289f6aSNate Lawson         return;
32753289f6aSNate Lawson     }
32853289f6aSNate Lawson 
32953289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
33053289f6aSNate Lawson         (!(AslCompilerdebug)))
33153289f6aSNate Lawson     {
33253289f6aSNate Lawson         return;
33353289f6aSNate Lawson     }
33453289f6aSNate Lawson 
3358d744e47SJung-uk Kim     va_start (Args, Fmt);
33653289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
33753289f6aSNate Lawson     va_end (Args);
33853289f6aSNate Lawson     return;
33953289f6aSNate Lawson }
34053289f6aSNate Lawson 
34153289f6aSNate Lawson 
34253289f6aSNate Lawson /*******************************************************************************
34353289f6aSNate Lawson  *
34453289f6aSNate Lawson  * FUNCTION:    UtPrintFormattedName
34553289f6aSNate Lawson  *
34653289f6aSNate Lawson  * PARAMETERS:  ParseOpcode         - Parser keyword ID
34753289f6aSNate Lawson  *              Level               - Indentation level
34853289f6aSNate Lawson  *
34953289f6aSNate Lawson  * RETURN:      None
35053289f6aSNate Lawson  *
35153289f6aSNate Lawson  * DESCRIPTION: Print the ascii name of the parse opcode.
35253289f6aSNate Lawson  *
35353289f6aSNate Lawson  ******************************************************************************/
35453289f6aSNate Lawson 
35553289f6aSNate Lawson #define TEXT_OFFSET 10
35653289f6aSNate Lawson 
35753289f6aSNate Lawson void
35853289f6aSNate Lawson UtPrintFormattedName (
35953289f6aSNate Lawson     UINT16                  ParseOpcode,
36053289f6aSNate Lawson     UINT32                  Level)
36153289f6aSNate Lawson {
36253289f6aSNate Lawson 
3631a39cfb0SJung-uk Kim     if (Level)
3641a39cfb0SJung-uk Kim     {
36553289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
3661a39cfb0SJung-uk Kim             "%*s", (3 * Level), " ");
3671a39cfb0SJung-uk Kim     }
3681a39cfb0SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT,
3691a39cfb0SJung-uk Kim         " %-20.20s", UtGetOpName (ParseOpcode));
37053289f6aSNate Lawson 
37153289f6aSNate Lawson     if (Level < TEXT_OFFSET)
37253289f6aSNate Lawson     {
37353289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
37453289f6aSNate Lawson             "%*s", (TEXT_OFFSET - Level) * 3, " ");
37553289f6aSNate Lawson     }
37653289f6aSNate Lawson }
37753289f6aSNate Lawson 
37853289f6aSNate Lawson 
37953289f6aSNate Lawson /*******************************************************************************
38053289f6aSNate Lawson  *
38153289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
38253289f6aSNate Lawson  *
383f38b0f21SJung-uk Kim  * PARAMETERS:  Op                  - Parse op to be named.
38453289f6aSNate Lawson  *
38553289f6aSNate Lawson  * RETURN:      None
38653289f6aSNate Lawson  *
38753289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
38853289f6aSNate Lawson  *
38953289f6aSNate Lawson  ******************************************************************************/
39053289f6aSNate Lawson 
39153289f6aSNate Lawson void
39253289f6aSNate Lawson UtSetParseOpName (
39353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
39453289f6aSNate Lawson {
395fba7fc7eSJung-uk Kim 
3961a39cfb0SJung-uk Kim     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
3971a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
39853289f6aSNate Lawson }
39953289f6aSNate Lawson 
40053289f6aSNate Lawson 
40153289f6aSNate Lawson /*******************************************************************************
40253289f6aSNate Lawson  *
40353289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
40453289f6aSNate Lawson  *
405fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
40653289f6aSNate Lawson  *
40753289f6aSNate Lawson  * RETURN:      None
40853289f6aSNate Lawson  *
40953289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
41053289f6aSNate Lawson  *
41153289f6aSNate Lawson  ******************************************************************************/
41253289f6aSNate Lawson 
41353289f6aSNate Lawson void
41453289f6aSNate Lawson UtDisplaySummary (
41553289f6aSNate Lawson     UINT32                  FileId)
41653289f6aSNate Lawson {
4173f0275a0SJung-uk Kim     UINT32                  i;
4183f0275a0SJung-uk Kim 
41953289f6aSNate Lawson 
42053289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
42153289f6aSNate Lawson     {
42253289f6aSNate Lawson         /* Compiler name and version number */
42353289f6aSNate Lawson 
4243f0275a0SJung-uk Kim         FlPrintFile (FileId, "%s version %X%s\n\n",
4253c1812acSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH);
42653289f6aSNate Lawson     }
42753289f6aSNate Lawson 
4283f0275a0SJung-uk Kim     /* Summary of main input and output files */
4293f0275a0SJung-uk Kim 
430a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
431a88e22b7SJung-uk Kim     {
432a88e22b7SJung-uk Kim         FlPrintFile (FileId,
4333f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u fields\n",
4343f0275a0SJung-uk Kim             "Table Input:",
435a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
436a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
437a88e22b7SJung-uk Kim 
438a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
439a88e22b7SJung-uk Kim         {
440a88e22b7SJung-uk Kim             FlPrintFile (FileId,
4413f0275a0SJung-uk Kim                 "%-14s %s - %u bytes\n",
4423f0275a0SJung-uk Kim                 "Binary Output:",
443a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
444a88e22b7SJung-uk Kim         }
445a88e22b7SJung-uk Kim     }
446a88e22b7SJung-uk Kim     else
447a88e22b7SJung-uk Kim     {
44853289f6aSNate Lawson         FlPrintFile (FileId,
4493f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u keywords\n",
4503f0275a0SJung-uk Kim             "ASL Input:",
45153289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
45253289f6aSNate Lawson             Gbl_InputByteCount, TotalKeywords);
45353289f6aSNate Lawson 
45453289f6aSNate Lawson         /* AML summary */
45553289f6aSNate Lawson 
45653289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
45753289f6aSNate Lawson         {
45853289f6aSNate Lawson             FlPrintFile (FileId,
4593f0275a0SJung-uk Kim                 "%-14s %s - %u bytes, %u named objects, %u executable opcodes\n",
4603f0275a0SJung-uk Kim                 "AML Output:",
46153289f6aSNate Lawson                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,
46253289f6aSNate Lawson                 TotalNamedObjects, TotalExecutableOpcodes);
46353289f6aSNate Lawson         }
464a88e22b7SJung-uk Kim     }
46553289f6aSNate Lawson 
4663f0275a0SJung-uk Kim     /* Display summary of any optional files */
4673f0275a0SJung-uk Kim 
4683f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
4693f0275a0SJung-uk Kim     {
4703f0275a0SJung-uk Kim         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
4713f0275a0SJung-uk Kim         {
4723f0275a0SJung-uk Kim             continue;
4733f0275a0SJung-uk Kim         }
4743f0275a0SJung-uk Kim 
4753f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
4763f0275a0SJung-uk Kim 
4773f0275a0SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
4783f0275a0SJung-uk Kim         {
4793f0275a0SJung-uk Kim             continue;
4803f0275a0SJung-uk Kim         }
4813f0275a0SJung-uk Kim 
4824c52cad2SJung-uk Kim         /* .I is a temp file unless specifically requested */
4834c52cad2SJung-uk Kim 
4844c52cad2SJung-uk Kim         if ((i == ASL_FILE_PREPROCESSOR) && (!Gbl_PreprocessorOutputFlag))
4854c52cad2SJung-uk Kim         {
4864c52cad2SJung-uk Kim             continue;
4874c52cad2SJung-uk Kim         }
4884c52cad2SJung-uk Kim 
4893f0275a0SJung-uk Kim         FlPrintFile (FileId, "%14s %s - %u bytes\n",
490042ff955SJung-uk Kim             Gbl_Files[i].ShortDescription,
4913f0275a0SJung-uk Kim             Gbl_Files[i].Filename, FlGetFileSize (i));
4923f0275a0SJung-uk Kim     }
4933f0275a0SJung-uk Kim 
49453289f6aSNate Lawson     /* Error summary */
49553289f6aSNate Lawson 
49653289f6aSNate Lawson     FlPrintFile (FileId,
4973f0275a0SJung-uk Kim         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
49853289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
4991a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
5001a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
5011a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
502a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
503a88e22b7SJung-uk Kim 
504a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
505a88e22b7SJung-uk Kim     {
506*7cf3e94aSJung-uk Kim         FlPrintFile (FileId, ", %u Optimizations",
507*7cf3e94aSJung-uk Kim             Gbl_ExceptionCount[ASL_OPTIMIZATION]);
508*7cf3e94aSJung-uk Kim 
509*7cf3e94aSJung-uk Kim         if (TotalFolds)
510*7cf3e94aSJung-uk Kim         {
511*7cf3e94aSJung-uk Kim             FlPrintFile (FileId, ", %u Constants Folded", TotalFolds);
512*7cf3e94aSJung-uk Kim         }
513a88e22b7SJung-uk Kim     }
514a88e22b7SJung-uk Kim 
515a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
51653289f6aSNate Lawson }
51753289f6aSNate Lawson 
51853289f6aSNate Lawson 
51953289f6aSNate Lawson /*******************************************************************************
52053289f6aSNate Lawson  *
521f38b0f21SJung-uk Kim  * FUNCTION:    UtCheckIntegerRange
52253289f6aSNate Lawson  *
52353289f6aSNate Lawson  * PARAMETERS:  Op                  - Integer parse node
52453289f6aSNate Lawson  *              LowValue            - Smallest allowed value
52553289f6aSNate Lawson  *              HighValue           - Largest allowed value
52653289f6aSNate Lawson  *
52753289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
52853289f6aSNate Lawson  *
52953289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
53053289f6aSNate Lawson  *
53153289f6aSNate Lawson  ******************************************************************************/
53253289f6aSNate Lawson 
53353289f6aSNate Lawson ACPI_PARSE_OBJECT *
53453289f6aSNate Lawson UtCheckIntegerRange (
53553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
53653289f6aSNate Lawson     UINT32                  LowValue,
53753289f6aSNate Lawson     UINT32                  HighValue)
53853289f6aSNate Lawson {
53953289f6aSNate Lawson 
54053289f6aSNate Lawson     if (!Op)
54153289f6aSNate Lawson     {
5428ef1a331SJung-uk Kim         return (NULL);
54353289f6aSNate Lawson     }
54453289f6aSNate Lawson 
5451df130f1SJung-uk Kim     if ((Op->Asl.Value.Integer < LowValue) ||
5461df130f1SJung-uk Kim         (Op->Asl.Value.Integer > HighValue))
54753289f6aSNate Lawson     {
5481df130f1SJung-uk Kim         sprintf (MsgBuffer, "0x%X, allowable: 0x%X-0x%X",
5491df130f1SJung-uk Kim             (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
5501df130f1SJung-uk Kim 
5511df130f1SJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RANGE, Op, MsgBuffer);
5521df130f1SJung-uk Kim         return (NULL);
55353289f6aSNate Lawson     }
55453289f6aSNate Lawson 
5551df130f1SJung-uk Kim     return (Op);
55653289f6aSNate Lawson }
55753289f6aSNate Lawson 
55853289f6aSNate Lawson 
55953289f6aSNate Lawson /*******************************************************************************
56053289f6aSNate Lawson  *
561313a0c13SJung-uk Kim  * FUNCTION:    UtStringCacheCalloc
56253289f6aSNate Lawson  *
56353289f6aSNate Lawson  * PARAMETERS:  Length              - Size of buffer requested
56453289f6aSNate Lawson  *
56553289f6aSNate Lawson  * RETURN:      Pointer to the buffer. Aborts on allocation failure
56653289f6aSNate Lawson  *
56753289f6aSNate Lawson  * DESCRIPTION: Allocate a string buffer. Bypass the local
56853289f6aSNate Lawson  *              dynamic memory manager for performance reasons (This has a
56953289f6aSNate Lawson  *              major impact on the speed of the compiler.)
57053289f6aSNate Lawson  *
57153289f6aSNate Lawson  ******************************************************************************/
57253289f6aSNate Lawson 
57353289f6aSNate Lawson char *
574313a0c13SJung-uk Kim UtStringCacheCalloc (
57553289f6aSNate Lawson     UINT32                  Length)
57653289f6aSNate Lawson {
57753289f6aSNate Lawson     char                    *Buffer;
578313a0c13SJung-uk Kim     ASL_CACHE_INFO          *Cache;
5791c0e1b6dSJung-uk Kim     UINT32                  CacheSize = ASL_STRING_CACHE_SIZE;
58053289f6aSNate Lawson 
58153289f6aSNate Lawson 
5821c0e1b6dSJung-uk Kim     if (Length > CacheSize)
583313a0c13SJung-uk Kim     {
5841c0e1b6dSJung-uk Kim         CacheSize = Length;
5851c0e1b6dSJung-uk Kim 
5861c0e1b6dSJung-uk Kim         if (Gbl_StringCacheList)
5871c0e1b6dSJung-uk Kim         {
5881c0e1b6dSJung-uk Kim             Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
5891c0e1b6dSJung-uk Kim 
5901c0e1b6dSJung-uk Kim             /* Link new cache buffer just following head of list */
5911c0e1b6dSJung-uk Kim 
5921c0e1b6dSJung-uk Kim             Cache->Next = Gbl_StringCacheList->Next;
5931c0e1b6dSJung-uk Kim             Gbl_StringCacheList->Next = Cache;
5941c0e1b6dSJung-uk Kim 
5951c0e1b6dSJung-uk Kim             /* Leave cache management pointers alone as they pertain to head */
5961c0e1b6dSJung-uk Kim 
5971c0e1b6dSJung-uk Kim             Gbl_StringCount++;
5981c0e1b6dSJung-uk Kim             Gbl_StringSize += Length;
5991c0e1b6dSJung-uk Kim 
6001c0e1b6dSJung-uk Kim             return (Cache->Buffer);
6011c0e1b6dSJung-uk Kim         }
602313a0c13SJung-uk Kim     }
603313a0c13SJung-uk Kim 
60453289f6aSNate Lawson     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
60553289f6aSNate Lawson     {
606313a0c13SJung-uk Kim         /* Allocate a new buffer */
607313a0c13SJung-uk Kim 
6081c0e1b6dSJung-uk Kim         Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
609313a0c13SJung-uk Kim 
610313a0c13SJung-uk Kim         /* Link new cache buffer to head of list */
611313a0c13SJung-uk Kim 
612313a0c13SJung-uk Kim         Cache->Next = Gbl_StringCacheList;
613313a0c13SJung-uk Kim         Gbl_StringCacheList = Cache;
614313a0c13SJung-uk Kim 
615313a0c13SJung-uk Kim         /* Setup cache management pointers */
616313a0c13SJung-uk Kim 
617313a0c13SJung-uk Kim         Gbl_StringCacheNext = Cache->Buffer;
6181c0e1b6dSJung-uk Kim         Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize;
61953289f6aSNate Lawson     }
62053289f6aSNate Lawson 
621313a0c13SJung-uk Kim     Gbl_StringCount++;
622313a0c13SJung-uk Kim     Gbl_StringSize += Length;
623313a0c13SJung-uk Kim 
62453289f6aSNate Lawson     Buffer = Gbl_StringCacheNext;
62553289f6aSNate Lawson     Gbl_StringCacheNext += Length;
62653289f6aSNate Lawson     return (Buffer);
62753289f6aSNate Lawson }
62853289f6aSNate Lawson 
62953289f6aSNate Lawson 
630042ff955SJung-uk Kim /******************************************************************************
631042ff955SJung-uk Kim  *
632042ff955SJung-uk Kim  * FUNCTION:    UtExpandLineBuffers
633042ff955SJung-uk Kim  *
634042ff955SJung-uk Kim  * PARAMETERS:  None. Updates global line buffer pointers.
635042ff955SJung-uk Kim  *
636042ff955SJung-uk Kim  * RETURN:      None. Reallocates the global line buffers
637042ff955SJung-uk Kim  *
638042ff955SJung-uk Kim  * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates
639042ff955SJung-uk Kim  *              all global line buffers and updates Gbl_LineBufferSize. NOTE:
640042ff955SJung-uk Kim  *              Also used for the initial allocation of the buffers, when
641042ff955SJung-uk Kim  *              all of the buffer pointers are NULL. Initial allocations are
642042ff955SJung-uk Kim  *              of size ASL_DEFAULT_LINE_BUFFER_SIZE
643042ff955SJung-uk Kim  *
644042ff955SJung-uk Kim  *****************************************************************************/
645042ff955SJung-uk Kim 
646042ff955SJung-uk Kim void
647042ff955SJung-uk Kim UtExpandLineBuffers (
648042ff955SJung-uk Kim     void)
649042ff955SJung-uk Kim {
650042ff955SJung-uk Kim     UINT32                  NewSize;
651042ff955SJung-uk Kim 
652042ff955SJung-uk Kim 
653042ff955SJung-uk Kim     /* Attempt to double the size of all line buffers */
654042ff955SJung-uk Kim 
655042ff955SJung-uk Kim     NewSize = Gbl_LineBufferSize * 2;
656042ff955SJung-uk Kim     if (Gbl_CurrentLineBuffer)
657042ff955SJung-uk Kim     {
658313a0c13SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT,
659313a0c13SJung-uk Kim             "Increasing line buffer size from %u to %u\n",
660042ff955SJung-uk Kim             Gbl_LineBufferSize, NewSize);
661042ff955SJung-uk Kim     }
662042ff955SJung-uk Kim 
663042ff955SJung-uk Kim     Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
664042ff955SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
665042ff955SJung-uk Kim     if (!Gbl_CurrentLineBuffer)
666042ff955SJung-uk Kim     {
667042ff955SJung-uk Kim         goto ErrorExit;
668042ff955SJung-uk Kim     }
669042ff955SJung-uk Kim 
670042ff955SJung-uk Kim     Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
671042ff955SJung-uk Kim     if (!Gbl_MainTokenBuffer)
672042ff955SJung-uk Kim     {
673042ff955SJung-uk Kim         goto ErrorExit;
674042ff955SJung-uk Kim     }
675042ff955SJung-uk Kim 
676042ff955SJung-uk Kim     Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
677042ff955SJung-uk Kim     if (!Gbl_MacroTokenBuffer)
678042ff955SJung-uk Kim     {
679042ff955SJung-uk Kim         goto ErrorExit;
680042ff955SJung-uk Kim     }
681042ff955SJung-uk Kim 
682042ff955SJung-uk Kim     Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
683042ff955SJung-uk Kim     if (!Gbl_ExpressionTokenBuffer)
684042ff955SJung-uk Kim     {
685042ff955SJung-uk Kim         goto ErrorExit;
686042ff955SJung-uk Kim     }
687042ff955SJung-uk Kim 
688042ff955SJung-uk Kim     Gbl_LineBufferSize = NewSize;
689042ff955SJung-uk Kim     return;
690042ff955SJung-uk Kim 
691042ff955SJung-uk Kim 
692042ff955SJung-uk Kim     /* On error above, simply issue error messages and abort, cannot continue */
693042ff955SJung-uk Kim 
694042ff955SJung-uk Kim ErrorExit:
695042ff955SJung-uk Kim     printf ("Could not increase line buffer size from %u to %u\n",
696042ff955SJung-uk Kim         Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
697042ff955SJung-uk Kim 
698042ff955SJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
699042ff955SJung-uk Kim         NULL, NULL);
700042ff955SJung-uk Kim     AslAbort ();
701042ff955SJung-uk Kim }
702042ff955SJung-uk Kim 
703042ff955SJung-uk Kim 
704313a0c13SJung-uk Kim /******************************************************************************
705313a0c13SJung-uk Kim  *
706313a0c13SJung-uk Kim  * FUNCTION:    UtFreeLineBuffers
707313a0c13SJung-uk Kim  *
708313a0c13SJung-uk Kim  * PARAMETERS:  None
709313a0c13SJung-uk Kim  *
710313a0c13SJung-uk Kim  * RETURN:      None
711313a0c13SJung-uk Kim  *
712313a0c13SJung-uk Kim  * DESCRIPTION: Free all line buffers
713313a0c13SJung-uk Kim  *
714313a0c13SJung-uk Kim  *****************************************************************************/
715313a0c13SJung-uk Kim 
716313a0c13SJung-uk Kim void
717313a0c13SJung-uk Kim UtFreeLineBuffers (
718313a0c13SJung-uk Kim     void)
719313a0c13SJung-uk Kim {
720313a0c13SJung-uk Kim 
721313a0c13SJung-uk Kim     free (Gbl_CurrentLineBuffer);
722313a0c13SJung-uk Kim     free (Gbl_MainTokenBuffer);
723313a0c13SJung-uk Kim     free (Gbl_MacroTokenBuffer);
724313a0c13SJung-uk Kim     free (Gbl_ExpressionTokenBuffer);
725313a0c13SJung-uk Kim }
726313a0c13SJung-uk Kim 
727313a0c13SJung-uk Kim 
72853289f6aSNate Lawson /*******************************************************************************
72953289f6aSNate Lawson  *
73053289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
73153289f6aSNate Lawson  *
73253289f6aSNate Lawson  * PARAMETERS:  ExternalName        - Name to convert
73353289f6aSNate Lawson  *              ConvertedName       - Where the converted name is returned
73453289f6aSNate Lawson  *
73553289f6aSNate Lawson  * RETURN:      Status
73653289f6aSNate Lawson  *
73753289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
73853289f6aSNate Lawson  *
73953289f6aSNate Lawson  ******************************************************************************/
74053289f6aSNate Lawson 
74153289f6aSNate Lawson ACPI_STATUS
74253289f6aSNate Lawson UtInternalizeName (
74353289f6aSNate Lawson     char                    *ExternalName,
74453289f6aSNate Lawson     char                    **ConvertedName)
74553289f6aSNate Lawson {
74653289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
74753289f6aSNate Lawson     ACPI_STATUS             Status;
74853289f6aSNate Lawson 
74953289f6aSNate Lawson 
75053289f6aSNate Lawson     if (!ExternalName)
75153289f6aSNate Lawson     {
75253289f6aSNate Lawson         return (AE_OK);
75353289f6aSNate Lawson     }
75453289f6aSNate Lawson 
75553289f6aSNate Lawson     /* Get the length of the new internal name */
75653289f6aSNate Lawson 
75753289f6aSNate Lawson     Info.ExternalName = ExternalName;
75853289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
75953289f6aSNate Lawson 
76053289f6aSNate Lawson     /* We need a segment to store the internal name */
76153289f6aSNate Lawson 
762313a0c13SJung-uk Kim     Info.InternalName = UtStringCacheCalloc (Info.Length);
76353289f6aSNate Lawson     if (!Info.InternalName)
76453289f6aSNate Lawson     {
76553289f6aSNate Lawson         return (AE_NO_MEMORY);
76653289f6aSNate Lawson     }
76753289f6aSNate Lawson 
76853289f6aSNate Lawson     /* Build the name */
76953289f6aSNate Lawson 
77053289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
77153289f6aSNate Lawson     if (ACPI_FAILURE (Status))
77253289f6aSNate Lawson     {
77353289f6aSNate Lawson         return (Status);
77453289f6aSNate Lawson     }
77553289f6aSNate Lawson 
77653289f6aSNate Lawson     *ConvertedName = Info.InternalName;
77753289f6aSNate Lawson     return (AE_OK);
77853289f6aSNate Lawson }
77953289f6aSNate Lawson 
78053289f6aSNate Lawson 
78153289f6aSNate Lawson /*******************************************************************************
78253289f6aSNate Lawson  *
78353289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
78453289f6aSNate Lawson  *
78553289f6aSNate Lawson  * PARAMETERS:  NameSeg             - Input nameseg
78653289f6aSNate Lawson  *              PaddedNameSeg       - Output padded nameseg
78753289f6aSNate Lawson  *
78853289f6aSNate Lawson  * RETURN:      Padded nameseg.
78953289f6aSNate Lawson  *
79053289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
79153289f6aSNate Lawson  *              ACPI_NAME.
79253289f6aSNate Lawson  *
79353289f6aSNate Lawson  ******************************************************************************/
79453289f6aSNate Lawson 
795fba7fc7eSJung-uk Kim static void
79653289f6aSNate Lawson UtPadNameWithUnderscores (
79753289f6aSNate Lawson     char                    *NameSeg,
79853289f6aSNate Lawson     char                    *PaddedNameSeg)
79953289f6aSNate Lawson {
80053289f6aSNate Lawson     UINT32                  i;
80153289f6aSNate Lawson 
80253289f6aSNate Lawson 
80353289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
80453289f6aSNate Lawson     {
80553289f6aSNate Lawson         if (*NameSeg)
80653289f6aSNate Lawson         {
80753289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
80853289f6aSNate Lawson             NameSeg++;
80953289f6aSNate Lawson         }
81053289f6aSNate Lawson         else
81153289f6aSNate Lawson         {
81253289f6aSNate Lawson             *PaddedNameSeg = '_';
81353289f6aSNate Lawson         }
81453289f6aSNate Lawson         PaddedNameSeg++;
81553289f6aSNate Lawson     }
81653289f6aSNate Lawson }
81753289f6aSNate Lawson 
81853289f6aSNate Lawson 
81953289f6aSNate Lawson /*******************************************************************************
82053289f6aSNate Lawson  *
82153289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
82253289f6aSNate Lawson  *
82353289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
82453289f6aSNate Lawson  *              Name                - Full ExternalName
82553289f6aSNate Lawson  *
826fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
82753289f6aSNate Lawson  *
82853289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
82953289f6aSNate Lawson  *              in the NameSeg field of the Op.
83053289f6aSNate Lawson  *
83153289f6aSNate Lawson  ******************************************************************************/
83253289f6aSNate Lawson 
833fba7fc7eSJung-uk Kim static void
83453289f6aSNate Lawson UtAttachNameseg (
83553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
83653289f6aSNate Lawson     char                    *Name)
83753289f6aSNate Lawson {
83853289f6aSNate Lawson     char                    *NameSeg;
83953289f6aSNate Lawson     char                    PaddedNameSeg[4];
84053289f6aSNate Lawson 
84153289f6aSNate Lawson 
84253289f6aSNate Lawson     if (!Name)
84353289f6aSNate Lawson     {
84453289f6aSNate Lawson         return;
84553289f6aSNate Lawson     }
84653289f6aSNate Lawson 
84753289f6aSNate Lawson     /* Look for the last dot in the namepath */
84853289f6aSNate Lawson 
84953289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
85053289f6aSNate Lawson     if (NameSeg)
85153289f6aSNate Lawson     {
85253289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
85353289f6aSNate Lawson 
85453289f6aSNate Lawson         NameSeg++;
85553289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
85653289f6aSNate Lawson     }
85753289f6aSNate Lawson     else
85853289f6aSNate Lawson     {
85953289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
86053289f6aSNate Lawson         /* Handle prefixes */
86153289f6aSNate Lawson 
862efcc2a30SJung-uk Kim         while (ACPI_IS_ROOT_PREFIX (*Name) ||
863efcc2a30SJung-uk Kim                ACPI_IS_PARENT_PREFIX (*Name))
86453289f6aSNate Lawson         {
86553289f6aSNate Lawson             Name++;
86653289f6aSNate Lawson         }
86753289f6aSNate Lawson 
8688ef1a331SJung-uk Kim         /* Remaining string should be one single nameseg */
86953289f6aSNate Lawson 
87053289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
87153289f6aSNate Lawson     }
87253289f6aSNate Lawson 
8738ef1a331SJung-uk Kim     ACPI_MOVE_NAME (Op->Asl.NameSeg, PaddedNameSeg);
87453289f6aSNate Lawson }
87553289f6aSNate Lawson 
87653289f6aSNate Lawson 
87753289f6aSNate Lawson /*******************************************************************************
87853289f6aSNate Lawson  *
87953289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
88053289f6aSNate Lawson  *
88153289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
88253289f6aSNate Lawson  *              NameOp              - Node that contains the name
88353289f6aSNate Lawson  *
88453289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
88553289f6aSNate Lawson  *
88653289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node: The original
88753289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
88853289f6aSNate Lawson  *              the ACPI namespace manager.
88953289f6aSNate Lawson  *
89053289f6aSNate Lawson  ******************************************************************************/
89153289f6aSNate Lawson 
89253289f6aSNate Lawson void
89353289f6aSNate Lawson UtAttachNamepathToOwner (
89453289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
89553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
89653289f6aSNate Lawson {
89753289f6aSNate Lawson     ACPI_STATUS             Status;
89853289f6aSNate Lawson 
89953289f6aSNate Lawson 
90053289f6aSNate Lawson     /* Full external path */
90153289f6aSNate Lawson 
90253289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
90353289f6aSNate Lawson 
904fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
905fba7fc7eSJung-uk Kim 
906fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
907fba7fc7eSJung-uk Kim 
90853289f6aSNate Lawson     /* Last nameseg of the path */
90953289f6aSNate Lawson 
91053289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
91153289f6aSNate Lawson 
91253289f6aSNate Lawson     /* Create internalized path */
91353289f6aSNate Lawson 
91453289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
91553289f6aSNate Lawson     if (ACPI_FAILURE (Status))
91653289f6aSNate Lawson     {
91753289f6aSNate Lawson         /* TBD: abort on no memory */
91853289f6aSNate Lawson     }
91953289f6aSNate Lawson }
92053289f6aSNate Lawson 
92153289f6aSNate Lawson 
92253289f6aSNate Lawson /*******************************************************************************
92353289f6aSNate Lawson  *
92453289f6aSNate Lawson  * FUNCTION:    UtDoConstant
92553289f6aSNate Lawson  *
92653289f6aSNate Lawson  * PARAMETERS:  String              - Hex, Octal, or Decimal string
92753289f6aSNate Lawson  *
92853289f6aSNate Lawson  * RETURN:      Converted Integer
92953289f6aSNate Lawson  *
930f38b0f21SJung-uk Kim  * DESCRIPTION: Convert a string to an integer, with error checking.
93153289f6aSNate Lawson  *
93253289f6aSNate Lawson  ******************************************************************************/
93353289f6aSNate Lawson 
9349a179dd8SJung-uk Kim UINT64
93553289f6aSNate Lawson UtDoConstant (
93653289f6aSNate Lawson     char                    *String)
93753289f6aSNate Lawson {
93853289f6aSNate Lawson     ACPI_STATUS             Status;
9399a179dd8SJung-uk Kim     UINT64                  Converted;
94053289f6aSNate Lawson     char                    ErrBuf[64];
94153289f6aSNate Lawson 
94253289f6aSNate Lawson 
94353289f6aSNate Lawson     Status = UtStrtoul64 (String, 0, &Converted);
94453289f6aSNate Lawson     if (ACPI_FAILURE (Status))
94553289f6aSNate Lawson     {
946fba7fc7eSJung-uk Kim         sprintf (ErrBuf, "%s %s\n", "Conversion error:",
947fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
94853289f6aSNate Lawson         AslCompilererror (ErrBuf);
94953289f6aSNate Lawson     }
95053289f6aSNate Lawson 
95153289f6aSNate Lawson     return (Converted);
95253289f6aSNate Lawson }
95353289f6aSNate Lawson 
95453289f6aSNate Lawson 
955fba7fc7eSJung-uk Kim /* TBD: use version in ACPICA main code base? */
956fba7fc7eSJung-uk Kim 
95753289f6aSNate Lawson /*******************************************************************************
95853289f6aSNate Lawson  *
95953289f6aSNate Lawson  * FUNCTION:    UtStrtoul64
96053289f6aSNate Lawson  *
96153289f6aSNate Lawson  * PARAMETERS:  String              - Null terminated string
962f38b0f21SJung-uk Kim  *              Terminater          - Where a pointer to the terminating byte
963f38b0f21SJung-uk Kim  *                                    is returned
96453289f6aSNate Lawson  *              Base                - Radix of the string
96553289f6aSNate Lawson  *
96653289f6aSNate Lawson  * RETURN:      Converted value
96753289f6aSNate Lawson  *
96853289f6aSNate Lawson  * DESCRIPTION: Convert a string into an unsigned value.
96953289f6aSNate Lawson  *
97053289f6aSNate Lawson  ******************************************************************************/
97153289f6aSNate Lawson 
972d052a1ccSJung-uk Kim ACPI_STATUS
97353289f6aSNate Lawson UtStrtoul64 (
97453289f6aSNate Lawson     char                    *String,
97553289f6aSNate Lawson     UINT32                  Base,
9769a179dd8SJung-uk Kim     UINT64                  *RetInteger)
97753289f6aSNate Lawson {
97853289f6aSNate Lawson     UINT32                  Index;
97953289f6aSNate Lawson     UINT32                  Sign;
9809a179dd8SJung-uk Kim     UINT64                  ReturnValue = 0;
98153289f6aSNate Lawson     ACPI_STATUS             Status = AE_OK;
98253289f6aSNate Lawson 
98353289f6aSNate Lawson 
98453289f6aSNate Lawson     *RetInteger = 0;
98553289f6aSNate Lawson 
98653289f6aSNate Lawson     switch (Base)
98753289f6aSNate Lawson     {
98853289f6aSNate Lawson     case 0:
98953289f6aSNate Lawson     case 8:
99053289f6aSNate Lawson     case 10:
99153289f6aSNate Lawson     case 16:
992a9d8d09cSJung-uk Kim 
99353289f6aSNate Lawson         break;
99453289f6aSNate Lawson 
99553289f6aSNate Lawson     default:
99653289f6aSNate Lawson         /*
99753289f6aSNate Lawson          * The specified Base parameter is not in the domain of
99853289f6aSNate Lawson          * this function:
99953289f6aSNate Lawson          */
100053289f6aSNate Lawson         return (AE_BAD_PARAMETER);
100153289f6aSNate Lawson     }
100253289f6aSNate Lawson 
1003fba7fc7eSJung-uk Kim     /* Skip over any white space in the buffer: */
1004fba7fc7eSJung-uk Kim 
10059a179dd8SJung-uk Kim     while (isspace ((int) *String) || *String == '\t')
100653289f6aSNate Lawson     {
100753289f6aSNate Lawson         ++String;
100853289f6aSNate Lawson     }
100953289f6aSNate Lawson 
101053289f6aSNate Lawson     /*
101153289f6aSNate Lawson      * The buffer may contain an optional plus or minus sign.
101253289f6aSNate Lawson      * If it does, then skip over it but remember what is was:
101353289f6aSNate Lawson      */
101453289f6aSNate Lawson     if (*String == '-')
101553289f6aSNate Lawson     {
101653289f6aSNate Lawson         Sign = NEGATIVE;
101753289f6aSNate Lawson         ++String;
101853289f6aSNate Lawson     }
101953289f6aSNate Lawson     else if (*String == '+')
102053289f6aSNate Lawson     {
102153289f6aSNate Lawson         ++String;
102253289f6aSNate Lawson         Sign = POSITIVE;
102353289f6aSNate Lawson     }
102453289f6aSNate Lawson     else
102553289f6aSNate Lawson     {
102653289f6aSNate Lawson         Sign = POSITIVE;
102753289f6aSNate Lawson     }
102853289f6aSNate Lawson 
102953289f6aSNate Lawson     /*
103053289f6aSNate Lawson      * If the input parameter Base is zero, then we need to
103153289f6aSNate Lawson      * determine if it is octal, decimal, or hexadecimal:
103253289f6aSNate Lawson      */
103353289f6aSNate Lawson     if (Base == 0)
103453289f6aSNate Lawson     {
103553289f6aSNate Lawson         if (*String == '0')
103653289f6aSNate Lawson         {
10379a179dd8SJung-uk Kim             if (tolower ((int) *(++String)) == 'x')
103853289f6aSNate Lawson             {
103953289f6aSNate Lawson                 Base = 16;
104053289f6aSNate Lawson                 ++String;
104153289f6aSNate Lawson             }
104253289f6aSNate Lawson             else
104353289f6aSNate Lawson             {
104453289f6aSNate Lawson                 Base = 8;
104553289f6aSNate Lawson             }
104653289f6aSNate Lawson         }
104753289f6aSNate Lawson         else
104853289f6aSNate Lawson         {
104953289f6aSNate Lawson             Base = 10;
105053289f6aSNate Lawson         }
105153289f6aSNate Lawson     }
105253289f6aSNate Lawson 
105353289f6aSNate Lawson     /*
105453289f6aSNate Lawson      * For octal and hexadecimal bases, skip over the leading
105553289f6aSNate Lawson      * 0 or 0x, if they are present.
105653289f6aSNate Lawson      */
105753289f6aSNate Lawson     if (Base == 8 && *String == '0')
105853289f6aSNate Lawson     {
105953289f6aSNate Lawson         String++;
106053289f6aSNate Lawson     }
106153289f6aSNate Lawson 
106253289f6aSNate Lawson     if (Base == 16 &&
106353289f6aSNate Lawson         *String == '0' &&
10649a179dd8SJung-uk Kim         tolower ((int) *(++String)) == 'x')
106553289f6aSNate Lawson     {
106653289f6aSNate Lawson         String++;
106753289f6aSNate Lawson     }
106853289f6aSNate Lawson 
106953289f6aSNate Lawson     /* Main loop: convert the string to an unsigned long */
107053289f6aSNate Lawson 
107153289f6aSNate Lawson     while (*String)
107253289f6aSNate Lawson     {
10739a179dd8SJung-uk Kim         if (isdigit ((int) *String))
107453289f6aSNate Lawson         {
107553289f6aSNate Lawson             Index = ((UINT8) *String) - '0';
107653289f6aSNate Lawson         }
107753289f6aSNate Lawson         else
107853289f6aSNate Lawson         {
10799a179dd8SJung-uk Kim             Index = (UINT8) toupper ((int) *String);
10809a179dd8SJung-uk Kim             if (isupper ((int) Index))
108153289f6aSNate Lawson             {
108253289f6aSNate Lawson                 Index = Index - 'A' + 10;
108353289f6aSNate Lawson             }
108453289f6aSNate Lawson             else
108553289f6aSNate Lawson             {
108653289f6aSNate Lawson                 goto ErrorExit;
108753289f6aSNate Lawson             }
108853289f6aSNate Lawson         }
108953289f6aSNate Lawson 
109053289f6aSNate Lawson         if (Index >= Base)
109153289f6aSNate Lawson         {
109253289f6aSNate Lawson             goto ErrorExit;
109353289f6aSNate Lawson         }
109453289f6aSNate Lawson 
109553289f6aSNate Lawson         /* Check to see if value is out of range: */
109653289f6aSNate Lawson 
10979a179dd8SJung-uk Kim         if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) /
10989a179dd8SJung-uk Kim                             (UINT64) Base))
109953289f6aSNate Lawson         {
110053289f6aSNate Lawson             goto ErrorExit;
110153289f6aSNate Lawson         }
110253289f6aSNate Lawson         else
110353289f6aSNate Lawson         {
110453289f6aSNate Lawson             ReturnValue *= Base;
110553289f6aSNate Lawson             ReturnValue += Index;
110653289f6aSNate Lawson         }
110753289f6aSNate Lawson 
110853289f6aSNate Lawson         ++String;
110953289f6aSNate Lawson     }
111053289f6aSNate Lawson 
111153289f6aSNate Lawson 
1112fba7fc7eSJung-uk Kim     /* If a minus sign was present, then "the conversion is negated": */
1113fba7fc7eSJung-uk Kim 
111453289f6aSNate Lawson     if (Sign == NEGATIVE)
111553289f6aSNate Lawson     {
111653289f6aSNate Lawson         ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
111753289f6aSNate Lawson     }
111853289f6aSNate Lawson 
111953289f6aSNate Lawson     *RetInteger = ReturnValue;
112053289f6aSNate Lawson     return (Status);
112153289f6aSNate Lawson 
112253289f6aSNate Lawson 
112353289f6aSNate Lawson ErrorExit:
112453289f6aSNate Lawson     switch (Base)
112553289f6aSNate Lawson     {
112653289f6aSNate Lawson     case 8:
1127a9d8d09cSJung-uk Kim 
112853289f6aSNate Lawson         Status = AE_BAD_OCTAL_CONSTANT;
112953289f6aSNate Lawson         break;
113053289f6aSNate Lawson 
113153289f6aSNate Lawson     case 10:
1132a9d8d09cSJung-uk Kim 
113353289f6aSNate Lawson         Status = AE_BAD_DECIMAL_CONSTANT;
113453289f6aSNate Lawson         break;
113553289f6aSNate Lawson 
113653289f6aSNate Lawson     case 16:
1137a9d8d09cSJung-uk Kim 
113853289f6aSNate Lawson         Status = AE_BAD_HEX_CONSTANT;
113953289f6aSNate Lawson         break;
114053289f6aSNate Lawson 
114153289f6aSNate Lawson     default:
1142a9d8d09cSJung-uk Kim 
114353289f6aSNate Lawson         /* Base validated above */
1144a9d8d09cSJung-uk Kim 
114553289f6aSNate Lawson         break;
114653289f6aSNate Lawson     }
114753289f6aSNate Lawson 
114853289f6aSNate Lawson     return (Status);
114953289f6aSNate Lawson }
1150