153289f6aSNate Lawson 253289f6aSNate Lawson /****************************************************************************** 353289f6aSNate Lawson * 453289f6aSNate Lawson * Module Name: aslutils -- compiler utilities 553289f6aSNate Lawson * 653289f6aSNate Lawson *****************************************************************************/ 753289f6aSNate Lawson 8d244b227SJung-uk Kim /* 9ec3fc72fSJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 1053289f6aSNate Lawson * All rights reserved. 1153289f6aSNate Lawson * 12d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 13d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 14d244b227SJung-uk Kim * are met: 15d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 16d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 17d244b227SJung-uk Kim * without modification. 18d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 20d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 21d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 22d244b227SJung-uk Kim * binary redistribution. 23d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 24d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 25d244b227SJung-uk Kim * from this software without specific prior written permission. 2653289f6aSNate Lawson * 27d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 28d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 29d244b227SJung-uk Kim * Software Foundation. 3053289f6aSNate Lawson * 31d244b227SJung-uk Kim * NO WARRANTY 32d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 43d244b227SJung-uk Kim */ 4453289f6aSNate Lawson 4553289f6aSNate Lawson 46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 4753289f6aSNate Lawson #include "aslcompiler.y.h" 48a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 513c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 5253289f6aSNate Lawson 5353289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 5453289f6aSNate Lawson ACPI_MODULE_NAME ("aslutils") 5553289f6aSNate Lawson 563f0275a0SJung-uk Kim 57d244b227SJung-uk Kim char AslHexLookup[] = 58a9f12690SJung-uk Kim { 59a9f12690SJung-uk Kim '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' 60a9f12690SJung-uk Kim }; 61a9f12690SJung-uk Kim 623f0275a0SJung-uk Kim /* Table below must match ASL_FILE_TYPES in asltypes.h */ 633f0275a0SJung-uk Kim 643f0275a0SJung-uk Kim static const char *AslFileTypeNames [ASL_NUM_FILES] = 653f0275a0SJung-uk Kim { 663f0275a0SJung-uk Kim "stdout: ", 673f0275a0SJung-uk Kim "stderr: ", 683f0275a0SJung-uk Kim "Table Input: ", 693f0275a0SJung-uk Kim "Binary Output:", 703f0275a0SJung-uk Kim "Source Output:", 71*4c52cad2SJung-uk Kim "Preprocessor: ", 723f0275a0SJung-uk Kim "Listing File: ", 733f0275a0SJung-uk Kim "Hex Dump: ", 743f0275a0SJung-uk Kim "Namespace: ", 753f0275a0SJung-uk Kim "Debug File: ", 763f0275a0SJung-uk Kim "ASM Source: ", 773f0275a0SJung-uk Kim "C Source: ", 783f0275a0SJung-uk Kim "ASM Include: ", 793f0275a0SJung-uk Kim "C Include: " 803f0275a0SJung-uk Kim }; 813f0275a0SJung-uk Kim 82a9f12690SJung-uk Kim 83fba7fc7eSJung-uk Kim /* Local prototypes */ 8453289f6aSNate Lawson 85fba7fc7eSJung-uk Kim static void 86fba7fc7eSJung-uk Kim UtPadNameWithUnderscores ( 87fba7fc7eSJung-uk Kim char *NameSeg, 88fba7fc7eSJung-uk Kim char *PaddedNameSeg); 89fba7fc7eSJung-uk Kim 90fba7fc7eSJung-uk Kim static void 91fba7fc7eSJung-uk Kim UtAttachNameseg ( 92fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 93fba7fc7eSJung-uk Kim char *Name); 9453289f6aSNate Lawson 9553289f6aSNate Lawson 9653289f6aSNate Lawson /******************************************************************************* 9753289f6aSNate Lawson * 98a88e22b7SJung-uk Kim * FUNCTION: UtDisplaySupportedTables 99a88e22b7SJung-uk Kim * 100a88e22b7SJung-uk Kim * PARAMETERS: None 101a88e22b7SJung-uk Kim * 102a88e22b7SJung-uk Kim * RETURN: None 103a88e22b7SJung-uk Kim * 104a88e22b7SJung-uk Kim * DESCRIPTION: Print all supported ACPI table names. 105a88e22b7SJung-uk Kim * 106a88e22b7SJung-uk Kim ******************************************************************************/ 107a88e22b7SJung-uk Kim 108a88e22b7SJung-uk Kim void 109a88e22b7SJung-uk Kim UtDisplaySupportedTables ( 110a88e22b7SJung-uk Kim void) 111a88e22b7SJung-uk Kim { 112a88e22b7SJung-uk Kim ACPI_DMTABLE_DATA *TableData; 113a88e22b7SJung-uk Kim UINT32 i = 6; 114a88e22b7SJung-uk Kim 115a88e22b7SJung-uk Kim 116a88e22b7SJung-uk Kim printf ("\nACPI tables supported by iASL subsystems in " 117a88e22b7SJung-uk Kim "version %8.8X:\n" 118a88e22b7SJung-uk Kim " ASL and Data Table compilers\n" 119a88e22b7SJung-uk Kim " AML and Data Table disassemblers\n" 120a88e22b7SJung-uk Kim " ACPI table template generator\n\n", ACPI_CA_VERSION); 121a88e22b7SJung-uk Kim 122a88e22b7SJung-uk Kim /* Special tables */ 123a88e22b7SJung-uk Kim 124a88e22b7SJung-uk Kim printf ("%8u) %s %s\n", 1, ACPI_SIG_DSDT, "Differentiated System Description Table"); 125a88e22b7SJung-uk Kim printf ("%8u) %s %s\n", 2, ACPI_SIG_SSDT, "Secondary System Description Table"); 126a88e22b7SJung-uk Kim printf ("%8u) %s %s\n", 3, ACPI_SIG_FADT, "Fixed ACPI Description Table (FADT)"); 127a88e22b7SJung-uk Kim printf ("%8u) %s %s\n", 4, ACPI_SIG_FACS, "Firmware ACPI Control Structure"); 128a88e22b7SJung-uk Kim printf ("%8u) %s %s\n", 5, ACPI_RSDP_NAME, "Root System Description Pointer"); 129a88e22b7SJung-uk Kim 130a88e22b7SJung-uk Kim /* All data tables with common table header */ 131a88e22b7SJung-uk Kim 132a88e22b7SJung-uk Kim for (TableData = AcpiDmTableData; TableData->Signature; TableData++) 133a88e22b7SJung-uk Kim { 134a88e22b7SJung-uk Kim printf ("%8u) %s %s\n", i, TableData->Signature, TableData->Name); 135a88e22b7SJung-uk Kim i++; 136a88e22b7SJung-uk Kim } 137a88e22b7SJung-uk Kim } 138a88e22b7SJung-uk Kim 139a88e22b7SJung-uk Kim 140a88e22b7SJung-uk Kim /******************************************************************************* 141a88e22b7SJung-uk Kim * 14253289f6aSNate Lawson * FUNCTION: AcpiPsDisplayConstantOpcodes 14353289f6aSNate Lawson * 14453289f6aSNate Lawson * PARAMETERS: None 14553289f6aSNate Lawson * 14653289f6aSNate Lawson * RETURN: None 14753289f6aSNate Lawson * 14853289f6aSNate Lawson * DESCRIPTION: Print AML opcodes that can be used in constant expressions. 14953289f6aSNate Lawson * 15053289f6aSNate Lawson ******************************************************************************/ 15153289f6aSNate Lawson 15253289f6aSNate Lawson void 15353289f6aSNate Lawson UtDisplayConstantOpcodes ( 15453289f6aSNate Lawson void) 15553289f6aSNate Lawson { 15653289f6aSNate Lawson UINT32 i; 15753289f6aSNate Lawson 158fba7fc7eSJung-uk Kim 15953289f6aSNate Lawson printf ("Constant expression opcode information\n\n"); 16053289f6aSNate Lawson 16153289f6aSNate Lawson for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++) 16253289f6aSNate Lawson { 16353289f6aSNate Lawson if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT) 16453289f6aSNate Lawson { 16553289f6aSNate Lawson printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name); 16653289f6aSNate Lawson } 16753289f6aSNate Lawson } 16853289f6aSNate Lawson } 16953289f6aSNate Lawson 17053289f6aSNate Lawson 17153289f6aSNate Lawson /******************************************************************************* 17253289f6aSNate Lawson * 17353289f6aSNate Lawson * FUNCTION: UtLocalCalloc 17453289f6aSNate Lawson * 17553289f6aSNate Lawson * PARAMETERS: Size - Bytes to be allocated 17653289f6aSNate Lawson * 17753289f6aSNate Lawson * RETURN: Pointer to the allocated memory. Guaranteed to be valid. 17853289f6aSNate Lawson * 17953289f6aSNate Lawson * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an 18053289f6aSNate Lawson * allocation failure, on the assumption that nothing more can be 18153289f6aSNate Lawson * accomplished. 18253289f6aSNate Lawson * 18353289f6aSNate Lawson ******************************************************************************/ 18453289f6aSNate Lawson 18553289f6aSNate Lawson void * 18653289f6aSNate Lawson UtLocalCalloc ( 18753289f6aSNate Lawson UINT32 Size) 18853289f6aSNate Lawson { 18953289f6aSNate Lawson void *Allocated; 19053289f6aSNate Lawson 19153289f6aSNate Lawson 1921a39cfb0SJung-uk Kim Allocated = ACPI_ALLOCATE_ZEROED (Size); 19353289f6aSNate Lawson if (!Allocated) 19453289f6aSNate Lawson { 19553289f6aSNate Lawson AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, 19653289f6aSNate Lawson Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 19753289f6aSNate Lawson Gbl_InputByteCount, Gbl_CurrentColumn, 19853289f6aSNate Lawson Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 199a88e22b7SJung-uk Kim 200a88e22b7SJung-uk Kim CmCleanupAndExit (); 20153289f6aSNate Lawson exit (1); 20253289f6aSNate Lawson } 20353289f6aSNate Lawson 20453289f6aSNate Lawson TotalAllocations++; 20553289f6aSNate Lawson TotalAllocated += Size; 2061a39cfb0SJung-uk Kim return (Allocated); 20753289f6aSNate Lawson } 20853289f6aSNate Lawson 20953289f6aSNate Lawson 21053289f6aSNate Lawson /******************************************************************************* 21153289f6aSNate Lawson * 21253289f6aSNate Lawson * FUNCTION: UtBeginEvent 21353289f6aSNate Lawson * 214fba7fc7eSJung-uk Kim * PARAMETERS: Name - Ascii name of this event 21553289f6aSNate Lawson * 216fba7fc7eSJung-uk Kim * RETURN: Event - Event number (integer index) 21753289f6aSNate Lawson * 21853289f6aSNate Lawson * DESCRIPTION: Saves the current time with this event 21953289f6aSNate Lawson * 22053289f6aSNate Lawson ******************************************************************************/ 22153289f6aSNate Lawson 222fba7fc7eSJung-uk Kim UINT8 22353289f6aSNate Lawson UtBeginEvent ( 22453289f6aSNate Lawson char *Name) 22553289f6aSNate Lawson { 22653289f6aSNate Lawson 227fba7fc7eSJung-uk Kim if (AslGbl_NextEvent >= ASL_NUM_EVENTS) 228fba7fc7eSJung-uk Kim { 229fba7fc7eSJung-uk Kim AcpiOsPrintf ("Ran out of compiler event structs!\n"); 230fba7fc7eSJung-uk Kim return (AslGbl_NextEvent); 231fba7fc7eSJung-uk Kim } 232fba7fc7eSJung-uk Kim 233fba7fc7eSJung-uk Kim /* Init event with current (start) time */ 234fba7fc7eSJung-uk Kim 235fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer (); 236fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].EventName = Name; 237fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].Valid = TRUE; 238fba7fc7eSJung-uk Kim 239fba7fc7eSJung-uk Kim return (AslGbl_NextEvent++); 24053289f6aSNate Lawson } 24153289f6aSNate Lawson 24253289f6aSNate Lawson 24353289f6aSNate Lawson /******************************************************************************* 24453289f6aSNate Lawson * 24553289f6aSNate Lawson * FUNCTION: UtEndEvent 24653289f6aSNate Lawson * 24753289f6aSNate Lawson * PARAMETERS: Event - Event number (integer index) 24853289f6aSNate Lawson * 24953289f6aSNate Lawson * RETURN: None 25053289f6aSNate Lawson * 25153289f6aSNate Lawson * DESCRIPTION: Saves the current time (end time) with this event 25253289f6aSNate Lawson * 25353289f6aSNate Lawson ******************************************************************************/ 25453289f6aSNate Lawson 25553289f6aSNate Lawson void 25653289f6aSNate Lawson UtEndEvent ( 257fba7fc7eSJung-uk Kim UINT8 Event) 25853289f6aSNate Lawson { 25953289f6aSNate Lawson 260fba7fc7eSJung-uk Kim if (Event >= ASL_NUM_EVENTS) 261fba7fc7eSJung-uk Kim { 262fba7fc7eSJung-uk Kim return; 263fba7fc7eSJung-uk Kim } 264fba7fc7eSJung-uk Kim 265fba7fc7eSJung-uk Kim /* Insert end time for event */ 266fba7fc7eSJung-uk Kim 267fba7fc7eSJung-uk Kim AslGbl_Events[Event].EndTime = AcpiOsGetTimer (); 26853289f6aSNate Lawson } 26953289f6aSNate Lawson 27053289f6aSNate Lawson 27153289f6aSNate Lawson /******************************************************************************* 27253289f6aSNate Lawson * 27353289f6aSNate Lawson * FUNCTION: UtHexCharToValue 27453289f6aSNate Lawson * 275fba7fc7eSJung-uk Kim * PARAMETERS: HexChar - Hex character in Ascii 27653289f6aSNate Lawson * 27753289f6aSNate Lawson * RETURN: The binary value of the hex character 27853289f6aSNate Lawson * 27953289f6aSNate Lawson * DESCRIPTION: Perform ascii-to-hex translation 28053289f6aSNate Lawson * 28153289f6aSNate Lawson ******************************************************************************/ 28253289f6aSNate Lawson 28353289f6aSNate Lawson UINT8 28453289f6aSNate Lawson UtHexCharToValue ( 285fba7fc7eSJung-uk Kim int HexChar) 28653289f6aSNate Lawson { 28753289f6aSNate Lawson 288fba7fc7eSJung-uk Kim if (HexChar <= 0x39) 28953289f6aSNate Lawson { 290fba7fc7eSJung-uk Kim return ((UINT8) (HexChar - 0x30)); 29153289f6aSNate Lawson } 29253289f6aSNate Lawson 293fba7fc7eSJung-uk Kim if (HexChar <= 0x46) 29453289f6aSNate Lawson { 295fba7fc7eSJung-uk Kim return ((UINT8) (HexChar - 0x37)); 29653289f6aSNate Lawson } 29753289f6aSNate Lawson 298fba7fc7eSJung-uk Kim return ((UINT8) (HexChar - 0x57)); 29953289f6aSNate Lawson } 30053289f6aSNate Lawson 30153289f6aSNate Lawson 30253289f6aSNate Lawson /******************************************************************************* 30353289f6aSNate Lawson * 30453289f6aSNate Lawson * FUNCTION: UtConvertByteToHex 30553289f6aSNate Lawson * 30653289f6aSNate Lawson * PARAMETERS: RawByte - Binary data 307fba7fc7eSJung-uk Kim * Buffer - Pointer to where the hex bytes will be stored 30853289f6aSNate Lawson * 30953289f6aSNate Lawson * RETURN: Ascii hex byte is stored in Buffer. 31053289f6aSNate Lawson * 31153289f6aSNate Lawson * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed 31253289f6aSNate Lawson * with "0x" 31353289f6aSNate Lawson * 31453289f6aSNate Lawson ******************************************************************************/ 31553289f6aSNate Lawson 31653289f6aSNate Lawson void 31753289f6aSNate Lawson UtConvertByteToHex ( 31853289f6aSNate Lawson UINT8 RawByte, 31953289f6aSNate Lawson UINT8 *Buffer) 32053289f6aSNate Lawson { 32153289f6aSNate Lawson 32253289f6aSNate Lawson Buffer[0] = '0'; 32353289f6aSNate Lawson Buffer[1] = 'x'; 32453289f6aSNate Lawson 325d244b227SJung-uk Kim Buffer[2] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF]; 326d244b227SJung-uk Kim Buffer[3] = (UINT8) AslHexLookup[RawByte & 0xF]; 32753289f6aSNate Lawson } 32853289f6aSNate Lawson 32953289f6aSNate Lawson 33053289f6aSNate Lawson /******************************************************************************* 33153289f6aSNate Lawson * 33253289f6aSNate Lawson * FUNCTION: UtConvertByteToAsmHex 33353289f6aSNate Lawson * 33453289f6aSNate Lawson * PARAMETERS: RawByte - Binary data 335fba7fc7eSJung-uk Kim * Buffer - Pointer to where the hex bytes will be stored 33653289f6aSNate Lawson * 33753289f6aSNate Lawson * RETURN: Ascii hex byte is stored in Buffer. 33853289f6aSNate Lawson * 33953289f6aSNate Lawson * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed 34053289f6aSNate Lawson * with "0x" 34153289f6aSNate Lawson * 34253289f6aSNate Lawson ******************************************************************************/ 34353289f6aSNate Lawson 34453289f6aSNate Lawson void 34553289f6aSNate Lawson UtConvertByteToAsmHex ( 34653289f6aSNate Lawson UINT8 RawByte, 34753289f6aSNate Lawson UINT8 *Buffer) 34853289f6aSNate Lawson { 34953289f6aSNate Lawson 35053289f6aSNate Lawson Buffer[0] = '0'; 351d244b227SJung-uk Kim Buffer[1] = (UINT8) AslHexLookup[(RawByte >> 4) & 0xF]; 352d244b227SJung-uk Kim Buffer[2] = (UINT8) AslHexLookup[RawByte & 0xF]; 35353289f6aSNate Lawson Buffer[3] = 'h'; 35453289f6aSNate Lawson } 35553289f6aSNate Lawson 35653289f6aSNate Lawson 35753289f6aSNate Lawson /******************************************************************************* 35853289f6aSNate Lawson * 35953289f6aSNate Lawson * FUNCTION: DbgPrint 36053289f6aSNate Lawson * 361fba7fc7eSJung-uk Kim * PARAMETERS: Type - Type of output 362fba7fc7eSJung-uk Kim * Fmt - Printf format string 36353289f6aSNate Lawson * ... - variable printf list 36453289f6aSNate Lawson * 36553289f6aSNate Lawson * RETURN: None 36653289f6aSNate Lawson * 36753289f6aSNate Lawson * DESCRIPTION: Conditional print statement. Prints to stderr only if the 36853289f6aSNate Lawson * debug flag is set. 36953289f6aSNate Lawson * 37053289f6aSNate Lawson ******************************************************************************/ 37153289f6aSNate Lawson 37253289f6aSNate Lawson void 37353289f6aSNate Lawson DbgPrint ( 37453289f6aSNate Lawson UINT32 Type, 37553289f6aSNate Lawson char *Fmt, 37653289f6aSNate Lawson ...) 37753289f6aSNate Lawson { 37853289f6aSNate Lawson va_list Args; 37953289f6aSNate Lawson 38053289f6aSNate Lawson 38153289f6aSNate Lawson va_start (Args, Fmt); 38253289f6aSNate Lawson 38353289f6aSNate Lawson if (!Gbl_DebugFlag) 38453289f6aSNate Lawson { 38553289f6aSNate Lawson return; 38653289f6aSNate Lawson } 38753289f6aSNate Lawson 38853289f6aSNate Lawson if ((Type == ASL_PARSE_OUTPUT) && 38953289f6aSNate Lawson (!(AslCompilerdebug))) 39053289f6aSNate Lawson { 39153289f6aSNate Lawson return; 39253289f6aSNate Lawson } 39353289f6aSNate Lawson 39453289f6aSNate Lawson (void) vfprintf (stderr, Fmt, Args); 39553289f6aSNate Lawson va_end (Args); 39653289f6aSNate Lawson return; 39753289f6aSNate Lawson } 39853289f6aSNate Lawson 39953289f6aSNate Lawson 40053289f6aSNate Lawson /******************************************************************************* 40153289f6aSNate Lawson * 40253289f6aSNate Lawson * FUNCTION: UtPrintFormattedName 40353289f6aSNate Lawson * 40453289f6aSNate Lawson * PARAMETERS: ParseOpcode - Parser keyword ID 40553289f6aSNate Lawson * Level - Indentation level 40653289f6aSNate Lawson * 40753289f6aSNate Lawson * RETURN: None 40853289f6aSNate Lawson * 40953289f6aSNate Lawson * DESCRIPTION: Print the ascii name of the parse opcode. 41053289f6aSNate Lawson * 41153289f6aSNate Lawson ******************************************************************************/ 41253289f6aSNate Lawson 41353289f6aSNate Lawson #define TEXT_OFFSET 10 41453289f6aSNate Lawson 41553289f6aSNate Lawson void 41653289f6aSNate Lawson UtPrintFormattedName ( 41753289f6aSNate Lawson UINT16 ParseOpcode, 41853289f6aSNate Lawson UINT32 Level) 41953289f6aSNate Lawson { 42053289f6aSNate Lawson 4211a39cfb0SJung-uk Kim if (Level) 4221a39cfb0SJung-uk Kim { 42353289f6aSNate Lawson DbgPrint (ASL_TREE_OUTPUT, 4241a39cfb0SJung-uk Kim "%*s", (3 * Level), " "); 4251a39cfb0SJung-uk Kim } 4261a39cfb0SJung-uk Kim DbgPrint (ASL_TREE_OUTPUT, 4271a39cfb0SJung-uk Kim " %-20.20s", UtGetOpName (ParseOpcode)); 42853289f6aSNate Lawson 42953289f6aSNate Lawson if (Level < TEXT_OFFSET) 43053289f6aSNate Lawson { 43153289f6aSNate Lawson DbgPrint (ASL_TREE_OUTPUT, 43253289f6aSNate Lawson "%*s", (TEXT_OFFSET - Level) * 3, " "); 43353289f6aSNate Lawson } 43453289f6aSNate Lawson } 43553289f6aSNate Lawson 43653289f6aSNate Lawson 43753289f6aSNate Lawson /******************************************************************************* 43853289f6aSNate Lawson * 43953289f6aSNate Lawson * FUNCTION: UtSetParseOpName 44053289f6aSNate Lawson * 44153289f6aSNate Lawson * PARAMETERS: Op 44253289f6aSNate Lawson * 44353289f6aSNate Lawson * RETURN: None 44453289f6aSNate Lawson * 44553289f6aSNate Lawson * DESCRIPTION: Insert the ascii name of the parse opcode 44653289f6aSNate Lawson * 44753289f6aSNate Lawson ******************************************************************************/ 44853289f6aSNate Lawson 44953289f6aSNate Lawson void 45053289f6aSNate Lawson UtSetParseOpName ( 45153289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 45253289f6aSNate Lawson { 453fba7fc7eSJung-uk Kim 4541a39cfb0SJung-uk Kim strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode), 4551a39cfb0SJung-uk Kim ACPI_MAX_PARSEOP_NAME); 45653289f6aSNate Lawson } 45753289f6aSNate Lawson 45853289f6aSNate Lawson 45953289f6aSNate Lawson /******************************************************************************* 46053289f6aSNate Lawson * 46153289f6aSNate Lawson * FUNCTION: UtDisplaySummary 46253289f6aSNate Lawson * 463fba7fc7eSJung-uk Kim * PARAMETERS: FileID - ID of outpout file 46453289f6aSNate Lawson * 46553289f6aSNate Lawson * RETURN: None 46653289f6aSNate Lawson * 46753289f6aSNate Lawson * DESCRIPTION: Display compilation statistics 46853289f6aSNate Lawson * 46953289f6aSNate Lawson ******************************************************************************/ 47053289f6aSNate Lawson 47153289f6aSNate Lawson void 47253289f6aSNate Lawson UtDisplaySummary ( 47353289f6aSNate Lawson UINT32 FileId) 47453289f6aSNate Lawson { 4753f0275a0SJung-uk Kim UINT32 i; 4763f0275a0SJung-uk Kim 47753289f6aSNate Lawson 47853289f6aSNate Lawson if (FileId != ASL_FILE_STDOUT) 47953289f6aSNate Lawson { 48053289f6aSNate Lawson /* Compiler name and version number */ 48153289f6aSNate Lawson 4823f0275a0SJung-uk Kim FlPrintFile (FileId, "%s version %X%s\n\n", 4833c1812acSJung-uk Kim ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH); 48453289f6aSNate Lawson } 48553289f6aSNate Lawson 4863f0275a0SJung-uk Kim /* Summary of main input and output files */ 4873f0275a0SJung-uk Kim 488a88e22b7SJung-uk Kim if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 489a88e22b7SJung-uk Kim { 490a88e22b7SJung-uk Kim FlPrintFile (FileId, 4913f0275a0SJung-uk Kim "%-14s %s - %u lines, %u bytes, %u fields\n", 4923f0275a0SJung-uk Kim "Table Input:", 493a88e22b7SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber, 494a88e22b7SJung-uk Kim Gbl_InputByteCount, Gbl_InputFieldCount); 495a88e22b7SJung-uk Kim 496a88e22b7SJung-uk Kim if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors)) 497a88e22b7SJung-uk Kim { 498a88e22b7SJung-uk Kim FlPrintFile (FileId, 4993f0275a0SJung-uk Kim "%-14s %s - %u bytes\n", 5003f0275a0SJung-uk Kim "Binary Output:", 501a88e22b7SJung-uk Kim Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength); 502a88e22b7SJung-uk Kim } 503a88e22b7SJung-uk Kim } 504a88e22b7SJung-uk Kim else 505a88e22b7SJung-uk Kim { 50653289f6aSNate Lawson FlPrintFile (FileId, 5073f0275a0SJung-uk Kim "%-14s %s - %u lines, %u bytes, %u keywords\n", 5083f0275a0SJung-uk Kim "ASL Input:", 50953289f6aSNate Lawson Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber, 51053289f6aSNate Lawson Gbl_InputByteCount, TotalKeywords); 51153289f6aSNate Lawson 51253289f6aSNate Lawson /* AML summary */ 51353289f6aSNate Lawson 51453289f6aSNate Lawson if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors)) 51553289f6aSNate Lawson { 51653289f6aSNate Lawson FlPrintFile (FileId, 5173f0275a0SJung-uk Kim "%-14s %s - %u bytes, %u named objects, %u executable opcodes\n", 5183f0275a0SJung-uk Kim "AML Output:", 51953289f6aSNate Lawson Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength, 52053289f6aSNate Lawson TotalNamedObjects, TotalExecutableOpcodes); 52153289f6aSNate Lawson } 522a88e22b7SJung-uk Kim } 52353289f6aSNate Lawson 5243f0275a0SJung-uk Kim /* Display summary of any optional files */ 5253f0275a0SJung-uk Kim 5263f0275a0SJung-uk Kim for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++) 5273f0275a0SJung-uk Kim { 5283f0275a0SJung-uk Kim if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle) 5293f0275a0SJung-uk Kim { 5303f0275a0SJung-uk Kim continue; 5313f0275a0SJung-uk Kim } 5323f0275a0SJung-uk Kim 5333f0275a0SJung-uk Kim /* .SRC is a temp file unless specifically requested */ 5343f0275a0SJung-uk Kim 5353f0275a0SJung-uk Kim if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag)) 5363f0275a0SJung-uk Kim { 5373f0275a0SJung-uk Kim continue; 5383f0275a0SJung-uk Kim } 5393f0275a0SJung-uk Kim 540*4c52cad2SJung-uk Kim /* .I is a temp file unless specifically requested */ 541*4c52cad2SJung-uk Kim 542*4c52cad2SJung-uk Kim if ((i == ASL_FILE_PREPROCESSOR) && (!Gbl_PreprocessorOutputFlag)) 543*4c52cad2SJung-uk Kim { 544*4c52cad2SJung-uk Kim continue; 545*4c52cad2SJung-uk Kim } 546*4c52cad2SJung-uk Kim 5473f0275a0SJung-uk Kim FlPrintFile (FileId, "%14s %s - %u bytes\n", 5483f0275a0SJung-uk Kim AslFileTypeNames [i], 5493f0275a0SJung-uk Kim Gbl_Files[i].Filename, FlGetFileSize (i)); 5503f0275a0SJung-uk Kim } 5513f0275a0SJung-uk Kim 55253289f6aSNate Lawson /* Error summary */ 55353289f6aSNate Lawson 55453289f6aSNate Lawson FlPrintFile (FileId, 5553f0275a0SJung-uk Kim "\nCompilation complete. %u Errors, %u Warnings, %u Remarks", 55653289f6aSNate Lawson Gbl_ExceptionCount[ASL_ERROR], 5571a39cfb0SJung-uk Kim Gbl_ExceptionCount[ASL_WARNING] + 5581a39cfb0SJung-uk Kim Gbl_ExceptionCount[ASL_WARNING2] + 5591a39cfb0SJung-uk Kim Gbl_ExceptionCount[ASL_WARNING3], 560a88e22b7SJung-uk Kim Gbl_ExceptionCount[ASL_REMARK]); 561a88e22b7SJung-uk Kim 562a88e22b7SJung-uk Kim if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA) 563a88e22b7SJung-uk Kim { 564a88e22b7SJung-uk Kim FlPrintFile (FileId, 565a88e22b7SJung-uk Kim ", %u Optimizations", Gbl_ExceptionCount[ASL_OPTIMIZATION]); 566a88e22b7SJung-uk Kim } 567a88e22b7SJung-uk Kim 568a88e22b7SJung-uk Kim FlPrintFile (FileId, "\n"); 56953289f6aSNate Lawson } 57053289f6aSNate Lawson 57153289f6aSNate Lawson 57253289f6aSNate Lawson /******************************************************************************* 57353289f6aSNate Lawson * 57453289f6aSNate Lawson * FUNCTION: UtDisplaySummary 57553289f6aSNate Lawson * 57653289f6aSNate Lawson * PARAMETERS: Op - Integer parse node 57753289f6aSNate Lawson * LowValue - Smallest allowed value 57853289f6aSNate Lawson * HighValue - Largest allowed value 57953289f6aSNate Lawson * 58053289f6aSNate Lawson * RETURN: Op if OK, otherwise NULL 58153289f6aSNate Lawson * 58253289f6aSNate Lawson * DESCRIPTION: Check integer for an allowable range 58353289f6aSNate Lawson * 58453289f6aSNate Lawson ******************************************************************************/ 58553289f6aSNate Lawson 58653289f6aSNate Lawson ACPI_PARSE_OBJECT * 58753289f6aSNate Lawson UtCheckIntegerRange ( 58853289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 58953289f6aSNate Lawson UINT32 LowValue, 59053289f6aSNate Lawson UINT32 HighValue) 59153289f6aSNate Lawson { 59253289f6aSNate Lawson char *ParseError = NULL; 59353289f6aSNate Lawson char Buffer[64]; 59453289f6aSNate Lawson 59553289f6aSNate Lawson 59653289f6aSNate Lawson if (!Op) 59753289f6aSNate Lawson { 59853289f6aSNate Lawson return NULL; 59953289f6aSNate Lawson } 60053289f6aSNate Lawson 60153289f6aSNate Lawson if (Op->Asl.Value.Integer < LowValue) 60253289f6aSNate Lawson { 60353289f6aSNate Lawson ParseError = "Value below valid range"; 60453289f6aSNate Lawson Op->Asl.Value.Integer = LowValue; 60553289f6aSNate Lawson } 60653289f6aSNate Lawson 60753289f6aSNate Lawson if (Op->Asl.Value.Integer > HighValue) 60853289f6aSNate Lawson { 60953289f6aSNate Lawson ParseError = "Value above valid range"; 61053289f6aSNate Lawson Op->Asl.Value.Integer = HighValue; 61153289f6aSNate Lawson } 61253289f6aSNate Lawson 61353289f6aSNate Lawson if (ParseError) 61453289f6aSNate Lawson { 61553289f6aSNate Lawson sprintf (Buffer, "%s 0x%X-0x%X", ParseError, LowValue, HighValue); 61653289f6aSNate Lawson AslCompilererror (Buffer); 61753289f6aSNate Lawson 61853289f6aSNate Lawson return NULL; 61953289f6aSNate Lawson } 62053289f6aSNate Lawson 62153289f6aSNate Lawson return Op; 62253289f6aSNate Lawson } 62353289f6aSNate Lawson 62453289f6aSNate Lawson 62553289f6aSNate Lawson /******************************************************************************* 62653289f6aSNate Lawson * 62753289f6aSNate Lawson * FUNCTION: UtGetStringBuffer 62853289f6aSNate Lawson * 62953289f6aSNate Lawson * PARAMETERS: Length - Size of buffer requested 63053289f6aSNate Lawson * 63153289f6aSNate Lawson * RETURN: Pointer to the buffer. Aborts on allocation failure 63253289f6aSNate Lawson * 63353289f6aSNate Lawson * DESCRIPTION: Allocate a string buffer. Bypass the local 63453289f6aSNate Lawson * dynamic memory manager for performance reasons (This has a 63553289f6aSNate Lawson * major impact on the speed of the compiler.) 63653289f6aSNate Lawson * 63753289f6aSNate Lawson ******************************************************************************/ 63853289f6aSNate Lawson 63953289f6aSNate Lawson char * 64053289f6aSNate Lawson UtGetStringBuffer ( 64153289f6aSNate Lawson UINT32 Length) 64253289f6aSNate Lawson { 64353289f6aSNate Lawson char *Buffer; 64453289f6aSNate Lawson 64553289f6aSNate Lawson 64653289f6aSNate Lawson if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast) 64753289f6aSNate Lawson { 64853289f6aSNate Lawson Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length); 649fba7fc7eSJung-uk Kim Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE + 650fba7fc7eSJung-uk Kim Length; 65153289f6aSNate Lawson } 65253289f6aSNate Lawson 65353289f6aSNate Lawson Buffer = Gbl_StringCacheNext; 65453289f6aSNate Lawson Gbl_StringCacheNext += Length; 65553289f6aSNate Lawson 65653289f6aSNate Lawson return (Buffer); 65753289f6aSNate Lawson } 65853289f6aSNate Lawson 65953289f6aSNate Lawson 66053289f6aSNate Lawson /******************************************************************************* 66153289f6aSNate Lawson * 66253289f6aSNate Lawson * FUNCTION: UtInternalizeName 66353289f6aSNate Lawson * 66453289f6aSNate Lawson * PARAMETERS: ExternalName - Name to convert 66553289f6aSNate Lawson * ConvertedName - Where the converted name is returned 66653289f6aSNate Lawson * 66753289f6aSNate Lawson * RETURN: Status 66853289f6aSNate Lawson * 66953289f6aSNate Lawson * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name 67053289f6aSNate Lawson * 67153289f6aSNate Lawson ******************************************************************************/ 67253289f6aSNate Lawson 67353289f6aSNate Lawson ACPI_STATUS 67453289f6aSNate Lawson UtInternalizeName ( 67553289f6aSNate Lawson char *ExternalName, 67653289f6aSNate Lawson char **ConvertedName) 67753289f6aSNate Lawson { 67853289f6aSNate Lawson ACPI_NAMESTRING_INFO Info; 67953289f6aSNate Lawson ACPI_STATUS Status; 68053289f6aSNate Lawson 68153289f6aSNate Lawson 68253289f6aSNate Lawson if (!ExternalName) 68353289f6aSNate Lawson { 68453289f6aSNate Lawson return (AE_OK); 68553289f6aSNate Lawson } 68653289f6aSNate Lawson 68753289f6aSNate Lawson /* Get the length of the new internal name */ 68853289f6aSNate Lawson 68953289f6aSNate Lawson Info.ExternalName = ExternalName; 69053289f6aSNate Lawson AcpiNsGetInternalNameLength (&Info); 69153289f6aSNate Lawson 69253289f6aSNate Lawson /* We need a segment to store the internal name */ 69353289f6aSNate Lawson 69453289f6aSNate Lawson Info.InternalName = UtGetStringBuffer (Info.Length); 69553289f6aSNate Lawson if (!Info.InternalName) 69653289f6aSNate Lawson { 69753289f6aSNate Lawson return (AE_NO_MEMORY); 69853289f6aSNate Lawson } 69953289f6aSNate Lawson 70053289f6aSNate Lawson /* Build the name */ 70153289f6aSNate Lawson 70253289f6aSNate Lawson Status = AcpiNsBuildInternalName (&Info); 70353289f6aSNate Lawson if (ACPI_FAILURE (Status)) 70453289f6aSNate Lawson { 70553289f6aSNate Lawson return (Status); 70653289f6aSNate Lawson } 70753289f6aSNate Lawson 70853289f6aSNate Lawson *ConvertedName = Info.InternalName; 70953289f6aSNate Lawson return (AE_OK); 71053289f6aSNate Lawson } 71153289f6aSNate Lawson 71253289f6aSNate Lawson 71353289f6aSNate Lawson /******************************************************************************* 71453289f6aSNate Lawson * 71553289f6aSNate Lawson * FUNCTION: UtPadNameWithUnderscores 71653289f6aSNate Lawson * 71753289f6aSNate Lawson * PARAMETERS: NameSeg - Input nameseg 71853289f6aSNate Lawson * PaddedNameSeg - Output padded nameseg 71953289f6aSNate Lawson * 72053289f6aSNate Lawson * RETURN: Padded nameseg. 72153289f6aSNate Lawson * 72253289f6aSNate Lawson * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full 72353289f6aSNate Lawson * ACPI_NAME. 72453289f6aSNate Lawson * 72553289f6aSNate Lawson ******************************************************************************/ 72653289f6aSNate Lawson 727fba7fc7eSJung-uk Kim static void 72853289f6aSNate Lawson UtPadNameWithUnderscores ( 72953289f6aSNate Lawson char *NameSeg, 73053289f6aSNate Lawson char *PaddedNameSeg) 73153289f6aSNate Lawson { 73253289f6aSNate Lawson UINT32 i; 73353289f6aSNate Lawson 73453289f6aSNate Lawson 73553289f6aSNate Lawson for (i = 0; (i < ACPI_NAME_SIZE); i++) 73653289f6aSNate Lawson { 73753289f6aSNate Lawson if (*NameSeg) 73853289f6aSNate Lawson { 73953289f6aSNate Lawson *PaddedNameSeg = *NameSeg; 74053289f6aSNate Lawson NameSeg++; 74153289f6aSNate Lawson } 74253289f6aSNate Lawson else 74353289f6aSNate Lawson { 74453289f6aSNate Lawson *PaddedNameSeg = '_'; 74553289f6aSNate Lawson } 74653289f6aSNate Lawson PaddedNameSeg++; 74753289f6aSNate Lawson } 74853289f6aSNate Lawson } 74953289f6aSNate Lawson 75053289f6aSNate Lawson 75153289f6aSNate Lawson /******************************************************************************* 75253289f6aSNate Lawson * 75353289f6aSNate Lawson * FUNCTION: UtAttachNameseg 75453289f6aSNate Lawson * 75553289f6aSNate Lawson * PARAMETERS: Op - Parent parse node 75653289f6aSNate Lawson * Name - Full ExternalName 75753289f6aSNate Lawson * 758fba7fc7eSJung-uk Kim * RETURN: None; Sets the NameSeg field in parent node 75953289f6aSNate Lawson * 76053289f6aSNate Lawson * DESCRIPTION: Extract the last nameseg of the ExternalName and store it 76153289f6aSNate Lawson * in the NameSeg field of the Op. 76253289f6aSNate Lawson * 76353289f6aSNate Lawson ******************************************************************************/ 76453289f6aSNate Lawson 765fba7fc7eSJung-uk Kim static void 76653289f6aSNate Lawson UtAttachNameseg ( 76753289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 76853289f6aSNate Lawson char *Name) 76953289f6aSNate Lawson { 77053289f6aSNate Lawson char *NameSeg; 77153289f6aSNate Lawson char PaddedNameSeg[4]; 77253289f6aSNate Lawson 77353289f6aSNate Lawson 77453289f6aSNate Lawson if (!Name) 77553289f6aSNate Lawson { 77653289f6aSNate Lawson return; 77753289f6aSNate Lawson } 77853289f6aSNate Lawson 77953289f6aSNate Lawson /* Look for the last dot in the namepath */ 78053289f6aSNate Lawson 78153289f6aSNate Lawson NameSeg = strrchr (Name, '.'); 78253289f6aSNate Lawson if (NameSeg) 78353289f6aSNate Lawson { 78453289f6aSNate Lawson /* Found last dot, we have also found the final nameseg */ 78553289f6aSNate Lawson 78653289f6aSNate Lawson NameSeg++; 78753289f6aSNate Lawson UtPadNameWithUnderscores (NameSeg, PaddedNameSeg); 78853289f6aSNate Lawson } 78953289f6aSNate Lawson else 79053289f6aSNate Lawson { 79153289f6aSNate Lawson /* No dots in the namepath, there is only a single nameseg. */ 79253289f6aSNate Lawson /* Handle prefixes */ 79353289f6aSNate Lawson 79453289f6aSNate Lawson while ((*Name == '\\') || (*Name == '^')) 79553289f6aSNate Lawson { 79653289f6aSNate Lawson Name++; 79753289f6aSNate Lawson } 79853289f6aSNate Lawson 79953289f6aSNate Lawson /* Remaing string should be one single nameseg */ 80053289f6aSNate Lawson 80153289f6aSNate Lawson UtPadNameWithUnderscores (Name, PaddedNameSeg); 80253289f6aSNate Lawson } 80353289f6aSNate Lawson 80453289f6aSNate Lawson strncpy (Op->Asl.NameSeg, PaddedNameSeg, 4); 80553289f6aSNate Lawson } 80653289f6aSNate Lawson 80753289f6aSNate Lawson 80853289f6aSNate Lawson /******************************************************************************* 80953289f6aSNate Lawson * 81053289f6aSNate Lawson * FUNCTION: UtAttachNamepathToOwner 81153289f6aSNate Lawson * 81253289f6aSNate Lawson * PARAMETERS: Op - Parent parse node 81353289f6aSNate Lawson * NameOp - Node that contains the name 81453289f6aSNate Lawson * 81553289f6aSNate Lawson * RETURN: Sets the ExternalName and Namepath in the parent node 81653289f6aSNate Lawson * 81753289f6aSNate Lawson * DESCRIPTION: Store the name in two forms in the parent node: The original 81853289f6aSNate Lawson * (external) name, and the internalized name that is used within 81953289f6aSNate Lawson * the ACPI namespace manager. 82053289f6aSNate Lawson * 82153289f6aSNate Lawson ******************************************************************************/ 82253289f6aSNate Lawson 82353289f6aSNate Lawson void 82453289f6aSNate Lawson UtAttachNamepathToOwner ( 82553289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 82653289f6aSNate Lawson ACPI_PARSE_OBJECT *NameOp) 82753289f6aSNate Lawson { 82853289f6aSNate Lawson ACPI_STATUS Status; 82953289f6aSNate Lawson 83053289f6aSNate Lawson 83153289f6aSNate Lawson /* Full external path */ 83253289f6aSNate Lawson 83353289f6aSNate Lawson Op->Asl.ExternalName = NameOp->Asl.Value.String; 83453289f6aSNate Lawson 835fba7fc7eSJung-uk Kim /* Save the NameOp for possible error reporting later */ 836fba7fc7eSJung-uk Kim 837fba7fc7eSJung-uk Kim Op->Asl.ParentMethod = (void *) NameOp; 838fba7fc7eSJung-uk Kim 83953289f6aSNate Lawson /* Last nameseg of the path */ 84053289f6aSNate Lawson 84153289f6aSNate Lawson UtAttachNameseg (Op, Op->Asl.ExternalName); 84253289f6aSNate Lawson 84353289f6aSNate Lawson /* Create internalized path */ 84453289f6aSNate Lawson 84553289f6aSNate Lawson Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath); 84653289f6aSNate Lawson if (ACPI_FAILURE (Status)) 84753289f6aSNate Lawson { 84853289f6aSNate Lawson /* TBD: abort on no memory */ 84953289f6aSNate Lawson } 85053289f6aSNate Lawson } 85153289f6aSNate Lawson 85253289f6aSNate Lawson 85353289f6aSNate Lawson /******************************************************************************* 85453289f6aSNate Lawson * 85553289f6aSNate Lawson * FUNCTION: UtDoConstant 85653289f6aSNate Lawson * 85753289f6aSNate Lawson * PARAMETERS: String - Hex, Octal, or Decimal string 85853289f6aSNate Lawson * 85953289f6aSNate Lawson * RETURN: Converted Integer 86053289f6aSNate Lawson * 86153289f6aSNate Lawson * DESCRIPTION: Convert a string to an integer. With error checking. 86253289f6aSNate Lawson * 86353289f6aSNate Lawson ******************************************************************************/ 86453289f6aSNate Lawson 8659a179dd8SJung-uk Kim UINT64 86653289f6aSNate Lawson UtDoConstant ( 86753289f6aSNate Lawson char *String) 86853289f6aSNate Lawson { 86953289f6aSNate Lawson ACPI_STATUS Status; 8709a179dd8SJung-uk Kim UINT64 Converted; 87153289f6aSNate Lawson char ErrBuf[64]; 87253289f6aSNate Lawson 87353289f6aSNate Lawson 87453289f6aSNate Lawson Status = UtStrtoul64 (String, 0, &Converted); 87553289f6aSNate Lawson if (ACPI_FAILURE (Status)) 87653289f6aSNate Lawson { 877fba7fc7eSJung-uk Kim sprintf (ErrBuf, "%s %s\n", "Conversion error:", 878fba7fc7eSJung-uk Kim AcpiFormatException (Status)); 87953289f6aSNate Lawson AslCompilererror (ErrBuf); 88053289f6aSNate Lawson } 88153289f6aSNate Lawson 88253289f6aSNate Lawson return (Converted); 88353289f6aSNate Lawson } 88453289f6aSNate Lawson 88553289f6aSNate Lawson 886fba7fc7eSJung-uk Kim /* TBD: use version in ACPI CA main code base? */ 887fba7fc7eSJung-uk Kim 88853289f6aSNate Lawson /******************************************************************************* 88953289f6aSNate Lawson * 89053289f6aSNate Lawson * FUNCTION: UtStrtoul64 89153289f6aSNate Lawson * 89253289f6aSNate Lawson * PARAMETERS: String - Null terminated string 893fba7fc7eSJung-uk Kim * Terminater - Where a pointer to the terminating byte is 894fba7fc7eSJung-uk Kim * returned 89553289f6aSNate Lawson * Base - Radix of the string 89653289f6aSNate Lawson * 89753289f6aSNate Lawson * RETURN: Converted value 89853289f6aSNate Lawson * 89953289f6aSNate Lawson * DESCRIPTION: Convert a string into an unsigned value. 90053289f6aSNate Lawson * 90153289f6aSNate Lawson ******************************************************************************/ 90253289f6aSNate Lawson 903d052a1ccSJung-uk Kim ACPI_STATUS 90453289f6aSNate Lawson UtStrtoul64 ( 90553289f6aSNate Lawson char *String, 90653289f6aSNate Lawson UINT32 Base, 9079a179dd8SJung-uk Kim UINT64 *RetInteger) 90853289f6aSNate Lawson { 90953289f6aSNate Lawson UINT32 Index; 91053289f6aSNate Lawson UINT32 Sign; 9119a179dd8SJung-uk Kim UINT64 ReturnValue = 0; 91253289f6aSNate Lawson ACPI_STATUS Status = AE_OK; 91353289f6aSNate Lawson 91453289f6aSNate Lawson 91553289f6aSNate Lawson *RetInteger = 0; 91653289f6aSNate Lawson 91753289f6aSNate Lawson switch (Base) 91853289f6aSNate Lawson { 91953289f6aSNate Lawson case 0: 92053289f6aSNate Lawson case 8: 92153289f6aSNate Lawson case 10: 92253289f6aSNate Lawson case 16: 92353289f6aSNate Lawson break; 92453289f6aSNate Lawson 92553289f6aSNate Lawson default: 92653289f6aSNate Lawson /* 92753289f6aSNate Lawson * The specified Base parameter is not in the domain of 92853289f6aSNate Lawson * this function: 92953289f6aSNate Lawson */ 93053289f6aSNate Lawson return (AE_BAD_PARAMETER); 93153289f6aSNate Lawson } 93253289f6aSNate Lawson 933fba7fc7eSJung-uk Kim /* Skip over any white space in the buffer: */ 934fba7fc7eSJung-uk Kim 9359a179dd8SJung-uk Kim while (isspace ((int) *String) || *String == '\t') 93653289f6aSNate Lawson { 93753289f6aSNate Lawson ++String; 93853289f6aSNate Lawson } 93953289f6aSNate Lawson 94053289f6aSNate Lawson /* 94153289f6aSNate Lawson * The buffer may contain an optional plus or minus sign. 94253289f6aSNate Lawson * If it does, then skip over it but remember what is was: 94353289f6aSNate Lawson */ 94453289f6aSNate Lawson if (*String == '-') 94553289f6aSNate Lawson { 94653289f6aSNate Lawson Sign = NEGATIVE; 94753289f6aSNate Lawson ++String; 94853289f6aSNate Lawson } 94953289f6aSNate Lawson else if (*String == '+') 95053289f6aSNate Lawson { 95153289f6aSNate Lawson ++String; 95253289f6aSNate Lawson Sign = POSITIVE; 95353289f6aSNate Lawson } 95453289f6aSNate Lawson else 95553289f6aSNate Lawson { 95653289f6aSNate Lawson Sign = POSITIVE; 95753289f6aSNate Lawson } 95853289f6aSNate Lawson 95953289f6aSNate Lawson /* 96053289f6aSNate Lawson * If the input parameter Base is zero, then we need to 96153289f6aSNate Lawson * determine if it is octal, decimal, or hexadecimal: 96253289f6aSNate Lawson */ 96353289f6aSNate Lawson if (Base == 0) 96453289f6aSNate Lawson { 96553289f6aSNate Lawson if (*String == '0') 96653289f6aSNate Lawson { 9679a179dd8SJung-uk Kim if (tolower ((int) *(++String)) == 'x') 96853289f6aSNate Lawson { 96953289f6aSNate Lawson Base = 16; 97053289f6aSNate Lawson ++String; 97153289f6aSNate Lawson } 97253289f6aSNate Lawson else 97353289f6aSNate Lawson { 97453289f6aSNate Lawson Base = 8; 97553289f6aSNate Lawson } 97653289f6aSNate Lawson } 97753289f6aSNate Lawson else 97853289f6aSNate Lawson { 97953289f6aSNate Lawson Base = 10; 98053289f6aSNate Lawson } 98153289f6aSNate Lawson } 98253289f6aSNate Lawson 98353289f6aSNate Lawson /* 98453289f6aSNate Lawson * For octal and hexadecimal bases, skip over the leading 98553289f6aSNate Lawson * 0 or 0x, if they are present. 98653289f6aSNate Lawson */ 98753289f6aSNate Lawson if (Base == 8 && *String == '0') 98853289f6aSNate Lawson { 98953289f6aSNate Lawson String++; 99053289f6aSNate Lawson } 99153289f6aSNate Lawson 99253289f6aSNate Lawson if (Base == 16 && 99353289f6aSNate Lawson *String == '0' && 9949a179dd8SJung-uk Kim tolower ((int) *(++String)) == 'x') 99553289f6aSNate Lawson { 99653289f6aSNate Lawson String++; 99753289f6aSNate Lawson } 99853289f6aSNate Lawson 99953289f6aSNate Lawson /* Main loop: convert the string to an unsigned long */ 100053289f6aSNate Lawson 100153289f6aSNate Lawson while (*String) 100253289f6aSNate Lawson { 10039a179dd8SJung-uk Kim if (isdigit ((int) *String)) 100453289f6aSNate Lawson { 100553289f6aSNate Lawson Index = ((UINT8) *String) - '0'; 100653289f6aSNate Lawson } 100753289f6aSNate Lawson else 100853289f6aSNate Lawson { 10099a179dd8SJung-uk Kim Index = (UINT8) toupper ((int) *String); 10109a179dd8SJung-uk Kim if (isupper ((int) Index)) 101153289f6aSNate Lawson { 101253289f6aSNate Lawson Index = Index - 'A' + 10; 101353289f6aSNate Lawson } 101453289f6aSNate Lawson else 101553289f6aSNate Lawson { 101653289f6aSNate Lawson goto ErrorExit; 101753289f6aSNate Lawson } 101853289f6aSNate Lawson } 101953289f6aSNate Lawson 102053289f6aSNate Lawson if (Index >= Base) 102153289f6aSNate Lawson { 102253289f6aSNate Lawson goto ErrorExit; 102353289f6aSNate Lawson } 102453289f6aSNate Lawson 102553289f6aSNate Lawson /* Check to see if value is out of range: */ 102653289f6aSNate Lawson 10279a179dd8SJung-uk Kim if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) / 10289a179dd8SJung-uk Kim (UINT64) Base)) 102953289f6aSNate Lawson { 103053289f6aSNate Lawson goto ErrorExit; 103153289f6aSNate Lawson } 103253289f6aSNate Lawson else 103353289f6aSNate Lawson { 103453289f6aSNate Lawson ReturnValue *= Base; 103553289f6aSNate Lawson ReturnValue += Index; 103653289f6aSNate Lawson } 103753289f6aSNate Lawson 103853289f6aSNate Lawson ++String; 103953289f6aSNate Lawson } 104053289f6aSNate Lawson 104153289f6aSNate Lawson 1042fba7fc7eSJung-uk Kim /* If a minus sign was present, then "the conversion is negated": */ 1043fba7fc7eSJung-uk Kim 104453289f6aSNate Lawson if (Sign == NEGATIVE) 104553289f6aSNate Lawson { 104653289f6aSNate Lawson ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1; 104753289f6aSNate Lawson } 104853289f6aSNate Lawson 104953289f6aSNate Lawson *RetInteger = ReturnValue; 105053289f6aSNate Lawson return (Status); 105153289f6aSNate Lawson 105253289f6aSNate Lawson 105353289f6aSNate Lawson ErrorExit: 105453289f6aSNate Lawson switch (Base) 105553289f6aSNate Lawson { 105653289f6aSNate Lawson case 8: 105753289f6aSNate Lawson Status = AE_BAD_OCTAL_CONSTANT; 105853289f6aSNate Lawson break; 105953289f6aSNate Lawson 106053289f6aSNate Lawson case 10: 106153289f6aSNate Lawson Status = AE_BAD_DECIMAL_CONSTANT; 106253289f6aSNate Lawson break; 106353289f6aSNate Lawson 106453289f6aSNate Lawson case 16: 106553289f6aSNate Lawson Status = AE_BAD_HEX_CONSTANT; 106653289f6aSNate Lawson break; 106753289f6aSNate Lawson 106853289f6aSNate Lawson default: 106953289f6aSNate Lawson /* Base validated above */ 107053289f6aSNate Lawson break; 107153289f6aSNate Lawson } 107253289f6aSNate Lawson 107353289f6aSNate Lawson return (Status); 107453289f6aSNate Lawson } 107553289f6aSNate Lawson 107653289f6aSNate Lawson 1077