Index: vendor-sys/acpica/dist/source/compiler/dtutils.c =================================================================== --- vendor-sys/acpica/dist/source/compiler/dtutils.c (revision 284518) +++ vendor-sys/acpica/dist/source/compiler/dtutils.c (revision 284519) @@ -1,1001 +1,1001 @@ /****************************************************************************** * * Module Name: dtutils.c - Utility routines for the data table compiler * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "aslcompiler.h" #include "dtcompiler.h" #include "actables.h" #define _COMPONENT DT_COMPILER ACPI_MODULE_NAME ("dtutils") /* Local prototypes */ static void DtSum ( DT_SUBTABLE *Subtable, void *Context, void *ReturnValue); /****************************************************************************** * * FUNCTION: DtError * * PARAMETERS: Level - Seriousness (Warning/error, etc.) * MessageId - Index into global message buffer * Op - Parse node where error happened * ExtraMessage - additional error message * * RETURN: None * * DESCRIPTION: Common error interface for data table compiler * *****************************************************************************/ void DtError ( UINT8 Level, UINT16 MessageId, DT_FIELD *FieldObject, char *ExtraMessage) { /* Check if user wants to ignore this exception */ if (AslIsExceptionDisabled (Level, MessageId)) { return; } if (FieldObject) { AslCommonError (Level, MessageId, FieldObject->Line, FieldObject->Line, FieldObject->ByteOffset, FieldObject->Column, Gbl_Files[ASL_FILE_INPUT].Filename, ExtraMessage); } else { AslCommonError (Level, MessageId, 0, 0, 0, 0, 0, ExtraMessage); } } /****************************************************************************** * * FUNCTION: DtNameError * * PARAMETERS: Level - Seriousness (Warning/error, etc.) * MessageId - Index into global message buffer * Op - Parse node where error happened * ExtraMessage - additional error message * * RETURN: None * * DESCRIPTION: Error interface for named objects * *****************************************************************************/ void DtNameError ( UINT8 Level, UINT16 MessageId, DT_FIELD *FieldObject, char *ExtraMessage) { switch (Level) { case ASL_WARNING2: case ASL_WARNING3: if (Gbl_WarningLevel < Level) { return; } break; default: break; } if (FieldObject) { AslCommonError (Level, MessageId, FieldObject->Line, FieldObject->Line, FieldObject->ByteOffset, FieldObject->NameColumn, Gbl_Files[ASL_FILE_INPUT].Filename, ExtraMessage); } else { AslCommonError (Level, MessageId, 0, 0, 0, 0, 0, ExtraMessage); } } /******************************************************************************* * * FUNCTION: DtFatal * * PARAMETERS: None * * RETURN: None * * DESCRIPTION: Dump the error log and abort the compiler. Used for serious * compile or I/O errors * ******************************************************************************/ void DtFatal ( UINT16 MessageId, DT_FIELD *FieldObject, char *ExtraMessage) { DtError (ASL_ERROR, MessageId, FieldObject, ExtraMessage); /* * TBD: remove this entire function, DtFatal * * We cannot abort the compiler on error, because we may be compiling a * list of files. We must move on to the next file. */ #ifdef __OBSOLETE CmCleanupAndExit (); exit (1); #endif } /****************************************************************************** * * FUNCTION: DtStrtoul64 * * PARAMETERS: String - Null terminated string * ReturnInteger - Where the converted integer is returned * * RETURN: Status * * DESCRIPTION: Simple conversion of a string hex integer constant to unsigned * value. Assumes no leading "0x" for the constant. * * Portability note: The reason this function exists is because a 64-bit * sscanf is not available in all environments. * *****************************************************************************/ ACPI_STATUS DtStrtoul64 ( char *String, UINT64 *ReturnInteger) { char *ThisChar = String; UINT32 ThisDigit; UINT64 ReturnValue = 0; int DigitCount = 0; /* Skip over any white space in the buffer */ while ((*ThisChar == ' ') || (*ThisChar == '\t')) { ThisChar++; } /* Skip leading zeros */ while ((*ThisChar) == '0') { ThisChar++; } /* Convert character-by-character */ while (*ThisChar) { - if (isdigit (*ThisChar)) + if (isdigit ((int) *ThisChar)) { /* Convert ASCII 0-9 to Decimal value */ ThisDigit = ((UINT8) *ThisChar) - '0'; } else /* Letter */ { - ThisDigit = (UINT32) toupper (*ThisChar); - if (!isxdigit ((char) ThisDigit)) + ThisDigit = (UINT32) toupper ((int) *ThisChar); + if (!isxdigit ((int) ThisDigit)) { /* Not A-F */ return (AE_BAD_CHARACTER); } /* Convert ASCII Hex char (A-F) to value */ ThisDigit = (ThisDigit - 'A') + 10; } /* Insert the 4-bit hex digit */ ReturnValue <<= 4; ReturnValue += ThisDigit; ThisChar++; DigitCount++; if (DigitCount > 16) { /* Value is too large (> 64 bits/8 bytes/16 hex digits) */ return (AE_LIMIT); } } *ReturnInteger = ReturnValue; return (AE_OK); } /****************************************************************************** * * FUNCTION: DtGetFieldValue * * PARAMETERS: Field - Current field list pointer * * RETURN: Field value * * DESCRIPTION: Get field value * *****************************************************************************/ char * DtGetFieldValue ( DT_FIELD *Field) { if (!Field) { return (NULL); } return (Field->Value); } /****************************************************************************** * * FUNCTION: DtGetFieldType * * PARAMETERS: Info - Data table info * * RETURN: Field type * * DESCRIPTION: Get field type * *****************************************************************************/ UINT8 DtGetFieldType ( ACPI_DMTABLE_INFO *Info) { UINT8 Type; /* DT_FLAG means that this is the start of a block of flag bits */ /* TBD - we can make these a separate opcode later */ if (Info->Flags & DT_FLAG) { return (DT_FIELD_TYPE_FLAGS_INTEGER); } /* Type is based upon the opcode for this field in the info table */ switch (Info->Opcode) { case ACPI_DMT_FLAG0: case ACPI_DMT_FLAG1: case ACPI_DMT_FLAG2: case ACPI_DMT_FLAG3: case ACPI_DMT_FLAG4: case ACPI_DMT_FLAG5: case ACPI_DMT_FLAG6: case ACPI_DMT_FLAG7: case ACPI_DMT_FLAGS0: case ACPI_DMT_FLAGS1: case ACPI_DMT_FLAGS2: case ACPI_DMT_FLAGS4: Type = DT_FIELD_TYPE_FLAG; break; case ACPI_DMT_NAME4: case ACPI_DMT_SIG: case ACPI_DMT_NAME6: case ACPI_DMT_NAME8: case ACPI_DMT_STRING: Type = DT_FIELD_TYPE_STRING; break; case ACPI_DMT_BUFFER: case ACPI_DMT_RAW_BUFFER: case ACPI_DMT_BUF7: case ACPI_DMT_BUF10: case ACPI_DMT_BUF16: case ACPI_DMT_BUF128: case ACPI_DMT_PCI_PATH: Type = DT_FIELD_TYPE_BUFFER; break; case ACPI_DMT_GAS: case ACPI_DMT_HESTNTFY: case ACPI_DMT_IORTMEM: Type = DT_FIELD_TYPE_INLINE_SUBTABLE; break; case ACPI_DMT_UNICODE: Type = DT_FIELD_TYPE_UNICODE; break; case ACPI_DMT_UUID: Type = DT_FIELD_TYPE_UUID; break; case ACPI_DMT_DEVICE_PATH: Type = DT_FIELD_TYPE_DEVICE_PATH; break; case ACPI_DMT_LABEL: Type = DT_FIELD_TYPE_LABEL; break; default: Type = DT_FIELD_TYPE_INTEGER; break; } return (Type); } /****************************************************************************** * * FUNCTION: DtGetBufferLength * * PARAMETERS: Buffer - List of integers, * for example "10 3A 4F 2E" * * RETURN: Count of integer * * DESCRIPTION: Get length of bytes needed to store the integers * *****************************************************************************/ UINT32 DtGetBufferLength ( char *Buffer) { UINT32 ByteLength = 0; while (*Buffer) { if (*Buffer == ' ') { ByteLength++; while (*Buffer == ' ') { Buffer++; } } Buffer++; } return (++ByteLength); } /****************************************************************************** * * FUNCTION: DtGetFieldLength * * PARAMETERS: Field - Current field * Info - Data table info * * RETURN: Field length * * DESCRIPTION: Get length of bytes needed to compile the field * * Note: This function must remain in sync with AcpiDmDumpTable. * *****************************************************************************/ UINT32 DtGetFieldLength ( DT_FIELD *Field, ACPI_DMTABLE_INFO *Info) { UINT32 ByteLength = 0; char *Value; /* Length is based upon the opcode for this field in the info table */ switch (Info->Opcode) { case ACPI_DMT_FLAG0: case ACPI_DMT_FLAG1: case ACPI_DMT_FLAG2: case ACPI_DMT_FLAG3: case ACPI_DMT_FLAG4: case ACPI_DMT_FLAG5: case ACPI_DMT_FLAG6: case ACPI_DMT_FLAG7: case ACPI_DMT_FLAGS0: case ACPI_DMT_FLAGS1: case ACPI_DMT_FLAGS2: case ACPI_DMT_FLAGS4: case ACPI_DMT_LABEL: case ACPI_DMT_EXTRA_TEXT: ByteLength = 0; break; case ACPI_DMT_UINT8: case ACPI_DMT_CHKSUM: case ACPI_DMT_SPACEID: case ACPI_DMT_ACCWIDTH: case ACPI_DMT_IVRS: case ACPI_DMT_GTDT: case ACPI_DMT_MADT: case ACPI_DMT_PCCT: case ACPI_DMT_PMTT: case ACPI_DMT_SRAT: case ACPI_DMT_ASF: case ACPI_DMT_HESTNTYP: case ACPI_DMT_FADTPM: case ACPI_DMT_EINJACT: case ACPI_DMT_EINJINST: case ACPI_DMT_ERSTACT: case ACPI_DMT_ERSTINST: case ACPI_DMT_DMAR_SCOPE: ByteLength = 1; break; case ACPI_DMT_UINT16: case ACPI_DMT_DMAR: case ACPI_DMT_HEST: case ACPI_DMT_NFIT: case ACPI_DMT_PCI_PATH: ByteLength = 2; break; case ACPI_DMT_UINT24: ByteLength = 3; break; case ACPI_DMT_UINT32: case ACPI_DMT_NAME4: case ACPI_DMT_SIG: case ACPI_DMT_LPIT: ByteLength = 4; break; case ACPI_DMT_UINT40: ByteLength = 5; break; case ACPI_DMT_UINT48: case ACPI_DMT_NAME6: ByteLength = 6; break; case ACPI_DMT_UINT56: case ACPI_DMT_BUF7: ByteLength = 7; break; case ACPI_DMT_UINT64: case ACPI_DMT_NAME8: ByteLength = 8; break; case ACPI_DMT_STRING: Value = DtGetFieldValue (Field); if (Value) { ByteLength = strlen (Value) + 1; } else { /* At this point, this is a fatal error */ sprintf (MsgBuffer, "Expected \"%s\"", Info->Name); DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, MsgBuffer); return (0); } break; case ACPI_DMT_GAS: ByteLength = sizeof (ACPI_GENERIC_ADDRESS); break; case ACPI_DMT_HESTNTFY: ByteLength = sizeof (ACPI_HEST_NOTIFY); break; case ACPI_DMT_IORTMEM: ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS); break; case ACPI_DMT_BUFFER: case ACPI_DMT_RAW_BUFFER: Value = DtGetFieldValue (Field); if (Value) { ByteLength = DtGetBufferLength (Value); } else { /* At this point, this is a fatal error */ sprintf (MsgBuffer, "Expected \"%s\"", Info->Name); DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, MsgBuffer); return (0); } break; case ACPI_DMT_BUF10: ByteLength = 10; break; case ACPI_DMT_BUF16: case ACPI_DMT_UUID: ByteLength = 16; break; case ACPI_DMT_BUF128: ByteLength = 128; break; case ACPI_DMT_UNICODE: Value = DtGetFieldValue (Field); /* TBD: error if Value is NULL? (as below?) */ ByteLength = (strlen (Value) + 1) * sizeof(UINT16); break; default: DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid table opcode"); return (0); } return (ByteLength); } /****************************************************************************** * * FUNCTION: DtSum * * PARAMETERS: DT_WALK_CALLBACK: * Subtable - Subtable * Context - Unused * ReturnValue - Store the checksum of subtable * * RETURN: Status * * DESCRIPTION: Get the checksum of subtable * *****************************************************************************/ static void DtSum ( DT_SUBTABLE *Subtable, void *Context, void *ReturnValue) { UINT8 Checksum; UINT8 *Sum = ReturnValue; Checksum = AcpiTbChecksum (Subtable->Buffer, Subtable->Length); *Sum = (UINT8) (*Sum + Checksum); } /****************************************************************************** * * FUNCTION: DtSetTableChecksum * * PARAMETERS: ChecksumPointer - Where to return the checksum * * RETURN: None * * DESCRIPTION: Set checksum of the whole data table into the checksum field * *****************************************************************************/ void DtSetTableChecksum ( UINT8 *ChecksumPointer) { UINT8 Checksum = 0; UINT8 OldSum; DtWalkTableTree (Gbl_RootTable, DtSum, NULL, &Checksum); OldSum = *ChecksumPointer; Checksum = (UINT8) (Checksum - OldSum); /* Compute the final checksum */ Checksum = (UINT8) (0 - Checksum); *ChecksumPointer = Checksum; } /****************************************************************************** * * FUNCTION: DtSetTableLength * * PARAMETERS: None * * RETURN: None * * DESCRIPTION: Walk the subtables and set all the length fields * *****************************************************************************/ void DtSetTableLength ( void) { DT_SUBTABLE *ParentTable; DT_SUBTABLE *ChildTable; ParentTable = Gbl_RootTable; ChildTable = NULL; if (!ParentTable) { return; } DtSetSubtableLength (ParentTable); while (1) { ChildTable = DtGetNextSubtable (ParentTable, ChildTable); if (ChildTable) { if (ChildTable->LengthField) { DtSetSubtableLength (ChildTable); } if (ChildTable->Child) { ParentTable = ChildTable; ChildTable = NULL; } else { ParentTable->TotalLength += ChildTable->TotalLength; if (ParentTable->LengthField) { DtSetSubtableLength (ParentTable); } } } else { ChildTable = ParentTable; if (ChildTable == Gbl_RootTable) { break; } ParentTable = DtGetParentSubtable (ParentTable); ParentTable->TotalLength += ChildTable->TotalLength; if (ParentTable->LengthField) { DtSetSubtableLength (ParentTable); } } } } /****************************************************************************** * * FUNCTION: DtWalkTableTree * * PARAMETERS: StartTable - Subtable in the tree where walking begins * UserFunction - Called during the walk * Context - Passed to user function * ReturnValue - The return value of UserFunction * * RETURN: None * * DESCRIPTION: Performs a depth-first walk of the subtable tree * *****************************************************************************/ void DtWalkTableTree ( DT_SUBTABLE *StartTable, DT_WALK_CALLBACK UserFunction, void *Context, void *ReturnValue) { DT_SUBTABLE *ParentTable; DT_SUBTABLE *ChildTable; ParentTable = StartTable; ChildTable = NULL; if (!ParentTable) { return; } UserFunction (ParentTable, Context, ReturnValue); while (1) { ChildTable = DtGetNextSubtable (ParentTable, ChildTable); if (ChildTable) { UserFunction (ChildTable, Context, ReturnValue); if (ChildTable->Child) { ParentTable = ChildTable; ChildTable = NULL; } } else { ChildTable = ParentTable; if (ChildTable == Gbl_RootTable) { break; } ParentTable = DtGetParentSubtable (ParentTable); if (ChildTable->Peer == StartTable) { break; } } } } /******************************************************************************* * * FUNCTION: UtSubtableCacheCalloc * * PARAMETERS: None * * RETURN: Pointer to the buffer. Aborts on allocation failure * * DESCRIPTION: Allocate a subtable object buffer. Bypass the local * dynamic memory manager for performance reasons (This has a * major impact on the speed of the compiler.) * ******************************************************************************/ DT_SUBTABLE * UtSubtableCacheCalloc ( void) { ASL_CACHE_INFO *Cache; if (Gbl_SubtableCacheNext >= Gbl_SubtableCacheLast) { /* Allocate a new buffer */ Cache = UtLocalCalloc (sizeof (Cache->Next) + (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE)); /* Link new cache buffer to head of list */ Cache->Next = Gbl_SubtableCacheList; Gbl_SubtableCacheList = Cache; /* Setup cache management pointers */ Gbl_SubtableCacheNext = ACPI_CAST_PTR (DT_SUBTABLE, Cache->Buffer); Gbl_SubtableCacheLast = Gbl_SubtableCacheNext + ASL_SUBTABLE_CACHE_SIZE; } Gbl_SubtableCount++; return (Gbl_SubtableCacheNext++); } /******************************************************************************* * * FUNCTION: UtFieldCacheCalloc * * PARAMETERS: None * * RETURN: Pointer to the buffer. Aborts on allocation failure * * DESCRIPTION: Allocate a field object buffer. Bypass the local * dynamic memory manager for performance reasons (This has a * major impact on the speed of the compiler.) * ******************************************************************************/ DT_FIELD * UtFieldCacheCalloc ( void) { ASL_CACHE_INFO *Cache; if (Gbl_FieldCacheNext >= Gbl_FieldCacheLast) { /* Allocate a new buffer */ Cache = UtLocalCalloc (sizeof (Cache->Next) + (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE)); /* Link new cache buffer to head of list */ Cache->Next = Gbl_FieldCacheList; Gbl_FieldCacheList = Cache; /* Setup cache management pointers */ Gbl_FieldCacheNext = ACPI_CAST_PTR (DT_FIELD, Cache->Buffer); Gbl_FieldCacheLast = Gbl_FieldCacheNext + ASL_FIELD_CACHE_SIZE; } Gbl_FieldCount++; return (Gbl_FieldCacheNext++); } /******************************************************************************* * * FUNCTION: DtDeleteCaches * * PARAMETERS: None * * RETURN: None * * DESCRIPTION: Delete all local cache buffer blocks * ******************************************************************************/ void DtDeleteCaches ( void) { UINT32 BufferCount; ASL_CACHE_INFO *Next; /* Field cache */ BufferCount = 0; while (Gbl_FieldCacheList) { Next = Gbl_FieldCacheList->Next; ACPI_FREE (Gbl_FieldCacheList); Gbl_FieldCacheList = Next; BufferCount++; } DbgPrint (ASL_DEBUG_OUTPUT, "%u Fields, Buffer size: %u fields (%u bytes), %u Buffers\n", Gbl_FieldCount, ASL_FIELD_CACHE_SIZE, (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE), BufferCount); Gbl_FieldCount = 0; Gbl_FieldCacheNext = NULL; Gbl_FieldCacheLast = NULL; /* Subtable cache */ BufferCount = 0; while (Gbl_SubtableCacheList) { Next = Gbl_SubtableCacheList->Next; ACPI_FREE (Gbl_SubtableCacheList); Gbl_SubtableCacheList = Next; BufferCount++; } DbgPrint (ASL_DEBUG_OUTPUT, "%u Subtables, Buffer size: %u subtables (%u bytes), %u Buffers\n", Gbl_SubtableCount, ASL_SUBTABLE_CACHE_SIZE, (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE), BufferCount); Gbl_SubtableCount = 0; Gbl_SubtableCacheNext = NULL; Gbl_SubtableCacheLast = NULL; } Index: vendor-sys/acpica/dist/source/components/debugger/dbinput.c =================================================================== --- vendor-sys/acpica/dist/source/components/debugger/dbinput.c (revision 284518) +++ vendor-sys/acpica/dist/source/components/debugger/dbinput.c (revision 284519) @@ -1,1322 +1,1322 @@ /******************************************************************************* * * Module Name: dbinput - user front-end to the AML debugger * ******************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpi.h" #include "accommon.h" #include "acdebug.h" #ifdef ACPI_DEBUGGER #define _COMPONENT ACPI_CA_DEBUGGER ACPI_MODULE_NAME ("dbinput") /* Local prototypes */ static UINT32 AcpiDbGetLine ( char *InputBuffer); static UINT32 AcpiDbMatchCommand ( char *UserCommand); static void AcpiDbSingleThread ( void); static void AcpiDbDisplayCommandInfo ( char *Command, BOOLEAN DisplayAll); static void AcpiDbDisplayHelp ( char *Command); static BOOLEAN AcpiDbMatchCommandHelp ( char *Command, const ACPI_DB_COMMAND_HELP *Help); /* * Top-level debugger commands. * * This list of commands must match the string table below it */ enum AcpiExDebuggerCommands { CMD_NOT_FOUND = 0, CMD_NULL, CMD_ALLOCATIONS, CMD_ARGS, CMD_ARGUMENTS, CMD_BREAKPOINT, CMD_BUSINFO, CMD_CALL, CMD_CLOSE, CMD_DEBUG, CMD_DISASSEMBLE, CMD_DISASM, CMD_DUMP, CMD_ENABLEACPI, CMD_EVALUATE, CMD_EVENT, CMD_EXECUTE, CMD_EXIT, CMD_FIND, CMD_GO, CMD_GPE, CMD_GPES, CMD_HANDLERS, CMD_HELP, CMD_HELP2, CMD_HISTORY, CMD_HISTORY_EXE, CMD_HISTORY_LAST, CMD_INFORMATION, CMD_INTEGRITY, CMD_INTO, CMD_LEVEL, CMD_LIST, CMD_LOAD, CMD_LOCALS, CMD_LOCKS, CMD_METHODS, CMD_NAMESPACE, CMD_NOTIFY, CMD_OBJECTS, CMD_OPEN, CMD_OSI, CMD_OWNER, CMD_PATHS, CMD_PREDEFINED, CMD_PREFIX, CMD_QUIT, CMD_REFERENCES, CMD_RESOURCES, CMD_RESULTS, CMD_SCI, CMD_SET, CMD_SLEEP, CMD_STATS, CMD_STOP, CMD_TABLES, CMD_TEMPLATE, CMD_TERMINATE, CMD_TEST, CMD_THREADS, CMD_TRACE, CMD_TREE, CMD_TYPE, CMD_UNLOAD }; #define CMD_FIRST_VALID 2 /* Second parameter is the required argument count */ static const ACPI_DB_COMMAND_INFO AcpiGbl_DbCommands[] = { {"", 0}, {"", 0}, {"ALLOCATIONS", 0}, {"ARGS", 0}, {"ARGUMENTS", 0}, {"BREAKPOINT", 1}, {"BUSINFO", 0}, {"CALL", 0}, {"CLOSE", 0}, {"DEBUG", 1}, {"DISASSEMBLE", 1}, {"DISASM", 1}, {"DUMP", 1}, {"ENABLEACPI", 0}, {"EVALUATE", 1}, {"EVENT", 1}, {"EXECUTE", 1}, {"EXIT", 0}, {"FIND", 1}, {"GO", 0}, {"GPE", 1}, {"GPES", 0}, {"HANDLERS", 0}, {"HELP", 0}, {"?", 0}, {"HISTORY", 0}, {"!", 1}, {"!!", 0}, {"INFORMATION", 0}, {"INTEGRITY", 0}, {"INTO", 0}, {"LEVEL", 0}, {"LIST", 0}, {"LOAD", 1}, {"LOCALS", 0}, {"LOCKS", 0}, {"METHODS", 0}, {"NAMESPACE", 0}, {"NOTIFY", 2}, {"OBJECTS", 1}, {"OPEN", 1}, {"OSI", 0}, {"OWNER", 1}, {"PATHS", 0}, {"PREDEFINED", 0}, {"PREFIX", 0}, {"QUIT", 0}, {"REFERENCES", 1}, {"RESOURCES", 0}, {"RESULTS", 0}, {"SCI", 0}, {"SET", 3}, {"SLEEP", 0}, {"STATS", 1}, {"STOP", 0}, {"TABLES", 0}, {"TEMPLATE", 1}, {"TERMINATE", 0}, {"TEST", 1}, {"THREADS", 3}, {"TRACE", 1}, {"TREE", 0}, {"TYPE", 1}, {"UNLOAD", 1}, {NULL, 0} }; /* * Help for all debugger commands. First argument is the number of lines * of help to output for the command. */ static const ACPI_DB_COMMAND_HELP AcpiGbl_DbCommandHelp[] = { {0, "\nGeneral-Purpose Commands:", "\n"}, {1, " Allocations", "Display list of current memory allocations\n"}, {2, " Dump
|", "\n"}, {0, " [Byte|Word|Dword|Qword]", "Display ACPI objects or memory\n"}, {1, " EnableAcpi", "Enable ACPI (hardware) mode\n"}, {1, " Handlers", "Info about global handlers\n"}, {1, " Help [Command]", "This help screen or individual command\n"}, {1, " History", "Display command history buffer\n"}, {1, " Level ] [console]", "Get/Set debug level for file or console\n"}, {1, " Locks", "Current status of internal mutexes\n"}, {1, " Osi [Install|Remove ]", "Display or modify global _OSI list\n"}, {1, " Quit or Exit", "Exit this command\n"}, {8, " Stats ", "Display namespace and memory statistics\n"}, {1, " Allocations", "Display list of current memory allocations\n"}, {1, " Memory", "Dump internal memory lists\n"}, {1, " Misc", "Namespace search and mutex stats\n"}, {1, " Objects", "Summary of namespace objects\n"}, {1, " Sizes", "Sizes for each of the internal objects\n"}, {1, " Stack", "Display CPU stack usage\n"}, {1, " Tables", "Info about current ACPI table(s)\n"}, {1, " Tables", "Display info about loaded ACPI tables\n"}, {1, " Unload ", "Unload an ACPI table via namespace object\n"}, {1, " ! ", "Execute command from history buffer\n"}, {1, " !!", "Execute last command again\n"}, {0, "\nNamespace Access Commands:", "\n"}, {1, " Businfo", "Display system bus info\n"}, {1, " Disassemble ", "Disassemble a control method\n"}, {1, " Find (? is wildcard)", "Find ACPI name(s) with wildcards\n"}, {1, " Integrity", "Validate namespace integrity\n"}, {1, " Methods", "Display list of loaded control methods\n"}, {1, " Namespace [Object] [Depth]", "Display loaded namespace tree/subtree\n"}, {1, " Notify ", "Send a notification on Object\n"}, {1, " Objects ", "Display all objects of the given type\n"}, {1, " Owner [Depth]", "Display loaded namespace by object owner\n"}, {1, " Paths", "Display full pathnames of namespace objects\n"}, {1, " Predefined", "Check all predefined names\n"}, {1, " Prefix []", "Set or Get current execution prefix\n"}, {1, " References ", "Find all references to object at addr\n"}, {1, " Resources [DeviceName]", "Display Device resources (no arg = all devices)\n"}, {1, " Set N ", "Set value for named integer\n"}, {1, " Template ", "Format/dump a Buffer/ResourceTemplate\n"}, {1, " Terminate", "Delete namespace and all internal objects\n"}, {1, " Type ", "Display object type\n"}, {0, "\nControl Method Execution Commands:","\n"}, {1, " Arguments (or Args)", "Display method arguments\n"}, {1, " Breakpoint ", "Set an AML execution breakpoint\n"}, {1, " Call", "Run to next control method invocation\n"}, {1, " Debug [Arguments]", "Single Step a control method\n"}, {6, " Evaluate", "Synonym for Execute\n"}, {5, " Execute [Arguments]", "Execute control method\n"}, {1, " Hex Integer", "Integer method argument\n"}, {1, " \"Ascii String\"", "String method argument\n"}, {1, " (Hex Byte List)", "Buffer method argument\n"}, {1, " [Package Element List]", "Package method argument\n"}, {1, " Go", "Allow method to run to completion\n"}, {1, " Information", "Display info about the current method\n"}, {1, " Into", "Step into (not over) a method call\n"}, {1, " List [# of Aml Opcodes]", "Display method ASL statements\n"}, {1, " Locals", "Display method local variables\n"}, {1, " Results", "Display method result stack\n"}, {1, " Set <#> ", "Set method data (Arguments/Locals)\n"}, {1, " Stop", "Terminate control method\n"}, {1, " Thread ", "Spawn threads to execute method(s)\n"}, {1, " Trace ", "Trace method execution\n"}, {1, " Tree", "Display control method calling tree\n"}, {1, " ", "Single step next AML opcode (over calls)\n"}, {0, "\nHardware Related Commands:", "\n"}, {1, " Event ", "Generate AcpiEvent (Fixed/GPE)\n"}, {1, " Gpe [GpeBlockDevice]", "Simulate a GPE\n"}, {1, " Gpes", "Display info on all GPEs\n"}, {1, " Sci", "Generate an SCI\n"}, {1, " Sleep [SleepState]", "Simulate sleep/wake sequence(s) (0-5)\n"}, {0, "\nFile I/O Commands:", "\n"}, {1, " Close", "Close debug output file\n"}, {1, " Load ", "Load ACPI table from a file\n"}, {1, " Open ", "Open a file for debug output\n"}, {0, "\nDebug Test Commands:", "\n"}, {3, " Test ", "Invoke a debug test\n"}, {1, " Objects", "Read/write/compare all namespace data objects\n"}, {1, " Predefined", "Execute all ACPI predefined names (_STA, etc.)\n"}, {0, NULL, NULL} }; /******************************************************************************* * * FUNCTION: AcpiDbMatchCommandHelp * * PARAMETERS: Command - Command string to match * Help - Help table entry to attempt match * * RETURN: TRUE if command matched, FALSE otherwise * * DESCRIPTION: Attempt to match a command in the help table in order to * print help information for a single command. * ******************************************************************************/ static BOOLEAN AcpiDbMatchCommandHelp ( char *Command, const ACPI_DB_COMMAND_HELP *Help) { char *Invocation = Help->Invocation; UINT32 LineCount; /* Valid commands in the help table begin with a couple of spaces */ if (*Invocation != ' ') { return (FALSE); } while (*Invocation == ' ') { Invocation++; } /* Match command name (full command or substring) */ while ((*Command) && (*Invocation) && (*Invocation != ' ')) { - if (tolower (*Command) != tolower (*Invocation)) + if (tolower ((int) *Command) != tolower ((int) *Invocation)) { return (FALSE); } Invocation++; Command++; } /* Print the appropriate number of help lines */ LineCount = Help->LineCount; while (LineCount) { AcpiOsPrintf ("%-38s : %s", Help->Invocation, Help->Description); Help++; LineCount--; } return (TRUE); } /******************************************************************************* * * FUNCTION: AcpiDbDisplayCommandInfo * * PARAMETERS: Command - Command string to match * DisplayAll - Display all matching commands, or just * the first one (substring match) * * RETURN: None * * DESCRIPTION: Display help information for a Debugger command. * ******************************************************************************/ static void AcpiDbDisplayCommandInfo ( char *Command, BOOLEAN DisplayAll) { const ACPI_DB_COMMAND_HELP *Next; BOOLEAN Matched; Next = AcpiGbl_DbCommandHelp; while (Next->Invocation) { Matched = AcpiDbMatchCommandHelp (Command, Next); if (!DisplayAll && Matched) { return; } Next++; } } /******************************************************************************* * * FUNCTION: AcpiDbDisplayHelp * * PARAMETERS: Command - Optional command string to display help. * if not specified, all debugger command * help strings are displayed * * RETURN: None * * DESCRIPTION: Display help for a single debugger command, or all of them. * ******************************************************************************/ static void AcpiDbDisplayHelp ( char *Command) { const ACPI_DB_COMMAND_HELP *Next = AcpiGbl_DbCommandHelp; if (!Command) { /* No argument to help, display help for all commands */ while (Next->Invocation) { AcpiOsPrintf ("%-38s%s", Next->Invocation, Next->Description); Next++; } } else { /* Display help for all commands that match the subtring */ AcpiDbDisplayCommandInfo (Command, TRUE); } } /******************************************************************************* * * FUNCTION: AcpiDbGetNextToken * * PARAMETERS: String - Command buffer * Next - Return value, end of next token * * RETURN: Pointer to the start of the next token. * * DESCRIPTION: Command line parsing. Get the next token on the command line * ******************************************************************************/ char * AcpiDbGetNextToken ( char *String, char **Next, ACPI_OBJECT_TYPE *ReturnType) { char *Start; UINT32 Depth; ACPI_OBJECT_TYPE Type = ACPI_TYPE_INTEGER; /* At end of buffer? */ if (!String || !(*String)) { return (NULL); } /* Remove any spaces at the beginning */ if (*String == ' ') { while (*String && (*String == ' ')) { String++; } if (!(*String)) { return (NULL); } } switch (*String) { case '"': /* This is a quoted string, scan until closing quote */ String++; Start = String; Type = ACPI_TYPE_STRING; /* Find end of string */ while (*String && (*String != '"')) { String++; } break; case '(': /* This is the start of a buffer, scan until closing paren */ String++; Start = String; Type = ACPI_TYPE_BUFFER; /* Find end of buffer */ while (*String && (*String != ')')) { String++; } break; case '[': /* This is the start of a package, scan until closing bracket */ String++; Depth = 1; Start = String; Type = ACPI_TYPE_PACKAGE; /* Find end of package (closing bracket) */ while (*String) { /* Handle String package elements */ if (*String == '"') { /* Find end of string */ String++; while (*String && (*String != '"')) { String++; } if (!(*String)) { break; } } else if (*String == '[') { Depth++; /* A nested package declaration */ } else if (*String == ']') { Depth--; if (Depth == 0) /* Found final package closing bracket */ { break; } } String++; } break; default: Start = String; /* Find end of token */ while (*String && (*String != ' ')) { String++; } break; } if (!(*String)) { *Next = NULL; } else { *String = 0; *Next = String + 1; } *ReturnType = Type; return (Start); } /******************************************************************************* * * FUNCTION: AcpiDbGetLine * * PARAMETERS: InputBuffer - Command line buffer * * RETURN: Count of arguments to the command * * DESCRIPTION: Get the next command line from the user. Gets entire line * up to the next newline * ******************************************************************************/ static UINT32 AcpiDbGetLine ( char *InputBuffer) { UINT32 i; UINT32 Count; char *Next; char *This; if (AcpiUtSafeStrcpy (AcpiGbl_DbParsedBuf, sizeof (AcpiGbl_DbParsedBuf), InputBuffer)) { AcpiOsPrintf ("Buffer overflow while parsing input line (max %u characters)\n", sizeof (AcpiGbl_DbParsedBuf)); return (0); } This = AcpiGbl_DbParsedBuf; for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++) { AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next, &AcpiGbl_DbArgTypes[i]); if (!AcpiGbl_DbArgs[i]) { break; } This = Next; } /* Uppercase the actual command */ if (AcpiGbl_DbArgs[0]) { AcpiUtStrupr (AcpiGbl_DbArgs[0]); } Count = i; if (Count) { Count--; /* Number of args only */ } return (Count); } /******************************************************************************* * * FUNCTION: AcpiDbMatchCommand * * PARAMETERS: UserCommand - User command line * * RETURN: Index into command array, -1 if not found * * DESCRIPTION: Search command array for a command match * ******************************************************************************/ static UINT32 AcpiDbMatchCommand ( char *UserCommand) { UINT32 i; if (!UserCommand || UserCommand[0] == 0) { return (CMD_NULL); } for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++) { if (strstr (AcpiGbl_DbCommands[i].Name, UserCommand) == AcpiGbl_DbCommands[i].Name) { return (i); } } /* Command not recognized */ return (CMD_NOT_FOUND); } /******************************************************************************* * * FUNCTION: AcpiDbCommandDispatch * * PARAMETERS: InputBuffer - Command line buffer * WalkState - Current walk * Op - Current (executing) parse op * * RETURN: Status * * DESCRIPTION: Command dispatcher. * ******************************************************************************/ ACPI_STATUS AcpiDbCommandDispatch ( char *InputBuffer, ACPI_WALK_STATE *WalkState, ACPI_PARSE_OBJECT *Op) { UINT32 Temp; UINT32 CommandIndex; UINT32 ParamCount; char *CommandLine; ACPI_STATUS Status = AE_CTRL_TRUE; /* If AcpiTerminate has been called, terminate this thread */ if (AcpiGbl_DbTerminateThreads) { return (AE_CTRL_TERMINATE); } /* Add all commands that come here to the history buffer */ AcpiDbAddToHistory (InputBuffer); ParamCount = AcpiDbGetLine (InputBuffer); CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]); Temp = 0; /* Verify that we have the minimum number of params */ if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs) { AcpiOsPrintf ("%u parameters entered, [%s] requires %u parameters\n", ParamCount, AcpiGbl_DbCommands[CommandIndex].Name, AcpiGbl_DbCommands[CommandIndex].MinArgs); AcpiDbDisplayCommandInfo (AcpiGbl_DbCommands[CommandIndex].Name, FALSE); return (AE_CTRL_TRUE); } /* Decode and dispatch the command */ switch (CommandIndex) { case CMD_NULL: if (Op) { return (AE_OK); } break; case CMD_ALLOCATIONS: #ifdef ACPI_DBG_TRACK_ALLOCATIONS AcpiUtDumpAllocations ((UINT32) -1, NULL); #endif break; case CMD_ARGS: case CMD_ARGUMENTS: AcpiDbDisplayArguments (); break; case CMD_BREAKPOINT: AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op); break; case CMD_BUSINFO: AcpiDbGetBusInfo (); break; case CMD_CALL: AcpiDbSetMethodCallBreakpoint (Op); Status = AE_OK; break; case CMD_CLOSE: AcpiDbCloseDebugFile (); break; case CMD_DEBUG: AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_SINGLE_STEP); break; case CMD_DISASSEMBLE: case CMD_DISASM: (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]); break; case CMD_DUMP: AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_ENABLEACPI: #if (!ACPI_REDUCED_HARDWARE) Status = AcpiEnable(); if (ACPI_FAILURE(Status)) { AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status); return (Status); } #endif /* !ACPI_REDUCED_HARDWARE */ break; case CMD_EVENT: AcpiOsPrintf ("Event command not implemented\n"); break; case CMD_EVALUATE: case CMD_EXECUTE: AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP); break; case CMD_FIND: Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]); break; case CMD_GO: AcpiGbl_CmSingleStep = FALSE; return (AE_OK); case CMD_GPE: AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_GPES: AcpiDbDisplayGpes (); break; case CMD_HANDLERS: AcpiDbDisplayHandlers (); break; case CMD_HELP: case CMD_HELP2: AcpiDbDisplayHelp (AcpiGbl_DbArgs[1]); break; case CMD_HISTORY: AcpiDbDisplayHistory (); break; case CMD_HISTORY_EXE: /* ! command */ CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]); if (!CommandLine) { return (AE_CTRL_TRUE); } Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op); return (Status); case CMD_HISTORY_LAST: /* !! command */ CommandLine = AcpiDbGetFromHistory (NULL); if (!CommandLine) { return (AE_CTRL_TRUE); } Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op); return (Status); case CMD_INFORMATION: AcpiDbDisplayMethodInfo (Op); break; case CMD_INTEGRITY: AcpiDbCheckIntegrity (); break; case CMD_INTO: if (Op) { AcpiGbl_CmSingleStep = TRUE; return (AE_OK); } break; case CMD_LEVEL: if (ParamCount == 0) { AcpiOsPrintf ("Current debug level for file output is: %8.8lX\n", AcpiGbl_DbDebugLevel); AcpiOsPrintf ("Current debug level for console output is: %8.8lX\n", AcpiGbl_DbConsoleDebugLevel); } else if (ParamCount == 2) { Temp = AcpiGbl_DbConsoleDebugLevel; AcpiGbl_DbConsoleDebugLevel = strtoul (AcpiGbl_DbArgs[1], NULL, 16); AcpiOsPrintf ( "Debug Level for console output was %8.8lX, now %8.8lX\n", Temp, AcpiGbl_DbConsoleDebugLevel); } else { Temp = AcpiGbl_DbDebugLevel; AcpiGbl_DbDebugLevel = strtoul (AcpiGbl_DbArgs[1], NULL, 16); AcpiOsPrintf ( "Debug Level for file output was %8.8lX, now %8.8lX\n", Temp, AcpiGbl_DbDebugLevel); } break; case CMD_LIST: AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op); break; case CMD_LOAD: Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL, FALSE); break; case CMD_LOCKS: AcpiDbDisplayLocks (); break; case CMD_LOCALS: AcpiDbDisplayLocals (); break; case CMD_METHODS: Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]); break; case CMD_NAMESPACE: AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_NOTIFY: Temp = strtoul (AcpiGbl_DbArgs[2], NULL, 0); AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp); break; case CMD_OBJECTS: AcpiUtStrupr (AcpiGbl_DbArgs[1]); Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_OPEN: AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]); break; case CMD_OSI: AcpiDbDisplayInterfaces (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_OWNER: AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_PATHS: AcpiDbDumpNamespacePaths (); break; case CMD_PREDEFINED: AcpiDbCheckPredefinedNames (); break; case CMD_PREFIX: AcpiDbSetScope (AcpiGbl_DbArgs[1]); break; case CMD_REFERENCES: AcpiDbFindReferences (AcpiGbl_DbArgs[1]); break; case CMD_RESOURCES: AcpiDbDisplayResources (AcpiGbl_DbArgs[1]); break; case CMD_RESULTS: AcpiDbDisplayResults (); break; case CMD_SCI: AcpiDbGenerateSci (); break; case CMD_SET: AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2], AcpiGbl_DbArgs[3]); break; case CMD_SLEEP: Status = AcpiDbSleep (AcpiGbl_DbArgs[1]); break; case CMD_STATS: Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]); break; case CMD_STOP: return (AE_NOT_IMPLEMENTED); case CMD_TABLES: AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]); break; case CMD_TEMPLATE: AcpiDbDisplayTemplate (AcpiGbl_DbArgs[1]); break; case CMD_TERMINATE: AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); AcpiUtSubsystemShutdown (); /* * TBD: [Restructure] Need some way to re-initialize without * re-creating the semaphores! */ /* AcpiInitialize (NULL); */ break; case CMD_TEST: AcpiDbExecuteTest (AcpiGbl_DbArgs[1]); break; case CMD_THREADS: AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2], AcpiGbl_DbArgs[3]); break; case CMD_TRACE: (void) AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1); break; case CMD_TREE: AcpiDbDisplayCallingTree (); break; case CMD_TYPE: AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]); break; case CMD_UNLOAD: AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1]); break; case CMD_EXIT: case CMD_QUIT: if (Op) { AcpiOsPrintf ("Method execution terminated\n"); return (AE_CTRL_TERMINATE); } if (!AcpiGbl_DbOutputToFile) { AcpiDbgLevel = ACPI_DEBUG_DEFAULT; } AcpiDbCloseDebugFile (); AcpiGbl_DbTerminateThreads = TRUE; return (AE_CTRL_TERMINATE); case CMD_NOT_FOUND: default: AcpiOsPrintf ("%s: unknown command\n", AcpiGbl_DbArgs[0]); return (AE_CTRL_TRUE); } if (ACPI_SUCCESS (Status)) { Status = AE_CTRL_TRUE; } return (Status); } /******************************************************************************* * * FUNCTION: AcpiDbExecuteThread * * PARAMETERS: Context - Not used * * RETURN: None * * DESCRIPTION: Debugger execute thread. Waits for a command line, then * simply dispatches it. * ******************************************************************************/ void ACPI_SYSTEM_XFACE AcpiDbExecuteThread ( void *Context) { ACPI_STATUS Status = AE_OK; ACPI_STATUS MStatus; while (Status != AE_CTRL_TERMINATE) { AcpiGbl_MethodExecuting = FALSE; AcpiGbl_StepToNextCall = FALSE; MStatus = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY); if (ACPI_FAILURE (MStatus)) { return; } Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL); MStatus = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE); if (ACPI_FAILURE (MStatus)) { return; } } } /******************************************************************************* * * FUNCTION: AcpiDbSingleThread * * PARAMETERS: None * * RETURN: None * * DESCRIPTION: Debugger execute thread. Waits for a command line, then * simply dispatches it. * ******************************************************************************/ static void AcpiDbSingleThread ( void) { AcpiGbl_MethodExecuting = FALSE; AcpiGbl_StepToNextCall = FALSE; (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL); } /******************************************************************************* * * FUNCTION: AcpiDbUserCommands * * PARAMETERS: Prompt - User prompt (depends on mode) * Op - Current executing parse op * * RETURN: None * * DESCRIPTION: Command line execution for the AML debugger. Commands are * matched and dispatched here. * ******************************************************************************/ ACPI_STATUS AcpiDbUserCommands ( char Prompt, ACPI_PARSE_OBJECT *Op) { ACPI_STATUS Status = AE_OK; AcpiOsPrintf ("\n"); /* TBD: [Restructure] Need a separate command line buffer for step mode */ while (!AcpiGbl_DbTerminateThreads) { /* Force output to console until a command is entered */ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); /* Different prompt if method is executing */ if (!AcpiGbl_MethodExecuting) { AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT); } else { AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT); } /* Get the user input line */ Status = AcpiOsGetLine (AcpiGbl_DbLineBuf, ACPI_DB_LINE_BUFFER_SIZE, NULL); if (ACPI_FAILURE (Status)) { ACPI_EXCEPTION ((AE_INFO, Status, "While parsing command line")); return (Status); } /* Check for single or multithreaded debug */ if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED) { /* * Signal the debug thread that we have a command to execute, * and wait for the command to complete. */ Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY); if (ACPI_FAILURE (Status)) { return (Status); } Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE); if (ACPI_FAILURE (Status)) { return (Status); } } else { /* Just call to the command line interpreter */ AcpiDbSingleThread (); } } /* * Only this thread (the original thread) should actually terminate the * subsystem, because all the semaphores are deleted during termination */ Status = AcpiTerminate (); return (Status); } #endif /* ACPI_DEBUGGER */ Index: vendor-sys/acpica/dist/source/components/disassembler/dmopcode.c =================================================================== --- vendor-sys/acpica/dist/source/components/disassembler/dmopcode.c (revision 284518) +++ vendor-sys/acpica/dist/source/components/disassembler/dmopcode.c (revision 284519) @@ -1,981 +1,981 @@ /******************************************************************************* * * Module Name: dmopcode - AML disassembler, specific AML opcodes * ******************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpi.h" #include "accommon.h" #include "acparser.h" #include "amlcode.h" #include "acdisasm.h" #include "acinterp.h" #include "acnamesp.h" #ifdef ACPI_DISASSEMBLER #define _COMPONENT ACPI_CA_DEBUGGER ACPI_MODULE_NAME ("dmopcode") /* Local prototypes */ static void AcpiDmMatchKeyword ( ACPI_PARSE_OBJECT *Op); /******************************************************************************* * * FUNCTION: AcpiDmDisplayTargetPathname * * PARAMETERS: Op - Parse object * * RETURN: None * * DESCRIPTION: For AML opcodes that have a target operand, display the full * pathname for the target, in a comment field. Handles Return() * statements also. * ******************************************************************************/ void AcpiDmDisplayTargetPathname ( ACPI_PARSE_OBJECT *Op) { ACPI_PARSE_OBJECT *NextOp; ACPI_PARSE_OBJECT *PrevOp = NULL; char *Pathname; const ACPI_OPCODE_INFO *OpInfo; if (Op->Common.AmlOpcode == AML_RETURN_OP) { PrevOp = Op->Asl.Value.Arg; } else { OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); if (!(OpInfo->Flags & AML_HAS_TARGET)) { return; } /* Target is the last Op in the arg list */ NextOp = Op->Asl.Value.Arg; while (NextOp) { PrevOp = NextOp; NextOp = PrevOp->Asl.Next; } } if (!PrevOp) { return; } /* We must have a namepath AML opcode */ if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) { return; } /* A null string is the "no target specified" case */ if (!PrevOp->Asl.Value.String) { return; } /* No node means "unresolved external reference" */ if (!PrevOp->Asl.Node) { AcpiOsPrintf (" /* External reference */"); return; } /* Ignore if path is already from the root */ if (*PrevOp->Asl.Value.String == '\\') { return; } /* Now: we can get the full pathname */ Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node); if (!Pathname) { return; } AcpiOsPrintf (" /* %s */", Pathname); ACPI_FREE (Pathname); } /******************************************************************************* * * FUNCTION: AcpiDmNotifyDescription * * PARAMETERS: Op - Name() parse object * * RETURN: None * * DESCRIPTION: Emit a description comment for the value associated with a * Notify() operator. * ******************************************************************************/ void AcpiDmNotifyDescription ( ACPI_PARSE_OBJECT *Op) { ACPI_PARSE_OBJECT *NextOp; ACPI_NAMESPACE_NODE *Node; UINT8 NotifyValue; UINT8 Type = ACPI_TYPE_ANY; /* The notify value is the second argument */ NextOp = Op->Asl.Value.Arg; NextOp = NextOp->Asl.Next; switch (NextOp->Common.AmlOpcode) { case AML_ZERO_OP: case AML_ONE_OP: NotifyValue = (UINT8) NextOp->Common.AmlOpcode; break; case AML_BYTE_OP: NotifyValue = (UINT8) NextOp->Asl.Value.Integer; break; default: return; } /* * Attempt to get the namespace node so we can determine the object type. * Some notify values are dependent on the object type (Device, Thermal, * or Processor). */ Node = Op->Asl.Node; if (Node) { Type = Node->Type; } AcpiOsPrintf (" // %s", AcpiUtGetNotifyName (NotifyValue, Type)); } /******************************************************************************* * * FUNCTION: AcpiDmPredefinedDescription * * PARAMETERS: Op - Name() parse object * * RETURN: None * * DESCRIPTION: Emit a description comment for a predefined ACPI name. * Used for iASL compiler only. * ******************************************************************************/ void AcpiDmPredefinedDescription ( ACPI_PARSE_OBJECT *Op) { #ifdef ACPI_ASL_COMPILER const AH_PREDEFINED_NAME *Info; char *NameString; int LastCharIsDigit; int LastCharsAreHex; if (!Op) { return; } /* Ensure that the comment field is emitted only once */ if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED) { return; } Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED; /* Predefined name must start with an underscore */ NameString = ACPI_CAST_PTR (char, &Op->Named.Name); if (NameString[0] != '_') { return; } /* * Check for the special ACPI names: * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a * (where d=decimal_digit, x=hex_digit, a=anything) * * Convert these to the generic name for table lookup. * Note: NameString is guaranteed to be upper case here. */ LastCharIsDigit = - (isdigit (NameString[3])); /* d */ + (isdigit ((int) NameString[3])); /* d */ LastCharsAreHex = - (isxdigit (NameString[2]) && /* xx */ - isxdigit (NameString[3])); + (isxdigit ((int) NameString[2]) && /* xx */ + isxdigit ((int) NameString[3])); switch (NameString[1]) { case 'A': if ((NameString[2] == 'C') && (LastCharIsDigit)) { NameString = "_ACx"; } else if ((NameString[2] == 'L') && (LastCharIsDigit)) { NameString = "_ALx"; } break; case 'E': if ((NameString[2] == 'J') && (LastCharIsDigit)) { NameString = "_EJx"; } else if (LastCharsAreHex) { NameString = "_Exx"; } break; case 'L': if (LastCharsAreHex) { NameString = "_Lxx"; } break; case 'Q': if (LastCharsAreHex) { NameString = "_Qxx"; } break; case 'T': if (NameString[2] == '_') { NameString = "_T_x"; } break; case 'W': if (LastCharsAreHex) { NameString = "_Wxx"; } break; default: break; } /* Match the name in the info table */ Info = AcpiAhMatchPredefinedName (NameString); if (Info) { AcpiOsPrintf (" // %4.4s: %s", NameString, ACPI_CAST_PTR (char, Info->Description)); } #endif return; } /******************************************************************************* * * FUNCTION: AcpiDmFieldPredefinedDescription * * PARAMETERS: Op - Parse object * * RETURN: None * * DESCRIPTION: Emit a description comment for a resource descriptor tag * (which is a predefined ACPI name.) Used for iASL compiler only. * ******************************************************************************/ void AcpiDmFieldPredefinedDescription ( ACPI_PARSE_OBJECT *Op) { #ifdef ACPI_ASL_COMPILER ACPI_PARSE_OBJECT *IndexOp; char *Tag; const ACPI_OPCODE_INFO *OpInfo; const AH_PREDEFINED_NAME *Info; if (!Op) { return; } /* Ensure that the comment field is emitted only once */ if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED) { return; } Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED; /* * Op must be one of the Create* operators: CreateField, CreateBitField, * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField */ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); if (!(OpInfo->Flags & AML_CREATE)) { return; } /* Second argument is the Index argument */ IndexOp = Op->Common.Value.Arg; IndexOp = IndexOp->Common.Next; /* Index argument must be a namepath */ if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP) { return; } /* Major cheat: We previously put the Tag ptr in the Node field */ Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node); if (!Tag) { return; } /* Match the name in the info table */ Info = AcpiAhMatchPredefinedName (Tag); if (Info) { AcpiOsPrintf (" // %4.4s: %s", Tag, ACPI_CAST_PTR (char, Info->Description)); } #endif return; } /******************************************************************************* * * FUNCTION: AcpiDmMethodFlags * * PARAMETERS: Op - Method Object to be examined * * RETURN: None * * DESCRIPTION: Decode control method flags * ******************************************************************************/ void AcpiDmMethodFlags ( ACPI_PARSE_OBJECT *Op) { UINT32 Flags; UINT32 Args; /* The next Op contains the flags */ Op = AcpiPsGetDepthNext (NULL, Op); Flags = (UINT8) Op->Common.Value.Integer; Args = Flags & 0x07; /* Mark the Op as completed */ Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* 1) Method argument count */ AcpiOsPrintf (", %u, ", Args); /* 2) Serialize rule */ if (!(Flags & 0x08)) { AcpiOsPrintf ("Not"); } AcpiOsPrintf ("Serialized"); /* 3) SyncLevel */ if (Flags & 0xF0) { AcpiOsPrintf (", %u", Flags >> 4); } } /******************************************************************************* * * FUNCTION: AcpiDmFieldFlags * * PARAMETERS: Op - Field Object to be examined * * RETURN: None * * DESCRIPTION: Decode Field definition flags * ******************************************************************************/ void AcpiDmFieldFlags ( ACPI_PARSE_OBJECT *Op) { UINT32 Flags; Op = Op->Common.Next; Flags = (UINT8) Op->Common.Value.Integer; /* Mark the Op as completed */ Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]); AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]); AcpiOsPrintf ("%s)", AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]); } /******************************************************************************* * * FUNCTION: AcpiDmAddressSpace * * PARAMETERS: SpaceId - ID to be translated * * RETURN: None * * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword * ******************************************************************************/ void AcpiDmAddressSpace ( UINT8 SpaceId) { if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) { if (SpaceId == 0x7F) { AcpiOsPrintf ("FFixedHW, "); } else { AcpiOsPrintf ("0x%.2X, ", SpaceId); } } else { AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]); } } /******************************************************************************* * * FUNCTION: AcpiDmRegionFlags * * PARAMETERS: Op - Object to be examined * * RETURN: None * * DESCRIPTION: Decode OperationRegion flags * ******************************************************************************/ void AcpiDmRegionFlags ( ACPI_PARSE_OBJECT *Op) { /* The next Op contains the SpaceId */ Op = AcpiPsGetDepthNext (NULL, Op); /* Mark the Op as completed */ Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; AcpiOsPrintf (", "); AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer); } /******************************************************************************* * * FUNCTION: AcpiDmMatchOp * * PARAMETERS: Op - Match Object to be examined * * RETURN: None * * DESCRIPTION: Decode Match opcode operands * ******************************************************************************/ void AcpiDmMatchOp ( ACPI_PARSE_OBJECT *Op) { ACPI_PARSE_OBJECT *NextOp; NextOp = AcpiPsGetDepthNext (NULL, Op); NextOp = NextOp->Common.Next; if (!NextOp) { /* Handle partial tree during single-step */ return; } /* Mark the two nodes that contain the encoding for the match keywords */ NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP; NextOp = NextOp->Common.Next; NextOp = NextOp->Common.Next; NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP; } /******************************************************************************* * * FUNCTION: AcpiDmMatchKeyword * * PARAMETERS: Op - Match Object to be examined * * RETURN: None * * DESCRIPTION: Decode Match opcode operands * ******************************************************************************/ static void AcpiDmMatchKeyword ( ACPI_PARSE_OBJECT *Op) { if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE) { AcpiOsPrintf ("/* Unknown Match Keyword encoding */"); } else { AcpiOsPrintf ("%s", ACPI_CAST_PTR (char, AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer])); } } /******************************************************************************* * * FUNCTION: AcpiDmDisassembleOneOp * * PARAMETERS: WalkState - Current walk info * Info - Parse tree walk info * Op - Op that is to be printed * * RETURN: None * * DESCRIPTION: Disassemble a single AML opcode * ******************************************************************************/ void AcpiDmDisassembleOneOp ( ACPI_WALK_STATE *WalkState, ACPI_OP_WALK_INFO *Info, ACPI_PARSE_OBJECT *Op) { const ACPI_OPCODE_INFO *OpInfo = NULL; UINT32 Offset; UINT32 Length; ACPI_PARSE_OBJECT *Child; ACPI_STATUS Status; UINT8 *Aml; const AH_DEVICE_ID *IdInfo; if (!Op) { AcpiOsPrintf (""); return; } switch (Op->Common.DisasmOpcode) { case ACPI_DASM_MATCHOP: AcpiDmMatchKeyword (Op); return; case ACPI_DASM_LNOT_SUFFIX: if (!AcpiGbl_CstyleDisassembly) { switch (Op->Common.AmlOpcode) { case AML_LEQUAL_OP: AcpiOsPrintf ("LNotEqual"); break; case AML_LGREATER_OP: AcpiOsPrintf ("LLessEqual"); break; case AML_LLESS_OP: AcpiOsPrintf ("LGreaterEqual"); break; default: break; } } Op->Common.DisasmOpcode = 0; Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; return; default: break; } OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); /* The op and arguments */ switch (Op->Common.AmlOpcode) { case AML_LNOT_OP: Child = Op->Common.Value.Arg; if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) || (Child->Common.AmlOpcode == AML_LGREATER_OP) || (Child->Common.AmlOpcode == AML_LLESS_OP)) { Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX; Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX; } else { AcpiOsPrintf ("%s", OpInfo->Name); } break; case AML_BYTE_OP: AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer); break; case AML_WORD_OP: if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) { AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer); } else { AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer); } break; case AML_DWORD_OP: if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) { AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer); } else { AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer); } break; case AML_QWORD_OP: AcpiOsPrintf ("0x%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); break; case AML_STRING_OP: AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX); /* For _HID/_CID strings, attempt to output a descriptive comment */ if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING) { /* If we know about the ID, emit the description */ IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String); if (IdInfo) { AcpiOsPrintf (" /* %s */", IdInfo->Description); } } break; case AML_BUFFER_OP: /* * Determine the type of buffer. We can have one of the following: * * 1) ResourceTemplate containing Resource Descriptors. * 2) Unicode String buffer * 3) ASCII String buffer * 4) Raw data buffer (if none of the above) * * Since there are no special AML opcodes to differentiate these * types of buffers, we have to closely look at the data in the * buffer to determine the type. */ if (!AcpiGbl_NoResourceDisassembly) { Status = AcpiDmIsResourceTemplate (WalkState, Op); if (ACPI_SUCCESS (Status)) { Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; AcpiOsPrintf ("ResourceTemplate"); break; } else if (Status == AE_AML_NO_RESOURCE_END_TAG) { AcpiOsPrintf ("/**** Is ResourceTemplate, but EndTag not at buffer end ****/ "); } } if (AcpiDmIsUuidBuffer (Op)) { Op->Common.DisasmOpcode = ACPI_DASM_UUID; AcpiOsPrintf ("ToUUID ("); } else if (AcpiDmIsUnicodeBuffer (Op)) { Op->Common.DisasmOpcode = ACPI_DASM_UNICODE; AcpiOsPrintf ("Unicode ("); } else if (AcpiDmIsStringBuffer (Op)) { Op->Common.DisasmOpcode = ACPI_DASM_STRING; AcpiOsPrintf ("Buffer"); } else if (AcpiDmIsPldBuffer (Op)) { Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD; AcpiOsPrintf ("ToPLD ("); } else { Op->Common.DisasmOpcode = ACPI_DASM_BUFFER; AcpiOsPrintf ("Buffer"); } break; case AML_INT_NAMEPATH_OP: AcpiDmNamestring (Op->Common.Value.Name); break; case AML_INT_NAMEDFIELD_OP: Length = AcpiDmDumpName (Op->Named.Name); AcpiOsPrintf (",%*.s %u", (unsigned) (5 - Length), " ", (UINT32) Op->Common.Value.Integer); AcpiDmCommaIfFieldMember (Op); Info->BitOffset += (UINT32) Op->Common.Value.Integer; break; case AML_INT_RESERVEDFIELD_OP: /* Offset() -- Must account for previous offsets */ Offset = (UINT32) Op->Common.Value.Integer; Info->BitOffset += Offset; if (Info->BitOffset % 8 == 0) { AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset)); } else { AcpiOsPrintf (" , %u", Offset); } AcpiDmCommaIfFieldMember (Op); break; case AML_INT_ACCESSFIELD_OP: case AML_INT_EXTACCESSFIELD_OP: AcpiOsPrintf ("AccessAs (%s, ", AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]); AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8)); if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP) { AcpiOsPrintf (" (0x%2.2X)", (unsigned) ((Op->Common.Value.Integer >> 16) & 0xFF)); } AcpiOsPrintf (")"); AcpiDmCommaIfFieldMember (Op); break; case AML_INT_CONNECTION_OP: /* * Two types of Connection() - one with a buffer object, the * other with a namestring that points to a buffer object. */ AcpiOsPrintf ("Connection ("); Child = Op->Common.Value.Arg; if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP) { AcpiOsPrintf ("\n"); Aml = Child->Named.Data; Length = (UINT32) Child->Common.Value.Integer; Info->Level += 1; Info->MappingOp = Op; Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length); Info->Level -= 1; AcpiDmIndent (Info->Level); } else { AcpiDmNamestring (Child->Common.Value.Name); } AcpiOsPrintf (")"); AcpiDmCommaIfFieldMember (Op); AcpiOsPrintf ("\n"); Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */ Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; break; case AML_INT_BYTELIST_OP: AcpiDmByteList (Info, Op); break; case AML_INT_METHODCALL_OP: Op = AcpiPsGetDepthNext (NULL, Op); Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; AcpiDmNamestring (Op->Common.Value.Name); break; default: /* Just get the opcode name and print it */ AcpiOsPrintf ("%s", OpInfo->Name); #ifdef ACPI_DEBUGGER if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) && (WalkState) && (WalkState->Results) && (WalkState->ResultCount)) { AcpiDmDecodeInternalObject ( WalkState->Results->Results.ObjDesc [ (WalkState->ResultCount - 1) % ACPI_RESULTS_FRAME_OBJ_NUM]); } #endif break; } } #endif /* ACPI_DISASSEMBLER */ Index: vendor-sys/acpica/dist/source/components/namespace/nsdump.c =================================================================== --- vendor-sys/acpica/dist/source/components/namespace/nsdump.c (revision 284518) +++ vendor-sys/acpica/dist/source/components/namespace/nsdump.c (revision 284519) @@ -1,937 +1,937 @@ /****************************************************************************** * * Module Name: nsdump - table dumping routines for debug * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpi.h" #include "accommon.h" #include "acnamesp.h" #include "acoutput.h" #define _COMPONENT ACPI_NAMESPACE ACPI_MODULE_NAME ("nsdump") /* Local prototypes */ #ifdef ACPI_OBSOLETE_FUNCTIONS void AcpiNsDumpRootDevices ( void); static ACPI_STATUS AcpiNsDumpOneDevice ( ACPI_HANDLE ObjHandle, UINT32 Level, void *Context, void **ReturnValue); #endif #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) static ACPI_STATUS AcpiNsDumpOneObjectPath ( ACPI_HANDLE ObjHandle, UINT32 Level, void *Context, void **ReturnValue); static ACPI_STATUS AcpiNsGetMaxDepth ( ACPI_HANDLE ObjHandle, UINT32 Level, void *Context, void **ReturnValue); /******************************************************************************* * * FUNCTION: AcpiNsPrintPathname * * PARAMETERS: NumSegments - Number of ACPI name segments * Pathname - The compressed (internal) path * * RETURN: None * * DESCRIPTION: Print an object's full namespace pathname * ******************************************************************************/ void AcpiNsPrintPathname ( UINT32 NumSegments, char *Pathname) { UINT32 i; ACPI_FUNCTION_NAME (NsPrintPathname); /* Check if debug output enabled */ if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_NAMES, ACPI_NAMESPACE)) { return; } /* Print the entire name */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[")); while (NumSegments) { for (i = 0; i < 4; i++) { - isprint (Pathname[i]) ? + isprint ((int) Pathname[i]) ? AcpiOsPrintf ("%c", Pathname[i]) : AcpiOsPrintf ("?"); } Pathname += ACPI_NAME_SIZE; NumSegments--; if (NumSegments) { AcpiOsPrintf ("."); } } AcpiOsPrintf ("]\n"); } /******************************************************************************* * * FUNCTION: AcpiNsDumpPathname * * PARAMETERS: Handle - Object * Msg - Prefix message * Level - Desired debug level * Component - Caller's component ID * * RETURN: None * * DESCRIPTION: Print an object's full namespace pathname * Manages allocation/freeing of a pathname buffer * ******************************************************************************/ void AcpiNsDumpPathname ( ACPI_HANDLE Handle, char *Msg, UINT32 Level, UINT32 Component) { ACPI_FUNCTION_TRACE (NsDumpPathname); /* Do this only if the requested debug level and component are enabled */ if (!ACPI_IS_DEBUG_ENABLED (Level, Component)) { return_VOID; } /* Convert handle to a full pathname and print it (with supplied message) */ AcpiNsPrintNodePathname (Handle, Msg); AcpiOsPrintf ("\n"); return_VOID; } /******************************************************************************* * * FUNCTION: AcpiNsDumpOneObject * * PARAMETERS: ObjHandle - Node to be dumped * Level - Nesting level of the handle * Context - Passed into WalkNamespace * ReturnValue - Not used * * RETURN: Status * * DESCRIPTION: Dump a single Node * This procedure is a UserFunction called by AcpiNsWalkNamespace. * ******************************************************************************/ ACPI_STATUS AcpiNsDumpOneObject ( ACPI_HANDLE ObjHandle, UINT32 Level, void *Context, void **ReturnValue) { ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context; ACPI_NAMESPACE_NODE *ThisNode; ACPI_OPERAND_OBJECT *ObjDesc = NULL; ACPI_OBJECT_TYPE ObjType; ACPI_OBJECT_TYPE Type; UINT32 BytesToDump; UINT32 DbgLevel; UINT32 i; ACPI_FUNCTION_NAME (NsDumpOneObject); /* Is output enabled? */ if (!(AcpiDbgLevel & Info->DebugLevel)) { return (AE_OK); } if (!ObjHandle) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Null object handle\n")); return (AE_OK); } ThisNode = AcpiNsValidateHandle (ObjHandle); if (!ThisNode) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Invalid object handle %p\n", ObjHandle)); return (AE_OK); } Type = ThisNode->Type; /* Check if the owner matches */ if ((Info->OwnerId != ACPI_OWNER_ID_MAX) && (Info->OwnerId != ThisNode->OwnerId)) { return (AE_OK); } if (!(Info->DisplayType & ACPI_DISPLAY_SHORT)) { /* Indent the object according to the level */ AcpiOsPrintf ("%2d%*s", (UINT32) Level - 1, (int) Level * 2, " "); /* Check the node type and name */ if (Type > ACPI_TYPE_LOCAL_MAX) { ACPI_WARNING ((AE_INFO, "Invalid ACPI Object Type 0x%08X", Type)); } AcpiOsPrintf ("%4.4s", AcpiUtGetNodeName (ThisNode)); } /* Now we can print out the pertinent information */ AcpiOsPrintf (" %-12s %p %2.2X ", AcpiUtGetTypeName (Type), ThisNode, ThisNode->OwnerId); DbgLevel = AcpiDbgLevel; AcpiDbgLevel = 0; ObjDesc = AcpiNsGetAttachedObject (ThisNode); AcpiDbgLevel = DbgLevel; /* Temp nodes are those nodes created by a control method */ if (ThisNode->Flags & ANOBJ_TEMPORARY) { AcpiOsPrintf ("(T) "); } switch (Info->DisplayType & ACPI_DISPLAY_MASK) { case ACPI_DISPLAY_SUMMARY: if (!ObjDesc) { /* No attached object. Some types should always have an object */ switch (Type) { case ACPI_TYPE_INTEGER: case ACPI_TYPE_PACKAGE: case ACPI_TYPE_BUFFER: case ACPI_TYPE_STRING: case ACPI_TYPE_METHOD: AcpiOsPrintf (""); break; default: break; } AcpiOsPrintf ("\n"); return (AE_OK); } switch (Type) { case ACPI_TYPE_PROCESSOR: AcpiOsPrintf ("ID %02X Len %02X Addr %8.8X%8.8X\n", ObjDesc->Processor.ProcId, ObjDesc->Processor.Length, ACPI_FORMAT_UINT64 (ObjDesc->Processor.Address)); break; case ACPI_TYPE_DEVICE: AcpiOsPrintf ("Notify Object: %p\n", ObjDesc); break; case ACPI_TYPE_METHOD: AcpiOsPrintf ("Args %X Len %.4X Aml %p\n", (UINT32) ObjDesc->Method.ParamCount, ObjDesc->Method.AmlLength, ObjDesc->Method.AmlStart); break; case ACPI_TYPE_INTEGER: AcpiOsPrintf ("= %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); break; case ACPI_TYPE_PACKAGE: if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) { AcpiOsPrintf ("Elements %.2X\n", ObjDesc->Package.Count); } else { AcpiOsPrintf ("[Length not yet evaluated]\n"); } break; case ACPI_TYPE_BUFFER: if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) { AcpiOsPrintf ("Len %.2X", ObjDesc->Buffer.Length); /* Dump some of the buffer */ if (ObjDesc->Buffer.Length > 0) { AcpiOsPrintf (" ="); for (i = 0; (i < ObjDesc->Buffer.Length && i < 12); i++) { AcpiOsPrintf (" %.2hX", ObjDesc->Buffer.Pointer[i]); } } AcpiOsPrintf ("\n"); } else { AcpiOsPrintf ("[Length not yet evaluated]\n"); } break; case ACPI_TYPE_STRING: AcpiOsPrintf ("Len %.2X ", ObjDesc->String.Length); AcpiUtPrintString (ObjDesc->String.Pointer, 32); AcpiOsPrintf ("\n"); break; case ACPI_TYPE_REGION: AcpiOsPrintf ("[%s]", AcpiUtGetRegionName (ObjDesc->Region.SpaceId)); if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) { AcpiOsPrintf (" Addr %8.8X%8.8X Len %.4X\n", ACPI_FORMAT_UINT64 (ObjDesc->Region.Address), ObjDesc->Region.Length); } else { AcpiOsPrintf (" [Address/Length not yet evaluated]\n"); } break; case ACPI_TYPE_LOCAL_REFERENCE: AcpiOsPrintf ("[%s]\n", AcpiUtGetReferenceName (ObjDesc)); break; case ACPI_TYPE_BUFFER_FIELD: if (ObjDesc->BufferField.BufferObj && ObjDesc->BufferField.BufferObj->Buffer.Node) { AcpiOsPrintf ("Buf [%4.4s]", AcpiUtGetNodeName ( ObjDesc->BufferField.BufferObj->Buffer.Node)); } break; case ACPI_TYPE_LOCAL_REGION_FIELD: AcpiOsPrintf ("Rgn [%4.4s]", AcpiUtGetNodeName ( ObjDesc->CommonField.RegionObj->Region.Node)); break; case ACPI_TYPE_LOCAL_BANK_FIELD: AcpiOsPrintf ("Rgn [%4.4s] Bnk [%4.4s]", AcpiUtGetNodeName ( ObjDesc->CommonField.RegionObj->Region.Node), AcpiUtGetNodeName ( ObjDesc->BankField.BankObj->CommonField.Node)); break; case ACPI_TYPE_LOCAL_INDEX_FIELD: AcpiOsPrintf ("Idx [%4.4s] Dat [%4.4s]", AcpiUtGetNodeName ( ObjDesc->IndexField.IndexObj->CommonField.Node), AcpiUtGetNodeName ( ObjDesc->IndexField.DataObj->CommonField.Node)); break; case ACPI_TYPE_LOCAL_ALIAS: case ACPI_TYPE_LOCAL_METHOD_ALIAS: AcpiOsPrintf ("Target %4.4s (%p)\n", AcpiUtGetNodeName (ObjDesc), ObjDesc); break; default: AcpiOsPrintf ("Object %p\n", ObjDesc); break; } /* Common field handling */ switch (Type) { case ACPI_TYPE_BUFFER_FIELD: case ACPI_TYPE_LOCAL_REGION_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD: AcpiOsPrintf (" Off %.3X Len %.2X Acc %.2hd\n", (ObjDesc->CommonField.BaseByteOffset * 8) + ObjDesc->CommonField.StartFieldBitOffset, ObjDesc->CommonField.BitLength, ObjDesc->CommonField.AccessByteWidth); break; default: break; } break; case ACPI_DISPLAY_OBJECTS: AcpiOsPrintf ("O:%p", ObjDesc); if (!ObjDesc) { /* No attached object, we are done */ AcpiOsPrintf ("\n"); return (AE_OK); } AcpiOsPrintf ("(R%u)", ObjDesc->Common.ReferenceCount); switch (Type) { case ACPI_TYPE_METHOD: /* Name is a Method and its AML offset/length are set */ AcpiOsPrintf (" M:%p-%X\n", ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength); break; case ACPI_TYPE_INTEGER: AcpiOsPrintf (" I:%8.8X8.8%X\n", ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); break; case ACPI_TYPE_STRING: AcpiOsPrintf (" S:%p-%X\n", ObjDesc->String.Pointer, ObjDesc->String.Length); break; case ACPI_TYPE_BUFFER: AcpiOsPrintf (" B:%p-%X\n", ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length); break; default: AcpiOsPrintf ("\n"); break; } break; default: AcpiOsPrintf ("\n"); break; } /* If debug turned off, done */ if (!(AcpiDbgLevel & ACPI_LV_VALUES)) { return (AE_OK); } /* If there is an attached object, display it */ DbgLevel = AcpiDbgLevel; AcpiDbgLevel = 0; ObjDesc = AcpiNsGetAttachedObject (ThisNode); AcpiDbgLevel = DbgLevel; /* Dump attached objects */ while (ObjDesc) { ObjType = ACPI_TYPE_INVALID; AcpiOsPrintf ("Attached Object %p: ", ObjDesc); /* Decode the type of attached object and dump the contents */ switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc)) { case ACPI_DESC_TYPE_NAMED: AcpiOsPrintf ("(Ptr to Node)\n"); BytesToDump = sizeof (ACPI_NAMESPACE_NODE); ACPI_DUMP_BUFFER (ObjDesc, BytesToDump); break; case ACPI_DESC_TYPE_OPERAND: ObjType = ObjDesc->Common.Type; if (ObjType > ACPI_TYPE_LOCAL_MAX) { AcpiOsPrintf ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n", ObjType); BytesToDump = 32; } else { AcpiOsPrintf ("(Pointer to ACPI Object type %.2X [%s])\n", ObjType, AcpiUtGetTypeName (ObjType)); BytesToDump = sizeof (ACPI_OPERAND_OBJECT); } ACPI_DUMP_BUFFER (ObjDesc, BytesToDump); break; default: break; } /* If value is NOT an internal object, we are done */ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) { goto Cleanup; } /* Valid object, get the pointer to next level, if any */ switch (ObjType) { case ACPI_TYPE_BUFFER: case ACPI_TYPE_STRING: /* * NOTE: takes advantage of common fields between string/buffer */ BytesToDump = ObjDesc->String.Length; ObjDesc = (void *) ObjDesc->String.Pointer; AcpiOsPrintf ( "(Buffer/String pointer %p length %X)\n", ObjDesc, BytesToDump); ACPI_DUMP_BUFFER (ObjDesc, BytesToDump); goto Cleanup; case ACPI_TYPE_BUFFER_FIELD: ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->BufferField.BufferObj; break; case ACPI_TYPE_PACKAGE: ObjDesc = (void *) ObjDesc->Package.Elements; break; case ACPI_TYPE_METHOD: ObjDesc = (void *) ObjDesc->Method.AmlStart; break; case ACPI_TYPE_LOCAL_REGION_FIELD: ObjDesc = (void *) ObjDesc->Field.RegionObj; break; case ACPI_TYPE_LOCAL_BANK_FIELD: ObjDesc = (void *) ObjDesc->BankField.RegionObj; break; case ACPI_TYPE_LOCAL_INDEX_FIELD: ObjDesc = (void *) ObjDesc->IndexField.IndexObj; break; default: goto Cleanup; } ObjType = ACPI_TYPE_INVALID; /* Terminate loop after next pass */ } Cleanup: AcpiOsPrintf ("\n"); return (AE_OK); } /******************************************************************************* * * FUNCTION: AcpiNsDumpObjects * * PARAMETERS: Type - Object type to be dumped * DisplayType - 0 or ACPI_DISPLAY_SUMMARY * MaxDepth - Maximum depth of dump. Use ACPI_UINT32_MAX * for an effectively unlimited depth. * OwnerId - Dump only objects owned by this ID. Use * ACPI_UINT32_MAX to match all owners. * StartHandle - Where in namespace to start/end search * * RETURN: None * * DESCRIPTION: Dump typed objects within the loaded namespace. Uses * AcpiNsWalkNamespace in conjunction with AcpiNsDumpOneObject. * ******************************************************************************/ void AcpiNsDumpObjects ( ACPI_OBJECT_TYPE Type, UINT8 DisplayType, UINT32 MaxDepth, ACPI_OWNER_ID OwnerId, ACPI_HANDLE StartHandle) { ACPI_WALK_INFO Info; ACPI_STATUS Status; ACPI_FUNCTION_ENTRY (); /* * Just lock the entire namespace for the duration of the dump. * We don't want any changes to the namespace during this time, * especially the temporary nodes since we are going to display * them also. */ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not acquire namespace mutex\n"); return; } Info.DebugLevel = ACPI_LV_TABLES; Info.OwnerId = OwnerId; Info.DisplayType = DisplayType; (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth, ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES, AcpiNsDumpOneObject, NULL, (void *) &Info, NULL); (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); } /******************************************************************************* * * FUNCTION: AcpiNsDumpOneObjectPath, AcpiNsGetMaxDepth * * PARAMETERS: ObjHandle - Node to be dumped * Level - Nesting level of the handle * Context - Passed into WalkNamespace * ReturnValue - Not used * * RETURN: Status * * DESCRIPTION: Dump the full pathname to a namespace object. AcpNsGetMaxDepth * computes the maximum nesting depth in the namespace tree, in * order to simplify formatting in AcpiNsDumpOneObjectPath. * These procedures are UserFunctions called by AcpiNsWalkNamespace. * ******************************************************************************/ static ACPI_STATUS AcpiNsDumpOneObjectPath ( ACPI_HANDLE ObjHandle, UINT32 Level, void *Context, void **ReturnValue) { UINT32 MaxLevel = *((UINT32 *) Context); char *Pathname; ACPI_NAMESPACE_NODE *Node; int PathIndent; if (!ObjHandle) { return (AE_OK); } Node = AcpiNsValidateHandle (ObjHandle); if (!Node) { /* Ignore bad node during namespace walk */ return (AE_OK); } Pathname = AcpiNsGetExternalPathname (Node); PathIndent = 1; if (Level <= MaxLevel) { PathIndent = MaxLevel - Level + 1; } AcpiOsPrintf ("%2d%*s%-12s%*s", Level, Level, " ", AcpiUtGetTypeName (Node->Type), PathIndent, " "); AcpiOsPrintf ("%s\n", &Pathname[1]); ACPI_FREE (Pathname); return (AE_OK); } static ACPI_STATUS AcpiNsGetMaxDepth ( ACPI_HANDLE ObjHandle, UINT32 Level, void *Context, void **ReturnValue) { UINT32 *MaxLevel = (UINT32 *) Context; if (Level > *MaxLevel) { *MaxLevel = Level; } return (AE_OK); } /******************************************************************************* * * FUNCTION: AcpiNsDumpObjectPaths * * PARAMETERS: Type - Object type to be dumped * DisplayType - 0 or ACPI_DISPLAY_SUMMARY * MaxDepth - Maximum depth of dump. Use ACPI_UINT32_MAX * for an effectively unlimited depth. * OwnerId - Dump only objects owned by this ID. Use * ACPI_UINT32_MAX to match all owners. * StartHandle - Where in namespace to start/end search * * RETURN: None * * DESCRIPTION: Dump full object pathnames within the loaded namespace. Uses * AcpiNsWalkNamespace in conjunction with AcpiNsDumpOneObjectPath. * ******************************************************************************/ void AcpiNsDumpObjectPaths ( ACPI_OBJECT_TYPE Type, UINT8 DisplayType, UINT32 MaxDepth, ACPI_OWNER_ID OwnerId, ACPI_HANDLE StartHandle) { ACPI_STATUS Status; UINT32 MaxLevel = 0; ACPI_FUNCTION_ENTRY (); /* * Just lock the entire namespace for the duration of the dump. * We don't want any changes to the namespace during this time, * especially the temporary nodes since we are going to display * them also. */ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not acquire namespace mutex\n"); return; } /* Get the max depth of the namespace tree, for formatting later */ (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth, ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES, AcpiNsGetMaxDepth, NULL, (void *) &MaxLevel, NULL); /* Now dump the entire namespace */ (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth, ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES, AcpiNsDumpOneObjectPath, NULL, (void *) &MaxLevel, NULL); (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); } /******************************************************************************* * * FUNCTION: AcpiNsDumpEntry * * PARAMETERS: Handle - Node to be dumped * DebugLevel - Output level * * RETURN: None * * DESCRIPTION: Dump a single Node * ******************************************************************************/ void AcpiNsDumpEntry ( ACPI_HANDLE Handle, UINT32 DebugLevel) { ACPI_WALK_INFO Info; ACPI_FUNCTION_ENTRY (); Info.DebugLevel = DebugLevel; Info.OwnerId = ACPI_OWNER_ID_MAX; Info.DisplayType = ACPI_DISPLAY_SUMMARY; (void) AcpiNsDumpOneObject (Handle, 1, &Info, NULL); } #ifdef ACPI_ASL_COMPILER /******************************************************************************* * * FUNCTION: AcpiNsDumpTables * * PARAMETERS: SearchBase - Root of subtree to be dumped, or * NS_ALL to dump the entire namespace * MaxDepth - Maximum depth of dump. Use INT_MAX * for an effectively unlimited depth. * * RETURN: None * * DESCRIPTION: Dump the name space, or a portion of it. * ******************************************************************************/ void AcpiNsDumpTables ( ACPI_HANDLE SearchBase, UINT32 MaxDepth) { ACPI_HANDLE SearchHandle = SearchBase; ACPI_FUNCTION_TRACE (NsDumpTables); if (!AcpiGbl_RootNode) { /* * If the name space has not been initialized, * there is nothing to dump. */ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "namespace not initialized!\n")); return_VOID; } if (ACPI_NS_ALL == SearchBase) { /* Entire namespace */ SearchHandle = AcpiGbl_RootNode; ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "\\\n")); } AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, MaxDepth, ACPI_OWNER_ID_MAX, SearchHandle); return_VOID; } #endif #endif Index: vendor-sys/acpica/dist/source/components/namespace/nsrepair2.c =================================================================== --- vendor-sys/acpica/dist/source/components/namespace/nsrepair2.c (revision 284518) +++ vendor-sys/acpica/dist/source/components/namespace/nsrepair2.c (revision 284519) @@ -1,1074 +1,1074 @@ /****************************************************************************** * * Module Name: nsrepair2 - Repair for objects returned by specific * predefined methods * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpi.h" #include "accommon.h" #include "acnamesp.h" #define _COMPONENT ACPI_NAMESPACE ACPI_MODULE_NAME ("nsrepair2") /* * Information structure and handler for ACPI predefined names that can * be repaired on a per-name basis. */ typedef ACPI_STATUS (*ACPI_REPAIR_FUNCTION) ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); typedef struct acpi_repair_info { char Name[ACPI_NAME_SIZE]; ACPI_REPAIR_FUNCTION RepairFunction; } ACPI_REPAIR_INFO; /* Local prototypes */ static const ACPI_REPAIR_INFO * AcpiNsMatchComplexRepair ( ACPI_NAMESPACE_NODE *Node); static ACPI_STATUS AcpiNsRepair_ALR ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_CID ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_CST ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_FDE ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_HID ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_PRT ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_PSS ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_TSS ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsCheckSortedList ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT *ReturnObject, UINT32 StartIndex, UINT32 ExpectedCount, UINT32 SortIndex, UINT8 SortDirection, char *SortKeyName); /* Values for SortDirection above */ #define ACPI_SORT_ASCENDING 0 #define ACPI_SORT_DESCENDING 1 static void AcpiNsRemoveElement ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 Index); static void AcpiNsSortList ( ACPI_OPERAND_OBJECT **Elements, UINT32 Count, UINT32 Index, UINT8 SortDirection); /* * This table contains the names of the predefined methods for which we can * perform more complex repairs. * * As necessary: * * _ALR: Sort the list ascending by AmbientIlluminance * _CID: Strings: uppercase all, remove any leading asterisk * _CST: Sort the list ascending by C state type * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs * _HID: Strings: uppercase all, remove any leading asterisk * _PRT: Fix reversed SourceName and SourceIndex * _PSS: Sort the list descending by Power * _TSS: Sort the list descending by Power * * Names that must be packages, but cannot be sorted: * * _BCL: Values are tied to the Package index where they appear, and cannot * be moved or sorted. These index values are used for _BQC and _BCM. * However, we can fix the case where a buffer is returned, by converting * it to a Package of integers. */ static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] = { {"_ALR", AcpiNsRepair_ALR}, {"_CID", AcpiNsRepair_CID}, {"_CST", AcpiNsRepair_CST}, {"_FDE", AcpiNsRepair_FDE}, {"_GTM", AcpiNsRepair_FDE}, /* _GTM has same repair as _FDE */ {"_HID", AcpiNsRepair_HID}, {"_PRT", AcpiNsRepair_PRT}, {"_PSS", AcpiNsRepair_PSS}, {"_TSS", AcpiNsRepair_TSS}, {{0,0,0,0}, NULL} /* Table terminator */ }; #define ACPI_FDE_FIELD_COUNT 5 #define ACPI_FDE_BYTE_BUFFER_SIZE 5 #define ACPI_FDE_DWORD_BUFFER_SIZE (ACPI_FDE_FIELD_COUNT * sizeof (UINT32)) /****************************************************************************** * * FUNCTION: AcpiNsComplexRepairs * * PARAMETERS: Info - Method execution information block * Node - Namespace node for the method/object * ValidateStatus - Original status of earlier validation * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if repair was successful. If name is not * matched, ValidateStatus is returned. * * DESCRIPTION: Attempt to repair/convert a return object of a type that was * not expected. * *****************************************************************************/ ACPI_STATUS AcpiNsComplexRepairs ( ACPI_EVALUATE_INFO *Info, ACPI_NAMESPACE_NODE *Node, ACPI_STATUS ValidateStatus, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { const ACPI_REPAIR_INFO *Predefined; ACPI_STATUS Status; /* Check if this name is in the list of repairable names */ Predefined = AcpiNsMatchComplexRepair (Node); if (!Predefined) { return (ValidateStatus); } Status = Predefined->RepairFunction (Info, ReturnObjectPtr); return (Status); } /****************************************************************************** * * FUNCTION: AcpiNsMatchComplexRepair * * PARAMETERS: Node - Namespace node for the method/object * * RETURN: Pointer to entry in repair table. NULL indicates not found. * * DESCRIPTION: Check an object name against the repairable object list. * *****************************************************************************/ static const ACPI_REPAIR_INFO * AcpiNsMatchComplexRepair ( ACPI_NAMESPACE_NODE *Node) { const ACPI_REPAIR_INFO *ThisName; /* Search info table for a repairable predefined method/object name */ ThisName = AcpiNsRepairableNames; while (ThisName->RepairFunction) { if (ACPI_COMPARE_NAME (Node->Name.Ascii, ThisName->Name)) { return (ThisName); } ThisName++; } return (NULL); /* Not found */ } /****************************************************************************** * * FUNCTION: AcpiNsRepair_ALR * * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * * DESCRIPTION: Repair for the _ALR object. If necessary, sort the object list * ascending by the ambient illuminance values. * *****************************************************************************/ static ACPI_STATUS AcpiNsRepair_ALR ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_STATUS Status; Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 2, 1, ACPI_SORT_ASCENDING, "AmbientIlluminance"); return (Status); } /****************************************************************************** * * FUNCTION: AcpiNsRepair_FDE * * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * * DESCRIPTION: Repair for the _FDE and _GTM objects. The expected return * value is a Buffer of 5 DWORDs. This function repairs a common * problem where the return value is a Buffer of BYTEs, not * DWORDs. * *****************************************************************************/ static ACPI_STATUS AcpiNsRepair_FDE ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_OPERAND_OBJECT *BufferObject; UINT8 *ByteBuffer; UINT32 *DwordBuffer; UINT32 i; ACPI_FUNCTION_NAME (NsRepair_FDE); switch (ReturnObject->Common.Type) { case ACPI_TYPE_BUFFER: /* This is the expected type. Length should be (at least) 5 DWORDs */ if (ReturnObject->Buffer.Length >= ACPI_FDE_DWORD_BUFFER_SIZE) { return (AE_OK); } /* We can only repair if we have exactly 5 BYTEs */ if (ReturnObject->Buffer.Length != ACPI_FDE_BYTE_BUFFER_SIZE) { ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Incorrect return buffer length %u, expected %u", ReturnObject->Buffer.Length, ACPI_FDE_DWORD_BUFFER_SIZE)); return (AE_AML_OPERAND_TYPE); } /* Create the new (larger) buffer object */ BufferObject = AcpiUtCreateBufferObject (ACPI_FDE_DWORD_BUFFER_SIZE); if (!BufferObject) { return (AE_NO_MEMORY); } /* Expand each byte to a DWORD */ ByteBuffer = ReturnObject->Buffer.Pointer; DwordBuffer = ACPI_CAST_PTR (UINT32, BufferObject->Buffer.Pointer); for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++) { *DwordBuffer = (UINT32) *ByteBuffer; DwordBuffer++; ByteBuffer++; } ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s Expanded Byte Buffer to expected DWord Buffer\n", Info->FullPathname)); break; default: return (AE_AML_OPERAND_TYPE); } /* Delete the original return object, return the new buffer object */ AcpiUtRemoveReference (ReturnObject); *ReturnObjectPtr = BufferObject; Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; return (AE_OK); } /****************************************************************************** * * FUNCTION: AcpiNsRepair_CID * * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * * DESCRIPTION: Repair for the _CID object. If a string, ensure that all * letters are uppercase and that there is no leading asterisk. * If a Package, ensure same for all string elements. * *****************************************************************************/ static ACPI_STATUS AcpiNsRepair_CID ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_STATUS Status; ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_OPERAND_OBJECT **ElementPtr; ACPI_OPERAND_OBJECT *OriginalElement; UINT16 OriginalRefCount; UINT32 i; /* Check for _CID as a simple string */ if (ReturnObject->Common.Type == ACPI_TYPE_STRING) { Status = AcpiNsRepair_HID (Info, ReturnObjectPtr); return (Status); } /* Exit if not a Package */ if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE) { return (AE_OK); } /* Examine each element of the _CID package */ ElementPtr = ReturnObject->Package.Elements; for (i = 0; i < ReturnObject->Package.Count; i++) { OriginalElement = *ElementPtr; OriginalRefCount = OriginalElement->Common.ReferenceCount; Status = AcpiNsRepair_HID (Info, ElementPtr); if (ACPI_FAILURE (Status)) { return (Status); } /* Take care with reference counts */ if (OriginalElement != *ElementPtr) { /* Element was replaced */ (*ElementPtr)->Common.ReferenceCount = OriginalRefCount; AcpiUtRemoveReference (OriginalElement); } ElementPtr++; } return (AE_OK); } /****************************************************************************** * * FUNCTION: AcpiNsRepair_CST * * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * * DESCRIPTION: Repair for the _CST object: * 1. Sort the list ascending by C state type * 2. Ensure type cannot be zero * 3. A subpackage count of zero means _CST is meaningless * 4. Count must match the number of C state subpackages * *****************************************************************************/ static ACPI_STATUS AcpiNsRepair_CST ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_OPERAND_OBJECT **OuterElements; UINT32 OuterElementCount; ACPI_OPERAND_OBJECT *ObjDesc; ACPI_STATUS Status; BOOLEAN Removing; UINT32 i; ACPI_FUNCTION_NAME (NsRepair_CST); /* * Check if the C-state type values are proportional. */ OuterElementCount = ReturnObject->Package.Count - 1; i = 0; while (i < OuterElementCount) { OuterElements = &ReturnObject->Package.Elements[i + 1]; Removing = FALSE; if ((*OuterElements)->Package.Count == 0) { ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "SubPackage[%u] - removing entry due to zero count", i)); Removing = TRUE; goto RemoveElement; } ObjDesc = (*OuterElements)->Package.Elements[1]; /* Index1 = Type */ if ((UINT32) ObjDesc->Integer.Value == 0) { ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "SubPackage[%u] - removing entry due to invalid Type(0)", i)); Removing = TRUE; } RemoveElement: if (Removing) { AcpiNsRemoveElement (ReturnObject, i + 1); OuterElementCount--; } else { i++; } } /* Update top-level package count, Type "Integer" checked elsewhere */ ObjDesc = ReturnObject->Package.Elements[0]; ObjDesc->Integer.Value = OuterElementCount; /* * Entries (subpackages) in the _CST Package must be sorted by the * C-state type, in ascending order. */ Status = AcpiNsCheckSortedList (Info, ReturnObject, 1, 4, 1, ACPI_SORT_ASCENDING, "C-State Type"); if (ACPI_FAILURE (Status)) { return (Status); } return (AE_OK); } /****************************************************************************** * * FUNCTION: AcpiNsRepair_HID * * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * * DESCRIPTION: Repair for the _HID object. If a string, ensure that all * letters are uppercase and that there is no leading asterisk. * *****************************************************************************/ static ACPI_STATUS AcpiNsRepair_HID ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_OPERAND_OBJECT *NewString; char *Source; char *Dest; ACPI_FUNCTION_NAME (NsRepair_HID); /* We only care about string _HID objects (not integers) */ if (ReturnObject->Common.Type != ACPI_TYPE_STRING) { return (AE_OK); } if (ReturnObject->String.Length == 0) { ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Invalid zero-length _HID or _CID string")); /* Return AE_OK anyway, let driver handle it */ Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; return (AE_OK); } /* It is simplest to always create a new string object */ NewString = AcpiUtCreateStringObject (ReturnObject->String.Length); if (!NewString) { return (AE_NO_MEMORY); } /* * Remove a leading asterisk if present. For some unknown reason, there * are many machines in the field that contains IDs like this. * * Examples: "*PNP0C03", "*ACPI0003" */ Source = ReturnObject->String.Pointer; if (*Source == '*') { Source++; NewString->String.Length--; ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Removed invalid leading asterisk\n", Info->FullPathname)); } /* * Copy and uppercase the string. From the ACPI 5.0 specification: * * A valid PNP ID must be of the form "AAA####" where A is an uppercase * letter and # is a hex digit. A valid ACPI ID must be of the form * "NNNN####" where N is an uppercase letter or decimal digit, and * # is a hex digit. */ for (Dest = NewString->String.Pointer; *Source; Dest++, Source++) { - *Dest = (char) toupper (*Source); + *Dest = (char) toupper ((int) *Source); } AcpiUtRemoveReference (ReturnObject); *ReturnObjectPtr = NewString; return (AE_OK); } /****************************************************************************** * * FUNCTION: AcpiNsRepair_PRT * * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * * DESCRIPTION: Repair for the _PRT object. If necessary, fix reversed * SourceName and SourceIndex field, a common BIOS bug. * *****************************************************************************/ static ACPI_STATUS AcpiNsRepair_PRT ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *PackageObject = *ReturnObjectPtr; ACPI_OPERAND_OBJECT **TopObjectList; ACPI_OPERAND_OBJECT **SubObjectList; ACPI_OPERAND_OBJECT *ObjDesc; ACPI_OPERAND_OBJECT *SubPackage; UINT32 ElementCount; UINT32 Index; /* Each element in the _PRT package is a subpackage */ TopObjectList = PackageObject->Package.Elements; ElementCount = PackageObject->Package.Count; /* Examine each subpackage */ for (Index = 0; Index < ElementCount; Index++, TopObjectList++) { SubPackage = *TopObjectList; SubObjectList = SubPackage->Package.Elements; /* Check for minimum required element count */ if (SubPackage->Package.Count < 4) { continue; } /* * If the BIOS has erroneously reversed the _PRT SourceName (index 2) * and the SourceIndex (index 3), fix it. _PRT is important enough to * workaround this BIOS error. This also provides compatibility with * other ACPI implementations. */ ObjDesc = SubObjectList[3]; if (!ObjDesc || (ObjDesc->Common.Type != ACPI_TYPE_INTEGER)) { SubObjectList[3] = SubObjectList[2]; SubObjectList[2] = ObjDesc; Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "PRT[%X]: Fixed reversed SourceName and SourceIndex", Index)); } } return (AE_OK); } /****************************************************************************** * * FUNCTION: AcpiNsRepair_PSS * * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * * DESCRIPTION: Repair for the _PSS object. If necessary, sort the object list * by the CPU frequencies. Check that the power dissipation values * are all proportional to CPU frequency (i.e., sorting by * frequency should be the same as sorting by power.) * *****************************************************************************/ static ACPI_STATUS AcpiNsRepair_PSS ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_OPERAND_OBJECT **OuterElements; UINT32 OuterElementCount; ACPI_OPERAND_OBJECT **Elements; ACPI_OPERAND_OBJECT *ObjDesc; UINT32 PreviousValue; ACPI_STATUS Status; UINT32 i; /* * Entries (subpackages) in the _PSS Package must be sorted by power * dissipation, in descending order. If it appears that the list is * incorrectly sorted, sort it. We sort by CpuFrequency, since this * should be proportional to the power. */ Status =AcpiNsCheckSortedList (Info, ReturnObject, 0, 6, 0, ACPI_SORT_DESCENDING, "CpuFrequency"); if (ACPI_FAILURE (Status)) { return (Status); } /* * We now know the list is correctly sorted by CPU frequency. Check if * the power dissipation values are proportional. */ PreviousValue = ACPI_UINT32_MAX; OuterElements = ReturnObject->Package.Elements; OuterElementCount = ReturnObject->Package.Count; for (i = 0; i < OuterElementCount; i++) { Elements = (*OuterElements)->Package.Elements; ObjDesc = Elements[1]; /* Index1 = PowerDissipation */ if ((UINT32) ObjDesc->Integer.Value > PreviousValue) { ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "SubPackage[%u,%u] - suspicious power dissipation values", i-1, i)); } PreviousValue = (UINT32) ObjDesc->Integer.Value; OuterElements++; } return (AE_OK); } /****************************************************************************** * * FUNCTION: AcpiNsRepair_TSS * * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list * descending by the power dissipation values. * *****************************************************************************/ static ACPI_STATUS AcpiNsRepair_TSS ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_STATUS Status; ACPI_NAMESPACE_NODE *Node; /* * We can only sort the _TSS return package if there is no _PSS in the * same scope. This is because if _PSS is present, the ACPI specification * dictates that the _TSS Power Dissipation field is to be ignored, and * therefore some BIOSs leave garbage values in the _TSS Power field(s). * In this case, it is best to just return the _TSS package as-is. * (May, 2011) */ Status = AcpiNsGetNode (Info->Node, "^_PSS", ACPI_NS_NO_UPSEARCH, &Node); if (ACPI_SUCCESS (Status)) { return (AE_OK); } Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 5, 1, ACPI_SORT_DESCENDING, "PowerDissipation"); return (Status); } /****************************************************************************** * * FUNCTION: AcpiNsCheckSortedList * * PARAMETERS: Info - Method execution information block * ReturnObject - Pointer to the top-level returned object * StartIndex - Index of the first subpackage * ExpectedCount - Minimum length of each subpackage * SortIndex - Subpackage entry to sort on * SortDirection - Ascending or descending * SortKeyName - Name of the SortIndex field * * RETURN: Status. AE_OK if the list is valid and is sorted correctly or * has been repaired by sorting the list. * * DESCRIPTION: Check if the package list is valid and sorted correctly by the * SortIndex. If not, then sort the list. * *****************************************************************************/ static ACPI_STATUS AcpiNsCheckSortedList ( ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT *ReturnObject, UINT32 StartIndex, UINT32 ExpectedCount, UINT32 SortIndex, UINT8 SortDirection, char *SortKeyName) { UINT32 OuterElementCount; ACPI_OPERAND_OBJECT **OuterElements; ACPI_OPERAND_OBJECT **Elements; ACPI_OPERAND_OBJECT *ObjDesc; UINT32 i; UINT32 PreviousValue; ACPI_FUNCTION_NAME (NsCheckSortedList); /* The top-level object must be a package */ if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE) { return (AE_AML_OPERAND_TYPE); } /* * NOTE: assumes list of subpackages contains no NULL elements. * Any NULL elements should have been removed by earlier call * to AcpiNsRemoveNullElements. */ OuterElementCount = ReturnObject->Package.Count; if (!OuterElementCount || StartIndex >= OuterElementCount) { return (AE_AML_PACKAGE_LIMIT); } OuterElements = &ReturnObject->Package.Elements[StartIndex]; OuterElementCount -= StartIndex; PreviousValue = 0; if (SortDirection == ACPI_SORT_DESCENDING) { PreviousValue = ACPI_UINT32_MAX; } /* Examine each subpackage */ for (i = 0; i < OuterElementCount; i++) { /* Each element of the top-level package must also be a package */ if ((*OuterElements)->Common.Type != ACPI_TYPE_PACKAGE) { return (AE_AML_OPERAND_TYPE); } /* Each subpackage must have the minimum length */ if ((*OuterElements)->Package.Count < ExpectedCount) { return (AE_AML_PACKAGE_LIMIT); } Elements = (*OuterElements)->Package.Elements; ObjDesc = Elements[SortIndex]; if (ObjDesc->Common.Type != ACPI_TYPE_INTEGER) { return (AE_AML_OPERAND_TYPE); } /* * The list must be sorted in the specified order. If we detect a * discrepancy, sort the entire list. */ if (((SortDirection == ACPI_SORT_ASCENDING) && (ObjDesc->Integer.Value < PreviousValue)) || ((SortDirection == ACPI_SORT_DESCENDING) && (ObjDesc->Integer.Value > PreviousValue))) { AcpiNsSortList (&ReturnObject->Package.Elements[StartIndex], OuterElementCount, SortIndex, SortDirection); Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Repaired unsorted list - now sorted by %s\n", Info->FullPathname, SortKeyName)); return (AE_OK); } PreviousValue = (UINT32) ObjDesc->Integer.Value; OuterElements++; } return (AE_OK); } /****************************************************************************** * * FUNCTION: AcpiNsSortList * * PARAMETERS: Elements - Package object element list * Count - Element count for above * Index - Sort by which package element * SortDirection - Ascending or Descending sort * * RETURN: None * * DESCRIPTION: Sort the objects that are in a package element list. * * NOTE: Assumes that all NULL elements have been removed from the package, * and that all elements have been verified to be of type Integer. * *****************************************************************************/ static void AcpiNsSortList ( ACPI_OPERAND_OBJECT **Elements, UINT32 Count, UINT32 Index, UINT8 SortDirection) { ACPI_OPERAND_OBJECT *ObjDesc1; ACPI_OPERAND_OBJECT *ObjDesc2; ACPI_OPERAND_OBJECT *TempObj; UINT32 i; UINT32 j; /* Simple bubble sort */ for (i = 1; i < Count; i++) { for (j = (Count - 1); j >= i; j--) { ObjDesc1 = Elements[j-1]->Package.Elements[Index]; ObjDesc2 = Elements[j]->Package.Elements[Index]; if (((SortDirection == ACPI_SORT_ASCENDING) && (ObjDesc1->Integer.Value > ObjDesc2->Integer.Value)) || ((SortDirection == ACPI_SORT_DESCENDING) && (ObjDesc1->Integer.Value < ObjDesc2->Integer.Value))) { TempObj = Elements[j-1]; Elements[j-1] = Elements[j]; Elements[j] = TempObj; } } } } /****************************************************************************** * * FUNCTION: AcpiNsRemoveElement * * PARAMETERS: ObjDesc - Package object element list * Index - Index of element to remove * * RETURN: None * * DESCRIPTION: Remove the requested element of a package and delete it. * *****************************************************************************/ static void AcpiNsRemoveElement ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 Index) { ACPI_OPERAND_OBJECT **Source; ACPI_OPERAND_OBJECT **Dest; UINT32 Count; UINT32 NewCount; UINT32 i; ACPI_FUNCTION_NAME (NsRemoveElement); Count = ObjDesc->Package.Count; NewCount = Count - 1; Source = ObjDesc->Package.Elements; Dest = Source; /* Examine all elements of the package object, remove matched index */ for (i = 0; i < Count; i++) { if (i == Index) { AcpiUtRemoveReference (*Source); /* Remove one ref for being in pkg */ AcpiUtRemoveReference (*Source); } else { *Dest = *Source; Dest++; } Source++; } /* NULL terminate list and update the package count */ *Dest = NULL; ObjDesc->Package.Count = NewCount; } Index: vendor-sys/acpica/dist/source/components/tables/tbprint.c =================================================================== --- vendor-sys/acpica/dist/source/components/tables/tbprint.c (revision 284518) +++ vendor-sys/acpica/dist/source/components/tables/tbprint.c (revision 284519) @@ -1,271 +1,271 @@ /****************************************************************************** * * Module Name: tbprint - Table output utilities * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpi.h" #include "accommon.h" #include "actables.h" #define _COMPONENT ACPI_TABLES ACPI_MODULE_NAME ("tbprint") /* Local prototypes */ static void AcpiTbFixString ( char *String, ACPI_SIZE Length); static void AcpiTbCleanupTableHeader ( ACPI_TABLE_HEADER *OutHeader, ACPI_TABLE_HEADER *Header); /******************************************************************************* * * FUNCTION: AcpiTbFixString * * PARAMETERS: String - String to be repaired * Length - Maximum length * * RETURN: None * * DESCRIPTION: Replace every non-printable or non-ascii byte in the string * with a question mark '?'. * ******************************************************************************/ static void AcpiTbFixString ( char *String, ACPI_SIZE Length) { while (Length && *String) { - if (!isprint (*String)) + if (!isprint ((int) *String)) { *String = '?'; } String++; Length--; } } /******************************************************************************* * * FUNCTION: AcpiTbCleanupTableHeader * * PARAMETERS: OutHeader - Where the cleaned header is returned * Header - Input ACPI table header * * RETURN: Returns the cleaned header in OutHeader * * DESCRIPTION: Copy the table header and ensure that all "string" fields in * the header consist of printable characters. * ******************************************************************************/ static void AcpiTbCleanupTableHeader ( ACPI_TABLE_HEADER *OutHeader, ACPI_TABLE_HEADER *Header) { memcpy (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); } /******************************************************************************* * * FUNCTION: AcpiTbPrintTableHeader * * PARAMETERS: Address - Table physical address * Header - Table header * * RETURN: None * * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. * ******************************************************************************/ void AcpiTbPrintTableHeader ( ACPI_PHYSICAL_ADDRESS Address, ACPI_TABLE_HEADER *Header) { ACPI_TABLE_HEADER LocalHeader; if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) { /* FACS only has signature and length fields */ ACPI_INFO ((AE_INFO, "%-4.4s 0x%8.8X%8.8X %06X", Header->Signature, ACPI_FORMAT_UINT64 (Address), Header->Length)); } else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) { /* RSDP has no common fields */ memcpy (LocalHeader.OemId, ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE); AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); ACPI_INFO ((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", ACPI_FORMAT_UINT64 (Address), (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, LocalHeader.OemId)); } else { /* Standard ACPI table with full common header */ AcpiTbCleanupTableHeader (&LocalHeader, Header); ACPI_INFO ((AE_INFO, "%-4.4s 0x%8.8X%8.8X" " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address), LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, LocalHeader.OemTableId, LocalHeader.OemRevision, LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); } } /******************************************************************************* * * FUNCTION: AcpiTbValidateChecksum * * PARAMETERS: Table - ACPI table to verify * Length - Length of entire table * * RETURN: Status * * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns * exception on bad checksum. * ******************************************************************************/ ACPI_STATUS AcpiTbVerifyChecksum ( ACPI_TABLE_HEADER *Table, UINT32 Length) { UINT8 Checksum; /* * FACS/S3PT: * They are the odd tables, have no standard ACPI header and no checksum */ if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) { return (AE_OK); } /* Compute the checksum on the table */ Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); /* Checksum ok? (should be zero) */ if (Checksum) { ACPI_BIOS_WARNING ((AE_INFO, "Incorrect checksum in table [%4.4s] - 0x%2.2X, " "should be 0x%2.2X", Table->Signature, Table->Checksum, (UINT8) (Table->Checksum - Checksum))); #if (ACPI_CHECKSUM_ABORT) return (AE_BAD_CHECKSUM); #endif } return (AE_OK); } /******************************************************************************* * * FUNCTION: AcpiTbChecksum * * PARAMETERS: Buffer - Pointer to memory region to be checked * Length - Length of this memory region * * RETURN: Checksum (UINT8) * * DESCRIPTION: Calculates circular checksum of memory region. * ******************************************************************************/ UINT8 AcpiTbChecksum ( UINT8 *Buffer, UINT32 Length) { UINT8 Sum = 0; UINT8 *End = Buffer + Length; while (Buffer < End) { Sum = (UINT8) (Sum + *(Buffer++)); } return (Sum); } Index: vendor-sys/acpica/dist/source/components/utilities/utprint.c =================================================================== --- vendor-sys/acpica/dist/source/components/utilities/utprint.c (revision 284518) +++ vendor-sys/acpica/dist/source/components/utilities/utprint.c (revision 284519) @@ -1,814 +1,814 @@ /****************************************************************************** * * Module Name: utprint - Formatted printing routines * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpi.h" #include "accommon.h" #define _COMPONENT ACPI_UTILITIES ACPI_MODULE_NAME ("utprint") #define ACPI_FORMAT_SIGN 0x01 #define ACPI_FORMAT_SIGN_PLUS 0x02 #define ACPI_FORMAT_SIGN_PLUS_SPACE 0x04 #define ACPI_FORMAT_ZERO 0x08 #define ACPI_FORMAT_LEFT 0x10 #define ACPI_FORMAT_UPPER 0x20 #define ACPI_FORMAT_PREFIX 0x40 /* Local prototypes */ static ACPI_SIZE AcpiUtBoundStringLength ( const char *String, ACPI_SIZE Count); static char * AcpiUtBoundStringOutput ( char *String, const char *End, char c); static char * AcpiUtFormatNumber ( char *String, char *End, UINT64 Number, UINT8 Base, INT32 Width, INT32 Precision, UINT8 Type); static char * AcpiUtPutNumber ( char *String, UINT64 Number, UINT8 Base, BOOLEAN Upper); /* Module globals */ static const char AcpiGbl_LowerHexDigits[] = "0123456789abcdef"; static const char AcpiGbl_UpperHexDigits[] = "0123456789ABCDEF"; /******************************************************************************* * * FUNCTION: AcpiUtBoundStringLength * * PARAMETERS: String - String with boundary * Count - Boundary of the string * * RETURN: Length of the string. Less than or equal to Count. * * DESCRIPTION: Calculate the length of a string with boundary. * ******************************************************************************/ static ACPI_SIZE AcpiUtBoundStringLength ( const char *String, ACPI_SIZE Count) { UINT32 Length = 0; while (*String && Count) { Length++; String++; Count--; } return (Length); } /******************************************************************************* * * FUNCTION: AcpiUtBoundStringOutput * * PARAMETERS: String - String with boundary * End - Boundary of the string * c - Character to be output to the string * * RETURN: Updated position for next valid character * * DESCRIPTION: Output a character into a string with boundary check. * ******************************************************************************/ static char * AcpiUtBoundStringOutput ( char *String, const char *End, char c) { if (String < End) { *String = c; } ++String; return (String); } /******************************************************************************* * * FUNCTION: AcpiUtPutNumber * * PARAMETERS: String - Buffer to hold reverse-ordered string * Number - Integer to be converted * Base - Base of the integer * Upper - Whether or not using upper cased digits * * RETURN: Updated position for next valid character * * DESCRIPTION: Convert an integer into a string, note that, the string holds a * reversed ordered number without the trailing zero. * ******************************************************************************/ static char * AcpiUtPutNumber ( char *String, UINT64 Number, UINT8 Base, BOOLEAN Upper) { const char *Digits; UINT64 DigitIndex; char *Pos; Pos = String; Digits = Upper ? AcpiGbl_UpperHexDigits : AcpiGbl_LowerHexDigits; if (Number == 0) { *(Pos++) = '0'; } else { while (Number) { (void) AcpiUtDivide (Number, Base, &Number, &DigitIndex); *(Pos++) = Digits[DigitIndex]; } } /* *(Pos++) = '0'; */ return (Pos); } /******************************************************************************* * * FUNCTION: AcpiUtScanNumber * * PARAMETERS: String - String buffer * NumberPtr - Where the number is returned * * RETURN: Updated position for next valid character * * DESCRIPTION: Scan a string for a decimal integer. * ******************************************************************************/ const char * AcpiUtScanNumber ( const char *String, UINT64 *NumberPtr) { UINT64 Number = 0; - while (isdigit (*String)) + while (isdigit ((int) *String)) { Number *= 10; Number += *(String++) - '0'; } *NumberPtr = Number; return (String); } /******************************************************************************* * * FUNCTION: AcpiUtPrintNumber * * PARAMETERS: String - String buffer * Number - The number to be converted * * RETURN: Updated position for next valid character * * DESCRIPTION: Print a decimal integer into a string. * ******************************************************************************/ const char * AcpiUtPrintNumber ( char *String, UINT64 Number) { char AsciiString[20]; const char *Pos1; char *Pos2; Pos1 = AcpiUtPutNumber (AsciiString, Number, 10, FALSE); Pos2 = String; while (Pos1 != AsciiString) { *(Pos2++) = *(--Pos1); } *Pos2 = 0; return (String); } /******************************************************************************* * * FUNCTION: AcpiUtFormatNumber * * PARAMETERS: String - String buffer with boundary * End - Boundary of the string * Number - The number to be converted * Base - Base of the integer * Width - Field width * Precision - Precision of the integer * Type - Special printing flags * * RETURN: Updated position for next valid character * * DESCRIPTION: Print an integer into a string with any base and any precision. * ******************************************************************************/ static char * AcpiUtFormatNumber ( char *String, char *End, UINT64 Number, UINT8 Base, INT32 Width, INT32 Precision, UINT8 Type) { char *Pos; char Sign; char Zero; BOOLEAN NeedPrefix; BOOLEAN Upper; INT32 i; char ReversedString[66]; /* Parameter validation */ if (Base < 2 || Base > 16) { return (NULL); } if (Type & ACPI_FORMAT_LEFT) { Type &= ~ACPI_FORMAT_ZERO; } NeedPrefix = ((Type & ACPI_FORMAT_PREFIX) && Base != 10) ? TRUE : FALSE; Upper = (Type & ACPI_FORMAT_UPPER) ? TRUE : FALSE; Zero = (Type & ACPI_FORMAT_ZERO) ? '0' : ' '; /* Calculate size according to sign and prefix */ Sign = '\0'; if (Type & ACPI_FORMAT_SIGN) { if ((INT64) Number < 0) { Sign = '-'; Number = - (INT64) Number; Width--; } else if (Type & ACPI_FORMAT_SIGN_PLUS) { Sign = '+'; Width--; } else if (Type & ACPI_FORMAT_SIGN_PLUS_SPACE) { Sign = ' '; Width--; } } if (NeedPrefix) { Width--; if (Base == 16) { Width--; } } /* Generate full string in reverse order */ Pos = AcpiUtPutNumber (ReversedString, Number, Base, Upper); i = ACPI_PTR_DIFF (Pos, ReversedString); /* Printing 100 using %2d gives "100", not "00" */ if (i > Precision) { Precision = i; } Width -= Precision; /* Output the string */ if (!(Type & (ACPI_FORMAT_ZERO | ACPI_FORMAT_LEFT))) { while (--Width >= 0) { String = AcpiUtBoundStringOutput (String, End, ' '); } } if (Sign) { String = AcpiUtBoundStringOutput (String, End, Sign); } if (NeedPrefix) { String = AcpiUtBoundStringOutput (String, End, '0'); if (Base == 16) { String = AcpiUtBoundStringOutput (String, End, Upper ? 'X' : 'x'); } } if (!(Type & ACPI_FORMAT_LEFT)) { while (--Width >= 0) { String = AcpiUtBoundStringOutput (String, End, Zero); } } while (i <= --Precision) { String = AcpiUtBoundStringOutput (String, End, '0'); } while (--i >= 0) { String = AcpiUtBoundStringOutput (String, End, ReversedString[i]); } while (--Width >= 0) { String = AcpiUtBoundStringOutput (String, End, ' '); } return (String); } /******************************************************************************* * * FUNCTION: AcpiUtVsnprintf * * PARAMETERS: String - String with boundary * Size - Boundary of the string * Format - Standard printf format * Args - Argument list * * RETURN: Number of bytes actually written. * * DESCRIPTION: Formatted output to a string using argument list pointer. * ******************************************************************************/ int AcpiUtVsnprintf ( char *String, ACPI_SIZE Size, const char *Format, va_list Args) { UINT8 Base; UINT8 Type; INT32 Width; INT32 Precision; char Qualifier; UINT64 Number; char *Pos; char *End; char c; const char *s; const void *p; INT32 Length; int i; Pos = String; End = String + Size; for (; *Format; ++Format) { if (*Format != '%') { Pos = AcpiUtBoundStringOutput (Pos, End, *Format); continue; } Type = 0; Base = 10; /* Process sign */ do { ++Format; if (*Format == '#') { Type |= ACPI_FORMAT_PREFIX; } else if (*Format == '0') { Type |= ACPI_FORMAT_ZERO; } else if (*Format == '+') { Type |= ACPI_FORMAT_SIGN_PLUS; } else if (*Format == ' ') { Type |= ACPI_FORMAT_SIGN_PLUS_SPACE; } else if (*Format == '-') { Type |= ACPI_FORMAT_LEFT; } else { break; } } while (1); /* Process width */ Width = -1; - if (isdigit (*Format)) + if (isdigit ((int) *Format)) { Format = AcpiUtScanNumber (Format, &Number); Width = (INT32) Number; } else if (*Format == '*') { ++Format; Width = va_arg (Args, int); if (Width < 0) { Width = -Width; Type |= ACPI_FORMAT_LEFT; } } /* Process precision */ Precision = -1; if (*Format == '.') { ++Format; - if (isdigit(*Format)) + if (isdigit ((int) *Format)) { Format = AcpiUtScanNumber (Format, &Number); Precision = (INT32) Number; } else if (*Format == '*') { ++Format; Precision = va_arg (Args, int); } if (Precision < 0) { Precision = 0; } } /* Process qualifier */ Qualifier = -1; if (*Format == 'h' || *Format == 'l' || *Format == 'L') { Qualifier = *Format; ++Format; if (Qualifier == 'l' && *Format == 'l') { Qualifier = 'L'; ++Format; } } switch (*Format) { case '%': Pos = AcpiUtBoundStringOutput (Pos, End, '%'); continue; case 'c': if (!(Type & ACPI_FORMAT_LEFT)) { while (--Width > 0) { Pos = AcpiUtBoundStringOutput (Pos, End, ' '); } } c = (char) va_arg (Args, int); Pos = AcpiUtBoundStringOutput (Pos, End, c); while (--Width > 0) { Pos = AcpiUtBoundStringOutput (Pos, End, ' '); } continue; case 's': s = va_arg (Args, char *); if (!s) { s = ""; } Length = AcpiUtBoundStringLength (s, Precision); if (!(Type & ACPI_FORMAT_LEFT)) { while (Length < Width--) { Pos = AcpiUtBoundStringOutput (Pos, End, ' '); } } for (i = 0; i < Length; ++i) { Pos = AcpiUtBoundStringOutput (Pos, End, *s); ++s; } while (Length < Width--) { Pos = AcpiUtBoundStringOutput (Pos, End, ' '); } continue; case 'o': Base = 8; break; case 'X': Type |= ACPI_FORMAT_UPPER; case 'x': Base = 16; break; case 'd': case 'i': Type |= ACPI_FORMAT_SIGN; case 'u': break; case 'p': if (Width == -1) { Width = 2 * sizeof (void *); Type |= ACPI_FORMAT_ZERO; } p = va_arg (Args, void *); Pos = AcpiUtFormatNumber (Pos, End, ACPI_TO_INTEGER (p), 16, Width, Precision, Type); continue; default: Pos = AcpiUtBoundStringOutput (Pos, End, '%'); if (*Format) { Pos = AcpiUtBoundStringOutput (Pos, End, *Format); } else { --Format; } continue; } if (Qualifier == 'L') { Number = va_arg (Args, UINT64); if (Type & ACPI_FORMAT_SIGN) { Number = (INT64) Number; } } else if (Qualifier == 'l') { Number = va_arg (Args, unsigned long); if (Type & ACPI_FORMAT_SIGN) { Number = (INT32) Number; } } else if (Qualifier == 'h') { Number = (UINT16) va_arg (Args, int); if (Type & ACPI_FORMAT_SIGN) { Number = (INT16) Number; } } else { Number = va_arg (Args, unsigned int); if (Type & ACPI_FORMAT_SIGN) { Number = (signed int) Number; } } Pos = AcpiUtFormatNumber (Pos, End, Number, Base, Width, Precision, Type); } if (Size > 0) { if (Pos < End) { *Pos = '\0'; } else { End[-1] = '\0'; } } return (ACPI_PTR_DIFF (Pos, String)); } /******************************************************************************* * * FUNCTION: AcpiUtSnprintf * * PARAMETERS: String - String with boundary * Size - Boundary of the string * Format, ... - Standard printf format * * RETURN: Number of bytes actually written. * * DESCRIPTION: Formatted output to a string. * ******************************************************************************/ int AcpiUtSnprintf ( char *String, ACPI_SIZE Size, const char *Format, ...) { va_list Args; int Length; va_start (Args, Format); Length = AcpiUtVsnprintf (String, Size, Format, Args); va_end (Args); return (Length); } #ifdef ACPI_APPLICATION /******************************************************************************* * * FUNCTION: AcpiUtFileVprintf * * PARAMETERS: File - File descriptor * Format - Standard printf format * Args - Argument list * * RETURN: Number of bytes actually written. * * DESCRIPTION: Formatted output to a file using argument list pointer. * ******************************************************************************/ int AcpiUtFileVprintf ( ACPI_FILE File, const char *Format, va_list Args) { ACPI_CPU_FLAGS Flags; int Length; Flags = AcpiOsAcquireLock (AcpiGbl_PrintLock); Length = AcpiUtVsnprintf (AcpiGbl_PrintBuffer, sizeof (AcpiGbl_PrintBuffer), Format, Args); (void) AcpiOsWriteFile (File, AcpiGbl_PrintBuffer, Length, 1); AcpiOsReleaseLock (AcpiGbl_PrintLock, Flags); return (Length); } /******************************************************************************* * * FUNCTION: AcpiUtFilePrintf * * PARAMETERS: File - File descriptor * Format, ... - Standard printf format * * RETURN: Number of bytes actually written. * * DESCRIPTION: Formatted output to a file. * ******************************************************************************/ int AcpiUtFilePrintf ( ACPI_FILE File, const char *Format, ...) { va_list Args; int Length; va_start (Args, Format); Length = AcpiUtFileVprintf (File, Format, Args); va_end (Args); return (Length); } #endif Index: vendor-sys/acpica/dist/source/components/utilities/utstring.c =================================================================== --- vendor-sys/acpica/dist/source/components/utilities/utstring.c (revision 284518) +++ vendor-sys/acpica/dist/source/components/utilities/utstring.c (revision 284519) @@ -1,759 +1,759 @@ /******************************************************************************* * * Module Name: utstring - Common functions for strings and characters * ******************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpi.h" #include "accommon.h" #include "acnamesp.h" #define _COMPONENT ACPI_UTILITIES ACPI_MODULE_NAME ("utstring") /* * Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit * version of strtoul. */ #ifdef ACPI_ASL_COMPILER /******************************************************************************* * * FUNCTION: AcpiUtStrlwr (strlwr) * * PARAMETERS: SrcString - The source string to convert * * RETURN: None * * DESCRIPTION: Convert string to lowercase * * NOTE: This is not a POSIX function, so it appears here, not in utclib.c * ******************************************************************************/ void AcpiUtStrlwr ( char *SrcString) { char *String; ACPI_FUNCTION_ENTRY (); if (!SrcString) { return; } /* Walk entire string, lowercasing the letters */ for (String = SrcString; *String; String++) { - *String = (char) tolower (*String); + *String = (char) tolower ((int) *String); } return; } /****************************************************************************** * * FUNCTION: AcpiUtStricmp (stricmp) * * PARAMETERS: String1 - first string to compare * String2 - second string to compare * * RETURN: int that signifies string relationship. Zero means strings * are equal. * * DESCRIPTION: Implementation of the non-ANSI stricmp function (compare * strings with no case sensitivity) * ******************************************************************************/ int AcpiUtStricmp ( char *String1, char *String2) { int c1; int c2; do { c1 = tolower ((int) *String1); c2 = tolower ((int) *String2); String1++; String2++; } while ((c1 == c2) && (c1)); return (c1 - c2); } #endif /******************************************************************************* * * FUNCTION: AcpiUtStrupr (strupr) * * PARAMETERS: SrcString - The source string to convert * * RETURN: None * * DESCRIPTION: Convert string to uppercase * * NOTE: This is not a POSIX function, so it appears here, not in utclib.c * ******************************************************************************/ void AcpiUtStrupr ( char *SrcString) { char *String; ACPI_FUNCTION_ENTRY (); if (!SrcString) { return; } /* Walk entire string, uppercasing the letters */ for (String = SrcString; *String; String++) { - *String = (char) toupper (*String); + *String = (char) toupper ((int) *String); } return; } /******************************************************************************* * * FUNCTION: AcpiUtStrtoul64 * * PARAMETERS: String - Null terminated string * Base - Radix of the string: 16 or ACPI_ANY_BASE; * ACPI_ANY_BASE means 'in behalf of ToInteger' * RetInteger - Where the converted integer is returned * * RETURN: Status and Converted value * * DESCRIPTION: Convert a string into an unsigned value. Performs either a * 32-bit or 64-bit conversion, depending on the current mode * of the interpreter. * NOTE: Does not support Octal strings, not needed. * ******************************************************************************/ ACPI_STATUS AcpiUtStrtoul64 ( char *String, UINT32 Base, UINT64 *RetInteger) { UINT32 ThisDigit = 0; UINT64 ReturnValue = 0; UINT64 Quotient; UINT64 Dividend; UINT32 ToIntegerOp = (Base == ACPI_ANY_BASE); UINT32 Mode32 = (AcpiGbl_IntegerByteWidth == 4); UINT8 ValidDigits = 0; UINT8 SignOf0x = 0; UINT8 Term = 0; ACPI_FUNCTION_TRACE_STR (UtStroul64, String); switch (Base) { case ACPI_ANY_BASE: case 16: break; default: /* Invalid Base */ return_ACPI_STATUS (AE_BAD_PARAMETER); } if (!String) { goto ErrorExit; } /* Skip over any white space in the buffer */ - while ((*String) && (isspace (*String) || *String == '\t')) + while ((*String) && (isspace ((int) *String) || *String == '\t')) { String++; } if (ToIntegerOp) { /* * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'. * We need to determine if it is decimal or hexadecimal. */ - if ((*String == '0') && (tolower (*(String + 1)) == 'x')) + if ((*String == '0') && (tolower ((int) *(String + 1)) == 'x')) { SignOf0x = 1; Base = 16; /* Skip over the leading '0x' */ String += 2; } else { Base = 10; } } /* Any string left? Check that '0x' is not followed by white space. */ - if (!(*String) || isspace (*String) || *String == '\t') + if (!(*String) || isspace ((int) *String) || *String == '\t') { if (ToIntegerOp) { goto ErrorExit; } else { goto AllDone; } } /* * Perform a 32-bit or 64-bit conversion, depending upon the current * execution mode of the interpreter */ Dividend = (Mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX; /* Main loop: convert the string to a 32- or 64-bit integer */ while (*String) { - if (isdigit (*String)) + if (isdigit ((int) *String)) { /* Convert ASCII 0-9 to Decimal value */ ThisDigit = ((UINT8) *String) - '0'; } else if (Base == 10) { /* Digit is out of range; possible in ToInteger case only */ Term = 1; } else { - ThisDigit = (UINT8) toupper (*String); - if (isxdigit ((char) ThisDigit)) + ThisDigit = (UINT8) toupper ((int) *String); + if (isxdigit ((int) ThisDigit)) { /* Convert ASCII Hex char to value */ ThisDigit = ThisDigit - 'A' + 10; } else { Term = 1; } } if (Term) { if (ToIntegerOp) { goto ErrorExit; } else { break; } } else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x) { /* Skip zeros */ String++; continue; } ValidDigits++; if (SignOf0x && ((ValidDigits > 16) || ((ValidDigits > 8) && Mode32))) { /* * This is ToInteger operation case. * No any restrictions for string-to-integer conversion, * see ACPI spec. */ goto ErrorExit; } /* Divide the digit into the correct position */ (void) AcpiUtShortDivide ((Dividend - (UINT64) ThisDigit), Base, &Quotient, NULL); if (ReturnValue > Quotient) { if (ToIntegerOp) { goto ErrorExit; } else { break; } } ReturnValue *= Base; ReturnValue += ThisDigit; String++; } /* All done, normal exit */ AllDone: ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (ReturnValue))); *RetInteger = ReturnValue; return_ACPI_STATUS (AE_OK); ErrorExit: /* Base was set/validated above */ if (Base == 10) { return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT); } else { return_ACPI_STATUS (AE_BAD_HEX_CONSTANT); } } /******************************************************************************* * * FUNCTION: AcpiUtPrintString * * PARAMETERS: String - Null terminated ASCII string * MaxLength - Maximum output length. Used to constrain the * length of strings during debug output only. * * RETURN: None * * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape * sequences. * ******************************************************************************/ void AcpiUtPrintString ( char *String, UINT16 MaxLength) { UINT32 i; if (!String) { AcpiOsPrintf ("<\"NULL STRING PTR\">"); return; } AcpiOsPrintf ("\""); for (i = 0; (i < MaxLength) && String[i]; i++) { /* Escape sequences */ switch (String[i]) { case 0x07: AcpiOsPrintf ("\\a"); /* BELL */ break; case 0x08: AcpiOsPrintf ("\\b"); /* BACKSPACE */ break; case 0x0C: AcpiOsPrintf ("\\f"); /* FORMFEED */ break; case 0x0A: AcpiOsPrintf ("\\n"); /* LINEFEED */ break; case 0x0D: AcpiOsPrintf ("\\r"); /* CARRIAGE RETURN*/ break; case 0x09: AcpiOsPrintf ("\\t"); /* HORIZONTAL TAB */ break; case 0x0B: AcpiOsPrintf ("\\v"); /* VERTICAL TAB */ break; case '\'': /* Single Quote */ case '\"': /* Double Quote */ case '\\': /* Backslash */ AcpiOsPrintf ("\\%c", (int) String[i]); break; default: /* Check for printable character or hex escape */ - if (isprint (String[i])) + if (isprint ((int) String[i])) { /* This is a normal character */ AcpiOsPrintf ("%c", (int) String[i]); } else { /* All others will be Hex escapes */ AcpiOsPrintf ("\\x%2.2X", (INT32) String[i]); } break; } } AcpiOsPrintf ("\""); if (i == MaxLength && String[i]) { AcpiOsPrintf ("..."); } } /******************************************************************************* * * FUNCTION: AcpiUtValidAcpiChar * * PARAMETERS: Char - The character to be examined * Position - Byte position (0-3) * * RETURN: TRUE if the character is valid, FALSE otherwise * * DESCRIPTION: Check for a valid ACPI character. Must be one of: * 1) Upper case alpha * 2) numeric * 3) underscore * * We allow a '!' as the last character because of the ASF! table * ******************************************************************************/ BOOLEAN AcpiUtValidAcpiChar ( char Character, UINT32 Position) { if (!((Character >= 'A' && Character <= 'Z') || (Character >= '0' && Character <= '9') || (Character == '_'))) { /* Allow a '!' in the last position */ if (Character == '!' && Position == 3) { return (TRUE); } return (FALSE); } return (TRUE); } /******************************************************************************* * * FUNCTION: AcpiUtValidAcpiName * * PARAMETERS: Name - The name to be examined. Does not have to * be NULL terminated string. * * RETURN: TRUE if the name is valid, FALSE otherwise * * DESCRIPTION: Check for a valid ACPI name. Each character must be one of: * 1) Upper case alpha * 2) numeric * 3) underscore * ******************************************************************************/ BOOLEAN AcpiUtValidAcpiName ( char *Name) { UINT32 i; ACPI_FUNCTION_ENTRY (); for (i = 0; i < ACPI_NAME_SIZE; i++) { if (!AcpiUtValidAcpiChar (Name[i], i)) { return (FALSE); } } return (TRUE); } /******************************************************************************* * * FUNCTION: AcpiUtRepairName * * PARAMETERS: Name - The ACPI name to be repaired * * RETURN: Repaired version of the name * * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and * return the new name. NOTE: the Name parameter must reside in * read/write memory, cannot be a const. * * An ACPI Name must consist of valid ACPI characters. We will repair the name * if necessary because we don't want to abort because of this, but we want * all namespace names to be printable. A warning message is appropriate. * * This issue came up because there are in fact machines that exhibit * this problem, and we want to be able to enable ACPI support for them, * even though there are a few bad names. * ******************************************************************************/ void AcpiUtRepairName ( char *Name) { UINT32 i; BOOLEAN FoundBadChar = FALSE; UINT32 OriginalName; ACPI_FUNCTION_NAME (UtRepairName); ACPI_MOVE_NAME (&OriginalName, Name); /* Check each character in the name */ for (i = 0; i < ACPI_NAME_SIZE; i++) { if (AcpiUtValidAcpiChar (Name[i], i)) { continue; } /* * Replace a bad character with something printable, yet technically * still invalid. This prevents any collisions with existing "good" * names in the namespace. */ Name[i] = '*'; FoundBadChar = TRUE; } if (FoundBadChar) { /* Report warning only if in strict mode or debug mode */ if (!AcpiGbl_EnableInterpreterSlack) { ACPI_WARNING ((AE_INFO, "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", OriginalName, Name)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", OriginalName, Name)); } } } #if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP /******************************************************************************* * * FUNCTION: UtConvertBackslashes * * PARAMETERS: Pathname - File pathname string to be converted * * RETURN: Modifies the input Pathname * * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within * the entire input file pathname string. * ******************************************************************************/ void UtConvertBackslashes ( char *Pathname) { if (!Pathname) { return; } while (*Pathname) { if (*Pathname == '\\') { *Pathname = '/'; } Pathname++; } } #endif #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) /******************************************************************************* * * FUNCTION: AcpiUtSafeStrcpy, AcpiUtSafeStrcat, AcpiUtSafeStrncat * * PARAMETERS: Adds a "DestSize" parameter to each of the standard string * functions. This is the size of the Destination buffer. * * RETURN: TRUE if the operation would overflow the destination buffer. * * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that * the result of the operation will not overflow the output string * buffer. * * NOTE: These functions are typically only helpful for processing * user input and command lines. For most ACPICA code, the * required buffer length is precisely calculated before buffer * allocation, so the use of these functions is unnecessary. * ******************************************************************************/ BOOLEAN AcpiUtSafeStrcpy ( char *Dest, ACPI_SIZE DestSize, char *Source) { if (strlen (Source) >= DestSize) { return (TRUE); } strcpy (Dest, Source); return (FALSE); } BOOLEAN AcpiUtSafeStrcat ( char *Dest, ACPI_SIZE DestSize, char *Source) { if ((strlen (Dest) + strlen (Source)) >= DestSize) { return (TRUE); } strcat (Dest, Source); return (FALSE); } BOOLEAN AcpiUtSafeStrncat ( char *Dest, ACPI_SIZE DestSize, char *Source, ACPI_SIZE MaxTransferLength) { ACPI_SIZE ActualTransferLength; ActualTransferLength = ACPI_MIN (MaxTransferLength, strlen (Source)); if ((strlen (Dest) + ActualTransferLength) >= DestSize) { return (TRUE); } strncat (Dest, Source, MaxTransferLength); return (FALSE); } #endif Index: vendor-sys/acpica/dist/source/include/acutils.h =================================================================== --- vendor-sys/acpica/dist/source/include/acutils.h (revision 284518) +++ vendor-sys/acpica/dist/source/include/acutils.h (revision 284519) @@ -1,1249 +1,1231 @@ /****************************************************************************** * * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #ifndef _ACUTILS_H #define _ACUTILS_H extern const UINT8 AcpiGbl_ResourceAmlSizes[]; extern const UINT8 AcpiGbl_ResourceAmlSerialBusSizes[]; /* Strings used by the disassembler and debugger resource dump routines */ #if defined(ACPI_DEBUG_OUTPUT) || defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER) extern const char *AcpiGbl_BmDecode[]; extern const char *AcpiGbl_ConfigDecode[]; extern const char *AcpiGbl_ConsumeDecode[]; extern const char *AcpiGbl_DecDecode[]; extern const char *AcpiGbl_HeDecode[]; extern const char *AcpiGbl_IoDecode[]; extern const char *AcpiGbl_LlDecode[]; extern const char *AcpiGbl_MaxDecode[]; extern const char *AcpiGbl_MemDecode[]; extern const char *AcpiGbl_MinDecode[]; extern const char *AcpiGbl_MtpDecode[]; extern const char *AcpiGbl_RngDecode[]; extern const char *AcpiGbl_RwDecode[]; extern const char *AcpiGbl_ShrDecode[]; extern const char *AcpiGbl_SizDecode[]; extern const char *AcpiGbl_TrsDecode[]; extern const char *AcpiGbl_TtpDecode[]; extern const char *AcpiGbl_TypDecode[]; extern const char *AcpiGbl_PpcDecode[]; extern const char *AcpiGbl_IorDecode[]; extern const char *AcpiGbl_DtsDecode[]; extern const char *AcpiGbl_CtDecode[]; extern const char *AcpiGbl_SbtDecode[]; extern const char *AcpiGbl_AmDecode[]; extern const char *AcpiGbl_SmDecode[]; extern const char *AcpiGbl_WmDecode[]; extern const char *AcpiGbl_CphDecode[]; extern const char *AcpiGbl_CpoDecode[]; extern const char *AcpiGbl_DpDecode[]; extern const char *AcpiGbl_EdDecode[]; extern const char *AcpiGbl_BpbDecode[]; extern const char *AcpiGbl_SbDecode[]; extern const char *AcpiGbl_FcDecode[]; extern const char *AcpiGbl_PtDecode[]; #endif /* * For the iASL compiler case, the output is redirected to stderr so that * any of the various ACPI errors and warnings do not appear in the output * files, for either the compiler or disassembler portions of the tool. */ #ifdef ACPI_ASL_COMPILER #include #define ACPI_MSG_REDIRECT_BEGIN \ FILE *OutputFile = AcpiGbl_OutputFile; \ AcpiOsRedirectOutput (stderr); #define ACPI_MSG_REDIRECT_END \ AcpiOsRedirectOutput (OutputFile); #else /* * non-iASL case - no redirection, nothing to do */ #define ACPI_MSG_REDIRECT_BEGIN #define ACPI_MSG_REDIRECT_END #endif /* * Common error message prefixes */ #define ACPI_MSG_ERROR "ACPI Error: " #define ACPI_MSG_EXCEPTION "ACPI Exception: " #define ACPI_MSG_WARNING "ACPI Warning: " #define ACPI_MSG_INFO "ACPI: " #define ACPI_MSG_BIOS_ERROR "ACPI BIOS Error (bug): " #define ACPI_MSG_BIOS_WARNING "ACPI BIOS Warning (bug): " /* * Common message suffix */ #define ACPI_MSG_SUFFIX \ AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber) /* Types for Resource descriptor entries */ #define ACPI_INVALID_RESOURCE 0 #define ACPI_FIXED_LENGTH 1 #define ACPI_VARIABLE_LENGTH 2 #define ACPI_SMALL_VARIABLE_LENGTH 3 typedef ACPI_STATUS (*ACPI_WALK_AML_CALLBACK) ( UINT8 *Aml, UINT32 Length, UINT32 Offset, UINT8 ResourceIndex, void **Context); typedef ACPI_STATUS (*ACPI_PKG_CALLBACK) ( UINT8 ObjectType, ACPI_OPERAND_OBJECT *SourceObject, ACPI_GENERIC_STATE *State, void *Context); typedef struct acpi_pkg_info { UINT8 *FreeSpace; ACPI_SIZE Length; UINT32 ObjectSpace; UINT32 NumPackages; } ACPI_PKG_INFO; /* Object reference counts */ #define REF_INCREMENT (UINT16) 0 #define REF_DECREMENT (UINT16) 1 /* AcpiUtDumpBuffer */ #define DB_BYTE_DISPLAY 1 #define DB_WORD_DISPLAY 2 #define DB_DWORD_DISPLAY 4 #define DB_QWORD_DISPLAY 8 /* * utglobal - Global data structures and procedures */ ACPI_STATUS AcpiUtInitGlobals ( void); #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) char * AcpiUtGetMutexName ( UINT32 MutexId); const char * AcpiUtGetNotifyName ( UINT32 NotifyValue, ACPI_OBJECT_TYPE Type); #endif char * AcpiUtGetTypeName ( ACPI_OBJECT_TYPE Type); char * AcpiUtGetNodeName ( void *Object); char * AcpiUtGetDescriptorName ( void *Object); const char * AcpiUtGetReferenceName ( ACPI_OPERAND_OBJECT *Object); char * AcpiUtGetObjectTypeName ( ACPI_OPERAND_OBJECT *ObjDesc); char * AcpiUtGetRegionName ( UINT8 SpaceId); char * AcpiUtGetEventName ( UINT32 EventId); char AcpiUtHexToAsciiChar ( UINT64 Integer, UINT32 Position); UINT8 AcpiUtAsciiCharToHex ( int HexChar); BOOLEAN AcpiUtValidObjectType ( ACPI_OBJECT_TYPE Type); /* * utinit - miscellaneous initialization and shutdown */ ACPI_STATUS AcpiUtHardwareInitialize ( void); void AcpiUtSubsystemShutdown ( void); /* * utclib - Local implementations of C library functions */ #ifndef ACPI_USE_SYSTEM_CLIBRARY #ifdef memcmp #error memcmp defined! #endif #undef strstr #undef strchr #undef strlen #undef strcpy #undef strncpy #undef strncmp #undef strcmp #undef strcat #undef strncat #undef strtoul #undef memcmp #undef memcpy #undef memset #undef toupper #undef tolower #undef isxdigit #undef isdigit #undef isspace #undef isupper #undef isprint #undef isalpha ACPI_SIZE strlen ( const char *String); char * strchr ( const char *String, int ch); char * strcpy ( char *DstString, const char *SrcString); char * strncpy ( char *DstString, const char *SrcString, ACPI_SIZE Count); int strncmp ( const char *String1, const char *String2, ACPI_SIZE Count); int strcmp ( const char *String1, const char *String2); char * strcat ( char *DstString, const char *SrcString); char * strncat ( char *DstString, const char *SrcString, ACPI_SIZE Count); UINT32 strtoul ( const char *String, char **Terminator, UINT32 Base); char * strstr ( char *String1, char *String2); int memcmp ( void *Buffer1, void *Buffer2, ACPI_SIZE Count); void * memcpy ( void *Dest, const void *Src, ACPI_SIZE Count); void * memset ( void *Dest, int Value, ACPI_SIZE Count); int toupper ( int c); int tolower ( int c); extern const UINT8 _acpi_ctype[]; #define _ACPI_XA 0x00 /* extra alphabetic - not supported */ #define _ACPI_XS 0x40 /* extra space */ #define _ACPI_BB 0x00 /* BEL, BS, etc. - not supported */ #define _ACPI_CN 0x20 /* CR, FF, HT, NL, VT */ #define _ACPI_DI 0x04 /* '0'-'9' */ #define _ACPI_LO 0x02 /* 'a'-'z' */ #define _ACPI_PU 0x10 /* punctuation */ #define _ACPI_SP 0x08 /* space, tab, CR, LF, VT, FF */ #define _ACPI_UP 0x01 /* 'A'-'Z' */ #define _ACPI_XD 0x80 /* '0'-'9', 'A'-'F', 'a'-'f' */ #define isdigit(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_DI)) #define isspace(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_SP)) #define isxdigit(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_XD)) #define isupper(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_UP)) #define islower(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO)) #define isprint(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_XS | _ACPI_PU)) #define isalpha(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP)) -#ifndef ACPI_CLIBRARY -#define strstr(s1,s2) strstr ((s1), (s2)) -#define strchr(s1,c) strchr ((s1), (c)) -#define strlen(s) (ACPI_SIZE) strlen ((s)) -#define strcpy(d,s) (void) strcpy ((d), (s)) -#define strncpy(d,s,n) (void) strncpy ((d), (s), (ACPI_SIZE)(n)) -#define strncmp(d,s,n) strncmp ((d), (s), (ACPI_SIZE)(n)) -#define strcmp(d,s) strcmp ((d), (s)) -#define strcat(d,s) (void) strcat ((d), (s)) -#define strncat(d,s,n) strncat ((d), (s), (ACPI_SIZE)(n)) -#define strtoul(d,s,n) strtoul ((d), (s), (ACPI_SIZE)(n)) -#define memcmp(s1,s2,n) memcmp((void *)(s1), (void *)(s2), (ACPI_SIZE)(n)) -#define memcpy(d,s,n) (void) memcpy ((d), (s), (ACPI_SIZE)(n)) -#define memset(d,v,n) (void) memset ((d), (v), (ACPI_SIZE)(n)) -#define toupper(c) toupper ((int) (c)) -#define tolower(c) tolower ((int) (c)) -#endif /* ACPI_CLIBRARY */ - #endif /* !ACPI_USE_SYSTEM_CLIBRARY */ #define ACPI_IS_ASCII(c) ((c) < 0x80) /* * utcopy - Object construction and conversion interfaces */ ACPI_STATUS AcpiUtBuildSimpleObject( ACPI_OPERAND_OBJECT *Obj, ACPI_OBJECT *UserObj, UINT8 *DataSpace, UINT32 *BufferSpaceUsed); ACPI_STATUS AcpiUtBuildPackageObject ( ACPI_OPERAND_OBJECT *Obj, UINT8 *Buffer, UINT32 *SpaceUsed); ACPI_STATUS AcpiUtCopyIobjectToEobject ( ACPI_OPERAND_OBJECT *Obj, ACPI_BUFFER *RetBuffer); ACPI_STATUS AcpiUtCopyEobjectToIobject ( ACPI_OBJECT *Obj, ACPI_OPERAND_OBJECT **InternalObj); ACPI_STATUS AcpiUtCopyISimpleToIsimple ( ACPI_OPERAND_OBJECT *SourceObj, ACPI_OPERAND_OBJECT *DestObj); ACPI_STATUS AcpiUtCopyIobjectToIobject ( ACPI_OPERAND_OBJECT *SourceDesc, ACPI_OPERAND_OBJECT **DestDesc, ACPI_WALK_STATE *WalkState); /* * utcreate - Object creation */ ACPI_STATUS AcpiUtUpdateObjectReference ( ACPI_OPERAND_OBJECT *Object, UINT16 Action); /* * utdebug - Debug interfaces */ void AcpiUtInitStackPtrTrace ( void); void AcpiUtTrackStackPtr ( void); void AcpiUtTrace ( UINT32 LineNumber, const char *FunctionName, const char *ModuleName, UINT32 ComponentId); void AcpiUtTracePtr ( UINT32 LineNumber, const char *FunctionName, const char *ModuleName, UINT32 ComponentId, void *Pointer); void AcpiUtTraceU32 ( UINT32 LineNumber, const char *FunctionName, const char *ModuleName, UINT32 ComponentId, UINT32 Integer); void AcpiUtTraceStr ( UINT32 LineNumber, const char *FunctionName, const char *ModuleName, UINT32 ComponentId, char *String); void AcpiUtExit ( UINT32 LineNumber, const char *FunctionName, const char *ModuleName, UINT32 ComponentId); void AcpiUtStatusExit ( UINT32 LineNumber, const char *FunctionName, const char *ModuleName, UINT32 ComponentId, ACPI_STATUS Status); void AcpiUtValueExit ( UINT32 LineNumber, const char *FunctionName, const char *ModuleName, UINT32 ComponentId, UINT64 Value); void AcpiUtPtrExit ( UINT32 LineNumber, const char *FunctionName, const char *ModuleName, UINT32 ComponentId, UINT8 *Ptr); void AcpiUtDebugDumpBuffer ( UINT8 *Buffer, UINT32 Count, UINT32 Display, UINT32 ComponentId); void AcpiUtDumpBuffer ( UINT8 *Buffer, UINT32 Count, UINT32 Display, UINT32 Offset); #ifdef ACPI_APPLICATION void AcpiUtDumpBufferToFile ( ACPI_FILE File, UINT8 *Buffer, UINT32 Count, UINT32 Display, UINT32 BaseOffset); #endif void AcpiUtReportError ( char *ModuleName, UINT32 LineNumber); void AcpiUtReportInfo ( char *ModuleName, UINT32 LineNumber); void AcpiUtReportWarning ( char *ModuleName, UINT32 LineNumber); /* * utdelete - Object deletion and reference counts */ void AcpiUtAddReference ( ACPI_OPERAND_OBJECT *Object); void AcpiUtRemoveReference ( ACPI_OPERAND_OBJECT *Object); void AcpiUtDeleteInternalPackageObject ( ACPI_OPERAND_OBJECT *Object); void AcpiUtDeleteInternalSimpleObject ( ACPI_OPERAND_OBJECT *Object); void AcpiUtDeleteInternalObjectList ( ACPI_OPERAND_OBJECT **ObjList); /* * uteval - object evaluation */ ACPI_STATUS AcpiUtEvaluateObject ( ACPI_NAMESPACE_NODE *PrefixNode, char *Path, UINT32 ExpectedReturnBtypes, ACPI_OPERAND_OBJECT **ReturnDesc); ACPI_STATUS AcpiUtEvaluateNumericObject ( char *ObjectName, ACPI_NAMESPACE_NODE *DeviceNode, UINT64 *Value); ACPI_STATUS AcpiUtExecute_STA ( ACPI_NAMESPACE_NODE *DeviceNode, UINT32 *StatusFlags); ACPI_STATUS AcpiUtExecutePowerMethods ( ACPI_NAMESPACE_NODE *DeviceNode, const char **MethodNames, UINT8 MethodCount, UINT8 *OutValues); /* * utfileio - file operations */ #ifdef ACPI_APPLICATION ACPI_STATUS AcpiUtReadTableFromFile ( char *Filename, ACPI_TABLE_HEADER **Table); #endif /* * utids - device ID support */ ACPI_STATUS AcpiUtExecute_HID ( ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID **ReturnId); ACPI_STATUS AcpiUtExecute_UID ( ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID **ReturnId); ACPI_STATUS AcpiUtExecute_SUB ( ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID **ReturnId); ACPI_STATUS AcpiUtExecute_CID ( ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID_LIST **ReturnCidList); ACPI_STATUS AcpiUtExecute_CLS ( ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID **ReturnId); /* * utlock - reader/writer locks */ ACPI_STATUS AcpiUtCreateRwLock ( ACPI_RW_LOCK *Lock); void AcpiUtDeleteRwLock ( ACPI_RW_LOCK *Lock); ACPI_STATUS AcpiUtAcquireReadLock ( ACPI_RW_LOCK *Lock); ACPI_STATUS AcpiUtReleaseReadLock ( ACPI_RW_LOCK *Lock); ACPI_STATUS AcpiUtAcquireWriteLock ( ACPI_RW_LOCK *Lock); void AcpiUtReleaseWriteLock ( ACPI_RW_LOCK *Lock); /* * utobject - internal object create/delete/cache routines */ ACPI_OPERAND_OBJECT * AcpiUtCreateInternalObjectDbg ( const char *ModuleName, UINT32 LineNumber, UINT32 ComponentId, ACPI_OBJECT_TYPE Type); void * AcpiUtAllocateObjectDescDbg ( const char *ModuleName, UINT32 LineNumber, UINT32 ComponentId); #define AcpiUtCreateInternalObject(t) AcpiUtCreateInternalObjectDbg (_AcpiModuleName,__LINE__,_COMPONENT,t) #define AcpiUtAllocateObjectDesc() AcpiUtAllocateObjectDescDbg (_AcpiModuleName,__LINE__,_COMPONENT) void AcpiUtDeleteObjectDesc ( ACPI_OPERAND_OBJECT *Object); BOOLEAN AcpiUtValidInternalObject ( void *Object); ACPI_OPERAND_OBJECT * AcpiUtCreatePackageObject ( UINT32 Count); ACPI_OPERAND_OBJECT * AcpiUtCreateIntegerObject ( UINT64 Value); ACPI_OPERAND_OBJECT * AcpiUtCreateBufferObject ( ACPI_SIZE BufferSize); ACPI_OPERAND_OBJECT * AcpiUtCreateStringObject ( ACPI_SIZE StringSize); ACPI_STATUS AcpiUtGetObjectSize( ACPI_OPERAND_OBJECT *Obj, ACPI_SIZE *ObjLength); /* * utosi - Support for the _OSI predefined control method */ ACPI_STATUS AcpiUtInitializeInterfaces ( void); ACPI_STATUS AcpiUtInterfaceTerminate ( void); ACPI_STATUS AcpiUtInstallInterface ( ACPI_STRING InterfaceName); ACPI_STATUS AcpiUtRemoveInterface ( ACPI_STRING InterfaceName); ACPI_STATUS AcpiUtUpdateInterfaces ( UINT8 Action); ACPI_INTERFACE_INFO * AcpiUtGetInterface ( ACPI_STRING InterfaceName); ACPI_STATUS AcpiUtOsiImplementation ( ACPI_WALK_STATE *WalkState); /* * utpredef - support for predefined names */ const ACPI_PREDEFINED_INFO * AcpiUtGetNextPredefinedMethod ( const ACPI_PREDEFINED_INFO *ThisName); const ACPI_PREDEFINED_INFO * AcpiUtMatchPredefinedMethod ( char *Name); void AcpiUtGetExpectedReturnTypes ( char *Buffer, UINT32 ExpectedBtypes); #if (defined ACPI_ASL_COMPILER || defined ACPI_HELP_APP) const ACPI_PREDEFINED_INFO * AcpiUtMatchResourceName ( char *Name); void AcpiUtDisplayPredefinedMethod ( char *Buffer, const ACPI_PREDEFINED_INFO *ThisName, BOOLEAN MultiLine); UINT32 AcpiUtGetResourceBitWidth ( char *Buffer, UINT16 Types); #endif /* * utstate - Generic state creation/cache routines */ void AcpiUtPushGenericState ( ACPI_GENERIC_STATE **ListHead, ACPI_GENERIC_STATE *State); ACPI_GENERIC_STATE * AcpiUtPopGenericState ( ACPI_GENERIC_STATE **ListHead); ACPI_GENERIC_STATE * AcpiUtCreateGenericState ( void); ACPI_THREAD_STATE * AcpiUtCreateThreadState ( void); ACPI_GENERIC_STATE * AcpiUtCreateUpdateState ( ACPI_OPERAND_OBJECT *Object, UINT16 Action); ACPI_GENERIC_STATE * AcpiUtCreatePkgState ( void *InternalObject, void *ExternalObject, UINT16 Index); ACPI_STATUS AcpiUtCreateUpdateStateAndPush ( ACPI_OPERAND_OBJECT *Object, UINT16 Action, ACPI_GENERIC_STATE **StateList); ACPI_GENERIC_STATE * AcpiUtCreateControlState ( void); void AcpiUtDeleteGenericState ( ACPI_GENERIC_STATE *State); /* * utmath */ ACPI_STATUS AcpiUtDivide ( UINT64 InDividend, UINT64 InDivisor, UINT64 *OutQuotient, UINT64 *OutRemainder); ACPI_STATUS AcpiUtShortDivide ( UINT64 InDividend, UINT32 Divisor, UINT64 *OutQuotient, UINT32 *OutRemainder); /* * utmisc */ const ACPI_EXCEPTION_INFO * AcpiUtValidateException ( ACPI_STATUS Status); BOOLEAN AcpiUtIsPciRootBridge ( char *Id); #if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP) BOOLEAN AcpiUtIsAmlTable ( ACPI_TABLE_HEADER *Table); #endif ACPI_STATUS AcpiUtWalkPackageTree ( ACPI_OPERAND_OBJECT *SourceObject, void *TargetObject, ACPI_PKG_CALLBACK WalkCallback, void *Context); /* Values for Base above (16=Hex, 10=Decimal) */ #define ACPI_ANY_BASE 0 UINT32 AcpiUtDwordByteSwap ( UINT32 Value); void AcpiUtSetIntegerWidth ( UINT8 Revision); #ifdef ACPI_DEBUG_OUTPUT void AcpiUtDisplayInitPathname ( UINT8 Type, ACPI_NAMESPACE_NODE *ObjHandle, char *Path); #endif /* * utownerid - Support for Table/Method Owner IDs */ ACPI_STATUS AcpiUtAllocateOwnerId ( ACPI_OWNER_ID *OwnerId); void AcpiUtReleaseOwnerId ( ACPI_OWNER_ID *OwnerId); /* * utresrc */ ACPI_STATUS AcpiUtWalkAmlResources ( ACPI_WALK_STATE *WalkState, UINT8 *Aml, ACPI_SIZE AmlLength, ACPI_WALK_AML_CALLBACK UserFunction, void **Context); ACPI_STATUS AcpiUtValidateResource ( ACPI_WALK_STATE *WalkState, void *Aml, UINT8 *ReturnIndex); UINT32 AcpiUtGetDescriptorLength ( void *Aml); UINT16 AcpiUtGetResourceLength ( void *Aml); UINT8 AcpiUtGetResourceHeaderLength ( void *Aml); UINT8 AcpiUtGetResourceType ( void *Aml); ACPI_STATUS AcpiUtGetResourceEndTag ( ACPI_OPERAND_OBJECT *ObjDesc, UINT8 **EndTag); /* * utstring - String and character utilities */ void AcpiUtStrupr ( char *SrcString); #ifdef ACPI_ASL_COMPILER void AcpiUtStrlwr ( char *SrcString); int AcpiUtStricmp ( char *String1, char *String2); #endif ACPI_STATUS AcpiUtStrtoul64 ( char *String, UINT32 Base, UINT64 *RetInteger); void AcpiUtPrintString ( char *String, UINT16 MaxLength); #if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP void UtConvertBackslashes ( char *Pathname); #endif BOOLEAN AcpiUtValidAcpiName ( char *Name); BOOLEAN AcpiUtValidAcpiChar ( char Character, UINT32 Position); void AcpiUtRepairName ( char *Name); #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) BOOLEAN AcpiUtSafeStrcpy ( char *Dest, ACPI_SIZE DestSize, char *Source); BOOLEAN AcpiUtSafeStrcat ( char *Dest, ACPI_SIZE DestSize, char *Source); BOOLEAN AcpiUtSafeStrncat ( char *Dest, ACPI_SIZE DestSize, char *Source, ACPI_SIZE MaxTransferLength); #endif /* * utmutex - mutex support */ ACPI_STATUS AcpiUtMutexInitialize ( void); void AcpiUtMutexTerminate ( void); ACPI_STATUS AcpiUtAcquireMutex ( ACPI_MUTEX_HANDLE MutexId); ACPI_STATUS AcpiUtReleaseMutex ( ACPI_MUTEX_HANDLE MutexId); /* * utalloc - memory allocation and object caching */ ACPI_STATUS AcpiUtCreateCaches ( void); ACPI_STATUS AcpiUtDeleteCaches ( void); ACPI_STATUS AcpiUtValidateBuffer ( ACPI_BUFFER *Buffer); ACPI_STATUS AcpiUtInitializeBuffer ( ACPI_BUFFER *Buffer, ACPI_SIZE RequiredLength); #ifdef ACPI_DBG_TRACK_ALLOCATIONS void * AcpiUtAllocateAndTrack ( ACPI_SIZE Size, UINT32 Component, const char *Module, UINT32 Line); void * AcpiUtAllocateZeroedAndTrack ( ACPI_SIZE Size, UINT32 Component, const char *Module, UINT32 Line); void AcpiUtFreeAndTrack ( void *Address, UINT32 Component, const char *Module, UINT32 Line); void AcpiUtDumpAllocationInfo ( void); void AcpiUtDumpAllocations ( UINT32 Component, const char *Module); ACPI_STATUS AcpiUtCreateList ( char *ListName, UINT16 ObjectSize, ACPI_MEMORY_LIST **ReturnCache); #endif /* ACPI_DBG_TRACK_ALLOCATIONS */ /* * utaddress - address range check */ ACPI_STATUS AcpiUtAddAddressRange ( ACPI_ADR_SPACE_TYPE SpaceId, ACPI_PHYSICAL_ADDRESS Address, UINT32 Length, ACPI_NAMESPACE_NODE *RegionNode); void AcpiUtRemoveAddressRange ( ACPI_ADR_SPACE_TYPE SpaceId, ACPI_NAMESPACE_NODE *RegionNode); UINT32 AcpiUtCheckAddressRange ( ACPI_ADR_SPACE_TYPE SpaceId, ACPI_PHYSICAL_ADDRESS Address, UINT32 Length, BOOLEAN Warn); void AcpiUtDeleteAddressLists ( void); /* * utxferror - various error/warning output functions */ void ACPI_INTERNAL_VAR_XFACE AcpiUtPredefinedWarning ( const char *ModuleName, UINT32 LineNumber, char *Pathname, UINT8 NodeFlags, const char *Format, ...); void ACPI_INTERNAL_VAR_XFACE AcpiUtPredefinedInfo ( const char *ModuleName, UINT32 LineNumber, char *Pathname, UINT8 NodeFlags, const char *Format, ...); void ACPI_INTERNAL_VAR_XFACE AcpiUtPredefinedBiosError ( const char *ModuleName, UINT32 LineNumber, char *Pathname, UINT8 NodeFlags, const char *Format, ...); void AcpiUtNamespaceError ( const char *ModuleName, UINT32 LineNumber, const char *InternalName, ACPI_STATUS LookupStatus); void AcpiUtMethodError ( const char *ModuleName, UINT32 LineNumber, const char *Message, ACPI_NAMESPACE_NODE *Node, const char *Path, ACPI_STATUS LookupStatus); /* * Utility functions for ACPI names and IDs */ const AH_PREDEFINED_NAME * AcpiAhMatchPredefinedName ( char *Nameseg); const AH_DEVICE_ID * AcpiAhMatchHardwareId ( char *Hid); const char * AcpiAhMatchUuid ( UINT8 *Data); /* * utprint - printf/vprintf output functions */ const char * AcpiUtScanNumber ( const char *String, UINT64 *NumberPtr); const char * AcpiUtPrintNumber ( char *String, UINT64 Number); int AcpiUtVsnprintf ( char *String, ACPI_SIZE Size, const char *Format, va_list Args); int AcpiUtSnprintf ( char *String, ACPI_SIZE Size, const char *Format, ...); #ifdef ACPI_APPLICATION int AcpiUtFileVprintf ( ACPI_FILE File, const char *Format, va_list Args); int AcpiUtFilePrintf ( ACPI_FILE File, const char *Format, ...); #endif /* * utuuid -- UUID support functions */ #if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP || defined ACPI_HELP_APP) void AcpiUtConvertStringToUuid ( char *InString, UINT8 *UuidBuffer); #endif #endif /* _ACUTILS_H */ Index: vendor-sys/acpica/dist/source/include/platform/acenv.h =================================================================== --- vendor-sys/acpica/dist/source/include/platform/acenv.h (revision 284518) +++ vendor-sys/acpica/dist/source/include/platform/acenv.h (revision 284519) @@ -1,448 +1,404 @@ /****************************************************************************** * * Name: acenv.h - Host and compiler configuration * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #ifndef __ACENV_H__ #define __ACENV_H__ /* * Environment configuration. The purpose of this file is to interface ACPICA * to the local environment. This includes compiler-specific, OS-specific, * and machine-specific configuration. */ /* Types for ACPI_MUTEX_TYPE */ #define ACPI_BINARY_SEMAPHORE 0 #define ACPI_OSL_MUTEX 1 /* Types for DEBUGGER_THREADING */ #define DEBUGGER_SINGLE_THREADED 0 #define DEBUGGER_MULTI_THREADED 1 /****************************************************************************** * * Configuration for ACPI tools and utilities * *****************************************************************************/ /* iASL configuration */ #ifdef ACPI_ASL_COMPILER #define ACPI_APPLICATION #define ACPI_DISASSEMBLER #define ACPI_DEBUG_OUTPUT #define ACPI_CONSTANT_EVAL_ONLY #define ACPI_LARGE_NAMESPACE_NODE #define ACPI_DATA_TABLE_DISASSEMBLY #define ACPI_SINGLE_THREADED #define ACPI_32BIT_PHYSICAL_ADDRESS #endif /* AcpiExec configuration. Multithreaded with full AML debugger */ #ifdef ACPI_EXEC_APP #define ACPI_APPLICATION #define ACPI_FULL_DEBUG #define ACPI_MUTEX_DEBUG #define ACPI_DBG_TRACK_ALLOCATIONS #endif /* * AcpiBin/AcpiDump/AcpiHelp/AcpiNames/AcpiSrc/AcpiXtract/Example configuration. * All single threaded. */ #if (defined ACPI_BIN_APP) || \ (defined ACPI_DUMP_APP) || \ (defined ACPI_HELP_APP) || \ (defined ACPI_NAMES_APP) || \ (defined ACPI_SRC_APP) || \ (defined ACPI_XTRACT_APP) || \ (defined ACPI_EXAMPLE_APP) #define ACPI_APPLICATION #define ACPI_SINGLE_THREADED #endif /* AcpiHelp configuration. Error messages disabled. */ #ifdef ACPI_HELP_APP #define ACPI_NO_ERROR_MESSAGES #endif /* AcpiNames configuration. Debug output enabled. */ #ifdef ACPI_NAMES_APP #define ACPI_DEBUG_OUTPUT #endif /* AcpiExec/AcpiNames/Example configuration. Native RSDP used. */ #if (defined ACPI_EXEC_APP) || \ (defined ACPI_EXAMPLE_APP) || \ (defined ACPI_NAMES_APP) #define ACPI_USE_NATIVE_RSDP_POINTER #endif /* AcpiDump configuration. Native mapping used if provied by OSPMs */ #ifdef ACPI_DUMP_APP #define ACPI_USE_NATIVE_MEMORY_MAPPING #define USE_NATIVE_ALLOCATE_ZEROED #endif /* AcpiNames/Example configuration. Hardware disabled */ #if (defined ACPI_EXAMPLE_APP) || \ (defined ACPI_NAMES_APP) #define ACPI_REDUCED_HARDWARE 1 #endif /* Linkable ACPICA library */ #ifdef ACPI_LIBRARY #define ACPI_USE_LOCAL_CACHE #endif /* Common for all ACPICA applications */ #ifdef ACPI_APPLICATION #define ACPI_USE_SYSTEM_CLIBRARY #define ACPI_USE_LOCAL_CACHE #endif /* Common debug support */ #ifdef ACPI_FULL_DEBUG #define ACPI_DEBUGGER #define ACPI_DEBUG_OUTPUT #define ACPI_DISASSEMBLER #endif /*! [Begin] no source code translation */ /****************************************************************************** * * Host configuration files. The compiler configuration files are included * by the host files. * *****************************************************************************/ #if defined(_LINUX) || defined(__linux__) #include "aclinux.h" #elif defined(_APPLE) || defined(__APPLE__) #include "acmacosx.h" #elif defined(__DragonFly__) #include "acdragonfly.h" #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include "acfreebsd.h" #elif defined(__NetBSD__) #include "acnetbsd.h" #elif defined(__sun) #include "acsolaris.h" #elif defined(MODESTO) #include "acmodesto.h" #elif defined(NETWARE) #include "acnetware.h" #elif defined(_CYGWIN) #include "accygwin.h" #elif defined(WIN32) #include "acwin.h" #elif defined(WIN64) #include "acwin64.h" #elif defined(_WRS_LIB_BUILD) #include "acvxworks.h" #elif defined(__OS2__) #include "acos2.h" #elif defined(_AED_EFI) #include "acefi.h" #elif defined(_GNU_EFI) #include "acefi.h" #elif defined(__HAIKU__) #include "achaiku.h" #else /* Unknown environment */ #error Unknown target environment #endif /*! [End] no source code translation !*/ /****************************************************************************** * * Setup defaults for the required symbols that were not defined in one of * the host/compiler files above. * *****************************************************************************/ /* 64-bit data types */ #ifndef COMPILER_DEPENDENT_INT64 #define COMPILER_DEPENDENT_INT64 long long #endif #ifndef COMPILER_DEPENDENT_UINT64 #define COMPILER_DEPENDENT_UINT64 unsigned long long #endif /* Type of mutex supported by host. Default is binary semaphores. */ #ifndef ACPI_MUTEX_TYPE #define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE #endif /* Global Lock acquire/release */ #ifndef ACPI_ACQUIRE_GLOBAL_LOCK #define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acquired) Acquired = 1 #endif #ifndef ACPI_RELEASE_GLOBAL_LOCK #define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Pending) Pending = 0 #endif /* Flush CPU cache - used when going to sleep. Wbinvd or similar. */ #ifndef ACPI_FLUSH_CPU_CACHE #define ACPI_FLUSH_CPU_CACHE() #endif /* "inline" keywords - configurable since inline is not standardized */ #ifndef ACPI_INLINE #define ACPI_INLINE #endif /* * Configurable calling conventions: * * ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads) * ACPI_EXTERNAL_XFACE - External ACPI interfaces * ACPI_INTERNAL_XFACE - Internal ACPI interfaces * ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces */ #ifndef ACPI_SYSTEM_XFACE #define ACPI_SYSTEM_XFACE #endif #ifndef ACPI_EXTERNAL_XFACE #define ACPI_EXTERNAL_XFACE #endif #ifndef ACPI_INTERNAL_XFACE #define ACPI_INTERNAL_XFACE #endif #ifndef ACPI_INTERNAL_VAR_XFACE #define ACPI_INTERNAL_VAR_XFACE #endif /* * Debugger threading model * Use single threaded if the entire subsystem is contained in an application * Use multiple threaded when the subsystem is running in the kernel. * * By default the model is single threaded if ACPI_APPLICATION is set, * multi-threaded if ACPI_APPLICATION is not set. */ #ifndef DEBUGGER_THREADING #ifdef ACPI_APPLICATION #define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED #else #define DEBUGGER_THREADING DEBUGGER_MULTI_THREADED #endif #endif /* !DEBUGGER_THREADING */ /****************************************************************************** * * C library configuration * *****************************************************************************/ /* * ACPI_USE_SYSTEM_CLIBRARY - Define this if linking to an actual C library. * Otherwise, local versions of string/memory functions will be used. * ACPI_USE_STANDARD_HEADERS - Define this if linking to a C library and * the standard header files may be used. * * The ACPICA subsystem only uses low level C library functions that do not call * operating system services and may therefore be inlined in the code. * * It may be necessary to tailor these include files to the target * generation environment. */ #ifdef ACPI_USE_SYSTEM_CLIBRARY /* Use the standard C library headers. We want to keep these to a minimum. */ #ifdef ACPI_USE_STANDARD_HEADERS /* Use the standard headers from the standard locations */ #include #include #include #include #endif /* ACPI_USE_STANDARD_HEADERS */ /* We will be linking to the standard Clib functions */ -#undef strstr -#undef strchr -#undef strlen -#undef strcpy -#undef strncpy -#undef strncmp -#undef strcmp -#undef strcat -#undef strncat -#undef strtoul -#undef memcmp -#undef memcpy -#undef memset -#undef toupper -#undef tolower -#undef isxdigit -#undef isdigit -#undef isspace -#undef isupper -#undef isprint -#undef isalpha - -#define strstr(s1,s2) strstr((s1), (s2)) -#define strchr(s1,c) strchr((s1), (c)) -#define strlen(s) (ACPI_SIZE) strlen((s)) -#define strcpy(d,s) (void) strcpy((d), (s)) -#define strncpy(d,s,n) (void) strncpy((d), (s), (ACPI_SIZE)(n)) -#define strncmp(d,s,n) strncmp((d), (s), (ACPI_SIZE)(n)) -#define strcmp(d,s) strcmp((d), (s)) -#define strcat(d,s) (void) strcat((d), (s)) -#define strncat(d,s,n) strncat((d), (s), (ACPI_SIZE)(n)) -#define strtoul(d,s,n) strtoul((d), (s), (ACPI_SIZE)(n)) -#define memcmp(s1,s2,n) memcmp((const char *)(s1), (const char *)(s2), (ACPI_SIZE)(n)) -#define memcpy(d,s,n) (void) memcpy((d), (s), (ACPI_SIZE)(n)) -#define memset(d,s,n) (void) memset((d), (s), (ACPI_SIZE)(n)) -#define toupper(i) toupper((int) (i)) -#define tolower(i) tolower((int) (i)) -#define isxdigit(i) isxdigit((int) (i)) -#define isdigit(i) isdigit((int) (i)) -#define isspace(i) isspace((int) (i)) -#define isupper(i) isupper((int) (i)) -#define isprint(i) isprint((int) (i)) -#define isalpha(i) isalpha((int) (i)) - #else /****************************************************************************** * * Not using native C library, use local implementations * *****************************************************************************/ /* * Use local definitions of C library macros and functions. These function * implementations may not be as efficient as an inline or assembly code * implementation provided by a native C library, but they are functionally * equivalent. */ #ifndef va_arg #ifndef _VALIST #define _VALIST typedef char *va_list; #endif /* _VALIST */ /* Storage alignment properties */ #define _AUPBND (sizeof (ACPI_NATIVE_INT) - 1) #define _ADNBND (sizeof (ACPI_NATIVE_INT) - 1) /* Variable argument list macro definitions */ #define _Bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd))) #define va_arg(ap, T) (*(T *)(((ap) += (_Bnd (T, _AUPBND))) - (_Bnd (T,_ADNBND)))) #define va_end(ap) (ap = (va_list) NULL) #define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_Bnd (A,_AUPBND)))) #endif /* va_arg */ /* Use the local (ACPICA) definitions of the clib functions */ #endif /* ACPI_USE_SYSTEM_CLIBRARY */ #ifndef ACPI_FILE #ifdef ACPI_APPLICATION #include #define ACPI_FILE FILE * #define ACPI_FILE_OUT stdout #define ACPI_FILE_ERR stderr #else #define ACPI_FILE void * #define ACPI_FILE_OUT NULL #define ACPI_FILE_ERR NULL #endif /* ACPI_APPLICATION */ #endif /* ACPI_FILE */ #endif /* __ACENV_H__ */ Index: vendor-sys/acpica/dist/source/tools/acpidump/apfiles.c =================================================================== --- vendor-sys/acpica/dist/source/tools/acpidump/apfiles.c (revision 284518) +++ vendor-sys/acpica/dist/source/tools/acpidump/apfiles.c (revision 284519) @@ -1,278 +1,278 @@ /****************************************************************************** * * Module Name: apfiles - File-related functions for acpidump utility * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpidump.h" #include "acapps.h" /* Local prototypes */ static int ApIsExistingFile ( char *Pathname); static int ApIsExistingFile ( char *Pathname) { #ifndef _GNU_EFI struct stat StatInfo; if (!stat (Pathname, &StatInfo)) { AcpiLogError ("Target path already exists, overwrite? [y|n] "); if (getchar () != 'y') { return (-1); } } #endif return 0; } /****************************************************************************** * * FUNCTION: ApOpenOutputFile * * PARAMETERS: Pathname - Output filename * * RETURN: Open file handle * * DESCRIPTION: Open a text output file for acpidump. Checks if file already * exists. * ******************************************************************************/ int ApOpenOutputFile ( char *Pathname) { ACPI_FILE File; /* If file exists, prompt for overwrite */ if (ApIsExistingFile (Pathname) != 0) { return (-1); } /* Point stdout to the file */ File = AcpiOsOpenFile (Pathname, ACPI_FILE_WRITING); if (!File) { AcpiLogError ("Could not open output file: %s\n", Pathname); return (-1); } /* Save the file and path */ Gbl_OutputFile = File; Gbl_OutputFilename = Pathname; return (0); } /****************************************************************************** * * FUNCTION: ApWriteToBinaryFile * * PARAMETERS: Table - ACPI table to be written * Instance - ACPI table instance no. to be written * * RETURN: Status * * DESCRIPTION: Write an ACPI table to a binary file. Builds the output * filename from the table signature. * ******************************************************************************/ int ApWriteToBinaryFile ( ACPI_TABLE_HEADER *Table, UINT32 Instance) { char Filename[ACPI_NAME_SIZE + 16]; char InstanceStr [16]; ACPI_FILE File; size_t Actual; UINT32 TableLength; /* Obtain table length */ TableLength = ApGetTableLength (Table); /* Construct lower-case filename from the table local signature */ if (ACPI_VALIDATE_RSDP_SIG (Table->Signature)) { ACPI_MOVE_NAME (Filename, ACPI_RSDP_NAME); } else { ACPI_MOVE_NAME (Filename, Table->Signature); } - Filename[0] = (char) tolower (Filename[0]); - Filename[1] = (char) tolower (Filename[1]); - Filename[2] = (char) tolower (Filename[2]); - Filename[3] = (char) tolower (Filename[3]); + Filename[0] = (char) tolower ((int) Filename[0]); + Filename[1] = (char) tolower ((int) Filename[1]); + Filename[2] = (char) tolower ((int) Filename[2]); + Filename[3] = (char) tolower ((int) Filename[3]); Filename[ACPI_NAME_SIZE] = 0; /* Handle multiple SSDTs - create different filenames for each */ if (Instance > 0) { AcpiUtSnprintf (InstanceStr, sizeof (InstanceStr), "%u", Instance); strcat (Filename, InstanceStr); } strcat (Filename, ACPI_TABLE_FILE_SUFFIX); if (Gbl_VerboseMode) { AcpiLogError ( "Writing [%4.4s] to binary file: %s 0x%X (%u) bytes\n", Table->Signature, Filename, Table->Length, Table->Length); } /* Open the file and dump the entire table in binary mode */ File = AcpiOsOpenFile (Filename, ACPI_FILE_WRITING | ACPI_FILE_BINARY); if (!File) { AcpiLogError ("Could not open output file: %s\n", Filename); return (-1); } Actual = AcpiOsWriteFile (File, Table, 1, TableLength); if (Actual != TableLength) { AcpiLogError ("Error writing binary output file: %s\n", Filename); AcpiOsCloseFile (File); return (-1); } AcpiOsCloseFile (File); return (0); } /****************************************************************************** * * FUNCTION: ApGetTableFromFile * * PARAMETERS: Pathname - File containing the binary ACPI table * OutFileSize - Where the file size is returned * * RETURN: Buffer containing the ACPI table. NULL on error. * * DESCRIPTION: Open a file and read it entirely into a new buffer * ******************************************************************************/ ACPI_TABLE_HEADER * ApGetTableFromFile ( char *Pathname, UINT32 *OutFileSize) { ACPI_TABLE_HEADER *Buffer = NULL; ACPI_FILE File; UINT32 FileSize; size_t Actual; /* Must use binary mode */ File = AcpiOsOpenFile (Pathname, ACPI_FILE_READING | ACPI_FILE_BINARY); if (!File) { AcpiLogError ("Could not open input file: %s\n", Pathname); return (NULL); } /* Need file size to allocate a buffer */ FileSize = CmGetFileSize (File); if (FileSize == ACPI_UINT32_MAX) { AcpiLogError ( "Could not get input file size: %s\n", Pathname); goto Cleanup; } /* Allocate a buffer for the entire file */ Buffer = ACPI_ALLOCATE_ZEROED (FileSize); if (!Buffer) { AcpiLogError ( "Could not allocate file buffer of size: %u\n", FileSize); goto Cleanup; } /* Read the entire file */ Actual = AcpiOsReadFile (File, Buffer, 1, FileSize); if (Actual != FileSize) { AcpiLogError ( "Could not read input file: %s\n", Pathname); ACPI_FREE (Buffer); Buffer = NULL; goto Cleanup; } *OutFileSize = FileSize; Cleanup: AcpiOsCloseFile (File); return (Buffer); } Index: vendor-sys/acpica/dist/source/tools/acpisrc/asutils.c =================================================================== --- vendor-sys/acpica/dist/source/tools/acpisrc/asutils.c (revision 284518) +++ vendor-sys/acpica/dist/source/tools/acpisrc/asutils.c (revision 284519) @@ -1,266 +1,266 @@ /****************************************************************************** * * Module Name: asutils - common utilities * *****************************************************************************/ /* * Copyright (C) 2000 - 2015, Intel Corp. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer * substantially similar to the "NO WARRANTY" disclaimer below * ("Disclaimer") and any redistribution must be conditioned upon * including a substantially similar Disclaimer requirement for further * binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */ #include "acpisrc.h" /******************************************************************************* * * FUNCTION: AsStrlwr (strlwr) * * PARAMETERS: SrcString - The source string to convert * * RETURN: None * * DESCRIPTION: Convert string to lowercase * * NOTE: This is not a POSIX function, so it appears here so that we don't have * header file issues with the various hosts/compilers/clibs. * ******************************************************************************/ void AsStrlwr ( char *SrcString) { char *String; /* Walk entire string, lowercasing the letters */ if (SrcString) { for (String = SrcString; *String; String++) { - *String = (char) tolower (*String); + *String = (char) tolower ((int) *String); } } } /****************************************************************************** * * FUNCTION: AsSkipUntilChar * * DESCRIPTION: Find the next instance of the input character * ******************************************************************************/ char * AsSkipUntilChar ( char *Buffer, char Target) { while (*Buffer != Target) { if (!*Buffer) { return (NULL); } Buffer++; } return (Buffer); } /****************************************************************************** * * FUNCTION: AsSkipPastChar * * DESCRIPTION: Find the next instance of the input character, return a buffer * pointer to this character+1. * ******************************************************************************/ char * AsSkipPastChar ( char *Buffer, char Target) { while (*Buffer != Target) { if (!*Buffer) { return (NULL); } Buffer++; } Buffer++; return (Buffer); } /****************************************************************************** * * FUNCTION: AsReplaceData * * DESCRIPTION: This function inserts and removes data from the file buffer. * if more data is inserted than is removed, the data in the buffer * is moved to make room. If less data is inserted than is removed, * the remaining data is moved to close the hole. * ******************************************************************************/ char * AsReplaceData ( char *Buffer, UINT32 LengthToRemove, char *BufferToAdd, UINT32 LengthToAdd) { UINT32 BufferLength; /* * Buffer is a string, so the length must include the terminating zero */ BufferLength = strlen (Buffer) + 1; if (LengthToRemove != LengthToAdd) { /* * Move some of the existing data * 1) If adding more bytes than removing, make room for the new data * 2) if removing more bytes than adding, delete the extra space */ if (LengthToRemove > 0) { Gbl_MadeChanges = TRUE; memmove ((Buffer + LengthToAdd), (Buffer + LengthToRemove), (BufferLength - LengthToRemove)); } } /* * Now we can move in the new data */ if (LengthToAdd > 0) { Gbl_MadeChanges = TRUE; memmove (Buffer, BufferToAdd, LengthToAdd); } return (Buffer + LengthToAdd); } /****************************************************************************** * * FUNCTION: AsInsertData * * DESCRIPTION: This function inserts and removes data from the file buffer. * if more data is inserted than is removed, the data in the buffer * is moved to make room. If less data is inserted than is removed, * the remaining data is moved to close the hole. * ******************************************************************************/ char * AsInsertData ( char *Buffer, char *BufferToAdd, UINT32 LengthToAdd) { UINT32 BufferLength; if (LengthToAdd > 0) { /* * Buffer is a string, so the length must include the terminating zero */ BufferLength = strlen (Buffer) + 1; /* * Move some of the existing data * 1) If adding more bytes than removing, make room for the new data * 2) if removing more bytes than adding, delete the extra space */ Gbl_MadeChanges = TRUE; memmove ((Buffer + LengthToAdd), Buffer, BufferLength); /* * Now we can move in the new data */ memmove (Buffer, BufferToAdd, LengthToAdd); } return (Buffer + LengthToAdd); } /****************************************************************************** * * FUNCTION: AsRemoveData * * DESCRIPTION: This function inserts and removes data from the file buffer. * if more data is inserted than is removed, the data in the buffer * is moved to make room. If less data is inserted than is removed, * the remaining data is moved to close the hole. * ******************************************************************************/ char * AsRemoveData ( char *StartPointer, char *EndPointer) { UINT32 BufferLength; /* * Buffer is a string, so the length must include the terminating zero */ BufferLength = strlen (EndPointer) + 1; Gbl_MadeChanges = TRUE; memmove (StartPointer, EndPointer, BufferLength); return (StartPointer); }