153289f6aSNate Lawson /****************************************************************************** 253289f6aSNate Lawson * 353289f6aSNate Lawson * Module Name: asllookup- Namespace lookup 453289f6aSNate Lawson * 553289f6aSNate Lawson *****************************************************************************/ 653289f6aSNate Lawson 753289f6aSNate Lawson /****************************************************************************** 853289f6aSNate Lawson * 953289f6aSNate Lawson * 1. Copyright Notice 1053289f6aSNate Lawson * 11a9f12690SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. 1253289f6aSNate Lawson * All rights reserved. 1353289f6aSNate Lawson * 1453289f6aSNate Lawson * 2. License 1553289f6aSNate Lawson * 1653289f6aSNate Lawson * 2.1. This is your license from Intel Corp. under its intellectual property 1753289f6aSNate Lawson * rights. You may have additional license terms from the party that provided 1853289f6aSNate Lawson * you this software, covering your right to use that party's intellectual 1953289f6aSNate Lawson * property rights. 2053289f6aSNate Lawson * 2153289f6aSNate Lawson * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 2253289f6aSNate Lawson * copy of the source code appearing in this file ("Covered Code") an 2353289f6aSNate Lawson * irrevocable, perpetual, worldwide license under Intel's copyrights in the 2453289f6aSNate Lawson * base code distributed originally by Intel ("Original Intel Code") to copy, 2553289f6aSNate Lawson * make derivatives, distribute, use and display any portion of the Covered 2653289f6aSNate Lawson * Code in any form, with the right to sublicense such rights; and 2753289f6aSNate Lawson * 2853289f6aSNate Lawson * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 2953289f6aSNate Lawson * license (with the right to sublicense), under only those claims of Intel 3053289f6aSNate Lawson * patents that are infringed by the Original Intel Code, to make, use, sell, 3153289f6aSNate Lawson * offer to sell, and import the Covered Code and derivative works thereof 3253289f6aSNate Lawson * solely to the minimum extent necessary to exercise the above copyright 3353289f6aSNate Lawson * license, and in no event shall the patent license extend to any additions 3453289f6aSNate Lawson * to or modifications of the Original Intel Code. No other license or right 3553289f6aSNate Lawson * is granted directly or by implication, estoppel or otherwise; 3653289f6aSNate Lawson * 3753289f6aSNate Lawson * The above copyright and patent license is granted only if the following 3853289f6aSNate Lawson * conditions are met: 3953289f6aSNate Lawson * 4053289f6aSNate Lawson * 3. Conditions 4153289f6aSNate Lawson * 4253289f6aSNate Lawson * 3.1. Redistribution of Source with Rights to Further Distribute Source. 4353289f6aSNate Lawson * Redistribution of source code of any substantial portion of the Covered 4453289f6aSNate Lawson * Code or modification with rights to further distribute source must include 4553289f6aSNate Lawson * the above Copyright Notice, the above License, this list of Conditions, 4653289f6aSNate Lawson * and the following Disclaimer and Export Compliance provision. In addition, 4753289f6aSNate Lawson * Licensee must cause all Covered Code to which Licensee contributes to 4853289f6aSNate Lawson * contain a file documenting the changes Licensee made to create that Covered 4953289f6aSNate Lawson * Code and the date of any change. Licensee must include in that file the 5053289f6aSNate Lawson * documentation of any changes made by any predecessor Licensee. Licensee 5153289f6aSNate Lawson * must include a prominent statement that the modification is derived, 5253289f6aSNate Lawson * directly or indirectly, from Original Intel Code. 5353289f6aSNate Lawson * 5453289f6aSNate Lawson * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 5553289f6aSNate Lawson * Redistribution of source code of any substantial portion of the Covered 5653289f6aSNate Lawson * Code or modification without rights to further distribute source must 5753289f6aSNate Lawson * include the following Disclaimer and Export Compliance provision in the 5853289f6aSNate Lawson * documentation and/or other materials provided with distribution. In 5953289f6aSNate Lawson * addition, Licensee may not authorize further sublicense of source of any 6053289f6aSNate Lawson * portion of the Covered Code, and must include terms to the effect that the 6153289f6aSNate Lawson * license from Licensee to its licensee is limited to the intellectual 6253289f6aSNate Lawson * property embodied in the software Licensee provides to its licensee, and 6353289f6aSNate Lawson * not to intellectual property embodied in modifications its licensee may 6453289f6aSNate Lawson * make. 6553289f6aSNate Lawson * 6653289f6aSNate Lawson * 3.3. Redistribution of Executable. Redistribution in executable form of any 6753289f6aSNate Lawson * substantial portion of the Covered Code or modification must reproduce the 6853289f6aSNate Lawson * above Copyright Notice, and the following Disclaimer and Export Compliance 6953289f6aSNate Lawson * provision in the documentation and/or other materials provided with the 7053289f6aSNate Lawson * distribution. 7153289f6aSNate Lawson * 7253289f6aSNate Lawson * 3.4. Intel retains all right, title, and interest in and to the Original 7353289f6aSNate Lawson * Intel Code. 7453289f6aSNate Lawson * 7553289f6aSNate Lawson * 3.5. Neither the name Intel nor any other trademark owned or controlled by 7653289f6aSNate Lawson * Intel shall be used in advertising or otherwise to promote the sale, use or 7753289f6aSNate Lawson * other dealings in products derived from or relating to the Covered Code 7853289f6aSNate Lawson * without prior written authorization from Intel. 7953289f6aSNate Lawson * 8053289f6aSNate Lawson * 4. Disclaimer and Export Compliance 8153289f6aSNate Lawson * 8253289f6aSNate Lawson * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 8353289f6aSNate Lawson * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 8453289f6aSNate Lawson * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 8553289f6aSNate Lawson * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 8653289f6aSNate Lawson * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 8753289f6aSNate Lawson * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 8853289f6aSNate Lawson * PARTICULAR PURPOSE. 8953289f6aSNate Lawson * 9053289f6aSNate Lawson * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 9153289f6aSNate Lawson * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 9253289f6aSNate Lawson * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 9353289f6aSNate Lawson * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 9453289f6aSNate Lawson * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 9553289f6aSNate Lawson * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 9653289f6aSNate Lawson * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 9753289f6aSNate Lawson * LIMITED REMEDY. 9853289f6aSNate Lawson * 9953289f6aSNate Lawson * 4.3. Licensee shall not export, either directly or indirectly, any of this 10053289f6aSNate Lawson * software or system incorporating such software without first obtaining any 10153289f6aSNate Lawson * required license or other approval from the U. S. Department of Commerce or 10253289f6aSNate Lawson * any other agency or department of the United States Government. In the 10353289f6aSNate Lawson * event Licensee exports any such software from the United States or 10453289f6aSNate Lawson * re-exports any such software from a foreign destination, Licensee shall 10553289f6aSNate Lawson * ensure that the distribution and export/re-export of the software is in 10653289f6aSNate Lawson * compliance with all laws, regulations, orders, or other restrictions of the 10753289f6aSNate Lawson * U.S. Export Administration Regulations. Licensee agrees that neither it nor 10853289f6aSNate Lawson * any of its subsidiaries will export/re-export any technical data, process, 10953289f6aSNate Lawson * software, or service, directly or indirectly, to any country for which the 11053289f6aSNate Lawson * United States government or any agency thereof requires an export license, 11153289f6aSNate Lawson * other governmental approval, or letter of assurance, without first obtaining 11253289f6aSNate Lawson * such license, approval or letter. 11353289f6aSNate Lawson * 11453289f6aSNate Lawson *****************************************************************************/ 11553289f6aSNate Lawson 11653289f6aSNate Lawson 117ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 11853289f6aSNate Lawson #include "aslcompiler.y.h" 11953289f6aSNate Lawson 120ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 121ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 122ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 123ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 12453289f6aSNate Lawson 12553289f6aSNate Lawson 12653289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 12753289f6aSNate Lawson ACPI_MODULE_NAME ("asllookup") 12853289f6aSNate Lawson 129fba7fc7eSJung-uk Kim /* Local prototypes */ 130fba7fc7eSJung-uk Kim 131fba7fc7eSJung-uk Kim static ACPI_STATUS 132fba7fc7eSJung-uk Kim LsCompareOneNamespaceObject ( 133fba7fc7eSJung-uk Kim ACPI_HANDLE ObjHandle, 134fba7fc7eSJung-uk Kim UINT32 Level, 135fba7fc7eSJung-uk Kim void *Context, 136fba7fc7eSJung-uk Kim void **ReturnValue); 137fba7fc7eSJung-uk Kim 138fba7fc7eSJung-uk Kim static ACPI_STATUS 139fba7fc7eSJung-uk Kim LsDoOneNamespaceObject ( 140fba7fc7eSJung-uk Kim ACPI_HANDLE ObjHandle, 141fba7fc7eSJung-uk Kim UINT32 Level, 142fba7fc7eSJung-uk Kim void *Context, 143fba7fc7eSJung-uk Kim void **ReturnValue); 144fba7fc7eSJung-uk Kim 145fba7fc7eSJung-uk Kim static BOOLEAN 146fba7fc7eSJung-uk Kim LkObjectExists ( 147fba7fc7eSJung-uk Kim char *Name); 148fba7fc7eSJung-uk Kim 149fba7fc7eSJung-uk Kim static void 150fba7fc7eSJung-uk Kim LkCheckFieldRange ( 151fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 152fba7fc7eSJung-uk Kim UINT32 RegionBitLength, 153fba7fc7eSJung-uk Kim UINT32 FieldBitOffset, 154fba7fc7eSJung-uk Kim UINT32 FieldBitLength, 155fba7fc7eSJung-uk Kim UINT32 AccessBitWidth); 156fba7fc7eSJung-uk Kim 157fba7fc7eSJung-uk Kim static ACPI_STATUS 158fba7fc7eSJung-uk Kim LkNamespaceLocateBegin ( 159fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 160fba7fc7eSJung-uk Kim UINT32 Level, 161fba7fc7eSJung-uk Kim void *Context); 162fba7fc7eSJung-uk Kim 163fba7fc7eSJung-uk Kim static ACPI_STATUS 164fba7fc7eSJung-uk Kim LkNamespaceLocateEnd ( 165fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 166fba7fc7eSJung-uk Kim UINT32 Level, 167fba7fc7eSJung-uk Kim void *Context); 168fba7fc7eSJung-uk Kim 1691a39cfb0SJung-uk Kim static ACPI_STATUS 1701a39cfb0SJung-uk Kim LkIsObjectUsed ( 1711a39cfb0SJung-uk Kim ACPI_HANDLE ObjHandle, 1721a39cfb0SJung-uk Kim UINT32 Level, 1731a39cfb0SJung-uk Kim void *Context, 1741a39cfb0SJung-uk Kim void **ReturnValue); 1751a39cfb0SJung-uk Kim 176a9f12690SJung-uk Kim static ACPI_STATUS 177a9f12690SJung-uk Kim LsDoOnePathname ( 178a9f12690SJung-uk Kim ACPI_HANDLE ObjHandle, 179a9f12690SJung-uk Kim UINT32 Level, 180a9f12690SJung-uk Kim void *Context, 181a9f12690SJung-uk Kim void **ReturnValue); 182a9f12690SJung-uk Kim 183a9f12690SJung-uk Kim void 184a9f12690SJung-uk Kim LsSetupNsList ( 185a9f12690SJung-uk Kim void *Handle); 186a9f12690SJung-uk Kim 187a9f12690SJung-uk Kim ACPI_PARSE_OBJECT * 188a9f12690SJung-uk Kim LkGetNameOp ( 189a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op); 190a9f12690SJung-uk Kim 19153289f6aSNate Lawson 19253289f6aSNate Lawson /******************************************************************************* 19353289f6aSNate Lawson * 19453289f6aSNate Lawson * FUNCTION: LsDoOneNamespaceObject 19553289f6aSNate Lawson * 19653289f6aSNate Lawson * PARAMETERS: ACPI_WALK_CALLBACK 19753289f6aSNate Lawson * 19853289f6aSNate Lawson * RETURN: Status 19953289f6aSNate Lawson * 20053289f6aSNate Lawson * DESCRIPTION: Dump a namespace object to the namespace output file. 20153289f6aSNate Lawson * Called during the walk of the namespace to dump all objects. 20253289f6aSNate Lawson * 20353289f6aSNate Lawson ******************************************************************************/ 20453289f6aSNate Lawson 205fba7fc7eSJung-uk Kim static ACPI_STATUS 20653289f6aSNate Lawson LsDoOneNamespaceObject ( 20753289f6aSNate Lawson ACPI_HANDLE ObjHandle, 20853289f6aSNate Lawson UINT32 Level, 20953289f6aSNate Lawson void *Context, 21053289f6aSNate Lawson void **ReturnValue) 21153289f6aSNate Lawson { 21253289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 213fba7fc7eSJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc; 21453289f6aSNate Lawson ACPI_PARSE_OBJECT *Op; 21553289f6aSNate Lawson 21653289f6aSNate Lawson 21753289f6aSNate Lawson Gbl_NumNamespaceObjects++; 21853289f6aSNate Lawson 21953289f6aSNate Lawson FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%5d [%d] %*s %4.4s - %s", 22053289f6aSNate Lawson Gbl_NumNamespaceObjects, Level, (Level * 3), " ", 22153289f6aSNate Lawson &Node->Name, 22253289f6aSNate Lawson AcpiUtGetTypeName (Node->Type)); 22353289f6aSNate Lawson 224fba7fc7eSJung-uk Kim Op = Node->Op; 225fba7fc7eSJung-uk Kim ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node->Object); 22653289f6aSNate Lawson 227fba7fc7eSJung-uk Kim if (!Op) 22853289f6aSNate Lawson { 229fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n"); 230fba7fc7eSJung-uk Kim return (AE_OK); 23153289f6aSNate Lawson } 23253289f6aSNate Lawson 233fba7fc7eSJung-uk Kim 234fba7fc7eSJung-uk Kim if ((ObjDesc) && 2351a39cfb0SJung-uk Kim (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)) 236fba7fc7eSJung-uk Kim { 23753289f6aSNate Lawson switch (Node->Type) 23853289f6aSNate Lawson { 23953289f6aSNate Lawson case ACPI_TYPE_INTEGER: 24053289f6aSNate Lawson 241fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 242fba7fc7eSJung-uk Kim " [Initial Value 0x%8.8X%8.8X]", 243fba7fc7eSJung-uk Kim ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 24453289f6aSNate Lawson break; 24553289f6aSNate Lawson 24653289f6aSNate Lawson 24753289f6aSNate Lawson case ACPI_TYPE_STRING: 24853289f6aSNate Lawson 249fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 250fba7fc7eSJung-uk Kim " [Initial Value \"%s\"]", 251fba7fc7eSJung-uk Kim ObjDesc->String.Pointer); 252fba7fc7eSJung-uk Kim break; 253fba7fc7eSJung-uk Kim 254fba7fc7eSJung-uk Kim default: 255fba7fc7eSJung-uk Kim /* Nothing to do for other types */ 256fba7fc7eSJung-uk Kim break; 257fba7fc7eSJung-uk Kim } 258fba7fc7eSJung-uk Kim 259fba7fc7eSJung-uk Kim } 260fba7fc7eSJung-uk Kim else 261fba7fc7eSJung-uk Kim { 262fba7fc7eSJung-uk Kim switch (Node->Type) 263fba7fc7eSJung-uk Kim { 264fba7fc7eSJung-uk Kim case ACPI_TYPE_INTEGER: 265fba7fc7eSJung-uk Kim 266fba7fc7eSJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 267fba7fc7eSJung-uk Kim { 268fba7fc7eSJung-uk Kim Op = Op->Asl.Child; 269fba7fc7eSJung-uk Kim } 27053289f6aSNate Lawson if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 27153289f6aSNate Lawson (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 27253289f6aSNate Lawson { 27353289f6aSNate Lawson Op = Op->Asl.Next; 27453289f6aSNate Lawson } 275fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 276fba7fc7eSJung-uk Kim " [Initial Value 0x%8.8X%8.8X]", 277fba7fc7eSJung-uk Kim ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer)); 278fba7fc7eSJung-uk Kim break; 27953289f6aSNate Lawson 280fba7fc7eSJung-uk Kim 281fba7fc7eSJung-uk Kim case ACPI_TYPE_STRING: 282fba7fc7eSJung-uk Kim 283fba7fc7eSJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 284fba7fc7eSJung-uk Kim { 285fba7fc7eSJung-uk Kim Op = Op->Asl.Child; 286fba7fc7eSJung-uk Kim } 287fba7fc7eSJung-uk Kim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 288fba7fc7eSJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 289fba7fc7eSJung-uk Kim { 290fba7fc7eSJung-uk Kim Op = Op->Asl.Next; 291fba7fc7eSJung-uk Kim } 292fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 293fba7fc7eSJung-uk Kim " [Initial Value \"%s\"]", 29453289f6aSNate Lawson Op->Asl.Value.String); 29553289f6aSNate Lawson break; 29653289f6aSNate Lawson 29753289f6aSNate Lawson 29853289f6aSNate Lawson case ACPI_TYPE_LOCAL_REGION_FIELD: 29953289f6aSNate Lawson 30053289f6aSNate Lawson if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 30153289f6aSNate Lawson (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 30253289f6aSNate Lawson { 30353289f6aSNate Lawson Op = Op->Asl.Child; 30453289f6aSNate Lawson } 305fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 306fba7fc7eSJung-uk Kim " [Offset 0x%04X Length 0x%04X bits]", 30753289f6aSNate Lawson Op->Asl.Parent->Asl.ExtraValue, (UINT32) Op->Asl.Value.Integer); 30853289f6aSNate Lawson break; 30953289f6aSNate Lawson 31053289f6aSNate Lawson 311fba7fc7eSJung-uk Kim case ACPI_TYPE_BUFFER_FIELD: 312fba7fc7eSJung-uk Kim 313fba7fc7eSJung-uk Kim switch (Op->Asl.ParseOpcode) 314fba7fc7eSJung-uk Kim { 315fba7fc7eSJung-uk Kim case PARSEOP_CREATEBYTEFIELD: 316fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [BYTE ( 8 bit)]"); 317fba7fc7eSJung-uk Kim break; 318fba7fc7eSJung-uk Kim 319fba7fc7eSJung-uk Kim case PARSEOP_CREATEDWORDFIELD: 320fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [DWORD (32 bit)]"); 321fba7fc7eSJung-uk Kim break; 322fba7fc7eSJung-uk Kim 323fba7fc7eSJung-uk Kim case PARSEOP_CREATEQWORDFIELD: 324fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [QWORD (64 bit)]"); 325fba7fc7eSJung-uk Kim break; 326fba7fc7eSJung-uk Kim 327fba7fc7eSJung-uk Kim case PARSEOP_CREATEWORDFIELD: 328fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [WORD (16 bit)]"); 329fba7fc7eSJung-uk Kim break; 330fba7fc7eSJung-uk Kim 331fba7fc7eSJung-uk Kim case PARSEOP_CREATEBITFIELD: 332fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [BIT ( 1 bit)]"); 333fba7fc7eSJung-uk Kim break; 334fba7fc7eSJung-uk Kim 335fba7fc7eSJung-uk Kim case PARSEOP_CREATEFIELD: 336fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [Arbitrary Bit Field]"); 337fba7fc7eSJung-uk Kim break; 338fba7fc7eSJung-uk Kim 339fba7fc7eSJung-uk Kim default: 340fba7fc7eSJung-uk Kim break; 341fba7fc7eSJung-uk Kim 342fba7fc7eSJung-uk Kim } 343fba7fc7eSJung-uk Kim break; 344fba7fc7eSJung-uk Kim 345fba7fc7eSJung-uk Kim 346fba7fc7eSJung-uk Kim case ACPI_TYPE_PACKAGE: 347fba7fc7eSJung-uk Kim 348fba7fc7eSJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 349fba7fc7eSJung-uk Kim { 350fba7fc7eSJung-uk Kim Op = Op->Asl.Child; 351fba7fc7eSJung-uk Kim } 352fba7fc7eSJung-uk Kim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 353fba7fc7eSJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 354fba7fc7eSJung-uk Kim { 355fba7fc7eSJung-uk Kim Op = Op->Asl.Next; 356fba7fc7eSJung-uk Kim } 357fba7fc7eSJung-uk Kim Op = Op->Asl.Child; 358fba7fc7eSJung-uk Kim 359fba7fc7eSJung-uk Kim if ((Op->Asl.ParseOpcode == PARSEOP_BYTECONST) || 360fba7fc7eSJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_RAW_DATA)) 361fba7fc7eSJung-uk Kim { 362fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 363fba7fc7eSJung-uk Kim " [Initial Length 0x%.2X elements]", 364fba7fc7eSJung-uk Kim Op->Asl.Value.Integer); 365fba7fc7eSJung-uk Kim } 366fba7fc7eSJung-uk Kim break; 367fba7fc7eSJung-uk Kim 368fba7fc7eSJung-uk Kim 369fba7fc7eSJung-uk Kim case ACPI_TYPE_BUFFER: 370fba7fc7eSJung-uk Kim 371fba7fc7eSJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 372fba7fc7eSJung-uk Kim { 373fba7fc7eSJung-uk Kim Op = Op->Asl.Child; 374fba7fc7eSJung-uk Kim } 375fba7fc7eSJung-uk Kim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 376fba7fc7eSJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 377fba7fc7eSJung-uk Kim { 378fba7fc7eSJung-uk Kim Op = Op->Asl.Next; 379fba7fc7eSJung-uk Kim } 380fba7fc7eSJung-uk Kim Op = Op->Asl.Child; 381fba7fc7eSJung-uk Kim 3821a39cfb0SJung-uk Kim if (Op && (Op->Asl.ParseOpcode == PARSEOP_INTEGER)) 383fba7fc7eSJung-uk Kim { 384fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 385fba7fc7eSJung-uk Kim " [Initial Length 0x%.2X bytes]", 386fba7fc7eSJung-uk Kim Op->Asl.Value.Integer); 387fba7fc7eSJung-uk Kim } 388fba7fc7eSJung-uk Kim break; 389fba7fc7eSJung-uk Kim 390fba7fc7eSJung-uk Kim 391fba7fc7eSJung-uk Kim case ACPI_TYPE_METHOD: 392fba7fc7eSJung-uk Kim 393fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 394fba7fc7eSJung-uk Kim " [Code Length 0x%.4X bytes]", 395fba7fc7eSJung-uk Kim Op->Asl.AmlSubtreeLength); 396fba7fc7eSJung-uk Kim break; 397fba7fc7eSJung-uk Kim 398fba7fc7eSJung-uk Kim 3991a39cfb0SJung-uk Kim case ACPI_TYPE_LOCAL_RESOURCE: 4001a39cfb0SJung-uk Kim 4011a39cfb0SJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 4021a39cfb0SJung-uk Kim " [Desc Offset 0x%.4X Bytes]", Node->Value); 4031a39cfb0SJung-uk Kim break; 4041a39cfb0SJung-uk Kim 4051a39cfb0SJung-uk Kim 4061a39cfb0SJung-uk Kim case ACPI_TYPE_LOCAL_RESOURCE_FIELD: 4071a39cfb0SJung-uk Kim 4081a39cfb0SJung-uk Kim if (Node->Flags & 0x80) 4091a39cfb0SJung-uk Kim { 4101a39cfb0SJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 4111a39cfb0SJung-uk Kim " [Field Offset 0x%.4X Bits 0x%.4X Bytes]", 4121a39cfb0SJung-uk Kim Node->Value, Node->Value / 8); 4131a39cfb0SJung-uk Kim } 4141a39cfb0SJung-uk Kim else 4151a39cfb0SJung-uk Kim { 4161a39cfb0SJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, 4171a39cfb0SJung-uk Kim " [Field Offset 0x%.4X Bytes]", Node->Value); 4181a39cfb0SJung-uk Kim } 4191a39cfb0SJung-uk Kim break; 4201a39cfb0SJung-uk Kim 4211a39cfb0SJung-uk Kim 42253289f6aSNate Lawson default: 42353289f6aSNate Lawson /* Nothing to do for other types */ 42453289f6aSNate Lawson break; 42553289f6aSNate Lawson } 42653289f6aSNate Lawson } 42753289f6aSNate Lawson 42853289f6aSNate Lawson FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n"); 42953289f6aSNate Lawson return (AE_OK); 43053289f6aSNate Lawson } 43153289f6aSNate Lawson 43253289f6aSNate Lawson 433a9f12690SJung-uk Kim /******************************************************************************* 434a9f12690SJung-uk Kim * 435a9f12690SJung-uk Kim * FUNCTION: LsSetupNsList 436a9f12690SJung-uk Kim * 437a9f12690SJung-uk Kim * PARAMETERS: Handle - local file handle 438a9f12690SJung-uk Kim * 439a9f12690SJung-uk Kim * RETURN: None 440a9f12690SJung-uk Kim * 441a9f12690SJung-uk Kim * DESCRIPTION: Set the namespace output file to the input handle 442a9f12690SJung-uk Kim * 443a9f12690SJung-uk Kim ******************************************************************************/ 444a9f12690SJung-uk Kim 4451a39cfb0SJung-uk Kim void 446a9f12690SJung-uk Kim LsSetupNsList ( 447a9f12690SJung-uk Kim void *Handle) 4481a39cfb0SJung-uk Kim { 4491a39cfb0SJung-uk Kim 4501a39cfb0SJung-uk Kim Gbl_NsOutputFlag = TRUE; 4511a39cfb0SJung-uk Kim Gbl_Files[ASL_FILE_NAMESPACE_OUTPUT].Handle = Handle; 4521a39cfb0SJung-uk Kim } 4531a39cfb0SJung-uk Kim 4541a39cfb0SJung-uk Kim 45553289f6aSNate Lawson /******************************************************************************* 45653289f6aSNate Lawson * 457a9f12690SJung-uk Kim * FUNCTION: LsDoOnePathname 458a9f12690SJung-uk Kim * 459a9f12690SJung-uk Kim * PARAMETERS: ACPI_WALK_CALLBACK 460a9f12690SJung-uk Kim * 461a9f12690SJung-uk Kim * RETURN: Status 462a9f12690SJung-uk Kim * 463a9f12690SJung-uk Kim * DESCRIPTION: Print the full pathname for a namespace node. 464a9f12690SJung-uk Kim * 465a9f12690SJung-uk Kim ******************************************************************************/ 466a9f12690SJung-uk Kim 467a9f12690SJung-uk Kim static ACPI_STATUS 468a9f12690SJung-uk Kim LsDoOnePathname ( 469a9f12690SJung-uk Kim ACPI_HANDLE ObjHandle, 470a9f12690SJung-uk Kim UINT32 Level, 471a9f12690SJung-uk Kim void *Context, 472a9f12690SJung-uk Kim void **ReturnValue) 473a9f12690SJung-uk Kim { 474a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 475a9f12690SJung-uk Kim ACPI_STATUS Status; 476a9f12690SJung-uk Kim ACPI_BUFFER TargetPath; 477a9f12690SJung-uk Kim 478a9f12690SJung-uk Kim 479a9f12690SJung-uk Kim TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 480a9f12690SJung-uk Kim Status = AcpiNsHandleToPathname (Node, &TargetPath); 481a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 482a9f12690SJung-uk Kim { 483a9f12690SJung-uk Kim return (Status); 484a9f12690SJung-uk Kim } 485a9f12690SJung-uk Kim 486a9f12690SJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%s\n", TargetPath.Pointer); 487a9f12690SJung-uk Kim ACPI_FREE (TargetPath.Pointer); 488a9f12690SJung-uk Kim 489a9f12690SJung-uk Kim return (AE_OK); 490a9f12690SJung-uk Kim } 491a9f12690SJung-uk Kim 492a9f12690SJung-uk Kim 493a9f12690SJung-uk Kim /******************************************************************************* 494a9f12690SJung-uk Kim * 49553289f6aSNate Lawson * FUNCTION: LsDisplayNamespace 49653289f6aSNate Lawson * 49753289f6aSNate Lawson * PARAMETERS: None 49853289f6aSNate Lawson * 499fba7fc7eSJung-uk Kim * RETURN: Status 50053289f6aSNate Lawson * 50153289f6aSNate Lawson * DESCRIPTION: Walk the namespace an display information about each node 50253289f6aSNate Lawson * in the tree. Information is written to the optional 50353289f6aSNate Lawson * namespace output file. 50453289f6aSNate Lawson * 50553289f6aSNate Lawson ******************************************************************************/ 50653289f6aSNate Lawson 50753289f6aSNate Lawson ACPI_STATUS 50853289f6aSNate Lawson LsDisplayNamespace ( 50953289f6aSNate Lawson void) 51053289f6aSNate Lawson { 51153289f6aSNate Lawson ACPI_STATUS Status; 51253289f6aSNate Lawson 51353289f6aSNate Lawson 51453289f6aSNate Lawson if (!Gbl_NsOutputFlag) 51553289f6aSNate Lawson { 51653289f6aSNate Lawson return (AE_OK); 51753289f6aSNate Lawson } 51853289f6aSNate Lawson 5191a39cfb0SJung-uk Kim Gbl_NumNamespaceObjects = 0; 5201a39cfb0SJung-uk Kim 52153289f6aSNate Lawson /* File header */ 52253289f6aSNate Lawson 52353289f6aSNate Lawson FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n"); 52453289f6aSNate Lawson FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Count Depth Name - Type\n\n"); 52553289f6aSNate Lawson 52653289f6aSNate Lawson /* Walk entire namespace from the root */ 52753289f6aSNate Lawson 52853289f6aSNate Lawson Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 52953289f6aSNate Lawson ACPI_UINT32_MAX, FALSE, LsDoOneNamespaceObject, 53053289f6aSNate Lawson NULL, NULL); 531a9f12690SJung-uk Kim 532a9f12690SJung-uk Kim /* Print the full pathname for each namespace node */ 533a9f12690SJung-uk Kim 534a9f12690SJung-uk Kim FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\nNamespace pathnames\n\n"); 535a9f12690SJung-uk Kim 536a9f12690SJung-uk Kim Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 537a9f12690SJung-uk Kim ACPI_UINT32_MAX, FALSE, LsDoOnePathname, 538a9f12690SJung-uk Kim NULL, NULL); 539a9f12690SJung-uk Kim 54053289f6aSNate Lawson return (Status); 54153289f6aSNate Lawson } 54253289f6aSNate Lawson 54353289f6aSNate Lawson 54453289f6aSNate Lawson /******************************************************************************* 54553289f6aSNate Lawson * 54653289f6aSNate Lawson * FUNCTION: LsCompareOneNamespaceObject 54753289f6aSNate Lawson * 54853289f6aSNate Lawson * PARAMETERS: ACPI_WALK_CALLBACK 54953289f6aSNate Lawson * 55053289f6aSNate Lawson * RETURN: Status 55153289f6aSNate Lawson * 55253289f6aSNate Lawson * DESCRIPTION: Compare name of one object. 55353289f6aSNate Lawson * 55453289f6aSNate Lawson ******************************************************************************/ 55553289f6aSNate Lawson 556fba7fc7eSJung-uk Kim static ACPI_STATUS 55753289f6aSNate Lawson LsCompareOneNamespaceObject ( 55853289f6aSNate Lawson ACPI_HANDLE ObjHandle, 55953289f6aSNate Lawson UINT32 Level, 56053289f6aSNate Lawson void *Context, 56153289f6aSNate Lawson void **ReturnValue) 56253289f6aSNate Lawson { 56353289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 56453289f6aSNate Lawson 56553289f6aSNate Lawson 56653289f6aSNate Lawson /* Simply check the name */ 56753289f6aSNate Lawson 56853289f6aSNate Lawson if (*((UINT32 *) (Context)) == Node->Name.Integer) 56953289f6aSNate Lawson { 57053289f6aSNate Lawson /* Abort walk if we found one instance */ 57153289f6aSNate Lawson 57253289f6aSNate Lawson return (AE_CTRL_TRUE); 57353289f6aSNate Lawson } 57453289f6aSNate Lawson 57553289f6aSNate Lawson return (AE_OK); 57653289f6aSNate Lawson } 57753289f6aSNate Lawson 57853289f6aSNate Lawson 57953289f6aSNate Lawson /******************************************************************************* 58053289f6aSNate Lawson * 58153289f6aSNate Lawson * FUNCTION: LkObjectExists 58253289f6aSNate Lawson * 58353289f6aSNate Lawson * PARAMETERS: Name - 4 char ACPI name 58453289f6aSNate Lawson * 58553289f6aSNate Lawson * RETURN: TRUE if name exists in namespace 58653289f6aSNate Lawson * 58753289f6aSNate Lawson * DESCRIPTION: Walk the namespace to find an object 58853289f6aSNate Lawson * 58953289f6aSNate Lawson ******************************************************************************/ 59053289f6aSNate Lawson 591fba7fc7eSJung-uk Kim static BOOLEAN 59253289f6aSNate Lawson LkObjectExists ( 59353289f6aSNate Lawson char *Name) 59453289f6aSNate Lawson { 59553289f6aSNate Lawson ACPI_STATUS Status; 59653289f6aSNate Lawson 59753289f6aSNate Lawson 59853289f6aSNate Lawson /* Walk entire namespace from the supplied root */ 59953289f6aSNate Lawson 60053289f6aSNate Lawson Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 60153289f6aSNate Lawson ACPI_UINT32_MAX, FALSE, LsCompareOneNamespaceObject, 60253289f6aSNate Lawson Name, NULL); 60353289f6aSNate Lawson if (Status == AE_CTRL_TRUE) 60453289f6aSNate Lawson { 60553289f6aSNate Lawson /* At least one instance of the name was found */ 60653289f6aSNate Lawson 60753289f6aSNate Lawson return (TRUE); 60853289f6aSNate Lawson } 60953289f6aSNate Lawson 61053289f6aSNate Lawson return (FALSE); 61153289f6aSNate Lawson } 61253289f6aSNate Lawson 61353289f6aSNate Lawson 61453289f6aSNate Lawson /******************************************************************************* 61553289f6aSNate Lawson * 6161a39cfb0SJung-uk Kim * FUNCTION: LkGetNameOp 6171a39cfb0SJung-uk Kim * 6181a39cfb0SJung-uk Kim * PARAMETERS: Op - Current Op 6191a39cfb0SJung-uk Kim * 6201a39cfb0SJung-uk Kim * RETURN: NameOp associated with the input op 6211a39cfb0SJung-uk Kim * 6221a39cfb0SJung-uk Kim * DESCRIPTION: Find the name declaration op associated with the operator 6231a39cfb0SJung-uk Kim * 6241a39cfb0SJung-uk Kim ******************************************************************************/ 6251a39cfb0SJung-uk Kim 6261a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT * 6271a39cfb0SJung-uk Kim LkGetNameOp ( 6281a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op) 6291a39cfb0SJung-uk Kim { 6301a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 6311a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NameOp = Op; 6321a39cfb0SJung-uk Kim 6331a39cfb0SJung-uk Kim 6341a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 6351a39cfb0SJung-uk Kim 6361a39cfb0SJung-uk Kim 6371a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */ 6381a39cfb0SJung-uk Kim 6391a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED) 6401a39cfb0SJung-uk Kim { 6411a39cfb0SJung-uk Kim /* For nearly all NAMED operators, the name reference is the first child */ 6421a39cfb0SJung-uk Kim 6431a39cfb0SJung-uk Kim NameOp = Op->Asl.Child; 6441a39cfb0SJung-uk Kim if (Op->Asl.AmlOpcode == AML_ALIAS_OP) 6451a39cfb0SJung-uk Kim { 6461a39cfb0SJung-uk Kim /* 6471a39cfb0SJung-uk Kim * ALIAS is the only oddball opcode, the name declaration 6481a39cfb0SJung-uk Kim * (alias name) is the second operand 6491a39cfb0SJung-uk Kim */ 6501a39cfb0SJung-uk Kim NameOp = Op->Asl.Child->Asl.Next; 6511a39cfb0SJung-uk Kim } 6521a39cfb0SJung-uk Kim } 6531a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE) 6541a39cfb0SJung-uk Kim { 6551a39cfb0SJung-uk Kim /* Name must appear as the last parameter */ 6561a39cfb0SJung-uk Kim 6571a39cfb0SJung-uk Kim NameOp = Op->Asl.Child; 6581a39cfb0SJung-uk Kim while (!(NameOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION)) 6591a39cfb0SJung-uk Kim { 6601a39cfb0SJung-uk Kim NameOp = NameOp->Asl.Next; 6611a39cfb0SJung-uk Kim } 6621a39cfb0SJung-uk Kim } 6631a39cfb0SJung-uk Kim 6641a39cfb0SJung-uk Kim return (NameOp); 6651a39cfb0SJung-uk Kim } 6661a39cfb0SJung-uk Kim 6671a39cfb0SJung-uk Kim 6681a39cfb0SJung-uk Kim /******************************************************************************* 6691a39cfb0SJung-uk Kim * 6701a39cfb0SJung-uk Kim * FUNCTION: LkIsObjectUsed 6711a39cfb0SJung-uk Kim * 6721a39cfb0SJung-uk Kim * PARAMETERS: ACPI_WALK_CALLBACK 6731a39cfb0SJung-uk Kim * 6741a39cfb0SJung-uk Kim * RETURN: Status 6751a39cfb0SJung-uk Kim * 6761a39cfb0SJung-uk Kim * DESCRIPTION: Check for an unreferenced namespace object and emit a warning. 6771a39cfb0SJung-uk Kim * We have to be careful, because some types and names are 6781a39cfb0SJung-uk Kim * typically or always unreferenced, we don't want to issue 6791a39cfb0SJung-uk Kim * excessive warnings. 6801a39cfb0SJung-uk Kim * 6811a39cfb0SJung-uk Kim ******************************************************************************/ 6821a39cfb0SJung-uk Kim 6831a39cfb0SJung-uk Kim static ACPI_STATUS 6841a39cfb0SJung-uk Kim LkIsObjectUsed ( 6851a39cfb0SJung-uk Kim ACPI_HANDLE ObjHandle, 6861a39cfb0SJung-uk Kim UINT32 Level, 6871a39cfb0SJung-uk Kim void *Context, 6881a39cfb0SJung-uk Kim void **ReturnValue) 6891a39cfb0SJung-uk Kim { 6901a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle); 6911a39cfb0SJung-uk Kim 6921a39cfb0SJung-uk Kim 6931a39cfb0SJung-uk Kim /* Referenced flag is set during the namespace xref */ 6941a39cfb0SJung-uk Kim 6951a39cfb0SJung-uk Kim if (Node->Flags & ANOBJ_IS_REFERENCED) 6961a39cfb0SJung-uk Kim { 6971a39cfb0SJung-uk Kim return (AE_OK); 6981a39cfb0SJung-uk Kim } 6991a39cfb0SJung-uk Kim 7001a39cfb0SJung-uk Kim /* 7011a39cfb0SJung-uk Kim * Ignore names that start with an underscore, 7021a39cfb0SJung-uk Kim * these are the reserved ACPI names and are typically not referenced, 7031a39cfb0SJung-uk Kim * they are called by the host OS. 7041a39cfb0SJung-uk Kim */ 7051a39cfb0SJung-uk Kim if (Node->Name.Ascii[0] == '_') 7061a39cfb0SJung-uk Kim { 7071a39cfb0SJung-uk Kim return (AE_OK); 7081a39cfb0SJung-uk Kim } 7091a39cfb0SJung-uk Kim 7101a39cfb0SJung-uk Kim /* There are some types that are typically not referenced, ignore them */ 7111a39cfb0SJung-uk Kim 7121a39cfb0SJung-uk Kim switch (Node->Type) 7131a39cfb0SJung-uk Kim { 7141a39cfb0SJung-uk Kim case ACPI_TYPE_DEVICE: 7151a39cfb0SJung-uk Kim case ACPI_TYPE_PROCESSOR: 7161a39cfb0SJung-uk Kim case ACPI_TYPE_POWER: 7171a39cfb0SJung-uk Kim case ACPI_TYPE_LOCAL_RESOURCE: 7181a39cfb0SJung-uk Kim return (AE_OK); 7191a39cfb0SJung-uk Kim 7201a39cfb0SJung-uk Kim default: 7211a39cfb0SJung-uk Kim break; 7221a39cfb0SJung-uk Kim } 7231a39cfb0SJung-uk Kim 7241a39cfb0SJung-uk Kim /* All others are valid unreferenced namespace objects */ 7251a39cfb0SJung-uk Kim 7261a39cfb0SJung-uk Kim if (Node->Op) 7271a39cfb0SJung-uk Kim { 7281a39cfb0SJung-uk Kim AslError (ASL_WARNING2, ASL_MSG_NOT_REFERENCED, LkGetNameOp (Node->Op), NULL); 7291a39cfb0SJung-uk Kim } 7301a39cfb0SJung-uk Kim return (AE_OK); 7311a39cfb0SJung-uk Kim } 7321a39cfb0SJung-uk Kim 7331a39cfb0SJung-uk Kim 7341a39cfb0SJung-uk Kim /******************************************************************************* 7351a39cfb0SJung-uk Kim * 7361a39cfb0SJung-uk Kim * FUNCTION: LkFindUnreferencedObjects 7371a39cfb0SJung-uk Kim * 7381a39cfb0SJung-uk Kim * PARAMETERS: None 7391a39cfb0SJung-uk Kim * 7401a39cfb0SJung-uk Kim * RETURN: None 7411a39cfb0SJung-uk Kim * 7421a39cfb0SJung-uk Kim * DESCRIPTION: Namespace walk to find objects that are not referenced in any 7431a39cfb0SJung-uk Kim * way. Must be called after the namespace has been cross 7441a39cfb0SJung-uk Kim * referenced. 7451a39cfb0SJung-uk Kim * 7461a39cfb0SJung-uk Kim ******************************************************************************/ 7471a39cfb0SJung-uk Kim 7481a39cfb0SJung-uk Kim void 7491a39cfb0SJung-uk Kim LkFindUnreferencedObjects ( 7501a39cfb0SJung-uk Kim void) 7511a39cfb0SJung-uk Kim { 7521a39cfb0SJung-uk Kim 7531a39cfb0SJung-uk Kim /* Walk entire namespace from the supplied root */ 7541a39cfb0SJung-uk Kim 7551a39cfb0SJung-uk Kim (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 7561a39cfb0SJung-uk Kim ACPI_UINT32_MAX, FALSE, LkIsObjectUsed, 7571a39cfb0SJung-uk Kim NULL, NULL); 7581a39cfb0SJung-uk Kim } 7591a39cfb0SJung-uk Kim 7601a39cfb0SJung-uk Kim 7611a39cfb0SJung-uk Kim /******************************************************************************* 7621a39cfb0SJung-uk Kim * 76353289f6aSNate Lawson * FUNCTION: LkCrossReferenceNamespace 76453289f6aSNate Lawson * 76553289f6aSNate Lawson * PARAMETERS: None 76653289f6aSNate Lawson * 76753289f6aSNate Lawson * RETURN: Status 76853289f6aSNate Lawson * 76953289f6aSNate Lawson * DESCRIPTION: Perform a cross reference check of the parse tree against the 77053289f6aSNate Lawson * namespace. Every named referenced within the parse tree 77153289f6aSNate Lawson * should be get resolved with a namespace lookup. If not, the 77253289f6aSNate Lawson * original reference in the ASL code is invalid -- i.e., refers 77353289f6aSNate Lawson * to a non-existent object. 77453289f6aSNate Lawson * 77553289f6aSNate Lawson * NOTE: The ASL "External" operator causes the name to be inserted into the 77653289f6aSNate Lawson * namespace so that references to the external name will be resolved 77753289f6aSNate Lawson * correctly here. 77853289f6aSNate Lawson * 77953289f6aSNate Lawson ******************************************************************************/ 78053289f6aSNate Lawson 78153289f6aSNate Lawson ACPI_STATUS 78253289f6aSNate Lawson LkCrossReferenceNamespace ( 78353289f6aSNate Lawson void) 78453289f6aSNate Lawson { 78553289f6aSNate Lawson ACPI_WALK_STATE *WalkState; 78653289f6aSNate Lawson 78753289f6aSNate Lawson 78853289f6aSNate Lawson DbgPrint (ASL_DEBUG_OUTPUT, "\nCross referencing namespace\n\n"); 78953289f6aSNate Lawson 79053289f6aSNate Lawson /* 79153289f6aSNate Lawson * Create a new walk state for use when looking up names 79253289f6aSNate Lawson * within the namespace (Passed as context to the callbacks) 79353289f6aSNate Lawson */ 79453289f6aSNate Lawson WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 79553289f6aSNate Lawson if (!WalkState) 79653289f6aSNate Lawson { 79753289f6aSNate Lawson return AE_NO_MEMORY; 79853289f6aSNate Lawson } 79953289f6aSNate Lawson 80053289f6aSNate Lawson /* Walk the entire parse tree */ 80153289f6aSNate Lawson 80253289f6aSNate Lawson TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE, LkNamespaceLocateBegin, 80353289f6aSNate Lawson LkNamespaceLocateEnd, WalkState); 80453289f6aSNate Lawson return AE_OK; 80553289f6aSNate Lawson } 80653289f6aSNate Lawson 80753289f6aSNate Lawson 80853289f6aSNate Lawson /******************************************************************************* 80953289f6aSNate Lawson * 81053289f6aSNate Lawson * FUNCTION: LkCheckFieldRange 81153289f6aSNate Lawson * 81253289f6aSNate Lawson * PARAMETERS: RegionBitLength - Length of entire parent region 81353289f6aSNate Lawson * FieldBitOffset - Start of the field unit (within region) 81453289f6aSNate Lawson * FieldBitLength - Entire length of field unit 81553289f6aSNate Lawson * AccessBitWidth - Access width of the field unit 81653289f6aSNate Lawson * 81753289f6aSNate Lawson * RETURN: None 81853289f6aSNate Lawson * 81953289f6aSNate Lawson * DESCRIPTION: Check one field unit to make sure it fits in the parent 82053289f6aSNate Lawson * op region. 82153289f6aSNate Lawson * 82253289f6aSNate Lawson * Note: AccessBitWidth must be either 8,16,32, or 64 82353289f6aSNate Lawson * 82453289f6aSNate Lawson ******************************************************************************/ 82553289f6aSNate Lawson 826fba7fc7eSJung-uk Kim static void 82753289f6aSNate Lawson LkCheckFieldRange ( 82853289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 82953289f6aSNate Lawson UINT32 RegionBitLength, 83053289f6aSNate Lawson UINT32 FieldBitOffset, 83153289f6aSNate Lawson UINT32 FieldBitLength, 83253289f6aSNate Lawson UINT32 AccessBitWidth) 83353289f6aSNate Lawson { 83453289f6aSNate Lawson UINT32 FieldEndBitOffset; 83553289f6aSNate Lawson 836fba7fc7eSJung-uk Kim 83753289f6aSNate Lawson /* 83853289f6aSNate Lawson * Check each field unit against the region size. The entire 83953289f6aSNate Lawson * field unit (start offset plus length) must fit within the 84053289f6aSNate Lawson * region. 84153289f6aSNate Lawson */ 84253289f6aSNate Lawson FieldEndBitOffset = FieldBitOffset + FieldBitLength; 84353289f6aSNate Lawson 84453289f6aSNate Lawson if (FieldEndBitOffset > RegionBitLength) 84553289f6aSNate Lawson { 84653289f6aSNate Lawson /* Field definition itself is beyond the end-of-region */ 84753289f6aSNate Lawson 84853289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_OFFSET, Op, NULL); 84953289f6aSNate Lawson return; 85053289f6aSNate Lawson } 85153289f6aSNate Lawson 85253289f6aSNate Lawson /* 85353289f6aSNate Lawson * Now check that the field plus AccessWidth doesn't go beyond 85453289f6aSNate Lawson * the end-of-region. Assumes AccessBitWidth is a power of 2 85553289f6aSNate Lawson */ 85653289f6aSNate Lawson FieldEndBitOffset = ACPI_ROUND_UP (FieldEndBitOffset, AccessBitWidth); 85753289f6aSNate Lawson 85853289f6aSNate Lawson if (FieldEndBitOffset > RegionBitLength) 85953289f6aSNate Lawson { 86053289f6aSNate Lawson /* Field definition combined with the access is beyond EOR */ 86153289f6aSNate Lawson 86253289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_ACCESS_WIDTH, Op, NULL); 86353289f6aSNate Lawson } 86453289f6aSNate Lawson } 86553289f6aSNate Lawson 86653289f6aSNate Lawson /******************************************************************************* 86753289f6aSNate Lawson * 86853289f6aSNate Lawson * FUNCTION: LkNamespaceLocateBegin 86953289f6aSNate Lawson * 87053289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 87153289f6aSNate Lawson * 87253289f6aSNate Lawson * RETURN: Status 87353289f6aSNate Lawson * 87453289f6aSNate Lawson * DESCRIPTION: Descending callback used during cross-reference. For named 87553289f6aSNate Lawson * object references, attempt to locate the name in the 87653289f6aSNate Lawson * namespace. 87753289f6aSNate Lawson * 87853289f6aSNate Lawson * NOTE: ASL references to named fields within resource descriptors are 87953289f6aSNate Lawson * resolved to integer values here. Therefore, this step is an 88053289f6aSNate Lawson * important part of the code generation. We don't know that the 88153289f6aSNate Lawson * name refers to a resource descriptor until now. 88253289f6aSNate Lawson * 88353289f6aSNate Lawson ******************************************************************************/ 88453289f6aSNate Lawson 885fba7fc7eSJung-uk Kim static ACPI_STATUS 88653289f6aSNate Lawson LkNamespaceLocateBegin ( 88753289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 88853289f6aSNate Lawson UINT32 Level, 88953289f6aSNate Lawson void *Context) 89053289f6aSNate Lawson { 89153289f6aSNate Lawson ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 89253289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 89353289f6aSNate Lawson ACPI_STATUS Status; 89453289f6aSNate Lawson ACPI_OBJECT_TYPE ObjectType; 89553289f6aSNate Lawson char *Path; 89653289f6aSNate Lawson UINT8 PassedArgs; 89753289f6aSNate Lawson ACPI_PARSE_OBJECT *NextOp; 89853289f6aSNate Lawson ACPI_PARSE_OBJECT *OwningOp; 89953289f6aSNate Lawson ACPI_PARSE_OBJECT *SpaceIdOp; 90053289f6aSNate Lawson UINT32 MinimumLength; 90153289f6aSNate Lawson UINT32 Temp; 90253289f6aSNate Lawson const ACPI_OPCODE_INFO *OpInfo; 90353289f6aSNate Lawson UINT32 Flags; 90453289f6aSNate Lawson 90553289f6aSNate Lawson 9061a39cfb0SJung-uk Kim ACPI_FUNCTION_TRACE_PTR (LkNamespaceLocateBegin, Op); 90753289f6aSNate Lawson 90853289f6aSNate Lawson /* 90953289f6aSNate Lawson * If this node is the actual declaration of a name 91053289f6aSNate Lawson * [such as the XXXX name in "Method (XXXX)"], 91153289f6aSNate Lawson * we are not interested in it here. We only care about names that are 91253289f6aSNate Lawson * references to other objects within the namespace and the parent objects 91353289f6aSNate Lawson * of name declarations 91453289f6aSNate Lawson */ 91553289f6aSNate Lawson if (Op->Asl.CompileFlags & NODE_IS_NAME_DECLARATION) 91653289f6aSNate Lawson { 91753289f6aSNate Lawson return (AE_OK); 91853289f6aSNate Lawson } 91953289f6aSNate Lawson 92053289f6aSNate Lawson /* We are only interested in opcodes that have an associated name */ 92153289f6aSNate Lawson 92253289f6aSNate Lawson OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 92353289f6aSNate Lawson 92453289f6aSNate Lawson if ((!(OpInfo->Flags & AML_NAMED)) && 92553289f6aSNate Lawson (!(OpInfo->Flags & AML_CREATE)) && 92653289f6aSNate Lawson (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) && 92753289f6aSNate Lawson (Op->Asl.ParseOpcode != PARSEOP_NAMESEG) && 92853289f6aSNate Lawson (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)) 92953289f6aSNate Lawson { 93053289f6aSNate Lawson return (AE_OK); 93153289f6aSNate Lawson } 93253289f6aSNate Lawson 93353289f6aSNate Lawson /* 934a9f12690SJung-uk Kim * One special case: CondRefOf operator - we don't care if the name exists 935a9f12690SJung-uk Kim * or not at this point, just ignore it, the point of the operator is to 936a9f12690SJung-uk Kim * determine if the name exists at runtime. 937a9f12690SJung-uk Kim */ 938a9f12690SJung-uk Kim if ((Op->Asl.Parent) && 939a9f12690SJung-uk Kim (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF)) 940a9f12690SJung-uk Kim { 941a9f12690SJung-uk Kim return (AE_OK); 942a9f12690SJung-uk Kim } 943a9f12690SJung-uk Kim 944a9f12690SJung-uk Kim /* 94553289f6aSNate Lawson * We must enable the "search-to-root" for single NameSegs, but 94653289f6aSNate Lawson * we have to be very careful about opening up scopes 94753289f6aSNate Lawson */ 94853289f6aSNate Lawson Flags = ACPI_NS_SEARCH_PARENT; 94953289f6aSNate Lawson if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 95053289f6aSNate Lawson (Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 95153289f6aSNate Lawson (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)) 95253289f6aSNate Lawson { 95353289f6aSNate Lawson /* 95453289f6aSNate Lawson * These are name references, do not push the scope stack 95553289f6aSNate Lawson * for them. 95653289f6aSNate Lawson */ 95753289f6aSNate Lawson Flags |= ACPI_NS_DONT_OPEN_SCOPE; 95853289f6aSNate Lawson } 95953289f6aSNate Lawson 96053289f6aSNate Lawson /* Get the NamePath from the appropriate place */ 96153289f6aSNate Lawson 96253289f6aSNate Lawson if (OpInfo->Flags & AML_NAMED) 96353289f6aSNate Lawson { 9641a39cfb0SJung-uk Kim /* For nearly all NAMED operators, the name reference is the first child */ 96553289f6aSNate Lawson 96653289f6aSNate Lawson Path = Op->Asl.Child->Asl.Value.String; 96753289f6aSNate Lawson if (Op->Asl.AmlOpcode == AML_ALIAS_OP) 96853289f6aSNate Lawson { 96953289f6aSNate Lawson /* 97053289f6aSNate Lawson * ALIAS is the only oddball opcode, the name declaration 97153289f6aSNate Lawson * (alias name) is the second operand 97253289f6aSNate Lawson */ 97353289f6aSNate Lawson Path = Op->Asl.Child->Asl.Next->Asl.Value.String; 97453289f6aSNate Lawson } 97553289f6aSNate Lawson } 97653289f6aSNate Lawson else if (OpInfo->Flags & AML_CREATE) 97753289f6aSNate Lawson { 97853289f6aSNate Lawson /* Name must appear as the last parameter */ 97953289f6aSNate Lawson 98053289f6aSNate Lawson NextOp = Op->Asl.Child; 98153289f6aSNate Lawson while (!(NextOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION)) 98253289f6aSNate Lawson { 98353289f6aSNate Lawson NextOp = NextOp->Asl.Next; 98453289f6aSNate Lawson } 98553289f6aSNate Lawson Path = NextOp->Asl.Value.String; 98653289f6aSNate Lawson } 98753289f6aSNate Lawson else 98853289f6aSNate Lawson { 98953289f6aSNate Lawson Path = Op->Asl.Value.String; 99053289f6aSNate Lawson } 99153289f6aSNate Lawson 99253289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 993fba7fc7eSJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 994fba7fc7eSJung-uk Kim "Type=%s\n", AcpiUtGetTypeName (ObjectType))); 99553289f6aSNate Lawson 99653289f6aSNate Lawson /* 99753289f6aSNate Lawson * Lookup the name in the namespace. Name must exist at this point, or it 99853289f6aSNate Lawson * is an invalid reference. 99953289f6aSNate Lawson * 100053289f6aSNate Lawson * The namespace is also used as a lookup table for references to resource 100153289f6aSNate Lawson * descriptors and the fields within them. 100253289f6aSNate Lawson */ 100353289f6aSNate Lawson Gbl_NsLookupCount++; 100453289f6aSNate Lawson 100553289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 100653289f6aSNate Lawson ACPI_IMODE_EXECUTE, Flags, WalkState, &(Node)); 100753289f6aSNate Lawson if (ACPI_FAILURE (Status)) 100853289f6aSNate Lawson { 100953289f6aSNate Lawson if (Status == AE_NOT_FOUND) 101053289f6aSNate Lawson { 101153289f6aSNate Lawson /* 101253289f6aSNate Lawson * We didn't find the name reference by path -- we can qualify this 101353289f6aSNate Lawson * a little better before we print an error message 101453289f6aSNate Lawson */ 101553289f6aSNate Lawson if (strlen (Path) == ACPI_NAME_SIZE) 101653289f6aSNate Lawson { 101753289f6aSNate Lawson /* A simple, one-segment ACPI name */ 101853289f6aSNate Lawson 101953289f6aSNate Lawson if (LkObjectExists (Path)) 102053289f6aSNate Lawson { 1021fba7fc7eSJung-uk Kim /* 1022fba7fc7eSJung-uk Kim * There exists such a name, but we couldn't get to it 1023fba7fc7eSJung-uk Kim * from this scope 1024fba7fc7eSJung-uk Kim */ 1025fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NOT_REACHABLE, Op, 1026fba7fc7eSJung-uk Kim Op->Asl.ExternalName); 102753289f6aSNate Lawson } 102853289f6aSNate Lawson else 102953289f6aSNate Lawson { 103053289f6aSNate Lawson /* The name doesn't exist, period */ 103153289f6aSNate Lawson 1032fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, 1033fba7fc7eSJung-uk Kim Op, Op->Asl.ExternalName); 103453289f6aSNate Lawson } 103553289f6aSNate Lawson } 103653289f6aSNate Lawson else 103753289f6aSNate Lawson { 103853289f6aSNate Lawson /* Check for a fully qualified path */ 103953289f6aSNate Lawson 104053289f6aSNate Lawson if (Path[0] == AML_ROOT_PREFIX) 104153289f6aSNate Lawson { 104253289f6aSNate Lawson /* Gave full path, the object does not exist */ 104353289f6aSNate Lawson 1044fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op, 1045fba7fc7eSJung-uk Kim Op->Asl.ExternalName); 104653289f6aSNate Lawson } 104753289f6aSNate Lawson else 104853289f6aSNate Lawson { 1049fba7fc7eSJung-uk Kim /* 1050fba7fc7eSJung-uk Kim * We can't tell whether it doesn't exist or just 1051fba7fc7eSJung-uk Kim * can't be reached. 1052fba7fc7eSJung-uk Kim */ 1053fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 1054fba7fc7eSJung-uk Kim Op->Asl.ExternalName); 105553289f6aSNate Lawson } 105653289f6aSNate Lawson } 105753289f6aSNate Lawson 105853289f6aSNate Lawson Status = AE_OK; 105953289f6aSNate Lawson } 106053289f6aSNate Lawson return (Status); 106153289f6aSNate Lawson } 106253289f6aSNate Lawson 10631a39cfb0SJung-uk Kim /* Check for a reference vs. name declaration */ 10641a39cfb0SJung-uk Kim 10651a39cfb0SJung-uk Kim if (!(OpInfo->Flags & AML_NAMED) && 10661a39cfb0SJung-uk Kim !(OpInfo->Flags & AML_CREATE)) 10671a39cfb0SJung-uk Kim { 10681a39cfb0SJung-uk Kim /* This node has been referenced, mark it for reference check */ 10691a39cfb0SJung-uk Kim 10701a39cfb0SJung-uk Kim Node->Flags |= ANOBJ_IS_REFERENCED; 10711a39cfb0SJung-uk Kim } 10721a39cfb0SJung-uk Kim 107353289f6aSNate Lawson /* Attempt to optimize the NamePath */ 107453289f6aSNate Lawson 107553289f6aSNate Lawson OptOptimizeNamePath (Op, OpInfo->Flags, WalkState, Path, Node); 107653289f6aSNate Lawson 107753289f6aSNate Lawson /* 10781a39cfb0SJung-uk Kim * 1) Dereference an alias (A name reference that is an alias) 10791a39cfb0SJung-uk Kim * Aliases are not nested, the alias always points to the final object 108053289f6aSNate Lawson */ 1081fba7fc7eSJung-uk Kim if ((Op->Asl.ParseOpcode != PARSEOP_ALIAS) && 1082fba7fc7eSJung-uk Kim (Node->Type == ACPI_TYPE_LOCAL_ALIAS)) 108353289f6aSNate Lawson { 108453289f6aSNate Lawson /* This node points back to the original PARSEOP_ALIAS */ 108553289f6aSNate Lawson 1086fba7fc7eSJung-uk Kim NextOp = Node->Op; 108753289f6aSNate Lawson 108853289f6aSNate Lawson /* The first child is the alias target op */ 108953289f6aSNate Lawson 109053289f6aSNate Lawson NextOp = NextOp->Asl.Child; 109153289f6aSNate Lawson 10921a39cfb0SJung-uk Kim /* That in turn points back to original target alias node */ 109353289f6aSNate Lawson 109453289f6aSNate Lawson if (NextOp->Asl.Node) 109553289f6aSNate Lawson { 109653289f6aSNate Lawson Node = NextOp->Asl.Node; 109753289f6aSNate Lawson } 10981a39cfb0SJung-uk Kim 10991a39cfb0SJung-uk Kim /* Else - forward reference to alias, will be resolved later */ 110053289f6aSNate Lawson } 110153289f6aSNate Lawson 11021a39cfb0SJung-uk Kim /* 2) Check for a reference to a resource descriptor */ 110353289f6aSNate Lawson 11041a39cfb0SJung-uk Kim if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE_FIELD) || 110553289f6aSNate Lawson (Node->Type == ACPI_TYPE_LOCAL_RESOURCE)) 110653289f6aSNate Lawson { 110753289f6aSNate Lawson /* 110853289f6aSNate Lawson * This was a reference to a field within a resource descriptor. Extract 110953289f6aSNate Lawson * the associated field offset (either a bit or byte offset depending on 111053289f6aSNate Lawson * the field type) and change the named reference into an integer for 111153289f6aSNate Lawson * AML code generation 111253289f6aSNate Lawson */ 1113fba7fc7eSJung-uk Kim Temp = Node->Value; 111453289f6aSNate Lawson if (Node->Flags & ANOBJ_IS_BIT_OFFSET) 111553289f6aSNate Lawson { 111653289f6aSNate Lawson Op->Asl.CompileFlags |= NODE_IS_BIT_OFFSET; 111753289f6aSNate Lawson } 111853289f6aSNate Lawson 111953289f6aSNate Lawson /* Perform BitOffset <--> ByteOffset conversion if necessary */ 112053289f6aSNate Lawson 112153289f6aSNate Lawson switch (Op->Asl.Parent->Asl.AmlOpcode) 112253289f6aSNate Lawson { 112353289f6aSNate Lawson case AML_CREATE_FIELD_OP: 112453289f6aSNate Lawson 112553289f6aSNate Lawson /* We allow a Byte offset to Bit Offset conversion for this op */ 112653289f6aSNate Lawson 112753289f6aSNate Lawson if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET)) 112853289f6aSNate Lawson { 112953289f6aSNate Lawson /* Simply multiply byte offset times 8 to get bit offset */ 113053289f6aSNate Lawson 113153289f6aSNate Lawson Temp = ACPI_MUL_8 (Temp); 113253289f6aSNate Lawson } 113353289f6aSNate Lawson break; 113453289f6aSNate Lawson 113553289f6aSNate Lawson 113653289f6aSNate Lawson case AML_CREATE_BIT_FIELD_OP: 113753289f6aSNate Lawson 113853289f6aSNate Lawson /* This op requires a Bit Offset */ 113953289f6aSNate Lawson 114053289f6aSNate Lawson if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET)) 114153289f6aSNate Lawson { 114253289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_BYTES_TO_BITS, Op, NULL); 114353289f6aSNate Lawson } 114453289f6aSNate Lawson break; 114553289f6aSNate Lawson 114653289f6aSNate Lawson 114753289f6aSNate Lawson case AML_CREATE_BYTE_FIELD_OP: 114853289f6aSNate Lawson case AML_CREATE_WORD_FIELD_OP: 114953289f6aSNate Lawson case AML_CREATE_DWORD_FIELD_OP: 115053289f6aSNate Lawson case AML_CREATE_QWORD_FIELD_OP: 115153289f6aSNate Lawson case AML_INDEX_OP: 115253289f6aSNate Lawson 115353289f6aSNate Lawson /* These Ops require Byte offsets */ 115453289f6aSNate Lawson 115553289f6aSNate Lawson if (Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET) 115653289f6aSNate Lawson { 115753289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_BITS_TO_BYTES, Op, NULL); 115853289f6aSNate Lawson } 115953289f6aSNate Lawson break; 116053289f6aSNate Lawson 116153289f6aSNate Lawson 116253289f6aSNate Lawson default: 116353289f6aSNate Lawson /* Nothing to do for other opcodes */ 116453289f6aSNate Lawson break; 116553289f6aSNate Lawson } 116653289f6aSNate Lawson 116753289f6aSNate Lawson /* Now convert this node to an integer whose value is the field offset */ 116853289f6aSNate Lawson 1169fba7fc7eSJung-uk Kim Op->Asl.AmlLength = 0; 117053289f6aSNate Lawson Op->Asl.ParseOpcode = PARSEOP_INTEGER; 117153289f6aSNate Lawson Op->Asl.Value.Integer = (UINT64) Temp; 117253289f6aSNate Lawson Op->Asl.CompileFlags |= NODE_IS_RESOURCE_FIELD; 117353289f6aSNate Lawson 117453289f6aSNate Lawson OpcGenerateAmlOpcode (Op); 117553289f6aSNate Lawson } 117653289f6aSNate Lawson 11771a39cfb0SJung-uk Kim /* 3) Check for a method invocation */ 117853289f6aSNate Lawson 117953289f6aSNate Lawson else if ((((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)) && 118053289f6aSNate Lawson (Node->Type == ACPI_TYPE_METHOD) && 118153289f6aSNate Lawson (Op->Asl.Parent) && 118253289f6aSNate Lawson (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_METHOD)) || 118353289f6aSNate Lawson 118453289f6aSNate Lawson (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)) 118553289f6aSNate Lawson { 118653289f6aSNate Lawson 118753289f6aSNate Lawson /* 1188fba7fc7eSJung-uk Kim * A reference to a method within one of these opcodes is not an 1189fba7fc7eSJung-uk Kim * invocation of the method, it is simply a reference to the method. 1190fba7fc7eSJung-uk Kim */ 1191fba7fc7eSJung-uk Kim if ((Op->Asl.Parent) && 1192fba7fc7eSJung-uk Kim ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_REFOF) || 1193fba7fc7eSJung-uk Kim (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEREFOF) || 1194fba7fc7eSJung-uk Kim (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_OBJECTTYPE))) 1195fba7fc7eSJung-uk Kim { 1196fba7fc7eSJung-uk Kim return (AE_OK); 1197fba7fc7eSJung-uk Kim } 1198fba7fc7eSJung-uk Kim /* 119953289f6aSNate Lawson * There are two types of method invocation: 1200fba7fc7eSJung-uk Kim * 1) Invocation with arguments -- the parser recognizes this 1201fba7fc7eSJung-uk Kim * as a METHODCALL. 1202fba7fc7eSJung-uk Kim * 2) Invocation with no arguments --the parser cannot determine that 1203fba7fc7eSJung-uk Kim * this is a method invocation, therefore we have to figure it out 1204fba7fc7eSJung-uk Kim * here. 120553289f6aSNate Lawson */ 120653289f6aSNate Lawson if (Node->Type != ACPI_TYPE_METHOD) 120753289f6aSNate Lawson { 1208fba7fc7eSJung-uk Kim sprintf (MsgBuffer, "%s is a %s", 1209fba7fc7eSJung-uk Kim Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 121053289f6aSNate Lawson 121153289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_NOT_METHOD, Op, MsgBuffer); 121253289f6aSNate Lawson return (AE_OK); 121353289f6aSNate Lawson } 121453289f6aSNate Lawson 121553289f6aSNate Lawson /* Save the method node in the caller's op */ 121653289f6aSNate Lawson 121753289f6aSNate Lawson Op->Asl.Node = Node; 121853289f6aSNate Lawson if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF) 121953289f6aSNate Lawson { 122053289f6aSNate Lawson return (AE_OK); 122153289f6aSNate Lawson } 122253289f6aSNate Lawson 122353289f6aSNate Lawson /* 122453289f6aSNate Lawson * This is a method invocation, with or without arguments. 122553289f6aSNate Lawson * Count the number of arguments, each appears as a child 122653289f6aSNate Lawson * under the parent node 122753289f6aSNate Lawson */ 122853289f6aSNate Lawson Op->Asl.ParseOpcode = PARSEOP_METHODCALL; 122953289f6aSNate Lawson UtSetParseOpName (Op); 123053289f6aSNate Lawson 123153289f6aSNate Lawson PassedArgs = 0; 123253289f6aSNate Lawson NextOp = Op->Asl.Child; 123353289f6aSNate Lawson 123453289f6aSNate Lawson while (NextOp) 123553289f6aSNate Lawson { 123653289f6aSNate Lawson PassedArgs++; 123753289f6aSNate Lawson NextOp = NextOp->Asl.Next; 123853289f6aSNate Lawson } 123953289f6aSNate Lawson 1240fba7fc7eSJung-uk Kim if (Node->Value != ASL_EXTERNAL_METHOD) 124153289f6aSNate Lawson { 124253289f6aSNate Lawson /* 124353289f6aSNate Lawson * Check the parsed arguments with the number expected by the 124453289f6aSNate Lawson * method declaration itself 124553289f6aSNate Lawson */ 1246fba7fc7eSJung-uk Kim if (PassedArgs != Node->Value) 124753289f6aSNate Lawson { 124853289f6aSNate Lawson sprintf (MsgBuffer, "%s requires %d", Op->Asl.ExternalName, 1249fba7fc7eSJung-uk Kim Node->Value); 125053289f6aSNate Lawson 1251fba7fc7eSJung-uk Kim if (PassedArgs < Node->Value) 125253289f6aSNate Lawson { 125353289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_LO, Op, MsgBuffer); 125453289f6aSNate Lawson } 125553289f6aSNate Lawson else 125653289f6aSNate Lawson { 125753289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_HI, Op, MsgBuffer); 125853289f6aSNate Lawson } 125953289f6aSNate Lawson } 126053289f6aSNate Lawson } 126153289f6aSNate Lawson } 126253289f6aSNate Lawson 12631a39cfb0SJung-uk Kim /* 4) Check for an ASL Field definition */ 1264fba7fc7eSJung-uk Kim 126553289f6aSNate Lawson else if ((Op->Asl.Parent) && 126653289f6aSNate Lawson ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_FIELD) || 126753289f6aSNate Lawson (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_BANKFIELD))) 126853289f6aSNate Lawson { 126953289f6aSNate Lawson /* 127053289f6aSNate Lawson * Offset checking for fields. If the parent operation region has a 127153289f6aSNate Lawson * constant length (known at compile time), we can check fields 127253289f6aSNate Lawson * defined in that region against the region length. This will catch 127353289f6aSNate Lawson * fields and field units that cannot possibly fit within the region. 127453289f6aSNate Lawson * 127553289f6aSNate Lawson * Note: Index fields do not directly reference an operation region, 127653289f6aSNate Lawson * thus they are not included in this check. 127753289f6aSNate Lawson */ 127853289f6aSNate Lawson if (Op == Op->Asl.Parent->Asl.Child) 127953289f6aSNate Lawson { 128053289f6aSNate Lawson /* 128153289f6aSNate Lawson * This is the first child of the field node, which is 128253289f6aSNate Lawson * the name of the region. Get the parse node for the 128353289f6aSNate Lawson * region -- which contains the length of the region. 128453289f6aSNate Lawson */ 1285fba7fc7eSJung-uk Kim OwningOp = Node->Op; 1286fba7fc7eSJung-uk Kim Op->Asl.Parent->Asl.ExtraValue = 1287fba7fc7eSJung-uk Kim ACPI_MUL_8 ((UINT32) OwningOp->Asl.Value.Integer); 128853289f6aSNate Lawson 128953289f6aSNate Lawson /* Examine the field access width */ 129053289f6aSNate Lawson 129153289f6aSNate Lawson switch ((UINT8) Op->Asl.Parent->Asl.Value.Integer) 129253289f6aSNate Lawson { 129353289f6aSNate Lawson case AML_FIELD_ACCESS_ANY: 129453289f6aSNate Lawson case AML_FIELD_ACCESS_BYTE: 129553289f6aSNate Lawson case AML_FIELD_ACCESS_BUFFER: 129653289f6aSNate Lawson default: 129753289f6aSNate Lawson MinimumLength = 1; 129853289f6aSNate Lawson break; 129953289f6aSNate Lawson 130053289f6aSNate Lawson case AML_FIELD_ACCESS_WORD: 130153289f6aSNate Lawson MinimumLength = 2; 130253289f6aSNate Lawson break; 130353289f6aSNate Lawson 130453289f6aSNate Lawson case AML_FIELD_ACCESS_DWORD: 130553289f6aSNate Lawson MinimumLength = 4; 130653289f6aSNate Lawson break; 130753289f6aSNate Lawson 130853289f6aSNate Lawson case AML_FIELD_ACCESS_QWORD: 130953289f6aSNate Lawson MinimumLength = 8; 131053289f6aSNate Lawson break; 131153289f6aSNate Lawson } 131253289f6aSNate Lawson 131353289f6aSNate Lawson /* 131453289f6aSNate Lawson * Is the region at least as big as the access width? 131553289f6aSNate Lawson * Note: DataTableRegions have 0 length 131653289f6aSNate Lawson */ 131753289f6aSNate Lawson if (((UINT32) OwningOp->Asl.Value.Integer) && 131853289f6aSNate Lawson ((UINT32) OwningOp->Asl.Value.Integer < MinimumLength)) 131953289f6aSNate Lawson { 132053289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_FIELD_ACCESS_WIDTH, Op, NULL); 132153289f6aSNate Lawson } 132253289f6aSNate Lawson 132353289f6aSNate Lawson /* 132453289f6aSNate Lawson * Check EC/CMOS/SMBUS fields to make sure that the correct 132553289f6aSNate Lawson * access type is used (BYTE for EC/CMOS, BUFFER for SMBUS) 132653289f6aSNate Lawson */ 132753289f6aSNate Lawson SpaceIdOp = OwningOp->Asl.Child->Asl.Next; 132853289f6aSNate Lawson switch ((UINT32) SpaceIdOp->Asl.Value.Integer) 132953289f6aSNate Lawson { 133053289f6aSNate Lawson case REGION_EC: 133153289f6aSNate Lawson case REGION_CMOS: 133253289f6aSNate Lawson 133353289f6aSNate Lawson if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BYTE) 133453289f6aSNate Lawson { 133553289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_REGION_BYTE_ACCESS, Op, NULL); 133653289f6aSNate Lawson } 133753289f6aSNate Lawson break; 133853289f6aSNate Lawson 133953289f6aSNate Lawson case REGION_SMBUS: 134053289f6aSNate Lawson 134153289f6aSNate Lawson if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BUFFER) 134253289f6aSNate Lawson { 134353289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_REGION_BUFFER_ACCESS, Op, NULL); 134453289f6aSNate Lawson } 134553289f6aSNate Lawson break; 134653289f6aSNate Lawson 134753289f6aSNate Lawson default: 134853289f6aSNate Lawson 134953289f6aSNate Lawson /* Nothing to do for other address spaces */ 135053289f6aSNate Lawson break; 135153289f6aSNate Lawson } 135253289f6aSNate Lawson } 135353289f6aSNate Lawson else 135453289f6aSNate Lawson { 135553289f6aSNate Lawson /* 135653289f6aSNate Lawson * This is one element of the field list. Check to make sure 135753289f6aSNate Lawson * that it does not go beyond the end of the parent operation region. 135853289f6aSNate Lawson * 135953289f6aSNate Lawson * In the code below: 136053289f6aSNate Lawson * Op->Asl.Parent->Asl.ExtraValue - Region Length (bits) 136153289f6aSNate Lawson * Op->Asl.ExtraValue - Field start offset (bits) 136253289f6aSNate Lawson * Op->Asl.Child->Asl.Value.Integer32 - Field length (bits) 136353289f6aSNate Lawson * Op->Asl.Child->Asl.ExtraValue - Field access width (bits) 136453289f6aSNate Lawson */ 136553289f6aSNate Lawson if (Op->Asl.Parent->Asl.ExtraValue && Op->Asl.Child) 136653289f6aSNate Lawson { 136753289f6aSNate Lawson LkCheckFieldRange (Op, 136853289f6aSNate Lawson Op->Asl.Parent->Asl.ExtraValue, 136953289f6aSNate Lawson Op->Asl.ExtraValue, 137053289f6aSNate Lawson (UINT32) Op->Asl.Child->Asl.Value.Integer, 137153289f6aSNate Lawson Op->Asl.Child->Asl.ExtraValue); 137253289f6aSNate Lawson } 137353289f6aSNate Lawson } 137453289f6aSNate Lawson } 137553289f6aSNate Lawson 137653289f6aSNate Lawson Op->Asl.Node = Node; 137753289f6aSNate Lawson return (Status); 137853289f6aSNate Lawson } 137953289f6aSNate Lawson 138053289f6aSNate Lawson 138153289f6aSNate Lawson /******************************************************************************* 138253289f6aSNate Lawson * 138353289f6aSNate Lawson * FUNCTION: LkNamespaceLocateEnd 138453289f6aSNate Lawson * 138553289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 138653289f6aSNate Lawson * 138753289f6aSNate Lawson * RETURN: Status 138853289f6aSNate Lawson * 138953289f6aSNate Lawson * DESCRIPTION: Ascending callback used during cross reference. We only 139053289f6aSNate Lawson * need to worry about scope management here. 139153289f6aSNate Lawson * 139253289f6aSNate Lawson ******************************************************************************/ 139353289f6aSNate Lawson 1394fba7fc7eSJung-uk Kim static ACPI_STATUS 139553289f6aSNate Lawson LkNamespaceLocateEnd ( 139653289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 139753289f6aSNate Lawson UINT32 Level, 139853289f6aSNate Lawson void *Context) 139953289f6aSNate Lawson { 140053289f6aSNate Lawson ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 140153289f6aSNate Lawson const ACPI_OPCODE_INFO *OpInfo; 140253289f6aSNate Lawson 140353289f6aSNate Lawson 14041a39cfb0SJung-uk Kim ACPI_FUNCTION_TRACE (LkNamespaceLocateEnd); 140553289f6aSNate Lawson 140653289f6aSNate Lawson 140753289f6aSNate Lawson /* We are only interested in opcodes that have an associated name */ 140853289f6aSNate Lawson 140953289f6aSNate Lawson OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 141053289f6aSNate Lawson if (!(OpInfo->Flags & AML_NAMED)) 141153289f6aSNate Lawson { 141253289f6aSNate Lawson return (AE_OK); 141353289f6aSNate Lawson } 141453289f6aSNate Lawson 141553289f6aSNate Lawson /* Not interested in name references, we did not open a scope for them */ 141653289f6aSNate Lawson 141753289f6aSNate Lawson if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 141853289f6aSNate Lawson (Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 141953289f6aSNate Lawson (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)) 142053289f6aSNate Lawson { 142153289f6aSNate Lawson return (AE_OK); 142253289f6aSNate Lawson } 142353289f6aSNate Lawson 142453289f6aSNate Lawson /* Pop the scope stack if necessary */ 142553289f6aSNate Lawson 142653289f6aSNate Lawson if (AcpiNsOpensScope (AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode))) 142753289f6aSNate Lawson { 142853289f6aSNate Lawson 142953289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 143053289f6aSNate Lawson "%s: Popping scope for Op %p\n", 143153289f6aSNate Lawson AcpiUtGetTypeName (OpInfo->ObjectType), Op)); 143253289f6aSNate Lawson 1433fba7fc7eSJung-uk Kim (void) AcpiDsScopeStackPop (WalkState); 143453289f6aSNate Lawson } 143553289f6aSNate Lawson 143653289f6aSNate Lawson return (AE_OK); 143753289f6aSNate Lawson } 143853289f6aSNate Lawson 143953289f6aSNate Lawson 1440