153289f6aSNate Lawson /****************************************************************************** 253289f6aSNate Lawson * 353289f6aSNate Lawson * Module Name: aslutils -- compiler utilities 453289f6aSNate Lawson * 553289f6aSNate Lawson *****************************************************************************/ 653289f6aSNate Lawson 7d244b227SJung-uk Kim /* 81c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, Intel Corp. 953289f6aSNate Lawson * All rights reserved. 1053289f6aSNate Lawson * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 2553289f6aSNate Lawson * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 2953289f6aSNate Lawson * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 4353289f6aSNate Lawson 44ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 4553289f6aSNate Lawson #include "aslcompiler.y.h" 46a88e22b7SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 493c1812acSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 5053289f6aSNate Lawson 5153289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 5253289f6aSNate Lawson ACPI_MODULE_NAME ("aslutils") 5353289f6aSNate Lawson 543f0275a0SJung-uk Kim 55fba7fc7eSJung-uk Kim /* Local prototypes */ 5653289f6aSNate Lawson 57fba7fc7eSJung-uk Kim static void 58fba7fc7eSJung-uk Kim UtPadNameWithUnderscores ( 59fba7fc7eSJung-uk Kim char *NameSeg, 60fba7fc7eSJung-uk Kim char *PaddedNameSeg); 61fba7fc7eSJung-uk Kim 62fba7fc7eSJung-uk Kim static void 63fba7fc7eSJung-uk Kim UtAttachNameseg ( 64fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 65fba7fc7eSJung-uk Kim char *Name); 6653289f6aSNate Lawson 6753289f6aSNate Lawson 6853289f6aSNate Lawson /******************************************************************************* 6953289f6aSNate Lawson * 70a88e22b7SJung-uk Kim * FUNCTION: UtDisplaySupportedTables 71a88e22b7SJung-uk Kim * 72a88e22b7SJung-uk Kim * PARAMETERS: None 73a88e22b7SJung-uk Kim * 74a88e22b7SJung-uk Kim * RETURN: None 75a88e22b7SJung-uk Kim * 76a88e22b7SJung-uk Kim * DESCRIPTION: Print all supported ACPI table names. 77a88e22b7SJung-uk Kim * 78a88e22b7SJung-uk Kim ******************************************************************************/ 79a88e22b7SJung-uk Kim 801df130f1SJung-uk Kim #define ACPI_TABLE_HELP_FORMAT "%8u) %s %s\n" 811df130f1SJung-uk Kim 82a88e22b7SJung-uk Kim void 83a88e22b7SJung-uk Kim UtDisplaySupportedTables ( 84a88e22b7SJung-uk Kim void) 85a88e22b7SJung-uk Kim { 86a88e22b7SJung-uk Kim ACPI_DMTABLE_DATA *TableData; 871df130f1SJung-uk Kim UINT32 i; 88a88e22b7SJung-uk Kim 89a88e22b7SJung-uk Kim 901df130f1SJung-uk Kim printf ("\nACPI tables supported by iASL version %8.8X:\n" 911df130f1SJung-uk Kim " (Compiler, Disassembler, Template Generator)\n\n", 921df130f1SJung-uk Kim ACPI_CA_VERSION); 93a88e22b7SJung-uk Kim 94a88e22b7SJung-uk Kim /* Special tables */ 95a88e22b7SJung-uk Kim 961df130f1SJung-uk Kim printf (" Special tables and AML tables:\n"); 971df130f1SJung-uk Kim printf (ACPI_TABLE_HELP_FORMAT, 1, ACPI_RSDP_NAME, "Root System Description Pointer"); 981df130f1SJung-uk Kim printf (ACPI_TABLE_HELP_FORMAT, 2, ACPI_SIG_FACS, "Firmware ACPI Control Structure"); 991df130f1SJung-uk Kim printf (ACPI_TABLE_HELP_FORMAT, 3, ACPI_SIG_DSDT, "Differentiated System Description Table"); 1001df130f1SJung-uk Kim printf (ACPI_TABLE_HELP_FORMAT, 4, ACPI_SIG_SSDT, "Secondary System Description Table"); 101a88e22b7SJung-uk Kim 102a88e22b7SJung-uk Kim /* All data tables with common table header */ 103a88e22b7SJung-uk Kim 1041df130f1SJung-uk Kim printf ("\n Standard ACPI data tables:\n"); 1051df130f1SJung-uk Kim for (TableData = AcpiDmTableData, i = 5; TableData->Signature; TableData++, i++) 106a88e22b7SJung-uk Kim { 1071df130f1SJung-uk Kim printf (ACPI_TABLE_HELP_FORMAT, i, TableData->Signature, TableData->Name); 108a88e22b7SJung-uk Kim } 109a88e22b7SJung-uk Kim } 110a88e22b7SJung-uk Kim 111a88e22b7SJung-uk Kim 112a88e22b7SJung-uk Kim /******************************************************************************* 113a88e22b7SJung-uk Kim * 114f38b0f21SJung-uk Kim * FUNCTION: UtDisplayConstantOpcodes 11553289f6aSNate Lawson * 11653289f6aSNate Lawson * PARAMETERS: None 11753289f6aSNate Lawson * 11853289f6aSNate Lawson * RETURN: None 11953289f6aSNate Lawson * 12053289f6aSNate Lawson * DESCRIPTION: Print AML opcodes that can be used in constant expressions. 12153289f6aSNate Lawson * 12253289f6aSNate Lawson ******************************************************************************/ 12353289f6aSNate Lawson 12453289f6aSNate Lawson void 12553289f6aSNate Lawson UtDisplayConstantOpcodes ( 12653289f6aSNate Lawson void) 12753289f6aSNate Lawson { 12853289f6aSNate Lawson UINT32 i; 12953289f6aSNate Lawson 130fba7fc7eSJung-uk Kim 13153289f6aSNate Lawson printf ("Constant expression opcode information\n\n"); 13253289f6aSNate Lawson 13353289f6aSNate Lawson for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++) 13453289f6aSNate Lawson { 13553289f6aSNate Lawson if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT) 13653289f6aSNate Lawson { 13753289f6aSNate Lawson printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name); 13853289f6aSNate Lawson } 13953289f6aSNate Lawson } 14053289f6aSNate Lawson } 14153289f6aSNate Lawson 14253289f6aSNate Lawson 14353289f6aSNate Lawson /******************************************************************************* 14453289f6aSNate Lawson * 14553289f6aSNate Lawson * FUNCTION: UtLocalCalloc 14653289f6aSNate Lawson * 14753289f6aSNate Lawson * PARAMETERS: Size - Bytes to be allocated 14853289f6aSNate Lawson * 14953289f6aSNate Lawson * RETURN: Pointer to the allocated memory. Guaranteed to be valid. 15053289f6aSNate Lawson * 15153289f6aSNate Lawson * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an 15253289f6aSNate Lawson * allocation failure, on the assumption that nothing more can be 15353289f6aSNate Lawson * accomplished. 15453289f6aSNate Lawson * 15553289f6aSNate Lawson ******************************************************************************/ 15653289f6aSNate Lawson 15753289f6aSNate Lawson void * 15853289f6aSNate Lawson UtLocalCalloc ( 15953289f6aSNate Lawson UINT32 Size) 16053289f6aSNate Lawson { 16153289f6aSNate Lawson void *Allocated; 16253289f6aSNate Lawson 16353289f6aSNate Lawson 1641a39cfb0SJung-uk Kim Allocated = ACPI_ALLOCATE_ZEROED (Size); 16553289f6aSNate Lawson if (!Allocated) 16653289f6aSNate Lawson { 16753289f6aSNate Lawson AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, 16853289f6aSNate Lawson Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 16953289f6aSNate Lawson Gbl_InputByteCount, Gbl_CurrentColumn, 17053289f6aSNate Lawson Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 171a88e22b7SJung-uk Kim 172a88e22b7SJung-uk Kim CmCleanupAndExit (); 17353289f6aSNate Lawson exit (1); 17453289f6aSNate Lawson } 17553289f6aSNate Lawson 17653289f6aSNate Lawson TotalAllocations++; 17753289f6aSNate Lawson TotalAllocated += Size; 1781a39cfb0SJung-uk Kim return (Allocated); 17953289f6aSNate Lawson } 18053289f6aSNate Lawson 18153289f6aSNate Lawson 18253289f6aSNate Lawson /******************************************************************************* 18353289f6aSNate Lawson * 18453289f6aSNate Lawson * FUNCTION: UtBeginEvent 18553289f6aSNate Lawson * 186fba7fc7eSJung-uk Kim * PARAMETERS: Name - Ascii name of this event 18753289f6aSNate Lawson * 188f38b0f21SJung-uk Kim * RETURN: Event number (integer index) 18953289f6aSNate Lawson * 19053289f6aSNate Lawson * DESCRIPTION: Saves the current time with this event 19153289f6aSNate Lawson * 19253289f6aSNate Lawson ******************************************************************************/ 19353289f6aSNate Lawson 194fba7fc7eSJung-uk Kim UINT8 19553289f6aSNate Lawson UtBeginEvent ( 19653289f6aSNate Lawson char *Name) 19753289f6aSNate Lawson { 19853289f6aSNate Lawson 199fba7fc7eSJung-uk Kim if (AslGbl_NextEvent >= ASL_NUM_EVENTS) 200fba7fc7eSJung-uk Kim { 201fba7fc7eSJung-uk Kim AcpiOsPrintf ("Ran out of compiler event structs!\n"); 202fba7fc7eSJung-uk Kim return (AslGbl_NextEvent); 203fba7fc7eSJung-uk Kim } 204fba7fc7eSJung-uk Kim 205fba7fc7eSJung-uk Kim /* Init event with current (start) time */ 206fba7fc7eSJung-uk Kim 207fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer (); 208fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].EventName = Name; 209fba7fc7eSJung-uk Kim AslGbl_Events[AslGbl_NextEvent].Valid = TRUE; 210fba7fc7eSJung-uk Kim 211fba7fc7eSJung-uk Kim return (AslGbl_NextEvent++); 21253289f6aSNate Lawson } 21353289f6aSNate Lawson 21453289f6aSNate Lawson 21553289f6aSNate Lawson /******************************************************************************* 21653289f6aSNate Lawson * 21753289f6aSNate Lawson * FUNCTION: UtEndEvent 21853289f6aSNate Lawson * 21953289f6aSNate Lawson * PARAMETERS: Event - Event number (integer index) 22053289f6aSNate Lawson * 22153289f6aSNate Lawson * RETURN: None 22253289f6aSNate Lawson * 22353289f6aSNate Lawson * DESCRIPTION: Saves the current time (end time) with this event 22453289f6aSNate Lawson * 22553289f6aSNate Lawson ******************************************************************************/ 22653289f6aSNate Lawson 22753289f6aSNate Lawson void 22853289f6aSNate Lawson UtEndEvent ( 229fba7fc7eSJung-uk Kim UINT8 Event) 23053289f6aSNate Lawson { 23153289f6aSNate Lawson 232fba7fc7eSJung-uk Kim if (Event >= ASL_NUM_EVENTS) 233fba7fc7eSJung-uk Kim { 234fba7fc7eSJung-uk Kim return; 235fba7fc7eSJung-uk Kim } 236fba7fc7eSJung-uk Kim 237fba7fc7eSJung-uk Kim /* Insert end time for event */ 238fba7fc7eSJung-uk Kim 239fba7fc7eSJung-uk Kim AslGbl_Events[Event].EndTime = AcpiOsGetTimer (); 24053289f6aSNate Lawson } 24153289f6aSNate Lawson 24253289f6aSNate Lawson 24353289f6aSNate Lawson /******************************************************************************* 24453289f6aSNate Lawson * 24553289f6aSNate Lawson * FUNCTION: UtConvertByteToHex 24653289f6aSNate Lawson * 24753289f6aSNate Lawson * PARAMETERS: RawByte - Binary data 248f38b0f21SJung-uk Kim * Buffer - Pointer to where the hex bytes will be 249f38b0f21SJung-uk Kim * stored 25053289f6aSNate Lawson * 25153289f6aSNate Lawson * RETURN: Ascii hex byte is stored in Buffer. 25253289f6aSNate Lawson * 25353289f6aSNate Lawson * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed 25453289f6aSNate Lawson * with "0x" 25553289f6aSNate Lawson * 25653289f6aSNate Lawson ******************************************************************************/ 25753289f6aSNate Lawson 25853289f6aSNate Lawson void 25953289f6aSNate Lawson UtConvertByteToHex ( 26053289f6aSNate Lawson UINT8 RawByte, 26153289f6aSNate Lawson UINT8 *Buffer) 26253289f6aSNate Lawson { 26353289f6aSNate Lawson 26453289f6aSNate Lawson Buffer[0] = '0'; 26553289f6aSNate Lawson Buffer[1] = 'x'; 26653289f6aSNate Lawson 267313a0c13SJung-uk Kim Buffer[2] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 4); 268313a0c13SJung-uk Kim Buffer[3] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 0); 26953289f6aSNate Lawson } 27053289f6aSNate Lawson 27153289f6aSNate Lawson 27253289f6aSNate Lawson /******************************************************************************* 27353289f6aSNate Lawson * 27453289f6aSNate Lawson * FUNCTION: UtConvertByteToAsmHex 27553289f6aSNate Lawson * 27653289f6aSNate Lawson * PARAMETERS: RawByte - Binary data 277f38b0f21SJung-uk Kim * Buffer - Pointer to where the hex bytes will be 278f38b0f21SJung-uk Kim * stored 27953289f6aSNate Lawson * 28053289f6aSNate Lawson * RETURN: Ascii hex byte is stored in Buffer. 28153289f6aSNate Lawson * 28253289f6aSNate Lawson * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed 283313a0c13SJung-uk Kim * with '0', and a trailing 'h' is added. 28453289f6aSNate Lawson * 28553289f6aSNate Lawson ******************************************************************************/ 28653289f6aSNate Lawson 28753289f6aSNate Lawson void 28853289f6aSNate Lawson UtConvertByteToAsmHex ( 28953289f6aSNate Lawson UINT8 RawByte, 29053289f6aSNate Lawson UINT8 *Buffer) 29153289f6aSNate Lawson { 29253289f6aSNate Lawson 29353289f6aSNate Lawson Buffer[0] = '0'; 294313a0c13SJung-uk Kim Buffer[1] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 4); 295313a0c13SJung-uk Kim Buffer[2] = (UINT8) AcpiUtHexToAsciiChar (RawByte, 0); 29653289f6aSNate Lawson Buffer[3] = 'h'; 29753289f6aSNate Lawson } 29853289f6aSNate Lawson 29953289f6aSNate Lawson 30053289f6aSNate Lawson /******************************************************************************* 30153289f6aSNate Lawson * 30253289f6aSNate Lawson * FUNCTION: DbgPrint 30353289f6aSNate Lawson * 304fba7fc7eSJung-uk Kim * PARAMETERS: Type - Type of output 305fba7fc7eSJung-uk Kim * Fmt - Printf format string 30653289f6aSNate Lawson * ... - variable printf list 30753289f6aSNate Lawson * 30853289f6aSNate Lawson * RETURN: None 30953289f6aSNate Lawson * 31053289f6aSNate Lawson * DESCRIPTION: Conditional print statement. Prints to stderr only if the 31153289f6aSNate Lawson * debug flag is set. 31253289f6aSNate Lawson * 31353289f6aSNate Lawson ******************************************************************************/ 31453289f6aSNate Lawson 31553289f6aSNate Lawson void 31653289f6aSNate Lawson DbgPrint ( 31753289f6aSNate Lawson UINT32 Type, 31853289f6aSNate Lawson char *Fmt, 31953289f6aSNate Lawson ...) 32053289f6aSNate Lawson { 32153289f6aSNate Lawson va_list Args; 32253289f6aSNate Lawson 32353289f6aSNate Lawson 32453289f6aSNate Lawson if (!Gbl_DebugFlag) 32553289f6aSNate Lawson { 32653289f6aSNate Lawson return; 32753289f6aSNate Lawson } 32853289f6aSNate Lawson 32953289f6aSNate Lawson if ((Type == ASL_PARSE_OUTPUT) && 33053289f6aSNate Lawson (!(AslCompilerdebug))) 33153289f6aSNate Lawson { 33253289f6aSNate Lawson return; 33353289f6aSNate Lawson } 33453289f6aSNate Lawson 3358d744e47SJung-uk Kim va_start (Args, Fmt); 33653289f6aSNate Lawson (void) vfprintf (stderr, Fmt, Args); 33753289f6aSNate Lawson va_end (Args); 33853289f6aSNate Lawson return; 33953289f6aSNate Lawson } 34053289f6aSNate Lawson 34153289f6aSNate Lawson 34253289f6aSNate Lawson /******************************************************************************* 34353289f6aSNate Lawson * 34453289f6aSNate Lawson * FUNCTION: UtPrintFormattedName 34553289f6aSNate Lawson * 34653289f6aSNate Lawson * PARAMETERS: ParseOpcode - Parser keyword ID 34753289f6aSNate Lawson * Level - Indentation level 34853289f6aSNate Lawson * 34953289f6aSNate Lawson * RETURN: None 35053289f6aSNate Lawson * 35153289f6aSNate Lawson * DESCRIPTION: Print the ascii name of the parse opcode. 35253289f6aSNate Lawson * 35353289f6aSNate Lawson ******************************************************************************/ 35453289f6aSNate Lawson 35553289f6aSNate Lawson #define TEXT_OFFSET 10 35653289f6aSNate Lawson 35753289f6aSNate Lawson void 35853289f6aSNate Lawson UtPrintFormattedName ( 35953289f6aSNate Lawson UINT16 ParseOpcode, 36053289f6aSNate Lawson UINT32 Level) 36153289f6aSNate Lawson { 36253289f6aSNate Lawson 3631a39cfb0SJung-uk Kim if (Level) 3641a39cfb0SJung-uk Kim { 36553289f6aSNate Lawson DbgPrint (ASL_TREE_OUTPUT, 3661a39cfb0SJung-uk Kim "%*s", (3 * Level), " "); 3671a39cfb0SJung-uk Kim } 3681a39cfb0SJung-uk Kim DbgPrint (ASL_TREE_OUTPUT, 3691a39cfb0SJung-uk Kim " %-20.20s", UtGetOpName (ParseOpcode)); 37053289f6aSNate Lawson 37153289f6aSNate Lawson if (Level < TEXT_OFFSET) 37253289f6aSNate Lawson { 37353289f6aSNate Lawson DbgPrint (ASL_TREE_OUTPUT, 37453289f6aSNate Lawson "%*s", (TEXT_OFFSET - Level) * 3, " "); 37553289f6aSNate Lawson } 37653289f6aSNate Lawson } 37753289f6aSNate Lawson 37853289f6aSNate Lawson 37953289f6aSNate Lawson /******************************************************************************* 38053289f6aSNate Lawson * 38153289f6aSNate Lawson * FUNCTION: UtSetParseOpName 38253289f6aSNate Lawson * 383f38b0f21SJung-uk Kim * PARAMETERS: Op - Parse op to be named. 38453289f6aSNate Lawson * 38553289f6aSNate Lawson * RETURN: None 38653289f6aSNate Lawson * 38753289f6aSNate Lawson * DESCRIPTION: Insert the ascii name of the parse opcode 38853289f6aSNate Lawson * 38953289f6aSNate Lawson ******************************************************************************/ 39053289f6aSNate Lawson 39153289f6aSNate Lawson void 39253289f6aSNate Lawson UtSetParseOpName ( 39353289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 39453289f6aSNate Lawson { 395fba7fc7eSJung-uk Kim 3961a39cfb0SJung-uk Kim strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode), 3971a39cfb0SJung-uk Kim ACPI_MAX_PARSEOP_NAME); 39853289f6aSNate Lawson } 39953289f6aSNate Lawson 40053289f6aSNate Lawson 40153289f6aSNate Lawson /******************************************************************************* 40253289f6aSNate Lawson * 40353289f6aSNate Lawson * FUNCTION: UtDisplaySummary 40453289f6aSNate Lawson * 405fba7fc7eSJung-uk Kim * PARAMETERS: FileID - ID of outpout file 40653289f6aSNate Lawson * 40753289f6aSNate Lawson * RETURN: None 40853289f6aSNate Lawson * 40953289f6aSNate Lawson * DESCRIPTION: Display compilation statistics 41053289f6aSNate Lawson * 41153289f6aSNate Lawson ******************************************************************************/ 41253289f6aSNate Lawson 41353289f6aSNate Lawson void 41453289f6aSNate Lawson UtDisplaySummary ( 41553289f6aSNate Lawson UINT32 FileId) 41653289f6aSNate Lawson { 4173f0275a0SJung-uk Kim UINT32 i; 4183f0275a0SJung-uk Kim 41953289f6aSNate Lawson 42053289f6aSNate Lawson if (FileId != ASL_FILE_STDOUT) 42153289f6aSNate Lawson { 42253289f6aSNate Lawson /* Compiler name and version number */ 42353289f6aSNate Lawson 4243f0275a0SJung-uk Kim FlPrintFile (FileId, "%s version %X%s\n\n", 4253c1812acSJung-uk Kim ASL_COMPILER_NAME, (UINT32) ACPI_CA_VERSION, ACPI_WIDTH); 42653289f6aSNate Lawson } 42753289f6aSNate Lawson 4283f0275a0SJung-uk Kim /* Summary of main input and output files */ 4293f0275a0SJung-uk Kim 430a88e22b7SJung-uk Kim if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 431a88e22b7SJung-uk Kim { 432a88e22b7SJung-uk Kim FlPrintFile (FileId, 4333f0275a0SJung-uk Kim "%-14s %s - %u lines, %u bytes, %u fields\n", 4343f0275a0SJung-uk Kim "Table Input:", 435a88e22b7SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber, 436a88e22b7SJung-uk Kim Gbl_InputByteCount, Gbl_InputFieldCount); 437a88e22b7SJung-uk Kim 438a88e22b7SJung-uk Kim if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors)) 439a88e22b7SJung-uk Kim { 440a88e22b7SJung-uk Kim FlPrintFile (FileId, 4413f0275a0SJung-uk Kim "%-14s %s - %u bytes\n", 4423f0275a0SJung-uk Kim "Binary Output:", 443a88e22b7SJung-uk Kim Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength); 444a88e22b7SJung-uk Kim } 445a88e22b7SJung-uk Kim } 446a88e22b7SJung-uk Kim else 447a88e22b7SJung-uk Kim { 44853289f6aSNate Lawson FlPrintFile (FileId, 4493f0275a0SJung-uk Kim "%-14s %s - %u lines, %u bytes, %u keywords\n", 4503f0275a0SJung-uk Kim "ASL Input:", 45153289f6aSNate Lawson Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber, 45253289f6aSNate Lawson Gbl_InputByteCount, TotalKeywords); 45353289f6aSNate Lawson 45453289f6aSNate Lawson /* AML summary */ 45553289f6aSNate Lawson 45653289f6aSNate Lawson if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors)) 45753289f6aSNate Lawson { 45853289f6aSNate Lawson FlPrintFile (FileId, 4593f0275a0SJung-uk Kim "%-14s %s - %u bytes, %u named objects, %u executable opcodes\n", 4603f0275a0SJung-uk Kim "AML Output:", 46153289f6aSNate Lawson Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength, 46253289f6aSNate Lawson TotalNamedObjects, TotalExecutableOpcodes); 46353289f6aSNate Lawson } 464a88e22b7SJung-uk Kim } 46553289f6aSNate Lawson 4663f0275a0SJung-uk Kim /* Display summary of any optional files */ 4673f0275a0SJung-uk Kim 4683f0275a0SJung-uk Kim for (i = ASL_FILE_SOURCE_OUTPUT; i <= ASL_MAX_FILE_TYPE; i++) 4693f0275a0SJung-uk Kim { 4703f0275a0SJung-uk Kim if (!Gbl_Files[i].Filename || !Gbl_Files[i].Handle) 4713f0275a0SJung-uk Kim { 4723f0275a0SJung-uk Kim continue; 4733f0275a0SJung-uk Kim } 4743f0275a0SJung-uk Kim 4753f0275a0SJung-uk Kim /* .SRC is a temp file unless specifically requested */ 4763f0275a0SJung-uk Kim 4773f0275a0SJung-uk Kim if ((i == ASL_FILE_SOURCE_OUTPUT) && (!Gbl_SourceOutputFlag)) 4783f0275a0SJung-uk Kim { 4793f0275a0SJung-uk Kim continue; 4803f0275a0SJung-uk Kim } 4813f0275a0SJung-uk Kim 4824c52cad2SJung-uk Kim /* .I is a temp file unless specifically requested */ 4834c52cad2SJung-uk Kim 4844c52cad2SJung-uk Kim if ((i == ASL_FILE_PREPROCESSOR) && (!Gbl_PreprocessorOutputFlag)) 4854c52cad2SJung-uk Kim { 4864c52cad2SJung-uk Kim continue; 4874c52cad2SJung-uk Kim } 4884c52cad2SJung-uk Kim 4893f0275a0SJung-uk Kim FlPrintFile (FileId, "%14s %s - %u bytes\n", 490042ff955SJung-uk Kim Gbl_Files[i].ShortDescription, 4913f0275a0SJung-uk Kim Gbl_Files[i].Filename, FlGetFileSize (i)); 4923f0275a0SJung-uk Kim } 4933f0275a0SJung-uk Kim 49453289f6aSNate Lawson /* Error summary */ 49553289f6aSNate Lawson 49653289f6aSNate Lawson FlPrintFile (FileId, 4973f0275a0SJung-uk Kim "\nCompilation complete. %u Errors, %u Warnings, %u Remarks", 49853289f6aSNate Lawson Gbl_ExceptionCount[ASL_ERROR], 4991a39cfb0SJung-uk Kim Gbl_ExceptionCount[ASL_WARNING] + 5001a39cfb0SJung-uk Kim Gbl_ExceptionCount[ASL_WARNING2] + 5011a39cfb0SJung-uk Kim Gbl_ExceptionCount[ASL_WARNING3], 502a88e22b7SJung-uk Kim Gbl_ExceptionCount[ASL_REMARK]); 503a88e22b7SJung-uk Kim 504a88e22b7SJung-uk Kim if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA) 505a88e22b7SJung-uk Kim { 506*7cf3e94aSJung-uk Kim FlPrintFile (FileId, ", %u Optimizations", 507*7cf3e94aSJung-uk Kim Gbl_ExceptionCount[ASL_OPTIMIZATION]); 508*7cf3e94aSJung-uk Kim 509*7cf3e94aSJung-uk Kim if (TotalFolds) 510*7cf3e94aSJung-uk Kim { 511*7cf3e94aSJung-uk Kim FlPrintFile (FileId, ", %u Constants Folded", TotalFolds); 512*7cf3e94aSJung-uk Kim } 513a88e22b7SJung-uk Kim } 514a88e22b7SJung-uk Kim 515a88e22b7SJung-uk Kim FlPrintFile (FileId, "\n"); 51653289f6aSNate Lawson } 51753289f6aSNate Lawson 51853289f6aSNate Lawson 51953289f6aSNate Lawson /******************************************************************************* 52053289f6aSNate Lawson * 521f38b0f21SJung-uk Kim * FUNCTION: UtCheckIntegerRange 52253289f6aSNate Lawson * 52353289f6aSNate Lawson * PARAMETERS: Op - Integer parse node 52453289f6aSNate Lawson * LowValue - Smallest allowed value 52553289f6aSNate Lawson * HighValue - Largest allowed value 52653289f6aSNate Lawson * 52753289f6aSNate Lawson * RETURN: Op if OK, otherwise NULL 52853289f6aSNate Lawson * 52953289f6aSNate Lawson * DESCRIPTION: Check integer for an allowable range 53053289f6aSNate Lawson * 53153289f6aSNate Lawson ******************************************************************************/ 53253289f6aSNate Lawson 53353289f6aSNate Lawson ACPI_PARSE_OBJECT * 53453289f6aSNate Lawson UtCheckIntegerRange ( 53553289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 53653289f6aSNate Lawson UINT32 LowValue, 53753289f6aSNate Lawson UINT32 HighValue) 53853289f6aSNate Lawson { 53953289f6aSNate Lawson 54053289f6aSNate Lawson if (!Op) 54153289f6aSNate Lawson { 5428ef1a331SJung-uk Kim return (NULL); 54353289f6aSNate Lawson } 54453289f6aSNate Lawson 5451df130f1SJung-uk Kim if ((Op->Asl.Value.Integer < LowValue) || 5461df130f1SJung-uk Kim (Op->Asl.Value.Integer > HighValue)) 54753289f6aSNate Lawson { 5481df130f1SJung-uk Kim sprintf (MsgBuffer, "0x%X, allowable: 0x%X-0x%X", 5491df130f1SJung-uk Kim (UINT32) Op->Asl.Value.Integer, LowValue, HighValue); 5501df130f1SJung-uk Kim 5511df130f1SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RANGE, Op, MsgBuffer); 5521df130f1SJung-uk Kim return (NULL); 55353289f6aSNate Lawson } 55453289f6aSNate Lawson 5551df130f1SJung-uk Kim return (Op); 55653289f6aSNate Lawson } 55753289f6aSNate Lawson 55853289f6aSNate Lawson 55953289f6aSNate Lawson /******************************************************************************* 56053289f6aSNate Lawson * 561313a0c13SJung-uk Kim * FUNCTION: UtStringCacheCalloc 56253289f6aSNate Lawson * 56353289f6aSNate Lawson * PARAMETERS: Length - Size of buffer requested 56453289f6aSNate Lawson * 56553289f6aSNate Lawson * RETURN: Pointer to the buffer. Aborts on allocation failure 56653289f6aSNate Lawson * 56753289f6aSNate Lawson * DESCRIPTION: Allocate a string buffer. Bypass the local 56853289f6aSNate Lawson * dynamic memory manager for performance reasons (This has a 56953289f6aSNate Lawson * major impact on the speed of the compiler.) 57053289f6aSNate Lawson * 57153289f6aSNate Lawson ******************************************************************************/ 57253289f6aSNate Lawson 57353289f6aSNate Lawson char * 574313a0c13SJung-uk Kim UtStringCacheCalloc ( 57553289f6aSNate Lawson UINT32 Length) 57653289f6aSNate Lawson { 57753289f6aSNate Lawson char *Buffer; 578313a0c13SJung-uk Kim ASL_CACHE_INFO *Cache; 5791c0e1b6dSJung-uk Kim UINT32 CacheSize = ASL_STRING_CACHE_SIZE; 58053289f6aSNate Lawson 58153289f6aSNate Lawson 5821c0e1b6dSJung-uk Kim if (Length > CacheSize) 583313a0c13SJung-uk Kim { 5841c0e1b6dSJung-uk Kim CacheSize = Length; 5851c0e1b6dSJung-uk Kim 5861c0e1b6dSJung-uk Kim if (Gbl_StringCacheList) 5871c0e1b6dSJung-uk Kim { 5881c0e1b6dSJung-uk Kim Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize); 5891c0e1b6dSJung-uk Kim 5901c0e1b6dSJung-uk Kim /* Link new cache buffer just following head of list */ 5911c0e1b6dSJung-uk Kim 5921c0e1b6dSJung-uk Kim Cache->Next = Gbl_StringCacheList->Next; 5931c0e1b6dSJung-uk Kim Gbl_StringCacheList->Next = Cache; 5941c0e1b6dSJung-uk Kim 5951c0e1b6dSJung-uk Kim /* Leave cache management pointers alone as they pertain to head */ 5961c0e1b6dSJung-uk Kim 5971c0e1b6dSJung-uk Kim Gbl_StringCount++; 5981c0e1b6dSJung-uk Kim Gbl_StringSize += Length; 5991c0e1b6dSJung-uk Kim 6001c0e1b6dSJung-uk Kim return (Cache->Buffer); 6011c0e1b6dSJung-uk Kim } 602313a0c13SJung-uk Kim } 603313a0c13SJung-uk Kim 60453289f6aSNate Lawson if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast) 60553289f6aSNate Lawson { 606313a0c13SJung-uk Kim /* Allocate a new buffer */ 607313a0c13SJung-uk Kim 6081c0e1b6dSJung-uk Kim Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize); 609313a0c13SJung-uk Kim 610313a0c13SJung-uk Kim /* Link new cache buffer to head of list */ 611313a0c13SJung-uk Kim 612313a0c13SJung-uk Kim Cache->Next = Gbl_StringCacheList; 613313a0c13SJung-uk Kim Gbl_StringCacheList = Cache; 614313a0c13SJung-uk Kim 615313a0c13SJung-uk Kim /* Setup cache management pointers */ 616313a0c13SJung-uk Kim 617313a0c13SJung-uk Kim Gbl_StringCacheNext = Cache->Buffer; 6181c0e1b6dSJung-uk Kim Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize; 61953289f6aSNate Lawson } 62053289f6aSNate Lawson 621313a0c13SJung-uk Kim Gbl_StringCount++; 622313a0c13SJung-uk Kim Gbl_StringSize += Length; 623313a0c13SJung-uk Kim 62453289f6aSNate Lawson Buffer = Gbl_StringCacheNext; 62553289f6aSNate Lawson Gbl_StringCacheNext += Length; 62653289f6aSNate Lawson return (Buffer); 62753289f6aSNate Lawson } 62853289f6aSNate Lawson 62953289f6aSNate Lawson 630042ff955SJung-uk Kim /****************************************************************************** 631042ff955SJung-uk Kim * 632042ff955SJung-uk Kim * FUNCTION: UtExpandLineBuffers 633042ff955SJung-uk Kim * 634042ff955SJung-uk Kim * PARAMETERS: None. Updates global line buffer pointers. 635042ff955SJung-uk Kim * 636042ff955SJung-uk Kim * RETURN: None. Reallocates the global line buffers 637042ff955SJung-uk Kim * 638042ff955SJung-uk Kim * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates 639042ff955SJung-uk Kim * all global line buffers and updates Gbl_LineBufferSize. NOTE: 640042ff955SJung-uk Kim * Also used for the initial allocation of the buffers, when 641042ff955SJung-uk Kim * all of the buffer pointers are NULL. Initial allocations are 642042ff955SJung-uk Kim * of size ASL_DEFAULT_LINE_BUFFER_SIZE 643042ff955SJung-uk Kim * 644042ff955SJung-uk Kim *****************************************************************************/ 645042ff955SJung-uk Kim 646042ff955SJung-uk Kim void 647042ff955SJung-uk Kim UtExpandLineBuffers ( 648042ff955SJung-uk Kim void) 649042ff955SJung-uk Kim { 650042ff955SJung-uk Kim UINT32 NewSize; 651042ff955SJung-uk Kim 652042ff955SJung-uk Kim 653042ff955SJung-uk Kim /* Attempt to double the size of all line buffers */ 654042ff955SJung-uk Kim 655042ff955SJung-uk Kim NewSize = Gbl_LineBufferSize * 2; 656042ff955SJung-uk Kim if (Gbl_CurrentLineBuffer) 657042ff955SJung-uk Kim { 658313a0c13SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 659313a0c13SJung-uk Kim "Increasing line buffer size from %u to %u\n", 660042ff955SJung-uk Kim Gbl_LineBufferSize, NewSize); 661042ff955SJung-uk Kim } 662042ff955SJung-uk Kim 663042ff955SJung-uk Kim Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize); 664042ff955SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 665042ff955SJung-uk Kim if (!Gbl_CurrentLineBuffer) 666042ff955SJung-uk Kim { 667042ff955SJung-uk Kim goto ErrorExit; 668042ff955SJung-uk Kim } 669042ff955SJung-uk Kim 670042ff955SJung-uk Kim Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize); 671042ff955SJung-uk Kim if (!Gbl_MainTokenBuffer) 672042ff955SJung-uk Kim { 673042ff955SJung-uk Kim goto ErrorExit; 674042ff955SJung-uk Kim } 675042ff955SJung-uk Kim 676042ff955SJung-uk Kim Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize); 677042ff955SJung-uk Kim if (!Gbl_MacroTokenBuffer) 678042ff955SJung-uk Kim { 679042ff955SJung-uk Kim goto ErrorExit; 680042ff955SJung-uk Kim } 681042ff955SJung-uk Kim 682042ff955SJung-uk Kim Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize); 683042ff955SJung-uk Kim if (!Gbl_ExpressionTokenBuffer) 684042ff955SJung-uk Kim { 685042ff955SJung-uk Kim goto ErrorExit; 686042ff955SJung-uk Kim } 687042ff955SJung-uk Kim 688042ff955SJung-uk Kim Gbl_LineBufferSize = NewSize; 689042ff955SJung-uk Kim return; 690042ff955SJung-uk Kim 691042ff955SJung-uk Kim 692042ff955SJung-uk Kim /* On error above, simply issue error messages and abort, cannot continue */ 693042ff955SJung-uk Kim 694042ff955SJung-uk Kim ErrorExit: 695042ff955SJung-uk Kim printf ("Could not increase line buffer size from %u to %u\n", 696042ff955SJung-uk Kim Gbl_LineBufferSize, Gbl_LineBufferSize * 2); 697042ff955SJung-uk Kim 698042ff955SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, 699042ff955SJung-uk Kim NULL, NULL); 700042ff955SJung-uk Kim AslAbort (); 701042ff955SJung-uk Kim } 702042ff955SJung-uk Kim 703042ff955SJung-uk Kim 704313a0c13SJung-uk Kim /****************************************************************************** 705313a0c13SJung-uk Kim * 706313a0c13SJung-uk Kim * FUNCTION: UtFreeLineBuffers 707313a0c13SJung-uk Kim * 708313a0c13SJung-uk Kim * PARAMETERS: None 709313a0c13SJung-uk Kim * 710313a0c13SJung-uk Kim * RETURN: None 711313a0c13SJung-uk Kim * 712313a0c13SJung-uk Kim * DESCRIPTION: Free all line buffers 713313a0c13SJung-uk Kim * 714313a0c13SJung-uk Kim *****************************************************************************/ 715313a0c13SJung-uk Kim 716313a0c13SJung-uk Kim void 717313a0c13SJung-uk Kim UtFreeLineBuffers ( 718313a0c13SJung-uk Kim void) 719313a0c13SJung-uk Kim { 720313a0c13SJung-uk Kim 721313a0c13SJung-uk Kim free (Gbl_CurrentLineBuffer); 722313a0c13SJung-uk Kim free (Gbl_MainTokenBuffer); 723313a0c13SJung-uk Kim free (Gbl_MacroTokenBuffer); 724313a0c13SJung-uk Kim free (Gbl_ExpressionTokenBuffer); 725313a0c13SJung-uk Kim } 726313a0c13SJung-uk Kim 727313a0c13SJung-uk Kim 72853289f6aSNate Lawson /******************************************************************************* 72953289f6aSNate Lawson * 73053289f6aSNate Lawson * FUNCTION: UtInternalizeName 73153289f6aSNate Lawson * 73253289f6aSNate Lawson * PARAMETERS: ExternalName - Name to convert 73353289f6aSNate Lawson * ConvertedName - Where the converted name is returned 73453289f6aSNate Lawson * 73553289f6aSNate Lawson * RETURN: Status 73653289f6aSNate Lawson * 73753289f6aSNate Lawson * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name 73853289f6aSNate Lawson * 73953289f6aSNate Lawson ******************************************************************************/ 74053289f6aSNate Lawson 74153289f6aSNate Lawson ACPI_STATUS 74253289f6aSNate Lawson UtInternalizeName ( 74353289f6aSNate Lawson char *ExternalName, 74453289f6aSNate Lawson char **ConvertedName) 74553289f6aSNate Lawson { 74653289f6aSNate Lawson ACPI_NAMESTRING_INFO Info; 74753289f6aSNate Lawson ACPI_STATUS Status; 74853289f6aSNate Lawson 74953289f6aSNate Lawson 75053289f6aSNate Lawson if (!ExternalName) 75153289f6aSNate Lawson { 75253289f6aSNate Lawson return (AE_OK); 75353289f6aSNate Lawson } 75453289f6aSNate Lawson 75553289f6aSNate Lawson /* Get the length of the new internal name */ 75653289f6aSNate Lawson 75753289f6aSNate Lawson Info.ExternalName = ExternalName; 75853289f6aSNate Lawson AcpiNsGetInternalNameLength (&Info); 75953289f6aSNate Lawson 76053289f6aSNate Lawson /* We need a segment to store the internal name */ 76153289f6aSNate Lawson 762313a0c13SJung-uk Kim Info.InternalName = UtStringCacheCalloc (Info.Length); 76353289f6aSNate Lawson if (!Info.InternalName) 76453289f6aSNate Lawson { 76553289f6aSNate Lawson return (AE_NO_MEMORY); 76653289f6aSNate Lawson } 76753289f6aSNate Lawson 76853289f6aSNate Lawson /* Build the name */ 76953289f6aSNate Lawson 77053289f6aSNate Lawson Status = AcpiNsBuildInternalName (&Info); 77153289f6aSNate Lawson if (ACPI_FAILURE (Status)) 77253289f6aSNate Lawson { 77353289f6aSNate Lawson return (Status); 77453289f6aSNate Lawson } 77553289f6aSNate Lawson 77653289f6aSNate Lawson *ConvertedName = Info.InternalName; 77753289f6aSNate Lawson return (AE_OK); 77853289f6aSNate Lawson } 77953289f6aSNate Lawson 78053289f6aSNate Lawson 78153289f6aSNate Lawson /******************************************************************************* 78253289f6aSNate Lawson * 78353289f6aSNate Lawson * FUNCTION: UtPadNameWithUnderscores 78453289f6aSNate Lawson * 78553289f6aSNate Lawson * PARAMETERS: NameSeg - Input nameseg 78653289f6aSNate Lawson * PaddedNameSeg - Output padded nameseg 78753289f6aSNate Lawson * 78853289f6aSNate Lawson * RETURN: Padded nameseg. 78953289f6aSNate Lawson * 79053289f6aSNate Lawson * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full 79153289f6aSNate Lawson * ACPI_NAME. 79253289f6aSNate Lawson * 79353289f6aSNate Lawson ******************************************************************************/ 79453289f6aSNate Lawson 795fba7fc7eSJung-uk Kim static void 79653289f6aSNate Lawson UtPadNameWithUnderscores ( 79753289f6aSNate Lawson char *NameSeg, 79853289f6aSNate Lawson char *PaddedNameSeg) 79953289f6aSNate Lawson { 80053289f6aSNate Lawson UINT32 i; 80153289f6aSNate Lawson 80253289f6aSNate Lawson 80353289f6aSNate Lawson for (i = 0; (i < ACPI_NAME_SIZE); i++) 80453289f6aSNate Lawson { 80553289f6aSNate Lawson if (*NameSeg) 80653289f6aSNate Lawson { 80753289f6aSNate Lawson *PaddedNameSeg = *NameSeg; 80853289f6aSNate Lawson NameSeg++; 80953289f6aSNate Lawson } 81053289f6aSNate Lawson else 81153289f6aSNate Lawson { 81253289f6aSNate Lawson *PaddedNameSeg = '_'; 81353289f6aSNate Lawson } 81453289f6aSNate Lawson PaddedNameSeg++; 81553289f6aSNate Lawson } 81653289f6aSNate Lawson } 81753289f6aSNate Lawson 81853289f6aSNate Lawson 81953289f6aSNate Lawson /******************************************************************************* 82053289f6aSNate Lawson * 82153289f6aSNate Lawson * FUNCTION: UtAttachNameseg 82253289f6aSNate Lawson * 82353289f6aSNate Lawson * PARAMETERS: Op - Parent parse node 82453289f6aSNate Lawson * Name - Full ExternalName 82553289f6aSNate Lawson * 826fba7fc7eSJung-uk Kim * RETURN: None; Sets the NameSeg field in parent node 82753289f6aSNate Lawson * 82853289f6aSNate Lawson * DESCRIPTION: Extract the last nameseg of the ExternalName and store it 82953289f6aSNate Lawson * in the NameSeg field of the Op. 83053289f6aSNate Lawson * 83153289f6aSNate Lawson ******************************************************************************/ 83253289f6aSNate Lawson 833fba7fc7eSJung-uk Kim static void 83453289f6aSNate Lawson UtAttachNameseg ( 83553289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 83653289f6aSNate Lawson char *Name) 83753289f6aSNate Lawson { 83853289f6aSNate Lawson char *NameSeg; 83953289f6aSNate Lawson char PaddedNameSeg[4]; 84053289f6aSNate Lawson 84153289f6aSNate Lawson 84253289f6aSNate Lawson if (!Name) 84353289f6aSNate Lawson { 84453289f6aSNate Lawson return; 84553289f6aSNate Lawson } 84653289f6aSNate Lawson 84753289f6aSNate Lawson /* Look for the last dot in the namepath */ 84853289f6aSNate Lawson 84953289f6aSNate Lawson NameSeg = strrchr (Name, '.'); 85053289f6aSNate Lawson if (NameSeg) 85153289f6aSNate Lawson { 85253289f6aSNate Lawson /* Found last dot, we have also found the final nameseg */ 85353289f6aSNate Lawson 85453289f6aSNate Lawson NameSeg++; 85553289f6aSNate Lawson UtPadNameWithUnderscores (NameSeg, PaddedNameSeg); 85653289f6aSNate Lawson } 85753289f6aSNate Lawson else 85853289f6aSNate Lawson { 85953289f6aSNate Lawson /* No dots in the namepath, there is only a single nameseg. */ 86053289f6aSNate Lawson /* Handle prefixes */ 86153289f6aSNate Lawson 862efcc2a30SJung-uk Kim while (ACPI_IS_ROOT_PREFIX (*Name) || 863efcc2a30SJung-uk Kim ACPI_IS_PARENT_PREFIX (*Name)) 86453289f6aSNate Lawson { 86553289f6aSNate Lawson Name++; 86653289f6aSNate Lawson } 86753289f6aSNate Lawson 8688ef1a331SJung-uk Kim /* Remaining string should be one single nameseg */ 86953289f6aSNate Lawson 87053289f6aSNate Lawson UtPadNameWithUnderscores (Name, PaddedNameSeg); 87153289f6aSNate Lawson } 87253289f6aSNate Lawson 8738ef1a331SJung-uk Kim ACPI_MOVE_NAME (Op->Asl.NameSeg, PaddedNameSeg); 87453289f6aSNate Lawson } 87553289f6aSNate Lawson 87653289f6aSNate Lawson 87753289f6aSNate Lawson /******************************************************************************* 87853289f6aSNate Lawson * 87953289f6aSNate Lawson * FUNCTION: UtAttachNamepathToOwner 88053289f6aSNate Lawson * 88153289f6aSNate Lawson * PARAMETERS: Op - Parent parse node 88253289f6aSNate Lawson * NameOp - Node that contains the name 88353289f6aSNate Lawson * 88453289f6aSNate Lawson * RETURN: Sets the ExternalName and Namepath in the parent node 88553289f6aSNate Lawson * 88653289f6aSNate Lawson * DESCRIPTION: Store the name in two forms in the parent node: The original 88753289f6aSNate Lawson * (external) name, and the internalized name that is used within 88853289f6aSNate Lawson * the ACPI namespace manager. 88953289f6aSNate Lawson * 89053289f6aSNate Lawson ******************************************************************************/ 89153289f6aSNate Lawson 89253289f6aSNate Lawson void 89353289f6aSNate Lawson UtAttachNamepathToOwner ( 89453289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 89553289f6aSNate Lawson ACPI_PARSE_OBJECT *NameOp) 89653289f6aSNate Lawson { 89753289f6aSNate Lawson ACPI_STATUS Status; 89853289f6aSNate Lawson 89953289f6aSNate Lawson 90053289f6aSNate Lawson /* Full external path */ 90153289f6aSNate Lawson 90253289f6aSNate Lawson Op->Asl.ExternalName = NameOp->Asl.Value.String; 90353289f6aSNate Lawson 904fba7fc7eSJung-uk Kim /* Save the NameOp for possible error reporting later */ 905fba7fc7eSJung-uk Kim 906fba7fc7eSJung-uk Kim Op->Asl.ParentMethod = (void *) NameOp; 907fba7fc7eSJung-uk Kim 90853289f6aSNate Lawson /* Last nameseg of the path */ 90953289f6aSNate Lawson 91053289f6aSNate Lawson UtAttachNameseg (Op, Op->Asl.ExternalName); 91153289f6aSNate Lawson 91253289f6aSNate Lawson /* Create internalized path */ 91353289f6aSNate Lawson 91453289f6aSNate Lawson Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath); 91553289f6aSNate Lawson if (ACPI_FAILURE (Status)) 91653289f6aSNate Lawson { 91753289f6aSNate Lawson /* TBD: abort on no memory */ 91853289f6aSNate Lawson } 91953289f6aSNate Lawson } 92053289f6aSNate Lawson 92153289f6aSNate Lawson 92253289f6aSNate Lawson /******************************************************************************* 92353289f6aSNate Lawson * 92453289f6aSNate Lawson * FUNCTION: UtDoConstant 92553289f6aSNate Lawson * 92653289f6aSNate Lawson * PARAMETERS: String - Hex, Octal, or Decimal string 92753289f6aSNate Lawson * 92853289f6aSNate Lawson * RETURN: Converted Integer 92953289f6aSNate Lawson * 930f38b0f21SJung-uk Kim * DESCRIPTION: Convert a string to an integer, with error checking. 93153289f6aSNate Lawson * 93253289f6aSNate Lawson ******************************************************************************/ 93353289f6aSNate Lawson 9349a179dd8SJung-uk Kim UINT64 93553289f6aSNate Lawson UtDoConstant ( 93653289f6aSNate Lawson char *String) 93753289f6aSNate Lawson { 93853289f6aSNate Lawson ACPI_STATUS Status; 9399a179dd8SJung-uk Kim UINT64 Converted; 94053289f6aSNate Lawson char ErrBuf[64]; 94153289f6aSNate Lawson 94253289f6aSNate Lawson 94353289f6aSNate Lawson Status = UtStrtoul64 (String, 0, &Converted); 94453289f6aSNate Lawson if (ACPI_FAILURE (Status)) 94553289f6aSNate Lawson { 946fba7fc7eSJung-uk Kim sprintf (ErrBuf, "%s %s\n", "Conversion error:", 947fba7fc7eSJung-uk Kim AcpiFormatException (Status)); 94853289f6aSNate Lawson AslCompilererror (ErrBuf); 94953289f6aSNate Lawson } 95053289f6aSNate Lawson 95153289f6aSNate Lawson return (Converted); 95253289f6aSNate Lawson } 95353289f6aSNate Lawson 95453289f6aSNate Lawson 955fba7fc7eSJung-uk Kim /* TBD: use version in ACPICA main code base? */ 956fba7fc7eSJung-uk Kim 95753289f6aSNate Lawson /******************************************************************************* 95853289f6aSNate Lawson * 95953289f6aSNate Lawson * FUNCTION: UtStrtoul64 96053289f6aSNate Lawson * 96153289f6aSNate Lawson * PARAMETERS: String - Null terminated string 962f38b0f21SJung-uk Kim * Terminater - Where a pointer to the terminating byte 963f38b0f21SJung-uk Kim * is returned 96453289f6aSNate Lawson * Base - Radix of the string 96553289f6aSNate Lawson * 96653289f6aSNate Lawson * RETURN: Converted value 96753289f6aSNate Lawson * 96853289f6aSNate Lawson * DESCRIPTION: Convert a string into an unsigned value. 96953289f6aSNate Lawson * 97053289f6aSNate Lawson ******************************************************************************/ 97153289f6aSNate Lawson 972d052a1ccSJung-uk Kim ACPI_STATUS 97353289f6aSNate Lawson UtStrtoul64 ( 97453289f6aSNate Lawson char *String, 97553289f6aSNate Lawson UINT32 Base, 9769a179dd8SJung-uk Kim UINT64 *RetInteger) 97753289f6aSNate Lawson { 97853289f6aSNate Lawson UINT32 Index; 97953289f6aSNate Lawson UINT32 Sign; 9809a179dd8SJung-uk Kim UINT64 ReturnValue = 0; 98153289f6aSNate Lawson ACPI_STATUS Status = AE_OK; 98253289f6aSNate Lawson 98353289f6aSNate Lawson 98453289f6aSNate Lawson *RetInteger = 0; 98553289f6aSNate Lawson 98653289f6aSNate Lawson switch (Base) 98753289f6aSNate Lawson { 98853289f6aSNate Lawson case 0: 98953289f6aSNate Lawson case 8: 99053289f6aSNate Lawson case 10: 99153289f6aSNate Lawson case 16: 992a9d8d09cSJung-uk Kim 99353289f6aSNate Lawson break; 99453289f6aSNate Lawson 99553289f6aSNate Lawson default: 99653289f6aSNate Lawson /* 99753289f6aSNate Lawson * The specified Base parameter is not in the domain of 99853289f6aSNate Lawson * this function: 99953289f6aSNate Lawson */ 100053289f6aSNate Lawson return (AE_BAD_PARAMETER); 100153289f6aSNate Lawson } 100253289f6aSNate Lawson 1003fba7fc7eSJung-uk Kim /* Skip over any white space in the buffer: */ 1004fba7fc7eSJung-uk Kim 10059a179dd8SJung-uk Kim while (isspace ((int) *String) || *String == '\t') 100653289f6aSNate Lawson { 100753289f6aSNate Lawson ++String; 100853289f6aSNate Lawson } 100953289f6aSNate Lawson 101053289f6aSNate Lawson /* 101153289f6aSNate Lawson * The buffer may contain an optional plus or minus sign. 101253289f6aSNate Lawson * If it does, then skip over it but remember what is was: 101353289f6aSNate Lawson */ 101453289f6aSNate Lawson if (*String == '-') 101553289f6aSNate Lawson { 101653289f6aSNate Lawson Sign = NEGATIVE; 101753289f6aSNate Lawson ++String; 101853289f6aSNate Lawson } 101953289f6aSNate Lawson else if (*String == '+') 102053289f6aSNate Lawson { 102153289f6aSNate Lawson ++String; 102253289f6aSNate Lawson Sign = POSITIVE; 102353289f6aSNate Lawson } 102453289f6aSNate Lawson else 102553289f6aSNate Lawson { 102653289f6aSNate Lawson Sign = POSITIVE; 102753289f6aSNate Lawson } 102853289f6aSNate Lawson 102953289f6aSNate Lawson /* 103053289f6aSNate Lawson * If the input parameter Base is zero, then we need to 103153289f6aSNate Lawson * determine if it is octal, decimal, or hexadecimal: 103253289f6aSNate Lawson */ 103353289f6aSNate Lawson if (Base == 0) 103453289f6aSNate Lawson { 103553289f6aSNate Lawson if (*String == '0') 103653289f6aSNate Lawson { 10379a179dd8SJung-uk Kim if (tolower ((int) *(++String)) == 'x') 103853289f6aSNate Lawson { 103953289f6aSNate Lawson Base = 16; 104053289f6aSNate Lawson ++String; 104153289f6aSNate Lawson } 104253289f6aSNate Lawson else 104353289f6aSNate Lawson { 104453289f6aSNate Lawson Base = 8; 104553289f6aSNate Lawson } 104653289f6aSNate Lawson } 104753289f6aSNate Lawson else 104853289f6aSNate Lawson { 104953289f6aSNate Lawson Base = 10; 105053289f6aSNate Lawson } 105153289f6aSNate Lawson } 105253289f6aSNate Lawson 105353289f6aSNate Lawson /* 105453289f6aSNate Lawson * For octal and hexadecimal bases, skip over the leading 105553289f6aSNate Lawson * 0 or 0x, if they are present. 105653289f6aSNate Lawson */ 105753289f6aSNate Lawson if (Base == 8 && *String == '0') 105853289f6aSNate Lawson { 105953289f6aSNate Lawson String++; 106053289f6aSNate Lawson } 106153289f6aSNate Lawson 106253289f6aSNate Lawson if (Base == 16 && 106353289f6aSNate Lawson *String == '0' && 10649a179dd8SJung-uk Kim tolower ((int) *(++String)) == 'x') 106553289f6aSNate Lawson { 106653289f6aSNate Lawson String++; 106753289f6aSNate Lawson } 106853289f6aSNate Lawson 106953289f6aSNate Lawson /* Main loop: convert the string to an unsigned long */ 107053289f6aSNate Lawson 107153289f6aSNate Lawson while (*String) 107253289f6aSNate Lawson { 10739a179dd8SJung-uk Kim if (isdigit ((int) *String)) 107453289f6aSNate Lawson { 107553289f6aSNate Lawson Index = ((UINT8) *String) - '0'; 107653289f6aSNate Lawson } 107753289f6aSNate Lawson else 107853289f6aSNate Lawson { 10799a179dd8SJung-uk Kim Index = (UINT8) toupper ((int) *String); 10809a179dd8SJung-uk Kim if (isupper ((int) Index)) 108153289f6aSNate Lawson { 108253289f6aSNate Lawson Index = Index - 'A' + 10; 108353289f6aSNate Lawson } 108453289f6aSNate Lawson else 108553289f6aSNate Lawson { 108653289f6aSNate Lawson goto ErrorExit; 108753289f6aSNate Lawson } 108853289f6aSNate Lawson } 108953289f6aSNate Lawson 109053289f6aSNate Lawson if (Index >= Base) 109153289f6aSNate Lawson { 109253289f6aSNate Lawson goto ErrorExit; 109353289f6aSNate Lawson } 109453289f6aSNate Lawson 109553289f6aSNate Lawson /* Check to see if value is out of range: */ 109653289f6aSNate Lawson 10979a179dd8SJung-uk Kim if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) / 10989a179dd8SJung-uk Kim (UINT64) Base)) 109953289f6aSNate Lawson { 110053289f6aSNate Lawson goto ErrorExit; 110153289f6aSNate Lawson } 110253289f6aSNate Lawson else 110353289f6aSNate Lawson { 110453289f6aSNate Lawson ReturnValue *= Base; 110553289f6aSNate Lawson ReturnValue += Index; 110653289f6aSNate Lawson } 110753289f6aSNate Lawson 110853289f6aSNate Lawson ++String; 110953289f6aSNate Lawson } 111053289f6aSNate Lawson 111153289f6aSNate Lawson 1112fba7fc7eSJung-uk Kim /* If a minus sign was present, then "the conversion is negated": */ 1113fba7fc7eSJung-uk Kim 111453289f6aSNate Lawson if (Sign == NEGATIVE) 111553289f6aSNate Lawson { 111653289f6aSNate Lawson ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1; 111753289f6aSNate Lawson } 111853289f6aSNate Lawson 111953289f6aSNate Lawson *RetInteger = ReturnValue; 112053289f6aSNate Lawson return (Status); 112153289f6aSNate Lawson 112253289f6aSNate Lawson 112353289f6aSNate Lawson ErrorExit: 112453289f6aSNate Lawson switch (Base) 112553289f6aSNate Lawson { 112653289f6aSNate Lawson case 8: 1127a9d8d09cSJung-uk Kim 112853289f6aSNate Lawson Status = AE_BAD_OCTAL_CONSTANT; 112953289f6aSNate Lawson break; 113053289f6aSNate Lawson 113153289f6aSNate Lawson case 10: 1132a9d8d09cSJung-uk Kim 113353289f6aSNate Lawson Status = AE_BAD_DECIMAL_CONSTANT; 113453289f6aSNate Lawson break; 113553289f6aSNate Lawson 113653289f6aSNate Lawson case 16: 1137a9d8d09cSJung-uk Kim 113853289f6aSNate Lawson Status = AE_BAD_HEX_CONSTANT; 113953289f6aSNate Lawson break; 114053289f6aSNate Lawson 114153289f6aSNate Lawson default: 1142a9d8d09cSJung-uk Kim 114353289f6aSNate Lawson /* Base validated above */ 1144a9d8d09cSJung-uk Kim 114553289f6aSNate Lawson break; 114653289f6aSNate Lawson } 114753289f6aSNate Lawson 114853289f6aSNate Lawson return (Status); 114953289f6aSNate Lawson } 1150