xref: /freebsd/sys/contrib/dev/acpica/compiler/aslutils.c (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: aslutils -- compiler utilities
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
7d244b227SJung-uk Kim /*
8*f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, 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>
50*f8146b88SJung-uk Kim #include <sys/stat.h>
51*f8146b88SJung-uk Kim 
5253289f6aSNate Lawson 
5353289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
5453289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslutils")
5553289f6aSNate Lawson 
563f0275a0SJung-uk Kim 
57fba7fc7eSJung-uk Kim /* Local prototypes */
5853289f6aSNate Lawson 
59fba7fc7eSJung-uk Kim static void
60fba7fc7eSJung-uk Kim UtPadNameWithUnderscores (
61fba7fc7eSJung-uk Kim     char                    *NameSeg,
62fba7fc7eSJung-uk Kim     char                    *PaddedNameSeg);
63fba7fc7eSJung-uk Kim 
64fba7fc7eSJung-uk Kim static void
65fba7fc7eSJung-uk Kim UtAttachNameseg (
66fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
67fba7fc7eSJung-uk Kim     char                    *Name);
6853289f6aSNate Lawson 
6953289f6aSNate Lawson 
7053289f6aSNate Lawson /*******************************************************************************
7153289f6aSNate Lawson  *
72*f8146b88SJung-uk Kim  * FUNCTION:    UtIsBigEndianMachine
73*f8146b88SJung-uk Kim  *
74*f8146b88SJung-uk Kim  * PARAMETERS:  None
75*f8146b88SJung-uk Kim  *
76*f8146b88SJung-uk Kim  * RETURN:      TRUE if machine is big endian
77*f8146b88SJung-uk Kim  *              FALSE if machine is little endian
78*f8146b88SJung-uk Kim  *
79*f8146b88SJung-uk Kim  * DESCRIPTION: Detect whether machine is little endian or big endian.
80*f8146b88SJung-uk Kim  *
81*f8146b88SJung-uk Kim  ******************************************************************************/
82*f8146b88SJung-uk Kim 
83*f8146b88SJung-uk Kim UINT8
84*f8146b88SJung-uk Kim UtIsBigEndianMachine (
85*f8146b88SJung-uk Kim     void)
86*f8146b88SJung-uk Kim {
87*f8146b88SJung-uk Kim     union {
88*f8146b88SJung-uk Kim         UINT32              Integer;
89*f8146b88SJung-uk Kim         UINT8               Bytes[4];
90*f8146b88SJung-uk Kim     } Overlay =                 {0xFF000000};
91*f8146b88SJung-uk Kim 
92*f8146b88SJung-uk Kim 
93*f8146b88SJung-uk Kim     return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */
94*f8146b88SJung-uk Kim }
95*f8146b88SJung-uk Kim 
96*f8146b88SJung-uk Kim 
97*f8146b88SJung-uk Kim /******************************************************************************
98*f8146b88SJung-uk Kim  *
99*f8146b88SJung-uk Kim  * FUNCTION:    UtQueryForOverwrite
100*f8146b88SJung-uk Kim  *
101*f8146b88SJung-uk Kim  * PARAMETERS:  Pathname            - Output filename
102*f8146b88SJung-uk Kim  *
103*f8146b88SJung-uk Kim  * RETURN:      TRUE if file does not exist or overwrite is authorized
104*f8146b88SJung-uk Kim  *
105*f8146b88SJung-uk Kim  * DESCRIPTION: Query for file overwrite if it already exists.
106*f8146b88SJung-uk Kim  *
107*f8146b88SJung-uk Kim  ******************************************************************************/
108*f8146b88SJung-uk Kim 
109*f8146b88SJung-uk Kim BOOLEAN
110*f8146b88SJung-uk Kim UtQueryForOverwrite (
111*f8146b88SJung-uk Kim     char                    *Pathname)
112*f8146b88SJung-uk Kim {
113*f8146b88SJung-uk Kim     struct stat             StatInfo;
114*f8146b88SJung-uk Kim 
115*f8146b88SJung-uk Kim 
116*f8146b88SJung-uk Kim     if (!stat (Pathname, &StatInfo))
117*f8146b88SJung-uk Kim     {
118*f8146b88SJung-uk Kim         fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ",
119*f8146b88SJung-uk Kim             Pathname);
120*f8146b88SJung-uk Kim 
121*f8146b88SJung-uk Kim         if (getchar () != 'y')
122*f8146b88SJung-uk Kim         {
123*f8146b88SJung-uk Kim             return (FALSE);
124*f8146b88SJung-uk Kim         }
125*f8146b88SJung-uk Kim     }
126*f8146b88SJung-uk Kim 
127*f8146b88SJung-uk Kim     return (TRUE);
128*f8146b88SJung-uk Kim }
129*f8146b88SJung-uk Kim 
130*f8146b88SJung-uk Kim 
131*f8146b88SJung-uk Kim /*******************************************************************************
132*f8146b88SJung-uk Kim  *
133a88e22b7SJung-uk Kim  * FUNCTION:    UtDisplaySupportedTables
134a88e22b7SJung-uk Kim  *
135a88e22b7SJung-uk Kim  * PARAMETERS:  None
136a88e22b7SJung-uk Kim  *
137a88e22b7SJung-uk Kim  * RETURN:      None
138a88e22b7SJung-uk Kim  *
139a88e22b7SJung-uk Kim  * DESCRIPTION: Print all supported ACPI table names.
140a88e22b7SJung-uk Kim  *
141a88e22b7SJung-uk Kim  ******************************************************************************/
142a88e22b7SJung-uk Kim 
143a88e22b7SJung-uk Kim void
144a88e22b7SJung-uk Kim UtDisplaySupportedTables (
145a88e22b7SJung-uk Kim     void)
146a88e22b7SJung-uk Kim {
147a371a5fdSJung-uk Kim     const AH_TABLE          *TableData;
1481df130f1SJung-uk Kim     UINT32                  i;
149a88e22b7SJung-uk Kim 
150a88e22b7SJung-uk Kim 
1511df130f1SJung-uk Kim     printf ("\nACPI tables supported by iASL version %8.8X:\n"
1521df130f1SJung-uk Kim         "  (Compiler, Disassembler, Template Generator)\n\n",
1531df130f1SJung-uk Kim         ACPI_CA_VERSION);
154a88e22b7SJung-uk Kim 
155a371a5fdSJung-uk Kim     /* All ACPI tables with the common table header */
156a88e22b7SJung-uk Kim 
157a371a5fdSJung-uk Kim     printf ("\n  Supported ACPI tables:\n");
158a371a5fdSJung-uk Kim     for (TableData = AcpiSupportedTables, i = 1;
159a371a5fdSJung-uk Kim          TableData->Signature; TableData++, i++)
160a88e22b7SJung-uk Kim     {
161a371a5fdSJung-uk Kim         printf ("%8u) %s    %s\n", i,
162a371a5fdSJung-uk Kim             TableData->Signature, TableData->Description);
163a88e22b7SJung-uk Kim     }
164a88e22b7SJung-uk Kim }
165a88e22b7SJung-uk Kim 
166a88e22b7SJung-uk Kim 
167a88e22b7SJung-uk Kim /*******************************************************************************
168a88e22b7SJung-uk Kim  *
169f38b0f21SJung-uk Kim  * FUNCTION:    UtDisplayConstantOpcodes
17053289f6aSNate Lawson  *
17153289f6aSNate Lawson  * PARAMETERS:  None
17253289f6aSNate Lawson  *
17353289f6aSNate Lawson  * RETURN:      None
17453289f6aSNate Lawson  *
17553289f6aSNate Lawson  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
17653289f6aSNate Lawson  *
17753289f6aSNate Lawson  ******************************************************************************/
17853289f6aSNate Lawson 
17953289f6aSNate Lawson void
18053289f6aSNate Lawson UtDisplayConstantOpcodes (
18153289f6aSNate Lawson     void)
18253289f6aSNate Lawson {
18353289f6aSNate Lawson     UINT32                  i;
18453289f6aSNate Lawson 
185fba7fc7eSJung-uk Kim 
18653289f6aSNate Lawson     printf ("Constant expression opcode information\n\n");
18753289f6aSNate Lawson 
18853289f6aSNate Lawson     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
18953289f6aSNate Lawson     {
19053289f6aSNate Lawson         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
19153289f6aSNate Lawson         {
19253289f6aSNate Lawson             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
19353289f6aSNate Lawson         }
19453289f6aSNate Lawson     }
19553289f6aSNate Lawson }
19653289f6aSNate Lawson 
19753289f6aSNate Lawson 
19853289f6aSNate Lawson /*******************************************************************************
19953289f6aSNate Lawson  *
20053289f6aSNate Lawson  * FUNCTION:    UtLocalCalloc
20153289f6aSNate Lawson  *
20253289f6aSNate Lawson  * PARAMETERS:  Size                - Bytes to be allocated
20353289f6aSNate Lawson  *
20453289f6aSNate Lawson  * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
20553289f6aSNate Lawson  *
20653289f6aSNate Lawson  * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
20753289f6aSNate Lawson  *              allocation failure, on the assumption that nothing more can be
20853289f6aSNate Lawson  *              accomplished.
20953289f6aSNate Lawson  *
21053289f6aSNate Lawson  ******************************************************************************/
21153289f6aSNate Lawson 
21253289f6aSNate Lawson void *
21353289f6aSNate Lawson UtLocalCalloc (
21453289f6aSNate Lawson     UINT32                  Size)
21553289f6aSNate Lawson {
21653289f6aSNate Lawson     void                    *Allocated;
21753289f6aSNate Lawson 
21853289f6aSNate Lawson 
2191a39cfb0SJung-uk Kim     Allocated = ACPI_ALLOCATE_ZEROED (Size);
22053289f6aSNate Lawson     if (!Allocated)
22153289f6aSNate Lawson     {
22253289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
22353289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
22453289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
22553289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
226a88e22b7SJung-uk Kim 
227a88e22b7SJung-uk Kim         CmCleanupAndExit ();
22853289f6aSNate Lawson         exit (1);
22953289f6aSNate Lawson     }
23053289f6aSNate Lawson 
23153289f6aSNate Lawson     TotalAllocations++;
23253289f6aSNate Lawson     TotalAllocated += Size;
2331a39cfb0SJung-uk Kim     return (Allocated);
23453289f6aSNate Lawson }
23553289f6aSNate Lawson 
23653289f6aSNate Lawson 
23753289f6aSNate Lawson /*******************************************************************************
23853289f6aSNate Lawson  *
23953289f6aSNate Lawson  * FUNCTION:    UtBeginEvent
24053289f6aSNate Lawson  *
241fba7fc7eSJung-uk Kim  * PARAMETERS:  Name                - Ascii name of this event
24253289f6aSNate Lawson  *
243f38b0f21SJung-uk Kim  * RETURN:      Event number (integer index)
24453289f6aSNate Lawson  *
24553289f6aSNate Lawson  * DESCRIPTION: Saves the current time with this event
24653289f6aSNate Lawson  *
24753289f6aSNate Lawson  ******************************************************************************/
24853289f6aSNate Lawson 
249fba7fc7eSJung-uk Kim UINT8
25053289f6aSNate Lawson UtBeginEvent (
25153289f6aSNate Lawson     char                    *Name)
25253289f6aSNate Lawson {
25353289f6aSNate Lawson 
254fba7fc7eSJung-uk Kim     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
255fba7fc7eSJung-uk Kim     {
256fba7fc7eSJung-uk Kim         AcpiOsPrintf ("Ran out of compiler event structs!\n");
257fba7fc7eSJung-uk Kim         return (AslGbl_NextEvent);
258fba7fc7eSJung-uk Kim     }
259fba7fc7eSJung-uk Kim 
260fba7fc7eSJung-uk Kim     /* Init event with current (start) time */
261fba7fc7eSJung-uk Kim 
262fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
263fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
264fba7fc7eSJung-uk Kim     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
265fba7fc7eSJung-uk Kim     return (AslGbl_NextEvent++);
26653289f6aSNate Lawson }
26753289f6aSNate Lawson 
26853289f6aSNate Lawson 
26953289f6aSNate Lawson /*******************************************************************************
27053289f6aSNate Lawson  *
27153289f6aSNate Lawson  * FUNCTION:    UtEndEvent
27253289f6aSNate Lawson  *
27353289f6aSNate Lawson  * PARAMETERS:  Event               - Event number (integer index)
27453289f6aSNate Lawson  *
27553289f6aSNate Lawson  * RETURN:      None
27653289f6aSNate Lawson  *
27753289f6aSNate Lawson  * DESCRIPTION: Saves the current time (end time) with this event
27853289f6aSNate Lawson  *
27953289f6aSNate Lawson  ******************************************************************************/
28053289f6aSNate Lawson 
28153289f6aSNate Lawson void
28253289f6aSNate Lawson UtEndEvent (
283fba7fc7eSJung-uk Kim     UINT8                   Event)
28453289f6aSNate Lawson {
28553289f6aSNate Lawson 
286fba7fc7eSJung-uk Kim     if (Event >= ASL_NUM_EVENTS)
287fba7fc7eSJung-uk Kim     {
288fba7fc7eSJung-uk Kim         return;
289fba7fc7eSJung-uk Kim     }
290fba7fc7eSJung-uk Kim 
291fba7fc7eSJung-uk Kim     /* Insert end time for event */
292fba7fc7eSJung-uk Kim 
293fba7fc7eSJung-uk Kim     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
29453289f6aSNate Lawson }
29553289f6aSNate Lawson 
29653289f6aSNate Lawson 
29753289f6aSNate Lawson /*******************************************************************************
29853289f6aSNate Lawson  *
29953289f6aSNate Lawson  * FUNCTION:    DbgPrint
30053289f6aSNate Lawson  *
301fba7fc7eSJung-uk Kim  * PARAMETERS:  Type                - Type of output
302fba7fc7eSJung-uk Kim  *              Fmt                 - Printf format string
30353289f6aSNate Lawson  *              ...                 - variable printf list
30453289f6aSNate Lawson  *
30553289f6aSNate Lawson  * RETURN:      None
30653289f6aSNate Lawson  *
30753289f6aSNate Lawson  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
30853289f6aSNate Lawson  *              debug flag is set.
30953289f6aSNate Lawson  *
31053289f6aSNate Lawson  ******************************************************************************/
31153289f6aSNate Lawson 
31253289f6aSNate Lawson void
31353289f6aSNate Lawson DbgPrint (
31453289f6aSNate Lawson     UINT32                  Type,
31553289f6aSNate Lawson     char                    *Fmt,
31653289f6aSNate Lawson     ...)
31753289f6aSNate Lawson {
31853289f6aSNate Lawson     va_list                 Args;
31953289f6aSNate Lawson 
32053289f6aSNate Lawson 
32153289f6aSNate Lawson     if (!Gbl_DebugFlag)
32253289f6aSNate Lawson     {
32353289f6aSNate Lawson         return;
32453289f6aSNate Lawson     }
32553289f6aSNate Lawson 
32653289f6aSNate Lawson     if ((Type == ASL_PARSE_OUTPUT) &&
32753289f6aSNate Lawson         (!(AslCompilerdebug)))
32853289f6aSNate Lawson     {
32953289f6aSNate Lawson         return;
33053289f6aSNate Lawson     }
33153289f6aSNate Lawson 
3328d744e47SJung-uk Kim     va_start (Args, Fmt);
33353289f6aSNate Lawson     (void) vfprintf (stderr, Fmt, Args);
33453289f6aSNate Lawson     va_end (Args);
33553289f6aSNate Lawson     return;
33653289f6aSNate Lawson }
33753289f6aSNate Lawson 
33853289f6aSNate Lawson 
33953289f6aSNate Lawson /*******************************************************************************
34053289f6aSNate Lawson  *
34153289f6aSNate Lawson  * FUNCTION:    UtSetParseOpName
34253289f6aSNate Lawson  *
343f38b0f21SJung-uk Kim  * PARAMETERS:  Op                  - Parse op to be named.
34453289f6aSNate Lawson  *
34553289f6aSNate Lawson  * RETURN:      None
34653289f6aSNate Lawson  *
34753289f6aSNate Lawson  * DESCRIPTION: Insert the ascii name of the parse opcode
34853289f6aSNate Lawson  *
34953289f6aSNate Lawson  ******************************************************************************/
35053289f6aSNate Lawson 
35153289f6aSNate Lawson void
35253289f6aSNate Lawson UtSetParseOpName (
35353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
35453289f6aSNate Lawson {
355fba7fc7eSJung-uk Kim 
3561a39cfb0SJung-uk Kim     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
3571a39cfb0SJung-uk Kim         ACPI_MAX_PARSEOP_NAME);
35853289f6aSNate Lawson }
35953289f6aSNate Lawson 
36053289f6aSNate Lawson 
36153289f6aSNate Lawson /*******************************************************************************
36253289f6aSNate Lawson  *
36353289f6aSNate Lawson  * FUNCTION:    UtDisplaySummary
36453289f6aSNate Lawson  *
365fba7fc7eSJung-uk Kim  * PARAMETERS:  FileID              - ID of outpout file
36653289f6aSNate Lawson  *
36753289f6aSNate Lawson  * RETURN:      None
36853289f6aSNate Lawson  *
36953289f6aSNate Lawson  * DESCRIPTION: Display compilation statistics
37053289f6aSNate Lawson  *
37153289f6aSNate Lawson  ******************************************************************************/
37253289f6aSNate Lawson 
37353289f6aSNate Lawson void
37453289f6aSNate Lawson UtDisplaySummary (
37553289f6aSNate Lawson     UINT32                  FileId)
37653289f6aSNate Lawson {
3773f0275a0SJung-uk Kim     UINT32                  i;
3783f0275a0SJung-uk Kim 
37953289f6aSNate Lawson 
38053289f6aSNate Lawson     if (FileId != ASL_FILE_STDOUT)
38153289f6aSNate Lawson     {
38253289f6aSNate Lawson         /* Compiler name and version number */
38353289f6aSNate Lawson 
3843f0275a0SJung-uk Kim         FlPrintFile (FileId, "%s version %X%s\n\n",
3853c1812acSJung-uk Kim             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH);
38653289f6aSNate Lawson     }
38753289f6aSNate Lawson 
3883f0275a0SJung-uk Kim     /* Summary of main input and output files */
3893f0275a0SJung-uk Kim 
390a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
391a88e22b7SJung-uk Kim     {
392a88e22b7SJung-uk Kim         FlPrintFile (FileId,
3933f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u fields\n",
3943f0275a0SJung-uk Kim             "Table Input:",
395a88e22b7SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
396a88e22b7SJung-uk Kim             Gbl_InputByteCount, Gbl_InputFieldCount);
397a88e22b7SJung-uk Kim 
398a88e22b7SJung-uk Kim         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
399a88e22b7SJung-uk Kim         {
400a88e22b7SJung-uk Kim             FlPrintFile (FileId,
4013f0275a0SJung-uk Kim                 "%-14s %s - %u bytes\n",
4023f0275a0SJung-uk Kim                 "Binary Output:",
403a88e22b7SJung-uk Kim                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
404a88e22b7SJung-uk Kim         }
405a88e22b7SJung-uk Kim     }
406a88e22b7SJung-uk Kim     else
407a88e22b7SJung-uk Kim     {
40853289f6aSNate Lawson         FlPrintFile (FileId,
4093f0275a0SJung-uk Kim             "%-14s %s - %u lines, %u bytes, %u keywords\n",
4103f0275a0SJung-uk Kim             "ASL Input:",
41153289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
4125ef50723SJung-uk Kim             Gbl_OriginalInputFileSize, TotalKeywords);
41353289f6aSNate Lawson 
41453289f6aSNate Lawson         /* AML summary */
41553289f6aSNate Lawson 
41653289f6aSNate Lawson         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
41753289f6aSNate Lawson         {
4185ef50723SJung-uk Kim             if (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
4195ef50723SJung-uk Kim             {
42053289f6aSNate Lawson                 FlPrintFile (FileId,
421*f8146b88SJung-uk Kim                     "%-14s %s - %u bytes, %u named objects, "
422*f8146b88SJung-uk Kim                     "%u executable opcodes\n",
4233f0275a0SJung-uk Kim                     "AML Output:",
424*f8146b88SJung-uk Kim                     Gbl_Files[ASL_FILE_AML_OUTPUT].Filename,
425*f8146b88SJung-uk Kim                     FlGetFileSize (ASL_FILE_AML_OUTPUT),
42653289f6aSNate Lawson                     TotalNamedObjects, TotalExecutableOpcodes);
42753289f6aSNate Lawson             }
428a88e22b7SJung-uk Kim         }
4295ef50723SJung-uk Kim     }
43053289f6aSNate Lawson 
4313f0275a0SJung-uk Kim     /* Display summary of any optional files */
4323f0275a0SJung-uk Kim 
4333f0275a0SJung-uk Kim     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
4343f0275a0SJung-uk Kim     {
4353f0275a0SJung-uk Kim         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
4363f0275a0SJung-uk Kim         {
4373f0275a0SJung-uk Kim             continue;
4383f0275a0SJung-uk Kim         }
4393f0275a0SJung-uk Kim 
4403f0275a0SJung-uk Kim         /* .SRC is a temp file unless specifically requested */
4413f0275a0SJung-uk Kim 
4423f0275a0SJung-uk Kim         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
4433f0275a0SJung-uk Kim         {
4443f0275a0SJung-uk Kim             continue;
4453f0275a0SJung-uk Kim         }
4463f0275a0SJung-uk Kim 
4475ef50723SJung-uk Kim         /* .PRE is the preprocessor intermediate file */
4484c52cad2SJung-uk Kim 
4495ef50723SJung-uk Kim         if ((i == ASL_FILE_PREPROCESSOR)  && (!Gbl_KeepPreprocessorTempFile))
4504c52cad2SJung-uk Kim         {
4514c52cad2SJung-uk Kim             continue;
4524c52cad2SJung-uk Kim         }
4534c52cad2SJung-uk Kim 
4543f0275a0SJung-uk Kim         FlPrintFile (FileId, "%14s %s - %u bytes\n",
455042ff955SJung-uk Kim             Gbl_Files[i].ShortDescription,
4563f0275a0SJung-uk Kim             Gbl_Files[i].Filename, FlGetFileSize (i));
4573f0275a0SJung-uk Kim     }
4583f0275a0SJung-uk Kim 
45953289f6aSNate Lawson     /* Error summary */
46053289f6aSNate Lawson 
46153289f6aSNate Lawson     FlPrintFile (FileId,
4623f0275a0SJung-uk Kim         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
46353289f6aSNate Lawson         Gbl_ExceptionCount[ASL_ERROR],
4641a39cfb0SJung-uk Kim         Gbl_ExceptionCount[ASL_WARNING] +
4651a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING2] +
4661a39cfb0SJung-uk Kim             Gbl_ExceptionCount[ASL_WARNING3],
467a88e22b7SJung-uk Kim         Gbl_ExceptionCount[ASL_REMARK]);
468a88e22b7SJung-uk Kim 
469a88e22b7SJung-uk Kim     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
470a88e22b7SJung-uk Kim     {
4717cf3e94aSJung-uk Kim         FlPrintFile (FileId, ", %u Optimizations",
4727cf3e94aSJung-uk Kim             Gbl_ExceptionCount[ASL_OPTIMIZATION]);
4737cf3e94aSJung-uk Kim 
4747cf3e94aSJung-uk Kim         if (TotalFolds)
4757cf3e94aSJung-uk Kim         {
4767cf3e94aSJung-uk Kim             FlPrintFile (FileId, ", %u Constants Folded", TotalFolds);
4777cf3e94aSJung-uk Kim         }
478a88e22b7SJung-uk Kim     }
479a88e22b7SJung-uk Kim 
480a88e22b7SJung-uk Kim     FlPrintFile (FileId, "\n");
48153289f6aSNate Lawson }
48253289f6aSNate Lawson 
48353289f6aSNate Lawson 
48453289f6aSNate Lawson /*******************************************************************************
48553289f6aSNate Lawson  *
486f38b0f21SJung-uk Kim  * FUNCTION:    UtCheckIntegerRange
48753289f6aSNate Lawson  *
48853289f6aSNate Lawson  * PARAMETERS:  Op                  - Integer parse node
48953289f6aSNate Lawson  *              LowValue            - Smallest allowed value
49053289f6aSNate Lawson  *              HighValue           - Largest allowed value
49153289f6aSNate Lawson  *
49253289f6aSNate Lawson  * RETURN:      Op if OK, otherwise NULL
49353289f6aSNate Lawson  *
49453289f6aSNate Lawson  * DESCRIPTION: Check integer for an allowable range
49553289f6aSNate Lawson  *
49653289f6aSNate Lawson  ******************************************************************************/
49753289f6aSNate Lawson 
49853289f6aSNate Lawson ACPI_PARSE_OBJECT *
49953289f6aSNate Lawson UtCheckIntegerRange (
50053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
50153289f6aSNate Lawson     UINT32                  LowValue,
50253289f6aSNate Lawson     UINT32                  HighValue)
50353289f6aSNate Lawson {
50453289f6aSNate Lawson 
50553289f6aSNate Lawson     if (!Op)
50653289f6aSNate Lawson     {
5078ef1a331SJung-uk Kim         return (NULL);
50853289f6aSNate Lawson     }
50953289f6aSNate Lawson 
5101df130f1SJung-uk Kim     if ((Op->Asl.Value.Integer < LowValue) ||
5111df130f1SJung-uk Kim         (Op->Asl.Value.Integer > HighValue))
51253289f6aSNate Lawson     {
5131df130f1SJung-uk Kim         sprintf (MsgBuffer, "0x%X, allowable: 0x%X-0x%X",
5141df130f1SJung-uk Kim             (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
5151df130f1SJung-uk Kim 
5161df130f1SJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_RANGE, Op, MsgBuffer);
5171df130f1SJung-uk Kim         return (NULL);
51853289f6aSNate Lawson     }
51953289f6aSNate Lawson 
5201df130f1SJung-uk Kim     return (Op);
52153289f6aSNate Lawson }
52253289f6aSNate Lawson 
52353289f6aSNate Lawson 
52453289f6aSNate Lawson /*******************************************************************************
52553289f6aSNate Lawson  *
526313a0c13SJung-uk Kim  * FUNCTION:    UtStringCacheCalloc
52753289f6aSNate Lawson  *
52853289f6aSNate Lawson  * PARAMETERS:  Length              - Size of buffer requested
52953289f6aSNate Lawson  *
53053289f6aSNate Lawson  * RETURN:      Pointer to the buffer. Aborts on allocation failure
53153289f6aSNate Lawson  *
53253289f6aSNate Lawson  * DESCRIPTION: Allocate a string buffer. Bypass the local
53353289f6aSNate Lawson  *              dynamic memory manager for performance reasons (This has a
53453289f6aSNate Lawson  *              major impact on the speed of the compiler.)
53553289f6aSNate Lawson  *
53653289f6aSNate Lawson  ******************************************************************************/
53753289f6aSNate Lawson 
53853289f6aSNate Lawson char *
539313a0c13SJung-uk Kim UtStringCacheCalloc (
54053289f6aSNate Lawson     UINT32                  Length)
54153289f6aSNate Lawson {
54253289f6aSNate Lawson     char                    *Buffer;
543313a0c13SJung-uk Kim     ASL_CACHE_INFO          *Cache;
5441c0e1b6dSJung-uk Kim     UINT32                  CacheSize = ASL_STRING_CACHE_SIZE;
54553289f6aSNate Lawson 
54653289f6aSNate Lawson 
5471c0e1b6dSJung-uk Kim     if (Length > CacheSize)
548313a0c13SJung-uk Kim     {
5491c0e1b6dSJung-uk Kim         CacheSize = Length;
5501c0e1b6dSJung-uk Kim 
5511c0e1b6dSJung-uk Kim         if (Gbl_StringCacheList)
5521c0e1b6dSJung-uk Kim         {
5531c0e1b6dSJung-uk Kim             Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
5541c0e1b6dSJung-uk Kim 
5551c0e1b6dSJung-uk Kim             /* Link new cache buffer just following head of list */
5561c0e1b6dSJung-uk Kim 
5571c0e1b6dSJung-uk Kim             Cache->Next = Gbl_StringCacheList->Next;
5581c0e1b6dSJung-uk Kim             Gbl_StringCacheList->Next = Cache;
5591c0e1b6dSJung-uk Kim 
5601c0e1b6dSJung-uk Kim             /* Leave cache management pointers alone as they pertain to head */
5611c0e1b6dSJung-uk Kim 
5621c0e1b6dSJung-uk Kim             Gbl_StringCount++;
5631c0e1b6dSJung-uk Kim             Gbl_StringSize += Length;
5641c0e1b6dSJung-uk Kim 
5651c0e1b6dSJung-uk Kim             return (Cache->Buffer);
5661c0e1b6dSJung-uk Kim         }
567313a0c13SJung-uk Kim     }
568313a0c13SJung-uk Kim 
56953289f6aSNate Lawson     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
57053289f6aSNate Lawson     {
571313a0c13SJung-uk Kim         /* Allocate a new buffer */
572313a0c13SJung-uk Kim 
5731c0e1b6dSJung-uk Kim         Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
574313a0c13SJung-uk Kim 
575313a0c13SJung-uk Kim         /* Link new cache buffer to head of list */
576313a0c13SJung-uk Kim 
577313a0c13SJung-uk Kim         Cache->Next = Gbl_StringCacheList;
578313a0c13SJung-uk Kim         Gbl_StringCacheList = Cache;
579313a0c13SJung-uk Kim 
580313a0c13SJung-uk Kim         /* Setup cache management pointers */
581313a0c13SJung-uk Kim 
582313a0c13SJung-uk Kim         Gbl_StringCacheNext = Cache->Buffer;
5831c0e1b6dSJung-uk Kim         Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize;
58453289f6aSNate Lawson     }
58553289f6aSNate Lawson 
586313a0c13SJung-uk Kim     Gbl_StringCount++;
587313a0c13SJung-uk Kim     Gbl_StringSize += Length;
588313a0c13SJung-uk Kim 
58953289f6aSNate Lawson     Buffer = Gbl_StringCacheNext;
59053289f6aSNate Lawson     Gbl_StringCacheNext += Length;
59153289f6aSNate Lawson     return (Buffer);
59253289f6aSNate Lawson }
59353289f6aSNate Lawson 
59453289f6aSNate Lawson 
595042ff955SJung-uk Kim /******************************************************************************
596042ff955SJung-uk Kim  *
597042ff955SJung-uk Kim  * FUNCTION:    UtExpandLineBuffers
598042ff955SJung-uk Kim  *
599042ff955SJung-uk Kim  * PARAMETERS:  None. Updates global line buffer pointers.
600042ff955SJung-uk Kim  *
601042ff955SJung-uk Kim  * RETURN:      None. Reallocates the global line buffers
602042ff955SJung-uk Kim  *
603042ff955SJung-uk Kim  * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates
604042ff955SJung-uk Kim  *              all global line buffers and updates Gbl_LineBufferSize. NOTE:
605042ff955SJung-uk Kim  *              Also used for the initial allocation of the buffers, when
606042ff955SJung-uk Kim  *              all of the buffer pointers are NULL. Initial allocations are
607042ff955SJung-uk Kim  *              of size ASL_DEFAULT_LINE_BUFFER_SIZE
608042ff955SJung-uk Kim  *
609042ff955SJung-uk Kim  *****************************************************************************/
610042ff955SJung-uk Kim 
611042ff955SJung-uk Kim void
612042ff955SJung-uk Kim UtExpandLineBuffers (
613042ff955SJung-uk Kim     void)
614042ff955SJung-uk Kim {
615042ff955SJung-uk Kim     UINT32                  NewSize;
616042ff955SJung-uk Kim 
617042ff955SJung-uk Kim 
618042ff955SJung-uk Kim     /* Attempt to double the size of all line buffers */
619042ff955SJung-uk Kim 
620042ff955SJung-uk Kim     NewSize = Gbl_LineBufferSize * 2;
621042ff955SJung-uk Kim     if (Gbl_CurrentLineBuffer)
622042ff955SJung-uk Kim     {
623313a0c13SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT,
624313a0c13SJung-uk Kim             "Increasing line buffer size from %u to %u\n",
625042ff955SJung-uk Kim             Gbl_LineBufferSize, NewSize);
626042ff955SJung-uk Kim     }
627042ff955SJung-uk Kim 
628042ff955SJung-uk Kim     Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
629042ff955SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
630042ff955SJung-uk Kim     if (!Gbl_CurrentLineBuffer)
631042ff955SJung-uk Kim     {
632042ff955SJung-uk Kim         goto ErrorExit;
633042ff955SJung-uk Kim     }
634042ff955SJung-uk Kim 
635042ff955SJung-uk Kim     Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
636042ff955SJung-uk Kim     if (!Gbl_MainTokenBuffer)
637042ff955SJung-uk Kim     {
638042ff955SJung-uk Kim         goto ErrorExit;
639042ff955SJung-uk Kim     }
640042ff955SJung-uk Kim 
641042ff955SJung-uk Kim     Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
642042ff955SJung-uk Kim     if (!Gbl_MacroTokenBuffer)
643042ff955SJung-uk Kim     {
644042ff955SJung-uk Kim         goto ErrorExit;
645042ff955SJung-uk Kim     }
646042ff955SJung-uk Kim 
647042ff955SJung-uk Kim     Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
648042ff955SJung-uk Kim     if (!Gbl_ExpressionTokenBuffer)
649042ff955SJung-uk Kim     {
650042ff955SJung-uk Kim         goto ErrorExit;
651042ff955SJung-uk Kim     }
652042ff955SJung-uk Kim 
653042ff955SJung-uk Kim     Gbl_LineBufferSize = NewSize;
654042ff955SJung-uk Kim     return;
655042ff955SJung-uk Kim 
656042ff955SJung-uk Kim 
657042ff955SJung-uk Kim     /* On error above, simply issue error messages and abort, cannot continue */
658042ff955SJung-uk Kim 
659042ff955SJung-uk Kim ErrorExit:
660042ff955SJung-uk Kim     printf ("Could not increase line buffer size from %u to %u\n",
661042ff955SJung-uk Kim         Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
662042ff955SJung-uk Kim 
663042ff955SJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
664042ff955SJung-uk Kim         NULL, NULL);
665042ff955SJung-uk Kim     AslAbort ();
666042ff955SJung-uk Kim }
667042ff955SJung-uk Kim 
668042ff955SJung-uk Kim 
669313a0c13SJung-uk Kim /******************************************************************************
670313a0c13SJung-uk Kim  *
671313a0c13SJung-uk Kim  * FUNCTION:    UtFreeLineBuffers
672313a0c13SJung-uk Kim  *
673313a0c13SJung-uk Kim  * PARAMETERS:  None
674313a0c13SJung-uk Kim  *
675313a0c13SJung-uk Kim  * RETURN:      None
676313a0c13SJung-uk Kim  *
677313a0c13SJung-uk Kim  * DESCRIPTION: Free all line buffers
678313a0c13SJung-uk Kim  *
679313a0c13SJung-uk Kim  *****************************************************************************/
680313a0c13SJung-uk Kim 
681313a0c13SJung-uk Kim void
682313a0c13SJung-uk Kim UtFreeLineBuffers (
683313a0c13SJung-uk Kim     void)
684313a0c13SJung-uk Kim {
685313a0c13SJung-uk Kim 
686313a0c13SJung-uk Kim     free (Gbl_CurrentLineBuffer);
687313a0c13SJung-uk Kim     free (Gbl_MainTokenBuffer);
688313a0c13SJung-uk Kim     free (Gbl_MacroTokenBuffer);
689313a0c13SJung-uk Kim     free (Gbl_ExpressionTokenBuffer);
690313a0c13SJung-uk Kim }
691313a0c13SJung-uk Kim 
692313a0c13SJung-uk Kim 
69353289f6aSNate Lawson /*******************************************************************************
69453289f6aSNate Lawson  *
69553289f6aSNate Lawson  * FUNCTION:    UtInternalizeName
69653289f6aSNate Lawson  *
69753289f6aSNate Lawson  * PARAMETERS:  ExternalName        - Name to convert
69853289f6aSNate Lawson  *              ConvertedName       - Where the converted name is returned
69953289f6aSNate Lawson  *
70053289f6aSNate Lawson  * RETURN:      Status
70153289f6aSNate Lawson  *
70253289f6aSNate Lawson  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
70353289f6aSNate Lawson  *
70453289f6aSNate Lawson  ******************************************************************************/
70553289f6aSNate Lawson 
70653289f6aSNate Lawson ACPI_STATUS
70753289f6aSNate Lawson UtInternalizeName (
70853289f6aSNate Lawson     char                    *ExternalName,
70953289f6aSNate Lawson     char                    **ConvertedName)
71053289f6aSNate Lawson {
71153289f6aSNate Lawson     ACPI_NAMESTRING_INFO    Info;
71253289f6aSNate Lawson     ACPI_STATUS             Status;
71353289f6aSNate Lawson 
71453289f6aSNate Lawson 
71553289f6aSNate Lawson     if (!ExternalName)
71653289f6aSNate Lawson     {
71753289f6aSNate Lawson         return (AE_OK);
71853289f6aSNate Lawson     }
71953289f6aSNate Lawson 
72053289f6aSNate Lawson     /* Get the length of the new internal name */
72153289f6aSNate Lawson 
72253289f6aSNate Lawson     Info.ExternalName = ExternalName;
72353289f6aSNate Lawson     AcpiNsGetInternalNameLength (&Info);
72453289f6aSNate Lawson 
72553289f6aSNate Lawson     /* We need a segment to store the internal name */
72653289f6aSNate Lawson 
727313a0c13SJung-uk Kim     Info.InternalName = UtStringCacheCalloc (Info.Length);
72853289f6aSNate Lawson     if (!Info.InternalName)
72953289f6aSNate Lawson     {
73053289f6aSNate Lawson         return (AE_NO_MEMORY);
73153289f6aSNate Lawson     }
73253289f6aSNate Lawson 
73353289f6aSNate Lawson     /* Build the name */
73453289f6aSNate Lawson 
73553289f6aSNate Lawson     Status = AcpiNsBuildInternalName (&Info);
73653289f6aSNate Lawson     if (ACPI_FAILURE (Status))
73753289f6aSNate Lawson     {
73853289f6aSNate Lawson         return (Status);
73953289f6aSNate Lawson     }
74053289f6aSNate Lawson 
74153289f6aSNate Lawson     *ConvertedName = Info.InternalName;
74253289f6aSNate Lawson     return (AE_OK);
74353289f6aSNate Lawson }
74453289f6aSNate Lawson 
74553289f6aSNate Lawson 
74653289f6aSNate Lawson /*******************************************************************************
74753289f6aSNate Lawson  *
74853289f6aSNate Lawson  * FUNCTION:    UtPadNameWithUnderscores
74953289f6aSNate Lawson  *
75053289f6aSNate Lawson  * PARAMETERS:  NameSeg             - Input nameseg
75153289f6aSNate Lawson  *              PaddedNameSeg       - Output padded nameseg
75253289f6aSNate Lawson  *
75353289f6aSNate Lawson  * RETURN:      Padded nameseg.
75453289f6aSNate Lawson  *
75553289f6aSNate Lawson  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
75653289f6aSNate Lawson  *              ACPI_NAME.
75753289f6aSNate Lawson  *
75853289f6aSNate Lawson  ******************************************************************************/
75953289f6aSNate Lawson 
760fba7fc7eSJung-uk Kim static void
76153289f6aSNate Lawson UtPadNameWithUnderscores (
76253289f6aSNate Lawson     char                    *NameSeg,
76353289f6aSNate Lawson     char                    *PaddedNameSeg)
76453289f6aSNate Lawson {
76553289f6aSNate Lawson     UINT32                  i;
76653289f6aSNate Lawson 
76753289f6aSNate Lawson 
76853289f6aSNate Lawson     for (i = 0; (i < ACPI_NAME_SIZE); i++)
76953289f6aSNate Lawson     {
77053289f6aSNate Lawson         if (*NameSeg)
77153289f6aSNate Lawson         {
77253289f6aSNate Lawson             *PaddedNameSeg = *NameSeg;
77353289f6aSNate Lawson             NameSeg++;
77453289f6aSNate Lawson         }
77553289f6aSNate Lawson         else
77653289f6aSNate Lawson         {
77753289f6aSNate Lawson             *PaddedNameSeg = '_';
77853289f6aSNate Lawson         }
779*f8146b88SJung-uk Kim 
78053289f6aSNate Lawson         PaddedNameSeg++;
78153289f6aSNate Lawson     }
78253289f6aSNate Lawson }
78353289f6aSNate Lawson 
78453289f6aSNate Lawson 
78553289f6aSNate Lawson /*******************************************************************************
78653289f6aSNate Lawson  *
78753289f6aSNate Lawson  * FUNCTION:    UtAttachNameseg
78853289f6aSNate Lawson  *
78953289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
79053289f6aSNate Lawson  *              Name                - Full ExternalName
79153289f6aSNate Lawson  *
792fba7fc7eSJung-uk Kim  * RETURN:      None; Sets the NameSeg field in parent node
79353289f6aSNate Lawson  *
79453289f6aSNate Lawson  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
79553289f6aSNate Lawson  *              in the NameSeg field of the Op.
79653289f6aSNate Lawson  *
79753289f6aSNate Lawson  ******************************************************************************/
79853289f6aSNate Lawson 
799fba7fc7eSJung-uk Kim static void
80053289f6aSNate Lawson UtAttachNameseg (
80153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
80253289f6aSNate Lawson     char                    *Name)
80353289f6aSNate Lawson {
80453289f6aSNate Lawson     char                    *NameSeg;
80553289f6aSNate Lawson     char                    PaddedNameSeg[4];
80653289f6aSNate Lawson 
80753289f6aSNate Lawson 
80853289f6aSNate Lawson     if (!Name)
80953289f6aSNate Lawson     {
81053289f6aSNate Lawson         return;
81153289f6aSNate Lawson     }
81253289f6aSNate Lawson 
81353289f6aSNate Lawson     /* Look for the last dot in the namepath */
81453289f6aSNate Lawson 
81553289f6aSNate Lawson     NameSeg = strrchr (Name, '.');
81653289f6aSNate Lawson     if (NameSeg)
81753289f6aSNate Lawson     {
81853289f6aSNate Lawson         /* Found last dot, we have also found the final nameseg */
81953289f6aSNate Lawson 
82053289f6aSNate Lawson         NameSeg++;
82153289f6aSNate Lawson         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
82253289f6aSNate Lawson     }
82353289f6aSNate Lawson     else
82453289f6aSNate Lawson     {
82553289f6aSNate Lawson         /* No dots in the namepath, there is only a single nameseg. */
82653289f6aSNate Lawson         /* Handle prefixes */
82753289f6aSNate Lawson 
828efcc2a30SJung-uk Kim         while (ACPI_IS_ROOT_PREFIX (*Name) ||
829efcc2a30SJung-uk Kim                ACPI_IS_PARENT_PREFIX (*Name))
83053289f6aSNate Lawson         {
83153289f6aSNate Lawson             Name++;
83253289f6aSNate Lawson         }
83353289f6aSNate Lawson 
8348ef1a331SJung-uk Kim         /* Remaining string should be one single nameseg */
83553289f6aSNate Lawson 
83653289f6aSNate Lawson         UtPadNameWithUnderscores (Name, PaddedNameSeg);
83753289f6aSNate Lawson     }
83853289f6aSNate Lawson 
8398ef1a331SJung-uk Kim     ACPI_MOVE_NAME (Op->Asl.NameSeg, PaddedNameSeg);
84053289f6aSNate Lawson }
84153289f6aSNate Lawson 
84253289f6aSNate Lawson 
84353289f6aSNate Lawson /*******************************************************************************
84453289f6aSNate Lawson  *
84553289f6aSNate Lawson  * FUNCTION:    UtAttachNamepathToOwner
84653289f6aSNate Lawson  *
84753289f6aSNate Lawson  * PARAMETERS:  Op                  - Parent parse node
84853289f6aSNate Lawson  *              NameOp              - Node that contains the name
84953289f6aSNate Lawson  *
85053289f6aSNate Lawson  * RETURN:      Sets the ExternalName and Namepath in the parent node
85153289f6aSNate Lawson  *
85253289f6aSNate Lawson  * DESCRIPTION: Store the name in two forms in the parent node: The original
85353289f6aSNate Lawson  *              (external) name, and the internalized name that is used within
85453289f6aSNate Lawson  *              the ACPI namespace manager.
85553289f6aSNate Lawson  *
85653289f6aSNate Lawson  ******************************************************************************/
85753289f6aSNate Lawson 
85853289f6aSNate Lawson void
85953289f6aSNate Lawson UtAttachNamepathToOwner (
86053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
86153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *NameOp)
86253289f6aSNate Lawson {
86353289f6aSNate Lawson     ACPI_STATUS             Status;
86453289f6aSNate Lawson 
86553289f6aSNate Lawson 
86653289f6aSNate Lawson     /* Full external path */
86753289f6aSNate Lawson 
86853289f6aSNate Lawson     Op->Asl.ExternalName = NameOp->Asl.Value.String;
86953289f6aSNate Lawson 
870fba7fc7eSJung-uk Kim     /* Save the NameOp for possible error reporting later */
871fba7fc7eSJung-uk Kim 
872fba7fc7eSJung-uk Kim     Op->Asl.ParentMethod = (void *) NameOp;
873fba7fc7eSJung-uk Kim 
87453289f6aSNate Lawson     /* Last nameseg of the path */
87553289f6aSNate Lawson 
87653289f6aSNate Lawson     UtAttachNameseg (Op, Op->Asl.ExternalName);
87753289f6aSNate Lawson 
87853289f6aSNate Lawson     /* Create internalized path */
87953289f6aSNate Lawson 
88053289f6aSNate Lawson     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
88153289f6aSNate Lawson     if (ACPI_FAILURE (Status))
88253289f6aSNate Lawson     {
88353289f6aSNate Lawson         /* TBD: abort on no memory */
88453289f6aSNate Lawson     }
88553289f6aSNate Lawson }
88653289f6aSNate Lawson 
88753289f6aSNate Lawson 
88853289f6aSNate Lawson /*******************************************************************************
88953289f6aSNate Lawson  *
89053289f6aSNate Lawson  * FUNCTION:    UtDoConstant
89153289f6aSNate Lawson  *
89253289f6aSNate Lawson  * PARAMETERS:  String              - Hex, Octal, or Decimal string
89353289f6aSNate Lawson  *
89453289f6aSNate Lawson  * RETURN:      Converted Integer
89553289f6aSNate Lawson  *
896f38b0f21SJung-uk Kim  * DESCRIPTION: Convert a string to an integer, with error checking.
89753289f6aSNate Lawson  *
89853289f6aSNate Lawson  ******************************************************************************/
89953289f6aSNate Lawson 
9009a179dd8SJung-uk Kim UINT64
90153289f6aSNate Lawson UtDoConstant (
90253289f6aSNate Lawson     char                    *String)
90353289f6aSNate Lawson {
90453289f6aSNate Lawson     ACPI_STATUS             Status;
9059a179dd8SJung-uk Kim     UINT64                  Converted;
90653289f6aSNate Lawson     char                    ErrBuf[64];
90753289f6aSNate Lawson 
90853289f6aSNate Lawson 
909*f8146b88SJung-uk Kim     Status = AcpiUtStrtoul64 (String, ACPI_ANY_BASE,
910*f8146b88SJung-uk Kim         ACPI_MAX64_BYTE_WIDTH, &Converted);
911*f8146b88SJung-uk Kim 
91253289f6aSNate Lawson     if (ACPI_FAILURE (Status))
91353289f6aSNate Lawson     {
914fba7fc7eSJung-uk Kim         sprintf (ErrBuf, "%s %s\n", "Conversion error:",
915fba7fc7eSJung-uk Kim             AcpiFormatException (Status));
91653289f6aSNate Lawson         AslCompilererror (ErrBuf);
91753289f6aSNate Lawson     }
91853289f6aSNate Lawson 
91953289f6aSNate Lawson     return (Converted);
92053289f6aSNate Lawson }
92153289f6aSNate Lawson 
92253289f6aSNate Lawson 
923*f8146b88SJung-uk Kim #ifdef _OBSOLETE_FUNCTIONS
924*f8146b88SJung-uk Kim /* Removed 01/2016 */
925fba7fc7eSJung-uk Kim 
92653289f6aSNate Lawson /*******************************************************************************
92753289f6aSNate Lawson  *
928*f8146b88SJung-uk Kim  * FUNCTION:    UtConvertByteToHex
92953289f6aSNate Lawson  *
930*f8146b88SJung-uk Kim  * PARAMETERS:  RawByte             - Binary data
931*f8146b88SJung-uk Kim  *              Buffer              - Pointer to where the hex bytes will be
932*f8146b88SJung-uk Kim  *                                    stored
93353289f6aSNate Lawson  *
934*f8146b88SJung-uk Kim  * RETURN:      Ascii hex byte is stored in Buffer.
93553289f6aSNate Lawson  *
936*f8146b88SJung-uk Kim  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
937*f8146b88SJung-uk Kim  *              with "0x"
93853289f6aSNate Lawson  *
93953289f6aSNate Lawson  ******************************************************************************/
94053289f6aSNate Lawson 
941*f8146b88SJung-uk Kim void
942*f8146b88SJung-uk Kim UtConvertByteToHex (
943*f8146b88SJung-uk Kim     UINT8                   RawByte,
944*f8146b88SJung-uk Kim     UINT8                   *Buffer)
94553289f6aSNate Lawson {
94653289f6aSNate Lawson 
947*f8146b88SJung-uk Kim     Buffer[0] = '0';
948*f8146b88SJung-uk Kim     Buffer[1] = 'x';
94953289f6aSNate Lawson 
950*f8146b88SJung-uk Kim     Buffer[2] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 4);
951*f8146b88SJung-uk Kim     Buffer[3] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 0);
95253289f6aSNate Lawson }
95353289f6aSNate Lawson 
95453289f6aSNate Lawson 
955*f8146b88SJung-uk Kim /*******************************************************************************
956*f8146b88SJung-uk Kim  *
957*f8146b88SJung-uk Kim  * FUNCTION:    UtConvertByteToAsmHex
958*f8146b88SJung-uk Kim  *
959*f8146b88SJung-uk Kim  * PARAMETERS:  RawByte             - Binary data
960*f8146b88SJung-uk Kim  *              Buffer              - Pointer to where the hex bytes will be
961*f8146b88SJung-uk Kim  *                                    stored
962*f8146b88SJung-uk Kim  *
963*f8146b88SJung-uk Kim  * RETURN:      Ascii hex byte is stored in Buffer.
964*f8146b88SJung-uk Kim  *
965*f8146b88SJung-uk Kim  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
966*f8146b88SJung-uk Kim  *              with '0', and a trailing 'h' is added.
967*f8146b88SJung-uk Kim  *
968*f8146b88SJung-uk Kim  ******************************************************************************/
969fba7fc7eSJung-uk Kim 
970*f8146b88SJung-uk Kim void
971*f8146b88SJung-uk Kim UtConvertByteToAsmHex (
972*f8146b88SJung-uk Kim     UINT8                   RawByte,
973*f8146b88SJung-uk Kim     UINT8                   *Buffer)
97453289f6aSNate Lawson {
975*f8146b88SJung-uk Kim 
976*f8146b88SJung-uk Kim     Buffer[0] = '0';
977*f8146b88SJung-uk Kim     Buffer[1] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 4);
978*f8146b88SJung-uk Kim     Buffer[2] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 0);
979*f8146b88SJung-uk Kim     Buffer[3] = 'h';
98053289f6aSNate Lawson }
981*f8146b88SJung-uk Kim #endif /* OBSOLETE_FUNCTIONS */
982