Home | History | Annotate | Line # | Download | only in compiler
aslutils.c revision 1.14
      1 /******************************************************************************
      2  *
      3  * Module Name: aslutils -- compiler utilities
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2016, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include "aslcompiler.h"
     45 #include "aslcompiler.y.h"
     46 #include "acdisasm.h"
     47 #include "acnamesp.h"
     48 #include "amlcode.h"
     49 #include "acapps.h"
     50 #include <sys/stat.h>
     51 
     52 
     53 #define _COMPONENT          ACPI_COMPILER
     54         ACPI_MODULE_NAME    ("aslutils")
     55 
     56 
     57 /* Local prototypes */
     58 
     59 static void
     60 UtPadNameWithUnderscores (
     61     char                    *NameSeg,
     62     char                    *PaddedNameSeg);
     63 
     64 static void
     65 UtAttachNameseg (
     66     ACPI_PARSE_OBJECT       *Op,
     67     char                    *Name);
     68 
     69 
     70 /*******************************************************************************
     71  *
     72  * FUNCTION:    UtIsBigEndianMachine
     73  *
     74  * PARAMETERS:  None
     75  *
     76  * RETURN:      TRUE if machine is big endian
     77  *              FALSE if machine is little endian
     78  *
     79  * DESCRIPTION: Detect whether machine is little endian or big endian.
     80  *
     81  ******************************************************************************/
     82 
     83 UINT8
     84 UtIsBigEndianMachine (
     85     void)
     86 {
     87     union {
     88         UINT32              Integer;
     89         UINT8               Bytes[4];
     90     } Overlay =                 {0xFF000000};
     91 
     92 
     93     return (Overlay.Bytes[0]); /* Returns 0xFF (TRUE) for big endian */
     94 }
     95 
     96 
     97 /******************************************************************************
     98  *
     99  * FUNCTION:    UtQueryForOverwrite
    100  *
    101  * PARAMETERS:  Pathname            - Output filename
    102  *
    103  * RETURN:      TRUE if file does not exist or overwrite is authorized
    104  *
    105  * DESCRIPTION: Query for file overwrite if it already exists.
    106  *
    107  ******************************************************************************/
    108 
    109 BOOLEAN
    110 UtQueryForOverwrite (
    111     char                    *Pathname)
    112 {
    113     struct stat             StatInfo;
    114 
    115 
    116     if (!stat (Pathname, &StatInfo))
    117     {
    118         fprintf (stderr, "Target file \"%s\" already exists, overwrite? [y|n] ",
    119             Pathname);
    120 
    121         if (getchar () != 'y')
    122         {
    123             return (FALSE);
    124         }
    125     }
    126 
    127     return (TRUE);
    128 }
    129 
    130 
    131 /*******************************************************************************
    132  *
    133  * FUNCTION:    UtDisplaySupportedTables
    134  *
    135  * PARAMETERS:  None
    136  *
    137  * RETURN:      None
    138  *
    139  * DESCRIPTION: Print all supported ACPI table names.
    140  *
    141  ******************************************************************************/
    142 
    143 void
    144 UtDisplaySupportedTables (
    145     void)
    146 {
    147     const AH_TABLE          *TableData;
    148     UINT32                  i;
    149 
    150 
    151     printf ("\nACPI tables supported by iASL version %8.8X:\n"
    152         "  (Compiler, Disassembler, Template Generator)\n\n",
    153         ACPI_CA_VERSION);
    154 
    155     /* All ACPI tables with the common table header */
    156 
    157     printf ("\n  Supported ACPI tables:\n");
    158     for (TableData = AcpiSupportedTables, i = 1;
    159          TableData->Signature; TableData++, i++)
    160     {
    161         printf ("%8u) %s    %s\n", i,
    162             TableData->Signature, TableData->Description);
    163     }
    164 }
    165 
    166 
    167 /*******************************************************************************
    168  *
    169  * FUNCTION:    UtDisplayConstantOpcodes
    170  *
    171  * PARAMETERS:  None
    172  *
    173  * RETURN:      None
    174  *
    175  * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
    176  *
    177  ******************************************************************************/
    178 
    179 void
    180 UtDisplayConstantOpcodes (
    181     void)
    182 {
    183     UINT32                  i;
    184 
    185 
    186     printf ("Constant expression opcode information\n\n");
    187 
    188     for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
    189     {
    190         if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
    191         {
    192             printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
    193         }
    194     }
    195 }
    196 
    197 
    198 /*******************************************************************************
    199  *
    200  * FUNCTION:    UtLocalCalloc
    201  *
    202  * PARAMETERS:  Size                - Bytes to be allocated
    203  *
    204  * RETURN:      Pointer to the allocated memory. Guaranteed to be valid.
    205  *
    206  * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
    207  *              allocation failure, on the assumption that nothing more can be
    208  *              accomplished.
    209  *
    210  ******************************************************************************/
    211 
    212 void *
    213 UtLocalCalloc (
    214     UINT32                  Size)
    215 {
    216     void                    *Allocated;
    217 
    218 
    219     Allocated = ACPI_ALLOCATE_ZEROED (Size);
    220     if (!Allocated)
    221     {
    222         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
    223             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
    224             Gbl_InputByteCount, Gbl_CurrentColumn,
    225             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
    226 
    227         CmCleanupAndExit ();
    228         exit (1);
    229     }
    230 
    231     TotalAllocations++;
    232     TotalAllocated += Size;
    233     return (Allocated);
    234 }
    235 
    236 /*******************************************************************************
    237  *
    238  * FUNCTION:    UtLocalFree
    239  *
    240  * PARAMETERS:  Allocated           - Pointer to be released
    241  * PARAMETERS:  Size                - Bytes to be released
    242  *
    243  * RETURN:      None
    244  *
    245  * DESCRIPTION: Free memory previously allocated
    246  *
    247  ******************************************************************************/
    248 void
    249 UtLocalFree (
    250 	void *Allocated, UINT32 Size)
    251 {
    252     ACPI_FREE (Allocated);
    253     TotalAllocations--;
    254     TotalAllocated -= Size;
    255 }
    256 
    257 /*******************************************************************************
    258  *
    259  * FUNCTION:    UtBeginEvent
    260  *
    261  * PARAMETERS:  Name                - Ascii name of this event
    262  *
    263  * RETURN:      Event number (integer index)
    264  *
    265  * DESCRIPTION: Saves the current time with this event
    266  *
    267  ******************************************************************************/
    268 
    269 UINT8
    270 UtBeginEvent (
    271     char                    *Name)
    272 {
    273 
    274     if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
    275     {
    276         AcpiOsPrintf ("Ran out of compiler event structs!\n");
    277         return (AslGbl_NextEvent);
    278     }
    279 
    280     /* Init event with current (start) time */
    281 
    282     AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
    283     AslGbl_Events[AslGbl_NextEvent].EventName = Name;
    284     AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
    285     return (AslGbl_NextEvent++);
    286 }
    287 
    288 
    289 /*******************************************************************************
    290  *
    291  * FUNCTION:    UtEndEvent
    292  *
    293  * PARAMETERS:  Event               - Event number (integer index)
    294  *
    295  * RETURN:      None
    296  *
    297  * DESCRIPTION: Saves the current time (end time) with this event
    298  *
    299  ******************************************************************************/
    300 
    301 void
    302 UtEndEvent (
    303     UINT8                   Event)
    304 {
    305 
    306     if (Event >= ASL_NUM_EVENTS)
    307     {
    308         return;
    309     }
    310 
    311     /* Insert end time for event */
    312 
    313     AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
    314 }
    315 
    316 
    317 /*******************************************************************************
    318  *
    319  * FUNCTION:    DbgPrint
    320  *
    321  * PARAMETERS:  Type                - Type of output
    322  *              Fmt                 - Printf format string
    323  *              ...                 - variable printf list
    324  *
    325  * RETURN:      None
    326  *
    327  * DESCRIPTION: Conditional print statement. Prints to stderr only if the
    328  *              debug flag is set.
    329  *
    330  ******************************************************************************/
    331 
    332 void
    333 DbgPrint (
    334     UINT32                  Type,
    335     char                    *Fmt,
    336     ...)
    337 {
    338     va_list                 Args;
    339 
    340 
    341     if (!Gbl_DebugFlag)
    342     {
    343         return;
    344     }
    345 
    346     if ((Type == ASL_PARSE_OUTPUT) &&
    347         (!(AslCompilerdebug)))
    348     {
    349         return;
    350     }
    351 
    352     va_start (Args, Fmt);
    353     (void) vfprintf (stderr, Fmt, Args);
    354     va_end (Args);
    355     return;
    356 }
    357 
    358 
    359 /*******************************************************************************
    360  *
    361  * FUNCTION:    UtSetParseOpName
    362  *
    363  * PARAMETERS:  Op                  - Parse op to be named.
    364  *
    365  * RETURN:      None
    366  *
    367  * DESCRIPTION: Insert the ascii name of the parse opcode
    368  *
    369  ******************************************************************************/
    370 
    371 void
    372 UtSetParseOpName (
    373     ACPI_PARSE_OBJECT       *Op)
    374 {
    375 
    376     strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
    377         ACPI_MAX_PARSEOP_NAME);
    378 }
    379 
    380 
    381 /*******************************************************************************
    382  *
    383  * FUNCTION:    UtDisplaySummary
    384  *
    385  * PARAMETERS:  FileID              - ID of outpout file
    386  *
    387  * RETURN:      None
    388  *
    389  * DESCRIPTION: Display compilation statistics
    390  *
    391  ******************************************************************************/
    392 
    393 void
    394 UtDisplaySummary (
    395     UINT32                  FileId)
    396 {
    397     UINT32                  i;
    398 
    399 
    400     if (FileId != ASL_FILE_STDOUT)
    401     {
    402         /* Compiler name and version number */
    403 
    404         FlPrintFile (FileId, "%s version %X%s [%s]\n\n",
    405             ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH, ACPI_DATE);
    406     }
    407 
    408     /* Summary of main input and output files */
    409 
    410     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
    411     {
    412         FlPrintFile (FileId,
    413             "%-14s %s - %u lines, %u bytes, %u fields\n",
    414             "Table Input:",
    415             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
    416             Gbl_InputByteCount, Gbl_InputFieldCount);
    417 
    418         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
    419         {
    420             FlPrintFile (FileId,
    421                 "%-14s %s - %u bytes\n",
    422                 "Binary Output:",
    423                 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength);
    424         }
    425     }
    426     else
    427     {
    428         FlPrintFile (FileId,
    429             "%-14s %s - %u lines, %u bytes, %u keywords\n",
    430             "ASL Input:",
    431             Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
    432             Gbl_OriginalInputFileSize, TotalKeywords);
    433 
    434         /* AML summary */
    435 
    436         if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
    437         {
    438             if (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
    439             {
    440                 FlPrintFile (FileId,
    441                     "%-14s %s - %u bytes, %u named objects, "
    442                     "%u executable opcodes\n",
    443                     "AML Output:",
    444                     Gbl_Files[ASL_FILE_AML_OUTPUT].Filename,
    445                     FlGetFileSize (ASL_FILE_AML_OUTPUT),
    446                     TotalNamedObjects, TotalExecutableOpcodes);
    447             }
    448         }
    449     }
    450 
    451     /* Display summary of any optional files */
    452 
    453     for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++)
    454     {
    455         if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle)
    456         {
    457             continue;
    458         }
    459 
    460         /* .SRC is a temp file unless specifically requested */
    461 
    462         if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag))
    463         {
    464             continue;
    465         }
    466 
    467         /* .PRE is the preprocessor intermediate file */
    468 
    469         if ((i == ASL_FILE_PREPROCESSOR)  && (!Gbl_KeepPreprocessorTempFile))
    470         {
    471             continue;
    472         }
    473 
    474         FlPrintFile (FileId, "%14s %s - %u bytes\n",
    475             Gbl_Files[i].ShortDescription,
    476             Gbl_Files[i].Filename, FlGetFileSize (i));
    477     }
    478 
    479     /* Error summary */
    480 
    481     FlPrintFile (FileId,
    482         "\nCompilation complete. %u Errors, %u Warnings, %u Remarks",
    483         Gbl_ExceptionCount[ASL_ERROR],
    484         Gbl_ExceptionCount[ASL_WARNING] +
    485             Gbl_ExceptionCount[ASL_WARNING2] +
    486             Gbl_ExceptionCount[ASL_WARNING3],
    487         Gbl_ExceptionCount[ASL_REMARK]);
    488 
    489     if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
    490     {
    491         FlPrintFile (FileId, ", %u Optimizations",
    492             Gbl_ExceptionCount[ASL_OPTIMIZATION]);
    493 
    494         if (TotalFolds)
    495         {
    496             FlPrintFile (FileId, ", %u Constants Folded", TotalFolds);
    497         }
    498     }
    499 
    500     FlPrintFile (FileId, "\n");
    501 }
    502 
    503 
    504 /*******************************************************************************
    505  *
    506  * FUNCTION:    UtCheckIntegerRange
    507  *
    508  * PARAMETERS:  Op                  - Integer parse node
    509  *              LowValue            - Smallest allowed value
    510  *              HighValue           - Largest allowed value
    511  *
    512  * RETURN:      Op if OK, otherwise NULL
    513  *
    514  * DESCRIPTION: Check integer for an allowable range
    515  *
    516  ******************************************************************************/
    517 
    518 ACPI_PARSE_OBJECT *
    519 UtCheckIntegerRange (
    520     ACPI_PARSE_OBJECT       *Op,
    521     UINT32                  LowValue,
    522     UINT32                  HighValue)
    523 {
    524 
    525     if (!Op)
    526     {
    527         return (NULL);
    528     }
    529 
    530     if ((Op->Asl.Value.Integer < LowValue) ||
    531         (Op->Asl.Value.Integer > HighValue))
    532     {
    533         snprintf (MsgBuffer, sizeof(MsgBuffer), "0x%X, allowable: 0x%X-0x%X",
    534             (UINT32) Op->Asl.Value.Integer, LowValue, HighValue);
    535 
    536         AslError (ASL_ERROR, ASL_MSG_RANGE, Op, MsgBuffer);
    537         return (NULL);
    538     }
    539 
    540     return (Op);
    541 }
    542 
    543 
    544 /*******************************************************************************
    545  *
    546  * FUNCTION:    UtStringCacheCalloc
    547  *
    548  * PARAMETERS:  Length              - Size of buffer requested
    549  *
    550  * RETURN:      Pointer to the buffer. Aborts on allocation failure
    551  *
    552  * DESCRIPTION: Allocate a string buffer. Bypass the local
    553  *              dynamic memory manager for performance reasons (This has a
    554  *              major impact on the speed of the compiler.)
    555  *
    556  ******************************************************************************/
    557 
    558 char *
    559 UtStringCacheCalloc (
    560     UINT32                  Length)
    561 {
    562     char                    *Buffer;
    563     ASL_CACHE_INFO          *Cache;
    564     UINT32                  CacheSize = ASL_STRING_CACHE_SIZE;
    565 
    566 
    567     if (Length > CacheSize)
    568     {
    569         CacheSize = Length;
    570 
    571         if (Gbl_StringCacheList)
    572         {
    573             Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
    574 
    575             /* Link new cache buffer just following head of list */
    576 
    577             Cache->Next = Gbl_StringCacheList->Next;
    578             Gbl_StringCacheList->Next = Cache;
    579 
    580             /* Leave cache management pointers alone as they pertain to head */
    581 
    582             Gbl_StringCount++;
    583             Gbl_StringSize += Length;
    584 
    585             return (Cache->Buffer);
    586         }
    587     }
    588 
    589     if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
    590     {
    591         /* Allocate a new buffer */
    592 
    593         Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize);
    594 
    595         /* Link new cache buffer to head of list */
    596 
    597         Cache->Next = Gbl_StringCacheList;
    598         Gbl_StringCacheList = Cache;
    599 
    600         /* Setup cache management pointers */
    601 
    602         Gbl_StringCacheNext = Cache->Buffer;
    603         Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize;
    604     }
    605 
    606     Gbl_StringCount++;
    607     Gbl_StringSize += Length;
    608 
    609     Buffer = Gbl_StringCacheNext;
    610     Gbl_StringCacheNext += Length;
    611     return (Buffer);
    612 }
    613 
    614 
    615 /******************************************************************************
    616  *
    617  * FUNCTION:    UtExpandLineBuffers
    618  *
    619  * PARAMETERS:  None. Updates global line buffer pointers.
    620  *
    621  * RETURN:      None. Reallocates the global line buffers
    622  *
    623  * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates
    624  *              all global line buffers and updates Gbl_LineBufferSize. NOTE:
    625  *              Also used for the initial allocation of the buffers, when
    626  *              all of the buffer pointers are NULL. Initial allocations are
    627  *              of size ASL_DEFAULT_LINE_BUFFER_SIZE
    628  *
    629  *****************************************************************************/
    630 
    631 void
    632 UtExpandLineBuffers (
    633     void)
    634 {
    635     UINT32                  NewSize;
    636 
    637 
    638     /* Attempt to double the size of all line buffers */
    639 
    640     NewSize = Gbl_LineBufferSize * 2;
    641     if (Gbl_CurrentLineBuffer)
    642     {
    643         DbgPrint (ASL_DEBUG_OUTPUT,
    644             "Increasing line buffer size from %u to %u\n",
    645             Gbl_LineBufferSize, NewSize);
    646     }
    647 
    648     Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
    649     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
    650     if (!Gbl_CurrentLineBuffer)
    651     {
    652         goto ErrorExit;
    653     }
    654 
    655     Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
    656     if (!Gbl_MainTokenBuffer)
    657     {
    658         goto ErrorExit;
    659     }
    660 
    661     Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
    662     if (!Gbl_MacroTokenBuffer)
    663     {
    664         goto ErrorExit;
    665     }
    666 
    667     Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
    668     if (!Gbl_ExpressionTokenBuffer)
    669     {
    670         goto ErrorExit;
    671     }
    672 
    673     Gbl_LineBufferSize = NewSize;
    674     return;
    675 
    676 
    677     /* On error above, simply issue error messages and abort, cannot continue */
    678 
    679 ErrorExit:
    680     printf ("Could not increase line buffer size from %u to %u\n",
    681         Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
    682 
    683     AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
    684         NULL, NULL);
    685     AslAbort ();
    686 }
    687 
    688 
    689 /******************************************************************************
    690  *
    691  * FUNCTION:    UtFreeLineBuffers
    692  *
    693  * PARAMETERS:  None
    694  *
    695  * RETURN:      None
    696  *
    697  * DESCRIPTION: Free all line buffers
    698  *
    699  *****************************************************************************/
    700 
    701 void
    702 UtFreeLineBuffers (
    703     void)
    704 {
    705 
    706     free (Gbl_CurrentLineBuffer);
    707     free (Gbl_MainTokenBuffer);
    708     free (Gbl_MacroTokenBuffer);
    709     free (Gbl_ExpressionTokenBuffer);
    710 }
    711 
    712 
    713 /*******************************************************************************
    714  *
    715  * FUNCTION:    UtInternalizeName
    716  *
    717  * PARAMETERS:  ExternalName        - Name to convert
    718  *              ConvertedName       - Where the converted name is returned
    719  *
    720  * RETURN:      Status
    721  *
    722  * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
    723  *
    724  ******************************************************************************/
    725 
    726 ACPI_STATUS
    727 UtInternalizeName (
    728     char                    *ExternalName,
    729     char                    **ConvertedName)
    730 {
    731     ACPI_NAMESTRING_INFO    Info;
    732     ACPI_STATUS             Status;
    733 
    734 
    735     if (!ExternalName)
    736     {
    737         return (AE_OK);
    738     }
    739 
    740     /* Get the length of the new internal name */
    741 
    742     Info.ExternalName = ExternalName;
    743     AcpiNsGetInternalNameLength (&Info);
    744 
    745     /* We need a segment to store the internal name */
    746 
    747     Info.InternalName = UtStringCacheCalloc (Info.Length);
    748     if (!Info.InternalName)
    749     {
    750         return (AE_NO_MEMORY);
    751     }
    752 
    753     /* Build the name */
    754 
    755     Status = AcpiNsBuildInternalName (&Info);
    756     if (ACPI_FAILURE (Status))
    757     {
    758         return (Status);
    759     }
    760 
    761     *ConvertedName = Info.InternalName;
    762     return (AE_OK);
    763 }
    764 
    765 
    766 /*******************************************************************************
    767  *
    768  * FUNCTION:    UtPadNameWithUnderscores
    769  *
    770  * PARAMETERS:  NameSeg             - Input nameseg
    771  *              PaddedNameSeg       - Output padded nameseg
    772  *
    773  * RETURN:      Padded nameseg.
    774  *
    775  * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
    776  *              ACPI_NAME.
    777  *
    778  ******************************************************************************/
    779 
    780 static void
    781 UtPadNameWithUnderscores (
    782     char                    *NameSeg,
    783     char                    *PaddedNameSeg)
    784 {
    785     UINT32                  i;
    786 
    787 
    788     for (i = 0; (i < ACPI_NAME_SIZE); i++)
    789     {
    790         if (*NameSeg)
    791         {
    792             *PaddedNameSeg = *NameSeg;
    793             NameSeg++;
    794         }
    795         else
    796         {
    797             *PaddedNameSeg = '_';
    798         }
    799 
    800         PaddedNameSeg++;
    801     }
    802 }
    803 
    804 
    805 /*******************************************************************************
    806  *
    807  * FUNCTION:    UtAttachNameseg
    808  *
    809  * PARAMETERS:  Op                  - Parent parse node
    810  *              Name                - Full ExternalName
    811  *
    812  * RETURN:      None; Sets the NameSeg field in parent node
    813  *
    814  * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
    815  *              in the NameSeg field of the Op.
    816  *
    817  ******************************************************************************/
    818 
    819 static void
    820 UtAttachNameseg (
    821     ACPI_PARSE_OBJECT       *Op,
    822     char                    *Name)
    823 {
    824     char                    *NameSeg;
    825     char                    PaddedNameSeg[4];
    826 
    827 
    828     if (!Name)
    829     {
    830         return;
    831     }
    832 
    833     /* Look for the last dot in the namepath */
    834 
    835     NameSeg = strrchr (Name, '.');
    836     if (NameSeg)
    837     {
    838         /* Found last dot, we have also found the final nameseg */
    839 
    840         NameSeg++;
    841         UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
    842     }
    843     else
    844     {
    845         /* No dots in the namepath, there is only a single nameseg. */
    846         /* Handle prefixes */
    847 
    848         while (ACPI_IS_ROOT_PREFIX (*Name) ||
    849                ACPI_IS_PARENT_PREFIX (*Name))
    850         {
    851             Name++;
    852         }
    853 
    854         /* Remaining string should be one single nameseg */
    855 
    856         UtPadNameWithUnderscores (Name, PaddedNameSeg);
    857     }
    858 
    859     ACPI_MOVE_NAME (Op->Asl.NameSeg, PaddedNameSeg);
    860 }
    861 
    862 
    863 /*******************************************************************************
    864  *
    865  * FUNCTION:    UtAttachNamepathToOwner
    866  *
    867  * PARAMETERS:  Op                  - Parent parse node
    868  *              NameOp              - Node that contains the name
    869  *
    870  * RETURN:      Sets the ExternalName and Namepath in the parent node
    871  *
    872  * DESCRIPTION: Store the name in two forms in the parent node: The original
    873  *              (external) name, and the internalized name that is used within
    874  *              the ACPI namespace manager.
    875  *
    876  ******************************************************************************/
    877 
    878 void
    879 UtAttachNamepathToOwner (
    880     ACPI_PARSE_OBJECT       *Op,
    881     ACPI_PARSE_OBJECT       *NameOp)
    882 {
    883     ACPI_STATUS             Status;
    884 
    885 
    886     /* Full external path */
    887 
    888     Op->Asl.ExternalName = NameOp->Asl.Value.String;
    889 
    890     /* Save the NameOp for possible error reporting later */
    891 
    892     Op->Asl.ParentMethod = (void *) NameOp;
    893 
    894     /* Last nameseg of the path */
    895 
    896     UtAttachNameseg (Op, Op->Asl.ExternalName);
    897 
    898     /* Create internalized path */
    899 
    900     Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
    901     if (ACPI_FAILURE (Status))
    902     {
    903         /* TBD: abort on no memory */
    904     }
    905 }
    906 
    907 
    908 /*******************************************************************************
    909  *
    910  * FUNCTION:    UtDoConstant
    911  *
    912  * PARAMETERS:  String              - Hex, Octal, or Decimal string
    913  *
    914  * RETURN:      Converted Integer
    915  *
    916  * DESCRIPTION: Convert a string to an integer, with error checking.
    917  *
    918  ******************************************************************************/
    919 
    920 UINT64
    921 UtDoConstant (
    922     char                    *String)
    923 {
    924     ACPI_STATUS             Status;
    925     UINT64                  Converted;
    926     char                    ErrBuf[64];
    927 
    928 
    929     Status = AcpiUtStrtoul64 (String, ACPI_ANY_BASE,
    930         ACPI_MAX64_BYTE_WIDTH, &Converted);
    931 
    932     if (ACPI_FAILURE (Status))
    933     {
    934         snprintf (ErrBuf, sizeof(ErrBuf), "%s %s\n", "Conversion error:",
    935             AcpiFormatException (Status));
    936         AslCompilererror (ErrBuf);
    937     }
    938 
    939     return (Converted);
    940 }
    941 
    942 
    943 #ifdef _OBSOLETE_FUNCTIONS
    944 /* Removed 01/2016 */
    945 
    946 /*******************************************************************************
    947  *
    948  * FUNCTION:    UtConvertByteToHex
    949  *
    950  * PARAMETERS:  RawByte             - Binary data
    951  *              Buffer              - Pointer to where the hex bytes will be
    952  *                                    stored
    953  *
    954  * RETURN:      Ascii hex byte is stored in Buffer.
    955  *
    956  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
    957  *              with "0x"
    958  *
    959  ******************************************************************************/
    960 
    961 void
    962 UtConvertByteToHex (
    963     UINT8                   RawByte,
    964     UINT8                   *Buffer)
    965 {
    966 
    967     Buffer[0] = '0';
    968     Buffer[1] = 'x';
    969 
    970     Buffer[2] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 4);
    971     Buffer[3] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 0);
    972 }
    973 
    974 
    975 /*******************************************************************************
    976  *
    977  * FUNCTION:    UtConvertByteToAsmHex
    978  *
    979  * PARAMETERS:  RawByte             - Binary data
    980  *              Buffer              - Pointer to where the hex bytes will be
    981  *                                    stored
    982  *
    983  * RETURN:      Ascii hex byte is stored in Buffer.
    984  *
    985  * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
    986  *              with '0', and a trailing 'h' is added.
    987  *
    988  ******************************************************************************/
    989 
    990 void
    991 UtConvertByteToAsmHex (
    992     UINT8                   RawByte,
    993     UINT8                   *Buffer)
    994 {
    995 
    996     Buffer[0] = '0';
    997     Buffer[1] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 4);
    998     Buffer[2] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 0);
    999     Buffer[3] = 'h';
   1000 }
   1001 #endif /* OBSOLETE_FUNCTIONS */
   1002