xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision d244b2279c2f63fc930fa1c11a6033b7119d426a)
153289f6aSNate Lawson 
253289f6aSNate Lawson /******************************************************************************
353289f6aSNate Lawson  *
453289f6aSNate Lawson  * Module Name: aslutils -- compiler utilities
553289f6aSNate Lawson  *
653289f6aSNate Lawson  *****************************************************************************/
753289f6aSNate Lawson 
8*d244b227SJung-uk Kim /*
9*d244b227SJung-uk Kim  * Copyright (C) 2000 - 2011, Intel Corp.
1053289f6aSNate Lawson  * All rights reserved.
1153289f6aSNate Lawson  *
12*d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
13*d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
14*d244b227SJung-uk Kim  * are met:
15*d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
16*d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
17*d244b227SJung-uk Kim  *    without modification.
18*d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19*d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
20*d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
21*d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
22*d244b227SJung-uk Kim  *    binary redistribution.
23*d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
24*d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
25*d244b227SJung-uk Kim  *    from this software without specific prior written permission.
2653289f6aSNate Lawson  *
27*d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
28*d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
29*d244b227SJung-uk Kim  * Software Foundation.
3053289f6aSNate Lawson  *
31*d244b227SJung-uk Kim  * NO WARRANTY
32*d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33*d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34*d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35*d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36*d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37*d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38*d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39*d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40*d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41*d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42*d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
43*d244b227SJung-uk Kim  */
4453289f6aSNate Lawson 
4553289f6aSNate Lawson 
46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
4753289f6aSNate Lawson #include "aslcompiler.y.h"
48a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
513c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
5253289f6aSNate Lawson 
5353289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
5453289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslutils")
5553289f6aSNate Lawson 
5653289f6aSNate Lawson #ifdef _USE_BERKELEY_YACC
5753289f6aSNate Lawson extern const char * const       AslCompilername[];
580161891aSNate Lawson static const char * const       *yytname = &AslCompilername[254];
5953289f6aSNate Lawson #else
6053289f6aSNate Lawson extern const char * const       yytname[];
6153289f6aSNate Lawson #endif
6253289f6aSNate Lawson 
63*d244b227SJung-uk Kim char                        AslHexLookup[] =
64a9f12690SJung-uk Kim {
65a9f12690SJung-uk Kim     '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
66a9f12690SJung-uk Kim };
67a9f12690SJung-uk Kim 
68a9f12690SJung-uk Kim 
69fba7fc7eSJung-uk Kim /* Local prototypes */
7053289f6aSNate Lawson 
71fba7fc7eSJung-uk Kim static ACPI_STATUS
72fba7fc7eSJung-uk Kim UtStrtoul64 (
73fba7fc7eSJung-uk Kim     char                    *String,
74fba7fc7eSJung-uk Kim     UINT32                  Base,
759a179dd8SJung-uk Kim     UINT64                  *RetInteger);
76fba7fc7eSJung-uk Kim 
77fba7fc7eSJung-uk Kim static void
78fba7fc7eSJung-uk Kim UtPadNameWithUnderscores (
79fba7fc7eSJung-uk Kim     char                    *NameSeg,
80fba7fc7eSJung-uk Kim     char                    *PaddedNameSeg);
81fba7fc7eSJung-uk Kim 
82fba7fc7eSJung-uk Kim static void
83fba7fc7eSJung-uk Kim UtAttachNameseg (
84fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
85fba7fc7eSJung-uk Kim     char                    *Name);
8653289f6aSNate Lawson 
8753289f6aSNate Lawson 
8853289f6aSNate Lawson /*******************************************************************************
8953289f6aSNate Lawson  *
90a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
91a88e22b7SJung-uk Kim  *
92a88e22b7SJung-uk Kim  * PARAMETERS:  None
93a88e22b7SJung-uk Kim  *
94a88e22b7SJung-uk Kim  * RETURN:      None
95a88e22b7SJung-uk Kim  *
96a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
97a88e22b7SJung-uk Kim  *
98a88e22b7SJung-uk Kim  ******************************************************************************/
99a88e22b7SJung-uk Kim 
100a88e22b7SJung-uk Kim void
101a88e22b7SJung-uk Kim UtDisplaySupportedTables (
102a88e22b7SJung-uk Kim     void)
103a88e22b7SJung-uk Kim {
104a88e22b7SJung-uk Kim     ACPI_DMTABLE_DATA       *TableData;
105a88e22b7SJung-uk Kim     UINT32                  i = 6;
106a88e22b7SJung-uk Kim 
107a88e22b7SJung-uk Kim 
108a88e22b7SJung-uk Kim     printf ("\nACPI tables supported by iASL subsystems in "
109a88e22b7SJung-uk Kim         "version %8.8X:\n"
110a88e22b7SJung-uk Kim         "  ASL and Data Table compilers\n"
111a88e22b7SJung-uk Kim         "  AML and Data Table disassemblers\n"
112a88e22b7SJung-uk Kim         "  ACPI table template generator\n\n", ACPI_CA_VERSION);
113a88e22b7SJung-uk Kim 
114a88e22b7SJung-uk Kim     /* Special tables */
115a88e22b7SJung-uk Kim 
116a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 1, ACPI_SIG_DSDT, "Differentiated System Description Table");
117a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 2, ACPI_SIG_SSDT, "Secondary System Description Table");
118a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 3, ACPI_SIG_FADT, "Fixed ACPI Description Table (FADT)");
119a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 4, ACPI_SIG_FACS, "Firmware ACPI Control Structure");
120a88e22b7SJung-uk Kim     printf ("%8u) %s    %s\n", 5, ACPI_RSDP_NAME, "Root System Description Pointer");
121a88e22b7SJung-uk Kim 
122a88e22b7SJung-uk Kim     /* All data tables with common table header */
123a88e22b7SJung-uk Kim 
124a88e22b7SJung-uk Kim     for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
125a88e22b7SJung-uk Kim     {
126a88e22b7SJung-uk Kim         printf ("%8u) %s    %s\n", i, TableData->Signature, TableData->Name);
127a88e22b7SJung-uk Kim         i++;
128a88e22b7SJung-uk Kim     }
129a88e22b7SJung-uk Kim }
130a88e22b7SJung-uk Kim 
131a88e22b7SJung-uk Kim 
132a88e22b7SJung-uk Kim /*******************************************************************************
133a88e22b7SJung-uk Kim  *
13453289f6aSNate Lawson  * FUNCTION:    AcpiPsDisplayConstantOpcodes
13553289f6aSNate Lawson  *
13653289f6aSNate Lawson  * PARAMETERS:  None
13753289f6aSNate Lawson  *
13853289f6aSNate Lawson  * RETURN:      None
13953289f6aSNate Lawson  *
14053289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
14153289f6aSNate Lawson  *
14253289f6aSNate Lawson  ******************************************************************************/
14353289f6aSNate Lawson 
14453289f6aSNate Lawson void
14553289f6aSNate Lawson UtDisplayConstantOpcodes (
14653289f6aSNate Lawson     void)
14753289f6aSNate Lawson {
14853289f6aSNate Lawson     UINT32                  i;
14953289f6aSNate Lawson 
150fba7fc7eSJung-uk Kim 
15153289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
15253289f6aSNate Lawson 
15353289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
15453289f6aSNate Lawson     {
15553289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
15653289f6aSNate Lawson         {
15753289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
15853289f6aSNate Lawson         }
15953289f6aSNate Lawson     }
16053289f6aSNate Lawson }
16153289f6aSNate Lawson 
16253289f6aSNate Lawson 
16353289f6aSNate Lawson /*******************************************************************************
16453289f6aSNate Lawson  *
16553289f6aSNate Lawson  * FUNCTION:    UtLocalCalloc
16653289f6aSNate Lawson  *
16753289f6aSNate Lawson  * PARAMETERS:  Size        - Bytes to be allocated
16853289f6aSNate Lawson  *
16953289f6aSNate Lawson  * RETURN:      Pointer to the allocated memory.  Guaranteed to be valid.
17053289f6aSNate Lawson  *
17153289f6aSNate Lawson  * DESCRIPTION: Allocate zero-initialized memory.  Aborts the compile on an
17253289f6aSNate Lawson  *              allocation failure, on the assumption that nothing more can be
17353289f6aSNate Lawson  *              accomplished.
17453289f6aSNate Lawson  *
17553289f6aSNate Lawson  ******************************************************************************/
17653289f6aSNate Lawson 
17753289f6aSNate Lawson void *
17853289f6aSNate Lawson UtLocalCalloc (
17953289f6aSNate Lawson     UINT32                  Size)
18053289f6aSNate Lawson {
18153289f6aSNate Lawson     void                    *Allocated;
18253289f6aSNate Lawson 
18353289f6aSNate Lawson 
1841a39cfb0SJung-uk Kim     Allocated = ACPI_ALLOCATE_ZEROED (Size);
18553289f6aSNate Lawson     if (!Allocated)
18653289f6aSNate Lawson     {
18753289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
18853289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
18953289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
19053289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
191a88e22b7SJung-uk Kim 
192a88e22b7SJung-uk Kim         CmCleanupAndExit ();
19353289f6aSNate Lawson         exit (1);
19453289f6aSNate Lawson     }
19553289f6aSNate Lawson 
19653289f6aSNate Lawson     TotalAllocations++;
19753289f6aSNate Lawson     TotalAllocated += Size;
1981a39cfb0SJung-uk Kim     return (Allocated);
19953289f6aSNate Lawson }
20053289f6aSNate Lawson 
20153289f6aSNate Lawson 
20253289f6aSNate Lawson /*******************************************************************************
20353289f6aSNate Lawson  *
20453289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
20553289f6aSNate Lawson  *
206fba7fc7eSJung-uk Kim  * PARAMETERS:  Name        - Ascii name of this event
20753289f6aSNate Lawson  *
208fba7fc7eSJung-uk Kim  * RETURN:      Event       - Event number (integer index)
20953289f6aSNate Lawson  *
21053289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
21153289f6aSNate Lawson  *
21253289f6aSNate Lawson  ******************************************************************************/
21353289f6aSNate Lawson 
214fba7fc7eSJung-uk Kim UINT8
21553289f6aSNate Lawson UtBeginEvent (
21653289f6aSNate Lawson     char                    *Name)
21753289f6aSNate Lawson {
21853289f6aSNate Lawson 
219fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
220fba7fc7eSJung-uk Kim     {
221fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
222fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
223fba7fc7eSJung-uk Kim     }
224fba7fc7eSJung-uk Kim 
225fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
226fba7fc7eSJung-uk Kim 
227fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
228fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
229fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
230fba7fc7eSJung-uk Kim 
231fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
23253289f6aSNate Lawson }
23353289f6aSNate Lawson 
23453289f6aSNate Lawson 
23553289f6aSNate Lawson /*******************************************************************************
23653289f6aSNate Lawson  *
23753289f6aSNate Lawson  * FUNCTION:    UtEndEvent
23853289f6aSNate Lawson  *
23953289f6aSNate Lawson  * PARAMETERS:  Event       - Event number (integer index)
24053289f6aSNate Lawson  *
24153289f6aSNate Lawson  * RETURN:      None
24253289f6aSNate Lawson  *
24353289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
24453289f6aSNate Lawson  *
24553289f6aSNate Lawson  ******************************************************************************/
24653289f6aSNate Lawson 
24753289f6aSNate Lawson void
24853289f6aSNate Lawson UtEndEvent (
249fba7fc7eSJung-uk Kim     UINT8                  Event)
25053289f6aSNate Lawson {
25153289f6aSNate Lawson 
252fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
253fba7fc7eSJung-uk Kim     {
254fba7fc7eSJung-uk Kim         return;
255fba7fc7eSJung-uk Kim     }
256fba7fc7eSJung-uk Kim 
257fba7fc7eSJung-uk Kim     /* Insert end time for event */
258fba7fc7eSJung-uk Kim 
259fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
26053289f6aSNate Lawson }
26153289f6aSNate Lawson 
26253289f6aSNate Lawson 
26353289f6aSNate Lawson /*******************************************************************************
26453289f6aSNate Lawson  *
26553289f6aSNate Lawson  * FUNCTION:    UtHexCharToValue
26653289f6aSNate Lawson  *
267fba7fc7eSJung-uk Kim  * PARAMETERS:  HexChar         - Hex character in Ascii
26853289f6aSNate Lawson  *
26953289f6aSNate Lawson  * RETURN:      The binary value of the hex character
27053289f6aSNate Lawson  *
27153289f6aSNate Lawson  * DESCRIPTION: Perform ascii-to-hex translation
27253289f6aSNate Lawson  *
27353289f6aSNate Lawson  ******************************************************************************/
27453289f6aSNate Lawson 
27553289f6aSNate Lawson UINT8
27653289f6aSNate Lawson UtHexCharToValue (
277fba7fc7eSJung-uk Kim     int                     HexChar)
27853289f6aSNate Lawson {
27953289f6aSNate Lawson 
280fba7fc7eSJung-uk Kim     if (HexChar <= 0x39)
28153289f6aSNate Lawson     {
282fba7fc7eSJung-uk Kim         return ((UINT8) (HexChar - 0x30));
28353289f6aSNate Lawson     }
28453289f6aSNate Lawson 
285fba7fc7eSJung-uk Kim     if (HexChar <= 0x46)
28653289f6aSNate Lawson     {
287fba7fc7eSJung-uk Kim         return ((UINT8) (HexChar - 0x37));
28853289f6aSNate Lawson     }
28953289f6aSNate Lawson 
290fba7fc7eSJung-uk Kim     return ((UINT8) (HexChar - 0x57));
29153289f6aSNate Lawson }
29253289f6aSNate Lawson 
29353289f6aSNate Lawson 
29453289f6aSNate Lawson /*******************************************************************************
29553289f6aSNate Lawson  *
29653289f6aSNate Lawson  * FUNCTION:    UtConvertByteToHex
29753289f6aSNate Lawson  *
29853289f6aSNate Lawson  * PARAMETERS:  RawByte         - Binary data
299fba7fc7eSJung-uk Kim  *              Buffer          - Pointer to where the hex bytes will be stored
30053289f6aSNate Lawson  *
30153289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
30253289f6aSNate Lawson  *
30353289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
30453289f6aSNate Lawson  *              with "0x"
30553289f6aSNate Lawson  *
30653289f6aSNate Lawson  ******************************************************************************/
30753289f6aSNate Lawson 
30853289f6aSNate Lawson void
30953289f6aSNate Lawson UtConvertByteToHex (
31053289f6aSNate Lawson     UINT8                   RawByte,
31153289f6aSNate Lawson     UINT8                   *Buffer)
31253289f6aSNate Lawson {
31353289f6aSNate Lawson 
31453289f6aSNate Lawson     Buffer[0] = '0';
31553289f6aSNate Lawson     Buffer[1] = 'x';
31653289f6aSNate Lawson 
317*d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
318*d244b227SJung-uk Kim     Buffer[3] = (UINT8) AslHexLookup[RawByte & 0xF];
31953289f6aSNate Lawson }
32053289f6aSNate Lawson 
32153289f6aSNate Lawson 
32253289f6aSNate Lawson /*******************************************************************************
32353289f6aSNate Lawson  *
32453289f6aSNate Lawson  * FUNCTION:    UtConvertByteToAsmHex
32553289f6aSNate Lawson  *
32653289f6aSNate Lawson  * PARAMETERS:  RawByte         - Binary data
327fba7fc7eSJung-uk Kim  *              Buffer          - Pointer to where the hex bytes will be stored
32853289f6aSNate Lawson  *
32953289f6aSNate Lawson  * RETURN:      Ascii hex byte is stored in Buffer.
33053289f6aSNate Lawson  *
33153289f6aSNate Lawson  * DESCRIPTION: Perform hex-to-ascii translation.  The return data is prefixed
33253289f6aSNate Lawson  *              with "0x"
33353289f6aSNate Lawson  *
33453289f6aSNate Lawson  ******************************************************************************/
33553289f6aSNate Lawson 
33653289f6aSNate Lawson void
33753289f6aSNate Lawson UtConvertByteToAsmHex (
33853289f6aSNate Lawson     UINT8                   RawByte,
33953289f6aSNate Lawson     UINT8                   *Buffer)
34053289f6aSNate Lawson {
34153289f6aSNate Lawson 
34253289f6aSNate Lawson     Buffer[0] = '0';
343*d244b227SJung-uk Kim     Buffer[1] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF];
344*d244b227SJung-uk Kim     Buffer[2] = (UINT8) AslHexLookup[RawByte & 0xF];
34553289f6aSNate Lawson     Buffer[3] = 'h';
34653289f6aSNate Lawson }
34753289f6aSNate Lawson 
34853289f6aSNate Lawson 
34953289f6aSNate Lawson /*******************************************************************************
35053289f6aSNate Lawson  *
35153289f6aSNate Lawson  * FUNCTION:    DbgPrint
35253289f6aSNate Lawson  *
353fba7fc7eSJung-uk Kim  * PARAMETERS:  Type            - Type of output
354fba7fc7eSJung-uk Kim  *              Fmt             - Printf format string
35553289f6aSNate Lawson  *              ...             - variable printf list
35653289f6aSNate Lawson  *
35753289f6aSNate Lawson  * RETURN:      None
35853289f6aSNate Lawson  *
35953289f6aSNate Lawson  * DESCRIPTION: Conditional print statement.  Prints to stderr only if the
36053289f6aSNate Lawson  *              debug flag is set.
36153289f6aSNate Lawson  *
36253289f6aSNate Lawson  ******************************************************************************/
36353289f6aSNate Lawson 
36453289f6aSNate Lawson void
36553289f6aSNate Lawson DbgPrint (
36653289f6aSNate Lawson     UINT32                  Type,
36753289f6aSNate Lawson     char                    *Fmt,
36853289f6aSNate Lawson     ...)
36953289f6aSNate Lawson {
37053289f6aSNate Lawson     va_list                 Args;
37153289f6aSNate Lawson 
37253289f6aSNate Lawson 
37353289f6aSNate Lawson     va_start (Args, Fmt);
37453289f6aSNate Lawson 
37553289f6aSNate Lawson     if (!Gbl_DebugFlag)
37653289f6aSNate Lawson     {
37753289f6aSNate Lawson         return;
37853289f6aSNate Lawson     }
37953289f6aSNate Lawson 
38053289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
38153289f6aSNate Lawson         (!(AslCompilerdebug)))
38253289f6aSNate Lawson     {
38353289f6aSNate Lawson         return;
38453289f6aSNate Lawson     }
38553289f6aSNate Lawson 
38653289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
38753289f6aSNate Lawson     va_end (Args);
38853289f6aSNate Lawson     return;
38953289f6aSNate Lawson }
39053289f6aSNate Lawson 
39153289f6aSNate Lawson 
39253289f6aSNate Lawson /*******************************************************************************
39353289f6aSNate Lawson  *
39453289f6aSNate Lawson  * FUNCTION:    UtPrintFormattedName
39553289f6aSNate Lawson  *
39653289f6aSNate Lawson  * PARAMETERS:  ParseOpcode         - Parser keyword ID
39753289f6aSNate Lawson  *              Level               - Indentation level
39853289f6aSNate Lawson  *
39953289f6aSNate Lawson  * RETURN:      None
40053289f6aSNate Lawson  *
40153289f6aSNate Lawson  * DESCRIPTION: Print the ascii name of the parse opcode.
40253289f6aSNate Lawson  *
40353289f6aSNate Lawson  ******************************************************************************/
40453289f6aSNate Lawson 
40553289f6aSNate Lawson #define TEXT_OFFSET 10
40653289f6aSNate Lawson 
40753289f6aSNate Lawson void
40853289f6aSNate Lawson UtPrintFormattedName (
40953289f6aSNate Lawson     UINT16                  ParseOpcode,
41053289f6aSNate Lawson     UINT32                  Level)
41153289f6aSNate Lawson {
41253289f6aSNate Lawson 
4131a39cfb0SJung-uk Kim     if (Level)
4141a39cfb0SJung-uk Kim     {
41553289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
4161a39cfb0SJung-uk Kim             "%*s", (3 * Level), " ");
4171a39cfb0SJung-uk Kim     }
4181a39cfb0SJung-uk Kim     DbgPrint (ASL_TREE_OUTPUT,
4191a39cfb0SJung-uk Kim         " %-20.20s", UtGetOpName (ParseOpcode));
42053289f6aSNate Lawson 
42153289f6aSNate Lawson     if (Level < TEXT_OFFSET)
42253289f6aSNate Lawson     {
42353289f6aSNate Lawson         DbgPrint (ASL_TREE_OUTPUT,
42453289f6aSNate Lawson             "%*s", (TEXT_OFFSET - Level) * 3, " ");
42553289f6aSNate Lawson     }
42653289f6aSNate Lawson }
42753289f6aSNate Lawson 
42853289f6aSNate Lawson 
42953289f6aSNate Lawson /*******************************************************************************
43053289f6aSNate Lawson  *
43153289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
43253289f6aSNate Lawson  *
43353289f6aSNate Lawson  * PARAMETERS:  Op
43453289f6aSNate Lawson  *
43553289f6aSNate Lawson  * RETURN:      None
43653289f6aSNate Lawson  *
43753289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
43853289f6aSNate Lawson  *
43953289f6aSNate Lawson  ******************************************************************************/
44053289f6aSNate Lawson 
44153289f6aSNate Lawson void
44253289f6aSNate Lawson UtSetParseOpName (
44353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
44453289f6aSNate Lawson {
445fba7fc7eSJung-uk Kim 
4461a39cfb0SJung-uk Kim     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
4471a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
44853289f6aSNate Lawson }
44953289f6aSNate Lawson 
45053289f6aSNate Lawson 
45153289f6aSNate Lawson /*******************************************************************************
45253289f6aSNate Lawson  *
45353289f6aSNate Lawson  * FUNCTION:    UtGetOpName
45453289f6aSNate Lawson  *
45553289f6aSNate Lawson  * PARAMETERS:  ParseOpcode         - Parser keyword ID
45653289f6aSNate Lawson  *
45753289f6aSNate Lawson  * RETURN:      Pointer to the opcode name
45853289f6aSNate Lawson  *
45953289f6aSNate Lawson  * DESCRIPTION: Get the ascii name of the parse opcode
46053289f6aSNate Lawson  *
46153289f6aSNate Lawson  ******************************************************************************/
46253289f6aSNate Lawson 
46353289f6aSNate Lawson char *
46453289f6aSNate Lawson UtGetOpName (
46553289f6aSNate Lawson     UINT32                  ParseOpcode)
46653289f6aSNate Lawson {
46753289f6aSNate Lawson 
46853289f6aSNate Lawson     /*
46953289f6aSNate Lawson      * First entries (ASL_YYTNAME_START) in yytname are special reserved names.
47053289f6aSNate Lawson      * Ignore first 8 characters of the name
47153289f6aSNate Lawson      */
4721a39cfb0SJung-uk Kim     return ((char *) yytname
4731a39cfb0SJung-uk Kim         [(ParseOpcode - ASL_FIRST_PARSE_OPCODE) + ASL_YYTNAME_START] + 8);
47453289f6aSNate Lawson }
47553289f6aSNate Lawson 
47653289f6aSNate Lawson 
47753289f6aSNate Lawson /*******************************************************************************
47853289f6aSNate Lawson  *
47953289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
48053289f6aSNate Lawson  *
481fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID          - ID of outpout file
48253289f6aSNate Lawson  *
48353289f6aSNate Lawson  * RETURN:      None
48453289f6aSNate Lawson  *
48553289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
48653289f6aSNate Lawson  *
48753289f6aSNate Lawson  ******************************************************************************/
48853289f6aSNate Lawson 
48953289f6aSNate Lawson void
49053289f6aSNate Lawson UtDisplaySummary (
49153289f6aSNate Lawson     UINT32                  FileId)
49253289f6aSNate Lawson {
49353289f6aSNate Lawson 
49453289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
49553289f6aSNate Lawson     {
49653289f6aSNate Lawson         /* Compiler name and version number */
49753289f6aSNate Lawson 
4983c1812acSJung-uk Kim         FlPrintFile (FileId, "%s version %X%s\n",
4993c1812acSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH);
50053289f6aSNate Lawson     }
50153289f6aSNate Lawson 
502a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
503a88e22b7SJung-uk Kim     {
504a88e22b7SJung-uk Kim         FlPrintFile (FileId,
505a88e22b7SJung-uk Kim             "Table Input:   %s - %u lines, %u bytes, %u fields\n",
506a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
507a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
508a88e22b7SJung-uk Kim 
509a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
510a88e22b7SJung-uk Kim         {
511a88e22b7SJung-uk Kim             FlPrintFile (FileId,
512a88e22b7SJung-uk Kim                 "Binary Output: %s - %u bytes\n\n",
513a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
514a88e22b7SJung-uk Kim         }
515a88e22b7SJung-uk Kim     }
516a88e22b7SJung-uk Kim     else
517a88e22b7SJung-uk Kim     {
51853289f6aSNate Lawson         /* Input/Output summary */
51953289f6aSNate Lawson 
52053289f6aSNate Lawson         FlPrintFile (FileId,
521a88e22b7SJung-uk Kim             "ASL Input:  %s - %u lines, %u bytes, %u keywords\n",
52253289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
52353289f6aSNate Lawson             Gbl_InputByteCount, TotalKeywords);
52453289f6aSNate Lawson 
52553289f6aSNate Lawson         /* AML summary */
52653289f6aSNate Lawson 
52753289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
52853289f6aSNate Lawson         {
52953289f6aSNate Lawson             FlPrintFile (FileId,
530a88e22b7SJung-uk Kim                 "AML Output: %s - %u bytes, %u named objects, %u executable opcodes\n\n",
53153289f6aSNate Lawson                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,
53253289f6aSNate Lawson                 TotalNamedObjects, TotalExecutableOpcodes);
53353289f6aSNate Lawson         }
534a88e22b7SJung-uk Kim     }
53553289f6aSNate Lawson 
53653289f6aSNate Lawson     /* Error summary */
53753289f6aSNate Lawson 
53853289f6aSNate Lawson     FlPrintFile (FileId,
539a88e22b7SJung-uk Kim         "Compilation complete. %u Errors, %u Warnings, %u Remarks",
54053289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
5411a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
5421a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
5431a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
544a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
545a88e22b7SJung-uk Kim 
546a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
547a88e22b7SJung-uk Kim     {
548a88e22b7SJung-uk Kim         FlPrintFile (FileId,
549a88e22b7SJung-uk Kim             ", %u Optimizations", Gbl_ExceptionCount[ASL_OPTIMIZATION]);
550a88e22b7SJung-uk Kim     }
551a88e22b7SJung-uk Kim 
552a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
55353289f6aSNate Lawson }
55453289f6aSNate Lawson 
55553289f6aSNate Lawson 
55653289f6aSNate Lawson /*******************************************************************************
55753289f6aSNate Lawson  *
55853289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
55953289f6aSNate Lawson  *
56053289f6aSNate Lawson  * PARAMETERS:  Op              - Integer parse node
56153289f6aSNate Lawson  *              LowValue        - Smallest allowed value
56253289f6aSNate Lawson  *              HighValue       - Largest allowed value
56353289f6aSNate Lawson  *
56453289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
56553289f6aSNate Lawson  *
56653289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
56753289f6aSNate Lawson  *
56853289f6aSNate Lawson  ******************************************************************************/
56953289f6aSNate Lawson 
57053289f6aSNate Lawson ACPI_PARSE_OBJECT *
57153289f6aSNate Lawson UtCheckIntegerRange (
57253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
57353289f6aSNate Lawson     UINT32                  LowValue,
57453289f6aSNate Lawson     UINT32                  HighValue)
57553289f6aSNate Lawson {
57653289f6aSNate Lawson     char                    *ParseError = NULL;
57753289f6aSNate Lawson     char                    Buffer[64];
57853289f6aSNate Lawson 
57953289f6aSNate Lawson 
58053289f6aSNate Lawson     if (!Op)
58153289f6aSNate Lawson     {
58253289f6aSNate Lawson         return NULL;
58353289f6aSNate Lawson     }
58453289f6aSNate Lawson 
58553289f6aSNate Lawson     if (Op->Asl.Value.Integer < LowValue)
58653289f6aSNate Lawson     {
58753289f6aSNate Lawson         ParseError = "Value below valid range";
58853289f6aSNate Lawson         Op->Asl.Value.Integer = LowValue;
58953289f6aSNate Lawson     }
59053289f6aSNate Lawson 
59153289f6aSNate Lawson     if (Op->Asl.Value.Integer > HighValue)
59253289f6aSNate Lawson     {
59353289f6aSNate Lawson         ParseError = "Value above valid range";
59453289f6aSNate Lawson         Op->Asl.Value.Integer = HighValue;
59553289f6aSNate Lawson     }
59653289f6aSNate Lawson 
59753289f6aSNate Lawson     if (ParseError)
59853289f6aSNate Lawson     {
59953289f6aSNate Lawson         sprintf (Buffer, "%s 0x%X-0x%X", ParseError, LowValue, HighValue);
60053289f6aSNate Lawson         AslCompilererror (Buffer);
60153289f6aSNate Lawson 
60253289f6aSNate Lawson         return NULL;
60353289f6aSNate Lawson     }
60453289f6aSNate Lawson 
60553289f6aSNate Lawson     return Op;
60653289f6aSNate Lawson }
60753289f6aSNate Lawson 
60853289f6aSNate Lawson 
60953289f6aSNate Lawson /*******************************************************************************
61053289f6aSNate Lawson  *
61153289f6aSNate Lawson  * FUNCTION:    UtGetStringBuffer
61253289f6aSNate Lawson  *
61353289f6aSNate Lawson  * PARAMETERS:  Length          - Size of buffer requested
61453289f6aSNate Lawson  *
61553289f6aSNate Lawson  * RETURN:      Pointer to the buffer.  Aborts on allocation failure
61653289f6aSNate Lawson  *
61753289f6aSNate Lawson  * DESCRIPTION: Allocate a string buffer.  Bypass the local
61853289f6aSNate Lawson  *              dynamic memory manager for performance reasons (This has a
61953289f6aSNate Lawson  *              major impact on the speed of the compiler.)
62053289f6aSNate Lawson  *
62153289f6aSNate Lawson  ******************************************************************************/
62253289f6aSNate Lawson 
62353289f6aSNate Lawson char *
62453289f6aSNate Lawson UtGetStringBuffer (
62553289f6aSNate Lawson     UINT32                  Length)
62653289f6aSNate Lawson {
62753289f6aSNate Lawson     char                    *Buffer;
62853289f6aSNate Lawson 
62953289f6aSNate Lawson 
63053289f6aSNate Lawson     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
63153289f6aSNate Lawson     {
63253289f6aSNate Lawson         Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length);
633fba7fc7eSJung-uk Kim         Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE +
634fba7fc7eSJung-uk Kim                                 Length;
63553289f6aSNate Lawson     }
63653289f6aSNate Lawson 
63753289f6aSNate Lawson     Buffer = Gbl_StringCacheNext;
63853289f6aSNate Lawson     Gbl_StringCacheNext += Length;
63953289f6aSNate Lawson 
64053289f6aSNate Lawson     return (Buffer);
64153289f6aSNate Lawson }
64253289f6aSNate Lawson 
64353289f6aSNate Lawson 
64453289f6aSNate Lawson /*******************************************************************************
64553289f6aSNate Lawson  *
64653289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
64753289f6aSNate Lawson  *
64853289f6aSNate Lawson  * PARAMETERS:  ExternalName            - Name to convert
64953289f6aSNate Lawson  *              ConvertedName           - Where the converted name is returned
65053289f6aSNate Lawson  *
65153289f6aSNate Lawson  * RETURN:      Status
65253289f6aSNate Lawson  *
65353289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
65453289f6aSNate Lawson  *
65553289f6aSNate Lawson  ******************************************************************************/
65653289f6aSNate Lawson 
65753289f6aSNate Lawson ACPI_STATUS
65853289f6aSNate Lawson UtInternalizeName (
65953289f6aSNate Lawson     char                    *ExternalName,
66053289f6aSNate Lawson     char                    **ConvertedName)
66153289f6aSNate Lawson {
66253289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
66353289f6aSNate Lawson     ACPI_STATUS             Status;
66453289f6aSNate Lawson 
66553289f6aSNate Lawson 
66653289f6aSNate Lawson     if (!ExternalName)
66753289f6aSNate Lawson     {
66853289f6aSNate Lawson         return (AE_OK);
66953289f6aSNate Lawson     }
67053289f6aSNate Lawson 
67153289f6aSNate Lawson     /* Get the length of the new internal name */
67253289f6aSNate Lawson 
67353289f6aSNate Lawson     Info.ExternalName = ExternalName;
67453289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
67553289f6aSNate Lawson 
67653289f6aSNate Lawson     /* We need a segment to store the internal  name */
67753289f6aSNate Lawson 
67853289f6aSNate Lawson     Info.InternalName = UtGetStringBuffer (Info.Length);
67953289f6aSNate Lawson     if (!Info.InternalName)
68053289f6aSNate Lawson     {
68153289f6aSNate Lawson         return (AE_NO_MEMORY);
68253289f6aSNate Lawson     }
68353289f6aSNate Lawson 
68453289f6aSNate Lawson     /* Build the name */
68553289f6aSNate Lawson 
68653289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
68753289f6aSNate Lawson     if (ACPI_FAILURE (Status))
68853289f6aSNate Lawson     {
68953289f6aSNate Lawson         return (Status);
69053289f6aSNate Lawson     }
69153289f6aSNate Lawson 
69253289f6aSNate Lawson     *ConvertedName = Info.InternalName;
69353289f6aSNate Lawson     return (AE_OK);
69453289f6aSNate Lawson }
69553289f6aSNate Lawson 
69653289f6aSNate Lawson 
69753289f6aSNate Lawson /*******************************************************************************
69853289f6aSNate Lawson  *
69953289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
70053289f6aSNate Lawson  *
70153289f6aSNate Lawson  * PARAMETERS:  NameSeg         - Input nameseg
70253289f6aSNate Lawson  *              PaddedNameSeg   - Output padded nameseg
70353289f6aSNate Lawson  *
70453289f6aSNate Lawson  * RETURN:      Padded nameseg.
70553289f6aSNate Lawson  *
70653289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
70753289f6aSNate Lawson  *              ACPI_NAME.
70853289f6aSNate Lawson  *
70953289f6aSNate Lawson  ******************************************************************************/
71053289f6aSNate Lawson 
711fba7fc7eSJung-uk Kim static void
71253289f6aSNate Lawson UtPadNameWithUnderscores (
71353289f6aSNate Lawson     char                    *NameSeg,
71453289f6aSNate Lawson     char                    *PaddedNameSeg)
71553289f6aSNate Lawson {
71653289f6aSNate Lawson     UINT32                  i;
71753289f6aSNate Lawson 
71853289f6aSNate Lawson 
71953289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
72053289f6aSNate Lawson     {
72153289f6aSNate Lawson         if (*NameSeg)
72253289f6aSNate Lawson         {
72353289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
72453289f6aSNate Lawson             NameSeg++;
72553289f6aSNate Lawson         }
72653289f6aSNate Lawson         else
72753289f6aSNate Lawson         {
72853289f6aSNate Lawson             *PaddedNameSeg = '_';
72953289f6aSNate Lawson         }
73053289f6aSNate Lawson         PaddedNameSeg++;
73153289f6aSNate Lawson     }
73253289f6aSNate Lawson }
73353289f6aSNate Lawson 
73453289f6aSNate Lawson 
73553289f6aSNate Lawson /*******************************************************************************
73653289f6aSNate Lawson  *
73753289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
73853289f6aSNate Lawson  *
73953289f6aSNate Lawson  * PARAMETERS:  Op              - Parent parse node
74053289f6aSNate Lawson  *              Name            - Full ExternalName
74153289f6aSNate Lawson  *
742fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
74353289f6aSNate Lawson  *
74453289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
74553289f6aSNate Lawson  *              in the NameSeg field of the Op.
74653289f6aSNate Lawson  *
74753289f6aSNate Lawson  ******************************************************************************/
74853289f6aSNate Lawson 
749fba7fc7eSJung-uk Kim static void
75053289f6aSNate Lawson UtAttachNameseg (
75153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
75253289f6aSNate Lawson     char                    *Name)
75353289f6aSNate Lawson {
75453289f6aSNate Lawson     char                    *NameSeg;
75553289f6aSNate Lawson     char                    PaddedNameSeg[4];
75653289f6aSNate Lawson 
75753289f6aSNate Lawson 
75853289f6aSNate Lawson     if (!Name)
75953289f6aSNate Lawson     {
76053289f6aSNate Lawson         return;
76153289f6aSNate Lawson     }
76253289f6aSNate Lawson 
76353289f6aSNate Lawson     /* Look for the last dot in the namepath */
76453289f6aSNate Lawson 
76553289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
76653289f6aSNate Lawson     if (NameSeg)
76753289f6aSNate Lawson     {
76853289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
76953289f6aSNate Lawson 
77053289f6aSNate Lawson         NameSeg++;
77153289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
77253289f6aSNate Lawson     }
77353289f6aSNate Lawson     else
77453289f6aSNate Lawson     {
77553289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
77653289f6aSNate Lawson         /* Handle prefixes */
77753289f6aSNate Lawson 
77853289f6aSNate Lawson         while ((*Name == '\\') || (*Name == '^'))
77953289f6aSNate Lawson         {
78053289f6aSNate Lawson             Name++;
78153289f6aSNate Lawson         }
78253289f6aSNate Lawson 
78353289f6aSNate Lawson         /* Remaing string should be one single nameseg */
78453289f6aSNate Lawson 
78553289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
78653289f6aSNate Lawson     }
78753289f6aSNate Lawson 
78853289f6aSNate Lawson     strncpy (Op->Asl.NameSeg, PaddedNameSeg, 4);
78953289f6aSNate Lawson }
79053289f6aSNate Lawson 
79153289f6aSNate Lawson 
79253289f6aSNate Lawson /*******************************************************************************
79353289f6aSNate Lawson  *
79453289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
79553289f6aSNate Lawson  *
79653289f6aSNate Lawson  * PARAMETERS:  Op            - Parent parse node
79753289f6aSNate Lawson  *              NameOp        - Node that contains the name
79853289f6aSNate Lawson  *
79953289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
80053289f6aSNate Lawson  *
80153289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node:  The original
80253289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
80353289f6aSNate Lawson  *              the ACPI namespace manager.
80453289f6aSNate Lawson  *
80553289f6aSNate Lawson  ******************************************************************************/
80653289f6aSNate Lawson 
80753289f6aSNate Lawson void
80853289f6aSNate Lawson UtAttachNamepathToOwner (
80953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
81053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
81153289f6aSNate Lawson {
81253289f6aSNate Lawson     ACPI_STATUS             Status;
81353289f6aSNate Lawson 
81453289f6aSNate Lawson 
81553289f6aSNate Lawson     /* Full external path */
81653289f6aSNate Lawson 
81753289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
81853289f6aSNate Lawson 
819fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
820fba7fc7eSJung-uk Kim 
821fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
822fba7fc7eSJung-uk Kim 
82353289f6aSNate Lawson     /* Last nameseg of the path */
82453289f6aSNate Lawson 
82553289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
82653289f6aSNate Lawson 
82753289f6aSNate Lawson     /* Create internalized path */
82853289f6aSNate Lawson 
82953289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
83053289f6aSNate Lawson     if (ACPI_FAILURE (Status))
83153289f6aSNate Lawson     {
83253289f6aSNate Lawson         /* TBD: abort on no memory */
83353289f6aSNate Lawson     }
83453289f6aSNate Lawson }
83553289f6aSNate Lawson 
83653289f6aSNate Lawson 
83753289f6aSNate Lawson /*******************************************************************************
83853289f6aSNate Lawson  *
83953289f6aSNate Lawson  * FUNCTION:    UtDoConstant
84053289f6aSNate Lawson  *
84153289f6aSNate Lawson  * PARAMETERS:  String      - Hex, Octal, or Decimal string
84253289f6aSNate Lawson  *
84353289f6aSNate Lawson  * RETURN:      Converted Integer
84453289f6aSNate Lawson  *
84553289f6aSNate Lawson  * DESCRIPTION: Convert a string to an integer.  With error checking.
84653289f6aSNate Lawson  *
84753289f6aSNate Lawson  ******************************************************************************/
84853289f6aSNate Lawson 
8499a179dd8SJung-uk Kim UINT64
85053289f6aSNate Lawson UtDoConstant (
85153289f6aSNate Lawson     char                    *String)
85253289f6aSNate Lawson {
85353289f6aSNate Lawson     ACPI_STATUS             Status;
8549a179dd8SJung-uk Kim     UINT64                  Converted;
85553289f6aSNate Lawson     char                    ErrBuf[64];
85653289f6aSNate Lawson 
85753289f6aSNate Lawson 
85853289f6aSNate Lawson     Status = UtStrtoul64 (String, 0, &Converted);
85953289f6aSNate Lawson     if (ACPI_FAILURE (Status))
86053289f6aSNate Lawson     {
861fba7fc7eSJung-uk Kim         sprintf (ErrBuf, "%s %s\n", "Conversion error:",
862fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
86353289f6aSNate Lawson         AslCompilererror (ErrBuf);
86453289f6aSNate Lawson     }
86553289f6aSNate Lawson 
86653289f6aSNate Lawson     return (Converted);
86753289f6aSNate Lawson }
86853289f6aSNate Lawson 
86953289f6aSNate Lawson 
870fba7fc7eSJung-uk Kim /* TBD: use version in ACPI CA main code base? */
871fba7fc7eSJung-uk Kim 
87253289f6aSNate Lawson /*******************************************************************************
87353289f6aSNate Lawson  *
87453289f6aSNate Lawson  * FUNCTION:    UtStrtoul64
87553289f6aSNate Lawson  *
87653289f6aSNate Lawson  * PARAMETERS:  String          - Null terminated string
877fba7fc7eSJung-uk Kim  *              Terminater      - Where a pointer to the terminating byte is
878fba7fc7eSJung-uk Kim  *                                returned
87953289f6aSNate Lawson  *              Base            - Radix of the string
88053289f6aSNate Lawson  *
88153289f6aSNate Lawson  * RETURN:      Converted value
88253289f6aSNate Lawson  *
88353289f6aSNate Lawson  * DESCRIPTION: Convert a string into an unsigned value.
88453289f6aSNate Lawson  *
88553289f6aSNate Lawson  ******************************************************************************/
88653289f6aSNate Lawson 
887fba7fc7eSJung-uk Kim static ACPI_STATUS
88853289f6aSNate Lawson UtStrtoul64 (
88953289f6aSNate Lawson     char                    *String,
89053289f6aSNate Lawson     UINT32                  Base,
8919a179dd8SJung-uk Kim     UINT64                  *RetInteger)
89253289f6aSNate Lawson {
89353289f6aSNate Lawson     UINT32                  Index;
89453289f6aSNate Lawson     UINT32                  Sign;
8959a179dd8SJung-uk Kim     UINT64                  ReturnValue = 0;
89653289f6aSNate Lawson     ACPI_STATUS             Status = AE_OK;
89753289f6aSNate Lawson 
89853289f6aSNate Lawson 
89953289f6aSNate Lawson     *RetInteger = 0;
90053289f6aSNate Lawson 
90153289f6aSNate Lawson     switch (Base)
90253289f6aSNate Lawson     {
90353289f6aSNate Lawson     case 0:
90453289f6aSNate Lawson     case 8:
90553289f6aSNate Lawson     case 10:
90653289f6aSNate Lawson     case 16:
90753289f6aSNate Lawson         break;
90853289f6aSNate Lawson 
90953289f6aSNate Lawson     default:
91053289f6aSNate Lawson         /*
91153289f6aSNate Lawson          * The specified Base parameter is not in the domain of
91253289f6aSNate Lawson          * this function:
91353289f6aSNate Lawson          */
91453289f6aSNate Lawson         return (AE_BAD_PARAMETER);
91553289f6aSNate Lawson     }
91653289f6aSNate Lawson 
917fba7fc7eSJung-uk Kim     /* Skip over any white space in the buffer: */
918fba7fc7eSJung-uk Kim 
9199a179dd8SJung-uk Kim     while (isspace ((int) *String) || *String == '\t')
92053289f6aSNate Lawson     {
92153289f6aSNate Lawson         ++String;
92253289f6aSNate Lawson     }
92353289f6aSNate Lawson 
92453289f6aSNate Lawson     /*
92553289f6aSNate Lawson      * The buffer may contain an optional plus or minus sign.
92653289f6aSNate Lawson      * If it does, then skip over it but remember what is was:
92753289f6aSNate Lawson      */
92853289f6aSNate Lawson     if (*String == '-')
92953289f6aSNate Lawson     {
93053289f6aSNate Lawson         Sign = NEGATIVE;
93153289f6aSNate Lawson         ++String;
93253289f6aSNate Lawson     }
93353289f6aSNate Lawson     else if (*String == '+')
93453289f6aSNate Lawson     {
93553289f6aSNate Lawson         ++String;
93653289f6aSNate Lawson         Sign = POSITIVE;
93753289f6aSNate Lawson     }
93853289f6aSNate Lawson     else
93953289f6aSNate Lawson     {
94053289f6aSNate Lawson         Sign = POSITIVE;
94153289f6aSNate Lawson     }
94253289f6aSNate Lawson 
94353289f6aSNate Lawson     /*
94453289f6aSNate Lawson      * If the input parameter Base is zero, then we need to
94553289f6aSNate Lawson      * determine if it is octal, decimal, or hexadecimal:
94653289f6aSNate Lawson      */
94753289f6aSNate Lawson     if (Base == 0)
94853289f6aSNate Lawson     {
94953289f6aSNate Lawson         if (*String == '0')
95053289f6aSNate Lawson         {
9519a179dd8SJung-uk Kim             if (tolower ((int) *(++String)) == 'x')
95253289f6aSNate Lawson             {
95353289f6aSNate Lawson                 Base = 16;
95453289f6aSNate Lawson                 ++String;
95553289f6aSNate Lawson             }
95653289f6aSNate Lawson             else
95753289f6aSNate Lawson             {
95853289f6aSNate Lawson                 Base = 8;
95953289f6aSNate Lawson             }
96053289f6aSNate Lawson         }
96153289f6aSNate Lawson         else
96253289f6aSNate Lawson         {
96353289f6aSNate Lawson             Base = 10;
96453289f6aSNate Lawson         }
96553289f6aSNate Lawson     }
96653289f6aSNate Lawson 
96753289f6aSNate Lawson     /*
96853289f6aSNate Lawson      * For octal and hexadecimal bases, skip over the leading
96953289f6aSNate Lawson      * 0 or 0x, if they are present.
97053289f6aSNate Lawson      */
97153289f6aSNate Lawson     if (Base == 8 && *String == '0')
97253289f6aSNate Lawson     {
97353289f6aSNate Lawson         String++;
97453289f6aSNate Lawson     }
97553289f6aSNate Lawson 
97653289f6aSNate Lawson     if (Base == 16 &&
97753289f6aSNate Lawson         *String == '0' &&
9789a179dd8SJung-uk Kim         tolower ((int) *(++String)) == 'x')
97953289f6aSNate Lawson     {
98053289f6aSNate Lawson         String++;
98153289f6aSNate Lawson     }
98253289f6aSNate Lawson 
98353289f6aSNate Lawson     /* Main loop: convert the string to an unsigned long */
98453289f6aSNate Lawson 
98553289f6aSNate Lawson     while (*String)
98653289f6aSNate Lawson     {
9879a179dd8SJung-uk Kim         if (isdigit ((int) *String))
98853289f6aSNate Lawson         {
98953289f6aSNate Lawson             Index = ((UINT8) *String) - '0';
99053289f6aSNate Lawson         }
99153289f6aSNate Lawson         else
99253289f6aSNate Lawson         {
9939a179dd8SJung-uk Kim             Index = (UINT8) toupper ((int) *String);
9949a179dd8SJung-uk Kim             if (isupper ((int) Index))
99553289f6aSNate Lawson             {
99653289f6aSNate Lawson                 Index = Index - 'A' + 10;
99753289f6aSNate Lawson             }
99853289f6aSNate Lawson             else
99953289f6aSNate Lawson             {
100053289f6aSNate Lawson                 goto ErrorExit;
100153289f6aSNate Lawson             }
100253289f6aSNate Lawson         }
100353289f6aSNate Lawson 
100453289f6aSNate Lawson         if (Index >= Base)
100553289f6aSNate Lawson         {
100653289f6aSNate Lawson             goto ErrorExit;
100753289f6aSNate Lawson         }
100853289f6aSNate Lawson 
100953289f6aSNate Lawson         /* Check to see if value is out of range: */
101053289f6aSNate Lawson 
10119a179dd8SJung-uk Kim         if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) /
10129a179dd8SJung-uk Kim                             (UINT64) Base))
101353289f6aSNate Lawson         {
101453289f6aSNate Lawson             goto ErrorExit;
101553289f6aSNate Lawson         }
101653289f6aSNate Lawson         else
101753289f6aSNate Lawson         {
101853289f6aSNate Lawson             ReturnValue *= Base;
101953289f6aSNate Lawson             ReturnValue += Index;
102053289f6aSNate Lawson         }
102153289f6aSNate Lawson 
102253289f6aSNate Lawson         ++String;
102353289f6aSNate Lawson     }
102453289f6aSNate Lawson 
102553289f6aSNate Lawson 
1026fba7fc7eSJung-uk Kim     /* If a minus sign was present, then "the conversion is negated": */
1027fba7fc7eSJung-uk Kim 
102853289f6aSNate Lawson     if (Sign == NEGATIVE)
102953289f6aSNate Lawson     {
103053289f6aSNate Lawson         ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
103153289f6aSNate Lawson     }
103253289f6aSNate Lawson 
103353289f6aSNate Lawson     *RetInteger = ReturnValue;
103453289f6aSNate Lawson     return (Status);
103553289f6aSNate Lawson 
103653289f6aSNate Lawson 
103753289f6aSNate Lawson ErrorExit:
103853289f6aSNate Lawson     switch (Base)
103953289f6aSNate Lawson     {
104053289f6aSNate Lawson     case 8:
104153289f6aSNate Lawson         Status = AE_BAD_OCTAL_CONSTANT;
104253289f6aSNate Lawson         break;
104353289f6aSNate Lawson 
104453289f6aSNate Lawson     case 10:
104553289f6aSNate Lawson         Status = AE_BAD_DECIMAL_CONSTANT;
104653289f6aSNate Lawson         break;
104753289f6aSNate Lawson 
104853289f6aSNate Lawson     case 16:
104953289f6aSNate Lawson         Status = AE_BAD_HEX_CONSTANT;
105053289f6aSNate Lawson         break;
105153289f6aSNate Lawson 
105253289f6aSNate Lawson     default:
105353289f6aSNate Lawson         /* Base validated above */
105453289f6aSNate Lawson         break;
105553289f6aSNate Lawson     }
105653289f6aSNate Lawson 
105753289f6aSNate Lawson     return (Status);
105853289f6aSNate Lawson }
105953289f6aSNate Lawson 
106053289f6aSNate Lawson 
1061