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