11a39cfb0SJung-uk Kim /****************************************************************************** 21a39cfb0SJung-uk Kim * 31a39cfb0SJung-uk Kim * Module Name: adwalk - Application-level disassembler parse tree walk routines 41a39cfb0SJung-uk Kim * 51a39cfb0SJung-uk Kim *****************************************************************************/ 61a39cfb0SJung-uk Kim 7d244b227SJung-uk Kim /* 8ec3fc72fSJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 91a39cfb0SJung-uk Kim * All rights reserved. 101a39cfb0SJung-uk Kim * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 251a39cfb0SJung-uk Kim * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 291a39cfb0SJung-uk Kim * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 431a39cfb0SJung-uk Kim 441a39cfb0SJung-uk Kim 45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 51ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 52ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 531a39cfb0SJung-uk Kim 541a39cfb0SJung-uk Kim 551a39cfb0SJung-uk Kim #define _COMPONENT ACPI_TOOLS 561a39cfb0SJung-uk Kim ACPI_MODULE_NAME ("adwalk") 571a39cfb0SJung-uk Kim 581a39cfb0SJung-uk Kim /* 591a39cfb0SJung-uk Kim * aslmap - opcode mappings and reserved method names 601a39cfb0SJung-uk Kim */ 611a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE 621a39cfb0SJung-uk Kim AslMapNamedOpcodeToDataType ( 631a39cfb0SJung-uk Kim UINT16 Opcode); 641a39cfb0SJung-uk Kim 651a39cfb0SJung-uk Kim /* Local prototypes */ 661a39cfb0SJung-uk Kim 671a39cfb0SJung-uk Kim static ACPI_STATUS 681a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending ( 691a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 701a39cfb0SJung-uk Kim UINT32 Level, 711a39cfb0SJung-uk Kim void *Context); 721a39cfb0SJung-uk Kim 731a39cfb0SJung-uk Kim static ACPI_STATUS 741a39cfb0SJung-uk Kim AcpiDmDumpDescending ( 751a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 761a39cfb0SJung-uk Kim UINT32 Level, 771a39cfb0SJung-uk Kim void *Context); 781a39cfb0SJung-uk Kim 791a39cfb0SJung-uk Kim static ACPI_STATUS 801a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp ( 811a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 821a39cfb0SJung-uk Kim UINT32 Level, 831a39cfb0SJung-uk Kim void *Context); 841a39cfb0SJung-uk Kim 851a39cfb0SJung-uk Kim static ACPI_STATUS 861a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp ( 871a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 881a39cfb0SJung-uk Kim UINT32 Level, 891a39cfb0SJung-uk Kim void *Context); 901a39cfb0SJung-uk Kim 911a39cfb0SJung-uk Kim static ACPI_STATUS 921a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp ( 931a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 941a39cfb0SJung-uk Kim UINT32 Level, 951a39cfb0SJung-uk Kim void *Context); 961a39cfb0SJung-uk Kim 971a39cfb0SJung-uk Kim static UINT32 981a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs ( 991a39cfb0SJung-uk Kim UINT32 CurrentOpArgCount, 1001a39cfb0SJung-uk Kim UINT32 TargetCount, 1011a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op); 1021a39cfb0SJung-uk Kim 1031a39cfb0SJung-uk Kim static ACPI_STATUS 1041a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp ( 1051a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1061a39cfb0SJung-uk Kim UINT32 Level, 1071a39cfb0SJung-uk Kim void *Context); 1081a39cfb0SJung-uk Kim 1091a39cfb0SJung-uk Kim 1101a39cfb0SJung-uk Kim /******************************************************************************* 1111a39cfb0SJung-uk Kim * 1121a39cfb0SJung-uk Kim * FUNCTION: AcpiDmDumpTree 1131a39cfb0SJung-uk Kim * 1141a39cfb0SJung-uk Kim * PARAMETERS: Origin - Starting object 1151a39cfb0SJung-uk Kim * 1161a39cfb0SJung-uk Kim * RETURN: None 1171a39cfb0SJung-uk Kim * 1181a39cfb0SJung-uk Kim * DESCRIPTION: Parse tree walk to format and output the nodes 1191a39cfb0SJung-uk Kim * 1201a39cfb0SJung-uk Kim ******************************************************************************/ 1211a39cfb0SJung-uk Kim 1221a39cfb0SJung-uk Kim void 1231a39cfb0SJung-uk Kim AcpiDmDumpTree ( 1241a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Origin) 1251a39cfb0SJung-uk Kim { 1261a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 1271a39cfb0SJung-uk Kim 1281a39cfb0SJung-uk Kim 1291a39cfb0SJung-uk Kim if (!Origin) 1301a39cfb0SJung-uk Kim { 1311a39cfb0SJung-uk Kim return; 1321a39cfb0SJung-uk Kim } 1331a39cfb0SJung-uk Kim 1341a39cfb0SJung-uk Kim AcpiOsPrintf ("/*\nAML Parse Tree\n\n"); 1351a39cfb0SJung-uk Kim Info.Flags = 0; 1361a39cfb0SJung-uk Kim Info.Count = 0; 1371a39cfb0SJung-uk Kim Info.Level = 0; 1381a39cfb0SJung-uk Kim Info.WalkState = NULL; 1391a39cfb0SJung-uk Kim AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info); 1401a39cfb0SJung-uk Kim AcpiOsPrintf ("*/\n\n"); 1411a39cfb0SJung-uk Kim } 1421a39cfb0SJung-uk Kim 1431a39cfb0SJung-uk Kim 1441a39cfb0SJung-uk Kim /******************************************************************************* 1451a39cfb0SJung-uk Kim * 1461a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFindOrphanMethods 1471a39cfb0SJung-uk Kim * 1481a39cfb0SJung-uk Kim * PARAMETERS: Origin - Starting object 1491a39cfb0SJung-uk Kim * 1501a39cfb0SJung-uk Kim * RETURN: None 1511a39cfb0SJung-uk Kim * 1521a39cfb0SJung-uk Kim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods 1531a39cfb0SJung-uk Kim * that are not resolved in the namespace 1541a39cfb0SJung-uk Kim * 1551a39cfb0SJung-uk Kim ******************************************************************************/ 1561a39cfb0SJung-uk Kim 1571a39cfb0SJung-uk Kim void 1581a39cfb0SJung-uk Kim AcpiDmFindOrphanMethods ( 1591a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Origin) 1601a39cfb0SJung-uk Kim { 1611a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 1621a39cfb0SJung-uk Kim 1631a39cfb0SJung-uk Kim 1641a39cfb0SJung-uk Kim if (!Origin) 1651a39cfb0SJung-uk Kim { 1661a39cfb0SJung-uk Kim return; 1671a39cfb0SJung-uk Kim } 1681a39cfb0SJung-uk Kim 1691a39cfb0SJung-uk Kim Info.Flags = 0; 1701a39cfb0SJung-uk Kim Info.Level = 0; 1711a39cfb0SJung-uk Kim Info.WalkState = NULL; 1721a39cfb0SJung-uk Kim AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info); 1731a39cfb0SJung-uk Kim } 1741a39cfb0SJung-uk Kim 1751a39cfb0SJung-uk Kim 1761a39cfb0SJung-uk Kim /******************************************************************************* 1771a39cfb0SJung-uk Kim * 1781a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFinishNamespaceLoad 1791a39cfb0SJung-uk Kim * 1801a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 1811a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 182a9f12690SJung-uk Kim * OwnerId - OwnerId of the table to be disassembled 1831a39cfb0SJung-uk Kim * 1841a39cfb0SJung-uk Kim * RETURN: None 1851a39cfb0SJung-uk Kim * 1861a39cfb0SJung-uk Kim * DESCRIPTION: Load all namespace items that are created within control 1871a39cfb0SJung-uk Kim * methods. Used before namespace cross reference 1881a39cfb0SJung-uk Kim * 1891a39cfb0SJung-uk Kim ******************************************************************************/ 1901a39cfb0SJung-uk Kim 1911a39cfb0SJung-uk Kim void 1921a39cfb0SJung-uk Kim AcpiDmFinishNamespaceLoad ( 1931a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 194a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot, 195a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId) 1961a39cfb0SJung-uk Kim { 1971a39cfb0SJung-uk Kim ACPI_STATUS Status; 1981a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 1991a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 2001a39cfb0SJung-uk Kim 2011a39cfb0SJung-uk Kim 2021a39cfb0SJung-uk Kim if (!ParseTreeRoot) 2031a39cfb0SJung-uk Kim { 2041a39cfb0SJung-uk Kim return; 2051a39cfb0SJung-uk Kim } 2061a39cfb0SJung-uk Kim 2071a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 2081a39cfb0SJung-uk Kim 209a9f12690SJung-uk Kim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 2101a39cfb0SJung-uk Kim if (!WalkState) 2111a39cfb0SJung-uk Kim { 2121a39cfb0SJung-uk Kim return; 2131a39cfb0SJung-uk Kim } 2141a39cfb0SJung-uk Kim 2151a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 2161a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 2171a39cfb0SJung-uk Kim { 2181a39cfb0SJung-uk Kim return; 2191a39cfb0SJung-uk Kim } 2201a39cfb0SJung-uk Kim 2211a39cfb0SJung-uk Kim Info.Flags = 0; 2221a39cfb0SJung-uk Kim Info.Level = 0; 2231a39cfb0SJung-uk Kim Info.WalkState = WalkState; 2241a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp, 2251a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 2261a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 2271a39cfb0SJung-uk Kim } 2281a39cfb0SJung-uk Kim 2291a39cfb0SJung-uk Kim 2301a39cfb0SJung-uk Kim /******************************************************************************* 2311a39cfb0SJung-uk Kim * 2321a39cfb0SJung-uk Kim * FUNCTION: AcpiDmCrossReferenceNamespace 2331a39cfb0SJung-uk Kim * 2341a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 2351a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 236a9f12690SJung-uk Kim * OwnerId - OwnerId of the table to be disassembled 2371a39cfb0SJung-uk Kim * 2381a39cfb0SJung-uk Kim * RETURN: None 2391a39cfb0SJung-uk Kim * 2401a39cfb0SJung-uk Kim * DESCRIPTION: Cross reference the namespace to create externals 2411a39cfb0SJung-uk Kim * 2421a39cfb0SJung-uk Kim ******************************************************************************/ 2431a39cfb0SJung-uk Kim 2441a39cfb0SJung-uk Kim void 2451a39cfb0SJung-uk Kim AcpiDmCrossReferenceNamespace ( 2461a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 247a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot, 248a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId) 2491a39cfb0SJung-uk Kim { 2501a39cfb0SJung-uk Kim ACPI_STATUS Status; 2511a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 2521a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 2531a39cfb0SJung-uk Kim 2541a39cfb0SJung-uk Kim 2551a39cfb0SJung-uk Kim if (!ParseTreeRoot) 2561a39cfb0SJung-uk Kim { 2571a39cfb0SJung-uk Kim return; 2581a39cfb0SJung-uk Kim } 2591a39cfb0SJung-uk Kim 2601a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 2611a39cfb0SJung-uk Kim 262a9f12690SJung-uk Kim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 2631a39cfb0SJung-uk Kim if (!WalkState) 2641a39cfb0SJung-uk Kim { 2651a39cfb0SJung-uk Kim return; 2661a39cfb0SJung-uk Kim } 2671a39cfb0SJung-uk Kim 2681a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 2691a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 2701a39cfb0SJung-uk Kim { 2711a39cfb0SJung-uk Kim return; 2721a39cfb0SJung-uk Kim } 2731a39cfb0SJung-uk Kim 2741a39cfb0SJung-uk Kim Info.Flags = 0; 2751a39cfb0SJung-uk Kim Info.Level = 0; 2761a39cfb0SJung-uk Kim Info.WalkState = WalkState; 2771a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp, 2781a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 2791a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 2801a39cfb0SJung-uk Kim } 2811a39cfb0SJung-uk Kim 2821a39cfb0SJung-uk Kim 2831a39cfb0SJung-uk Kim /******************************************************************************* 2841a39cfb0SJung-uk Kim * 2851a39cfb0SJung-uk Kim * FUNCTION: AcpiDmConvertResourceIndexes 2861a39cfb0SJung-uk Kim * 2871a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 2881a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 2891a39cfb0SJung-uk Kim * 2901a39cfb0SJung-uk Kim * RETURN: None 2911a39cfb0SJung-uk Kim * 2921a39cfb0SJung-uk Kim * DESCRIPTION: Convert fixed-offset references to resource descriptors to 2931a39cfb0SJung-uk Kim * symbolic references. Should only be called after namespace has 2941a39cfb0SJung-uk Kim * been cross referenced. 2951a39cfb0SJung-uk Kim * 2961a39cfb0SJung-uk Kim ******************************************************************************/ 2971a39cfb0SJung-uk Kim 2981a39cfb0SJung-uk Kim void 2991a39cfb0SJung-uk Kim AcpiDmConvertResourceIndexes ( 3001a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 3011a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot) 3021a39cfb0SJung-uk Kim { 3031a39cfb0SJung-uk Kim ACPI_STATUS Status; 3041a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 3051a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 3061a39cfb0SJung-uk Kim 3071a39cfb0SJung-uk Kim 3081a39cfb0SJung-uk Kim if (!ParseTreeRoot) 3091a39cfb0SJung-uk Kim { 3101a39cfb0SJung-uk Kim return; 3111a39cfb0SJung-uk Kim } 3121a39cfb0SJung-uk Kim 3131a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 3141a39cfb0SJung-uk Kim 3151a39cfb0SJung-uk Kim WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL); 3161a39cfb0SJung-uk Kim if (!WalkState) 3171a39cfb0SJung-uk Kim { 3181a39cfb0SJung-uk Kim return; 3191a39cfb0SJung-uk Kim } 3201a39cfb0SJung-uk Kim 3211a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 3221a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 3231a39cfb0SJung-uk Kim { 3241a39cfb0SJung-uk Kim return; 3251a39cfb0SJung-uk Kim } 3261a39cfb0SJung-uk Kim 3271a39cfb0SJung-uk Kim Info.Flags = 0; 3281a39cfb0SJung-uk Kim Info.Level = 0; 3291a39cfb0SJung-uk Kim Info.WalkState = WalkState; 3301a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp, 3311a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 3321a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 3331a39cfb0SJung-uk Kim return; 3341a39cfb0SJung-uk Kim } 3351a39cfb0SJung-uk Kim 3361a39cfb0SJung-uk Kim 3371a39cfb0SJung-uk Kim /******************************************************************************* 3381a39cfb0SJung-uk Kim * 3391a39cfb0SJung-uk Kim * FUNCTION: AcpiDmDumpDescending 3401a39cfb0SJung-uk Kim * 3411a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 3421a39cfb0SJung-uk Kim * 3431a39cfb0SJung-uk Kim * RETURN: Status 3441a39cfb0SJung-uk Kim * 3451a39cfb0SJung-uk Kim * DESCRIPTION: Format and print contents of one parse Op. 3461a39cfb0SJung-uk Kim * 3471a39cfb0SJung-uk Kim ******************************************************************************/ 3481a39cfb0SJung-uk Kim 3491a39cfb0SJung-uk Kim static ACPI_STATUS 3501a39cfb0SJung-uk Kim AcpiDmDumpDescending ( 3511a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 3521a39cfb0SJung-uk Kim UINT32 Level, 3531a39cfb0SJung-uk Kim void *Context) 3541a39cfb0SJung-uk Kim { 3551a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 3561a39cfb0SJung-uk Kim char *Path; 3571a39cfb0SJung-uk Kim 3581a39cfb0SJung-uk Kim 3591a39cfb0SJung-uk Kim if (!Op) 3601a39cfb0SJung-uk Kim { 3611a39cfb0SJung-uk Kim return (AE_OK); 3621a39cfb0SJung-uk Kim } 3631a39cfb0SJung-uk Kim 3641a39cfb0SJung-uk Kim /* Most of the information (count, level, name) here */ 3651a39cfb0SJung-uk Kim 366f556842eSJung-uk Kim Info->Count++; 3671a39cfb0SJung-uk Kim AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level); 3681a39cfb0SJung-uk Kim AcpiDmIndent (Level); 3691a39cfb0SJung-uk Kim AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode)); 3701a39cfb0SJung-uk Kim 3711a39cfb0SJung-uk Kim /* Extra info is helpful */ 3721a39cfb0SJung-uk Kim 3731a39cfb0SJung-uk Kim switch (Op->Common.AmlOpcode) 3741a39cfb0SJung-uk Kim { 3751a39cfb0SJung-uk Kim case AML_BYTE_OP: 3761a39cfb0SJung-uk Kim case AML_WORD_OP: 3771a39cfb0SJung-uk Kim case AML_DWORD_OP: 3781a39cfb0SJung-uk Kim AcpiOsPrintf ("%X", (UINT32) Op->Common.Value.Integer); 3791a39cfb0SJung-uk Kim break; 3801a39cfb0SJung-uk Kim 3813f0275a0SJung-uk Kim case AML_QWORD_OP: 3823f0275a0SJung-uk Kim AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); 3833f0275a0SJung-uk Kim break; 3843f0275a0SJung-uk Kim 3851a39cfb0SJung-uk Kim case AML_INT_NAMEPATH_OP: 3861a39cfb0SJung-uk Kim if (Op->Common.Value.String) 3871a39cfb0SJung-uk Kim { 3881a39cfb0SJung-uk Kim AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String, 3891a39cfb0SJung-uk Kim NULL, &Path); 3901a39cfb0SJung-uk Kim AcpiOsPrintf ("%s %p", Path, Op->Common.Node); 3911a39cfb0SJung-uk Kim ACPI_FREE (Path); 3921a39cfb0SJung-uk Kim } 3931a39cfb0SJung-uk Kim else 3941a39cfb0SJung-uk Kim { 3951a39cfb0SJung-uk Kim AcpiOsPrintf ("[NULL]"); 3961a39cfb0SJung-uk Kim } 3971a39cfb0SJung-uk Kim break; 3981a39cfb0SJung-uk Kim 3991a39cfb0SJung-uk Kim case AML_NAME_OP: 4001a39cfb0SJung-uk Kim case AML_METHOD_OP: 4011a39cfb0SJung-uk Kim case AML_DEVICE_OP: 4021a39cfb0SJung-uk Kim case AML_INT_NAMEDFIELD_OP: 403f556842eSJung-uk Kim AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name)); 4041a39cfb0SJung-uk Kim break; 405a9f12690SJung-uk Kim 406a9f12690SJung-uk Kim default: 407a9f12690SJung-uk Kim break; 4081a39cfb0SJung-uk Kim } 4091a39cfb0SJung-uk Kim 4101a39cfb0SJung-uk Kim AcpiOsPrintf ("\n"); 4111a39cfb0SJung-uk Kim return (AE_OK); 4121a39cfb0SJung-uk Kim } 4131a39cfb0SJung-uk Kim 4141a39cfb0SJung-uk Kim 4151a39cfb0SJung-uk Kim /******************************************************************************* 4161a39cfb0SJung-uk Kim * 4171a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFindOrphanDescending 4181a39cfb0SJung-uk Kim * 4191a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 4201a39cfb0SJung-uk Kim * 4211a39cfb0SJung-uk Kim * RETURN: Status 4221a39cfb0SJung-uk Kim * 4231a39cfb0SJung-uk Kim * DESCRIPTION: Check namepath Ops for orphaned method invocations 4241a39cfb0SJung-uk Kim * 4251a39cfb0SJung-uk Kim * Note: Experimental. 4261a39cfb0SJung-uk Kim * 4271a39cfb0SJung-uk Kim ******************************************************************************/ 4281a39cfb0SJung-uk Kim 4291a39cfb0SJung-uk Kim static ACPI_STATUS 4301a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending ( 4311a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 4321a39cfb0SJung-uk Kim UINT32 Level, 4331a39cfb0SJung-uk Kim void *Context) 4341a39cfb0SJung-uk Kim { 4351a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 4361a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ChildOp; 4371a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 4381a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp; 4391a39cfb0SJung-uk Kim UINT32 ArgCount; 4401a39cfb0SJung-uk Kim 4411a39cfb0SJung-uk Kim 4421a39cfb0SJung-uk Kim if (!Op) 4431a39cfb0SJung-uk Kim { 4441a39cfb0SJung-uk Kim return (AE_OK); 4451a39cfb0SJung-uk Kim } 4461a39cfb0SJung-uk Kim 4471a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 4481a39cfb0SJung-uk Kim 4491a39cfb0SJung-uk Kim switch (Op->Common.AmlOpcode) 4501a39cfb0SJung-uk Kim { 4511a39cfb0SJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT 4521a39cfb0SJung-uk Kim case AML_ADD_OP: 4531a39cfb0SJung-uk Kim ChildOp = Op->Common.Value.Arg; 4541a39cfb0SJung-uk Kim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 4551a39cfb0SJung-uk Kim !ChildOp->Common.Node) 4561a39cfb0SJung-uk Kim { 4571a39cfb0SJung-uk Kim AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String, 4581a39cfb0SJung-uk Kim NULL, &Path); 4591a39cfb0SJung-uk Kim AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n", Op->Common.AmlOpName, Path); 4601a39cfb0SJung-uk Kim ACPI_FREE (Path); 4611a39cfb0SJung-uk Kim 4621a39cfb0SJung-uk Kim NextOp = Op->Common.Next; 4631a39cfb0SJung-uk Kim if (!NextOp) 4641a39cfb0SJung-uk Kim { 4651a39cfb0SJung-uk Kim /* This NamePath has no args, assume it is an integer */ 4661a39cfb0SJung-uk Kim 467f556842eSJung-uk Kim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 4681a39cfb0SJung-uk Kim return (AE_OK); 4691a39cfb0SJung-uk Kim } 4701a39cfb0SJung-uk Kim 4711a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp); 472a88e22b7SJung-uk Kim AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n", ArgCount, AcpiDmCountChildren (Op)); 4731a39cfb0SJung-uk Kim 4741a39cfb0SJung-uk Kim if (ArgCount < 1) 4751a39cfb0SJung-uk Kim { 4761a39cfb0SJung-uk Kim /* One Arg means this is just a Store(Name,Target) */ 4771a39cfb0SJung-uk Kim 478f556842eSJung-uk Kim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 4791a39cfb0SJung-uk Kim return (AE_OK); 4801a39cfb0SJung-uk Kim } 4811a39cfb0SJung-uk Kim 482f556842eSJung-uk Kim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 4831a39cfb0SJung-uk Kim } 4841a39cfb0SJung-uk Kim break; 4851a39cfb0SJung-uk Kim #endif 4861a39cfb0SJung-uk Kim 4871a39cfb0SJung-uk Kim case AML_STORE_OP: 4881a39cfb0SJung-uk Kim 4891a39cfb0SJung-uk Kim ChildOp = Op->Common.Value.Arg; 4901a39cfb0SJung-uk Kim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 4911a39cfb0SJung-uk Kim !ChildOp->Common.Node) 4921a39cfb0SJung-uk Kim { 4931a39cfb0SJung-uk Kim NextOp = Op->Common.Next; 4941a39cfb0SJung-uk Kim if (!NextOp) 4951a39cfb0SJung-uk Kim { 4961a39cfb0SJung-uk Kim /* This NamePath has no args, assume it is an integer */ 4971a39cfb0SJung-uk Kim 498f556842eSJung-uk Kim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 4991a39cfb0SJung-uk Kim return (AE_OK); 5001a39cfb0SJung-uk Kim } 5011a39cfb0SJung-uk Kim 5021a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp); 5031a39cfb0SJung-uk Kim if (ArgCount <= 1) 5041a39cfb0SJung-uk Kim { 5051a39cfb0SJung-uk Kim /* One Arg means this is just a Store(Name,Target) */ 5061a39cfb0SJung-uk Kim 507f556842eSJung-uk Kim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 5081a39cfb0SJung-uk Kim return (AE_OK); 5091a39cfb0SJung-uk Kim } 5101a39cfb0SJung-uk Kim 511f556842eSJung-uk Kim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 5121a39cfb0SJung-uk Kim } 5131a39cfb0SJung-uk Kim break; 5141a39cfb0SJung-uk Kim 5151a39cfb0SJung-uk Kim case AML_INT_NAMEPATH_OP: 5161a39cfb0SJung-uk Kim 5171a39cfb0SJung-uk Kim /* Must examine parent to see if this namepath is an argument */ 5181a39cfb0SJung-uk Kim 5191a39cfb0SJung-uk Kim ParentOp = Op->Common.Parent; 5201a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode); 5211a39cfb0SJung-uk Kim 5221a39cfb0SJung-uk Kim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 5231a39cfb0SJung-uk Kim (OpInfo->Class != AML_CLASS_CREATE) && 524a7a3b383SJung-uk Kim (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) && 5251a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && 5261a39cfb0SJung-uk Kim !Op->Common.Node) 5271a39cfb0SJung-uk Kim { 5281a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next); 5291a39cfb0SJung-uk Kim 5301a39cfb0SJung-uk Kim /* 5311a39cfb0SJung-uk Kim * Check if namepath is a predicate for if/while or lone parameter to 5321a39cfb0SJung-uk Kim * a return. 5331a39cfb0SJung-uk Kim */ 5341a39cfb0SJung-uk Kim if (ArgCount == 0) 5351a39cfb0SJung-uk Kim { 5361a39cfb0SJung-uk Kim if (((ParentOp->Common.AmlOpcode == AML_IF_OP) || 5371a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_WHILE_OP) || 5381a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) && 5391a39cfb0SJung-uk Kim 5401a39cfb0SJung-uk Kim /* And namepath is the first argument */ 5411a39cfb0SJung-uk Kim (ParentOp->Common.Value.Arg == Op)) 5421a39cfb0SJung-uk Kim { 543f556842eSJung-uk Kim AcpiDmAddToExternalList (Op, Op->Common.Value.String, ACPI_TYPE_INTEGER, 0); 5441a39cfb0SJung-uk Kim break; 5451a39cfb0SJung-uk Kim } 5461a39cfb0SJung-uk Kim } 5471a39cfb0SJung-uk Kim 5481a39cfb0SJung-uk Kim /* 5491a39cfb0SJung-uk Kim * This is a standalone namestring (not a parameter to another 5501a39cfb0SJung-uk Kim * operator) - it *must* be a method invocation, nothing else is 5511a39cfb0SJung-uk Kim * grammatically possible. 5521a39cfb0SJung-uk Kim */ 553f556842eSJung-uk Kim AcpiDmAddToExternalList (Op, Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 5541a39cfb0SJung-uk Kim 5551a39cfb0SJung-uk Kim } 5561a39cfb0SJung-uk Kim break; 557a9f12690SJung-uk Kim 558a9f12690SJung-uk Kim default: 559a9f12690SJung-uk Kim break; 5601a39cfb0SJung-uk Kim } 5611a39cfb0SJung-uk Kim 5621a39cfb0SJung-uk Kim return (AE_OK); 5631a39cfb0SJung-uk Kim } 5641a39cfb0SJung-uk Kim 5651a39cfb0SJung-uk Kim 5661a39cfb0SJung-uk Kim /******************************************************************************* 5671a39cfb0SJung-uk Kim * 5681a39cfb0SJung-uk Kim * FUNCTION: AcpiDmLoadDescendingOp 5691a39cfb0SJung-uk Kim * 5701a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 5711a39cfb0SJung-uk Kim * 5721a39cfb0SJung-uk Kim * RETURN: Status 5731a39cfb0SJung-uk Kim * 5741a39cfb0SJung-uk Kim * DESCRIPTION: Descending handler for namespace control method object load 5751a39cfb0SJung-uk Kim * 5761a39cfb0SJung-uk Kim ******************************************************************************/ 5771a39cfb0SJung-uk Kim 5781a39cfb0SJung-uk Kim static ACPI_STATUS 5791a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp ( 5801a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 5811a39cfb0SJung-uk Kim UINT32 Level, 5821a39cfb0SJung-uk Kim void *Context) 5831a39cfb0SJung-uk Kim { 5841a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 5851a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 5861a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 5871a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 5881a39cfb0SJung-uk Kim ACPI_STATUS Status; 5891a39cfb0SJung-uk Kim char *Path = NULL; 5901a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 5911a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 592a9f12690SJung-uk Kim char FieldPath[5]; 593a9f12690SJung-uk Kim BOOLEAN PreDefined = FALSE; 594a9f12690SJung-uk Kim UINT8 PreDefineIndex = 0; 5951a39cfb0SJung-uk Kim 5961a39cfb0SJung-uk Kim 5971a39cfb0SJung-uk Kim WalkState = Info->WalkState; 5981a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 5991a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 6001a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 6011a39cfb0SJung-uk Kim 6021a39cfb0SJung-uk Kim /* Only interested in operators that create new names */ 6031a39cfb0SJung-uk Kim 6041a39cfb0SJung-uk Kim if (!(OpInfo->Flags & AML_NAMED) && 6051a39cfb0SJung-uk Kim !(OpInfo->Flags & AML_CREATE)) 6061a39cfb0SJung-uk Kim { 6071a39cfb0SJung-uk Kim goto Exit; 6081a39cfb0SJung-uk Kim } 6091a39cfb0SJung-uk Kim 6101a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */ 6111a39cfb0SJung-uk Kim 6121a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED) 6131a39cfb0SJung-uk Kim { 6141a39cfb0SJung-uk Kim /* For all named operators, get the new name */ 6151a39cfb0SJung-uk Kim 6161a39cfb0SJung-uk Kim Path = (char *) Op->Named.Path; 617a9f12690SJung-uk Kim 618a9f12690SJung-uk Kim if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 619a9f12690SJung-uk Kim { 620a9f12690SJung-uk Kim *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name; 621a9f12690SJung-uk Kim FieldPath[4] = 0; 622a9f12690SJung-uk Kim Path = FieldPath; 623a9f12690SJung-uk Kim } 6241a39cfb0SJung-uk Kim } 6251a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE) 6261a39cfb0SJung-uk Kim { 6271a39cfb0SJung-uk Kim /* New name is the last child */ 6281a39cfb0SJung-uk Kim 6291a39cfb0SJung-uk Kim NextOp = Op->Common.Value.Arg; 6301a39cfb0SJung-uk Kim 6311a39cfb0SJung-uk Kim while (NextOp->Common.Next) 6321a39cfb0SJung-uk Kim { 6331a39cfb0SJung-uk Kim NextOp = NextOp->Common.Next; 6341a39cfb0SJung-uk Kim } 6351a39cfb0SJung-uk Kim Path = NextOp->Common.Value.String; 6361a39cfb0SJung-uk Kim } 6371a39cfb0SJung-uk Kim 6381a39cfb0SJung-uk Kim if (!Path) 6391a39cfb0SJung-uk Kim { 6401a39cfb0SJung-uk Kim goto Exit; 6411a39cfb0SJung-uk Kim } 6421a39cfb0SJung-uk Kim 6431a39cfb0SJung-uk Kim /* Insert the name into the namespace */ 6441a39cfb0SJung-uk Kim 6451a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 6461a39cfb0SJung-uk Kim ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE, 6471a39cfb0SJung-uk Kim WalkState, &Node); 6481a39cfb0SJung-uk Kim 6491a39cfb0SJung-uk Kim Op->Common.Node = Node; 6501a39cfb0SJung-uk Kim 651a9f12690SJung-uk Kim if (ACPI_SUCCESS (Status)) 652a9f12690SJung-uk Kim { 653a9f12690SJung-uk Kim /* Check if it's a predefined node */ 654a9f12690SJung-uk Kim 655a9f12690SJung-uk Kim while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name) 656a9f12690SJung-uk Kim { 657*8ef1a331SJung-uk Kim if (ACPI_COMPARE_NAME (Node->Name.Ascii, 658*8ef1a331SJung-uk Kim AcpiGbl_PreDefinedNames[PreDefineIndex].Name)) 659a9f12690SJung-uk Kim { 660a9f12690SJung-uk Kim PreDefined = TRUE; 661a9f12690SJung-uk Kim break; 662a9f12690SJung-uk Kim } 663a9f12690SJung-uk Kim 664a9f12690SJung-uk Kim PreDefineIndex++; 665a9f12690SJung-uk Kim } 666a9f12690SJung-uk Kim 667a9f12690SJung-uk Kim /* 668a9f12690SJung-uk Kim * Set node owner id if it satisfies all the following conditions: 669a9f12690SJung-uk Kim * 1) Not a predefined node, _SB_ etc 670a9f12690SJung-uk Kim * 2) Not the root node 671a9f12690SJung-uk Kim * 3) Not a node created by Scope 672a9f12690SJung-uk Kim */ 673a9f12690SJung-uk Kim 674a9f12690SJung-uk Kim if (!PreDefined && Node != AcpiGbl_RootNode && 675a9f12690SJung-uk Kim Op->Common.AmlOpcode != AML_SCOPE_OP) 676a9f12690SJung-uk Kim { 677a9f12690SJung-uk Kim Node->OwnerId = WalkState->OwnerId; 678a9f12690SJung-uk Kim } 679a9f12690SJung-uk Kim } 680a9f12690SJung-uk Kim 6811a39cfb0SJung-uk Kim 6821a39cfb0SJung-uk Kim Exit: 6831a39cfb0SJung-uk Kim 6841a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 6851a39cfb0SJung-uk Kim { 6861a39cfb0SJung-uk Kim if (Op->Common.Node) 6871a39cfb0SJung-uk Kim { 6881a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 6891a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 6901a39cfb0SJung-uk Kim { 6911a39cfb0SJung-uk Kim return (Status); 6921a39cfb0SJung-uk Kim } 6931a39cfb0SJung-uk Kim } 6941a39cfb0SJung-uk Kim } 6951a39cfb0SJung-uk Kim 6961a39cfb0SJung-uk Kim return (AE_OK); 6971a39cfb0SJung-uk Kim } 6981a39cfb0SJung-uk Kim 6991a39cfb0SJung-uk Kim 7001a39cfb0SJung-uk Kim /******************************************************************************* 7011a39cfb0SJung-uk Kim * 7021a39cfb0SJung-uk Kim * FUNCTION: AcpiDmXrefDescendingOp 7031a39cfb0SJung-uk Kim * 7041a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 7051a39cfb0SJung-uk Kim * 7061a39cfb0SJung-uk Kim * RETURN: Status 7071a39cfb0SJung-uk Kim * 7081a39cfb0SJung-uk Kim * DESCRIPTION: Descending handler for namespace cross reference 7091a39cfb0SJung-uk Kim * 7101a39cfb0SJung-uk Kim ******************************************************************************/ 7111a39cfb0SJung-uk Kim 7121a39cfb0SJung-uk Kim static ACPI_STATUS 7131a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp ( 7141a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 7151a39cfb0SJung-uk Kim UINT32 Level, 7161a39cfb0SJung-uk Kim void *Context) 7171a39cfb0SJung-uk Kim { 7181a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 7191a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 7201a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 7211a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 722a9f12690SJung-uk Kim ACPI_OBJECT_TYPE ObjectType2; 7231a39cfb0SJung-uk Kim ACPI_STATUS Status; 7241a39cfb0SJung-uk Kim char *Path = NULL; 7251a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 7261a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 727a9f12690SJung-uk Kim ACPI_OPERAND_OBJECT *Object; 72842fecd12SJung-uk Kim UINT32 ParamCount = 0; 7291a39cfb0SJung-uk Kim 7301a39cfb0SJung-uk Kim 7311a39cfb0SJung-uk Kim WalkState = Info->WalkState; 7321a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 7331a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 7341a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 7351a39cfb0SJung-uk Kim 7361a39cfb0SJung-uk Kim if ((!(OpInfo->Flags & AML_NAMED)) && 7371a39cfb0SJung-uk Kim (!(OpInfo->Flags & AML_CREATE)) && 7381a39cfb0SJung-uk Kim (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP)) 7391a39cfb0SJung-uk Kim { 7401a39cfb0SJung-uk Kim goto Exit; 7411a39cfb0SJung-uk Kim } 7421a39cfb0SJung-uk Kim 7431a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */ 7441a39cfb0SJung-uk Kim 7451a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED) 7461a39cfb0SJung-uk Kim { 7471a39cfb0SJung-uk Kim /* 748a7a3b383SJung-uk Kim * Only these two operators (Alias, Scope) refer to an existing 749a7a3b383SJung-uk Kim * name, it is the first argument 7501a39cfb0SJung-uk Kim */ 751a7a3b383SJung-uk Kim if (Op->Common.AmlOpcode == AML_ALIAS_OP) 752a7a3b383SJung-uk Kim { 753a7a3b383SJung-uk Kim ObjectType = ACPI_TYPE_ANY; 754a7a3b383SJung-uk Kim 755a7a3b383SJung-uk Kim NextOp = Op->Common.Value.Arg; 756a7a3b383SJung-uk Kim NextOp = NextOp->Common.Value.Arg; 757a7a3b383SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 758a7a3b383SJung-uk Kim { 759a7a3b383SJung-uk Kim Path = NextOp->Common.Value.String; 760a7a3b383SJung-uk Kim } 761a7a3b383SJung-uk Kim } 762a7a3b383SJung-uk Kim else if (Op->Common.AmlOpcode == AML_SCOPE_OP) 763a7a3b383SJung-uk Kim { 7641a39cfb0SJung-uk Kim Path = (char *) Op->Named.Path; 7651a39cfb0SJung-uk Kim } 7661a39cfb0SJung-uk Kim } 7671a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE) 7681a39cfb0SJung-uk Kim { 7691a39cfb0SJung-uk Kim /* Referenced Buffer Name is the first child */ 7701a39cfb0SJung-uk Kim 771a7a3b383SJung-uk Kim ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */ 772a7a3b383SJung-uk Kim 7731a39cfb0SJung-uk Kim NextOp = Op->Common.Value.Arg; 7741a39cfb0SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 7751a39cfb0SJung-uk Kim { 7761a39cfb0SJung-uk Kim Path = NextOp->Common.Value.String; 7771a39cfb0SJung-uk Kim } 7781a39cfb0SJung-uk Kim } 7791a39cfb0SJung-uk Kim else 7801a39cfb0SJung-uk Kim { 7811a39cfb0SJung-uk Kim Path = Op->Common.Value.String; 7821a39cfb0SJung-uk Kim } 7831a39cfb0SJung-uk Kim 7841a39cfb0SJung-uk Kim if (!Path) 7851a39cfb0SJung-uk Kim { 7861a39cfb0SJung-uk Kim goto Exit; 7871a39cfb0SJung-uk Kim } 7881a39cfb0SJung-uk Kim 7891a39cfb0SJung-uk Kim /* 7901a39cfb0SJung-uk Kim * Lookup the name in the namespace. Name must exist at this point, or it 7911a39cfb0SJung-uk Kim * is an invalid reference. 7921a39cfb0SJung-uk Kim * 7931a39cfb0SJung-uk Kim * The namespace is also used as a lookup table for references to resource 7941a39cfb0SJung-uk Kim * descriptors and the fields within them. 7951a39cfb0SJung-uk Kim */ 7961a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 7971a39cfb0SJung-uk Kim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 7981a39cfb0SJung-uk Kim WalkState, &Node); 799a7a3b383SJung-uk Kim if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL)) 800a7a3b383SJung-uk Kim { 801a7a3b383SJung-uk Kim Status = AE_NOT_FOUND; 802a7a3b383SJung-uk Kim } 803a7a3b383SJung-uk Kim 8041a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 8051a39cfb0SJung-uk Kim { 8061a39cfb0SJung-uk Kim if (Status == AE_NOT_FOUND) 8071a39cfb0SJung-uk Kim { 808f556842eSJung-uk Kim AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0); 8091a39cfb0SJung-uk Kim 8101a39cfb0SJung-uk Kim /* 8111a39cfb0SJung-uk Kim * We could install this into the namespace, but we catch duplicate 8121a39cfb0SJung-uk Kim * externals when they are added to the list. 8131a39cfb0SJung-uk Kim */ 8141a39cfb0SJung-uk Kim #if 0 8151a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 8161a39cfb0SJung-uk Kim ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE, 8171a39cfb0SJung-uk Kim WalkState, &Node); 8181a39cfb0SJung-uk Kim #endif 8191a39cfb0SJung-uk Kim } 8201a39cfb0SJung-uk Kim } 821a9f12690SJung-uk Kim 822a9f12690SJung-uk Kim /* 823a9f12690SJung-uk Kim * Found the node in external table, add it to external list 824a9f12690SJung-uk Kim * Node->OwnerId == 0 indicates built-in ACPI Names, _OS_ etc 825a9f12690SJung-uk Kim */ 826a9f12690SJung-uk Kim else if (Node->OwnerId && WalkState->OwnerId != Node->OwnerId) 827a9f12690SJung-uk Kim { 828a9f12690SJung-uk Kim ObjectType2 = ObjectType; 829a9f12690SJung-uk Kim 830a9f12690SJung-uk Kim Object = AcpiNsGetAttachedObject (Node); 831a9f12690SJung-uk Kim if (Object) 832a9f12690SJung-uk Kim { 833a9f12690SJung-uk Kim ObjectType2 = Object->Common.Type; 834a9f12690SJung-uk Kim if (ObjectType2 == ACPI_TYPE_METHOD) 835a9f12690SJung-uk Kim { 83642fecd12SJung-uk Kim ParamCount = Object->Method.ParamCount; 837a9f12690SJung-uk Kim } 838a9f12690SJung-uk Kim } 839a9f12690SJung-uk Kim 84042fecd12SJung-uk Kim AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType2, ParamCount); 841a9f12690SJung-uk Kim Op->Common.Node = Node; 842a9f12690SJung-uk Kim } 8431a39cfb0SJung-uk Kim else 8441a39cfb0SJung-uk Kim { 8451a39cfb0SJung-uk Kim Op->Common.Node = Node; 8461a39cfb0SJung-uk Kim } 8471a39cfb0SJung-uk Kim 8481a39cfb0SJung-uk Kim 8491a39cfb0SJung-uk Kim Exit: 8501a39cfb0SJung-uk Kim /* Open new scope if necessary */ 8511a39cfb0SJung-uk Kim 8521a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 8531a39cfb0SJung-uk Kim { 8541a39cfb0SJung-uk Kim if (Op->Common.Node) 8551a39cfb0SJung-uk Kim { 8561a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 8571a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 8581a39cfb0SJung-uk Kim { 8591a39cfb0SJung-uk Kim return (Status); 8601a39cfb0SJung-uk Kim } 8611a39cfb0SJung-uk Kim } 8621a39cfb0SJung-uk Kim } 8631a39cfb0SJung-uk Kim 8641a39cfb0SJung-uk Kim return (AE_OK); 8651a39cfb0SJung-uk Kim } 8661a39cfb0SJung-uk Kim 8671a39cfb0SJung-uk Kim 8681a39cfb0SJung-uk Kim /******************************************************************************* 8691a39cfb0SJung-uk Kim * 8701a39cfb0SJung-uk Kim * FUNCTION: AcpiDmResourceDescendingOp 8711a39cfb0SJung-uk Kim * 8721a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 8731a39cfb0SJung-uk Kim * 8741a39cfb0SJung-uk Kim * RETURN: None 8751a39cfb0SJung-uk Kim * 8761a39cfb0SJung-uk Kim * DESCRIPTION: Process one parse op during symbolic resource index conversion. 8771a39cfb0SJung-uk Kim * 8781a39cfb0SJung-uk Kim ******************************************************************************/ 8791a39cfb0SJung-uk Kim 8801a39cfb0SJung-uk Kim static ACPI_STATUS 8811a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp ( 8821a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 8831a39cfb0SJung-uk Kim UINT32 Level, 8841a39cfb0SJung-uk Kim void *Context) 8851a39cfb0SJung-uk Kim { 8861a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 8871a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 8881a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 8891a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 8901a39cfb0SJung-uk Kim ACPI_STATUS Status; 8911a39cfb0SJung-uk Kim 8921a39cfb0SJung-uk Kim 8931a39cfb0SJung-uk Kim WalkState = Info->WalkState; 8941a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 8951a39cfb0SJung-uk Kim 8961a39cfb0SJung-uk Kim /* Open new scope if necessary */ 8971a39cfb0SJung-uk Kim 8981a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 8991a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 9001a39cfb0SJung-uk Kim { 9011a39cfb0SJung-uk Kim if (Op->Common.Node) 9021a39cfb0SJung-uk Kim { 9031a39cfb0SJung-uk Kim 9041a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 9051a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 9061a39cfb0SJung-uk Kim { 9071a39cfb0SJung-uk Kim return (Status); 9081a39cfb0SJung-uk Kim } 9091a39cfb0SJung-uk Kim } 9101a39cfb0SJung-uk Kim } 9111a39cfb0SJung-uk Kim 9121a39cfb0SJung-uk Kim /* 9131a39cfb0SJung-uk Kim * Check if this operator contains a reference to a resource descriptor. 9141a39cfb0SJung-uk Kim * If so, convert the reference into a symbolic reference. 9151a39cfb0SJung-uk Kim */ 9161a39cfb0SJung-uk Kim AcpiDmCheckResourceReference (Op, WalkState); 9171a39cfb0SJung-uk Kim return (AE_OK); 9181a39cfb0SJung-uk Kim } 9191a39cfb0SJung-uk Kim 9201a39cfb0SJung-uk Kim 9211a39cfb0SJung-uk Kim /******************************************************************************* 9221a39cfb0SJung-uk Kim * 9231a39cfb0SJung-uk Kim * FUNCTION: AcpiDmCommonAscendingOp 9241a39cfb0SJung-uk Kim * 9251a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 9261a39cfb0SJung-uk Kim * 9271a39cfb0SJung-uk Kim * RETURN: None 9281a39cfb0SJung-uk Kim * 9291a39cfb0SJung-uk Kim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes 9301a39cfb0SJung-uk Kim * scope if necessary. 9311a39cfb0SJung-uk Kim * 9321a39cfb0SJung-uk Kim ******************************************************************************/ 9331a39cfb0SJung-uk Kim 9341a39cfb0SJung-uk Kim static ACPI_STATUS 9351a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp ( 9361a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 9371a39cfb0SJung-uk Kim UINT32 Level, 9381a39cfb0SJung-uk Kim void *Context) 9391a39cfb0SJung-uk Kim { 9401a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 9411a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 9421a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 9431a39cfb0SJung-uk Kim 9441a39cfb0SJung-uk Kim 9451a39cfb0SJung-uk Kim /* Close scope if necessary */ 9461a39cfb0SJung-uk Kim 9471a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 9481a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 9491a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 9501a39cfb0SJung-uk Kim 9511a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 9521a39cfb0SJung-uk Kim { 9531a39cfb0SJung-uk Kim (void) AcpiDsScopeStackPop (Info->WalkState); 9541a39cfb0SJung-uk Kim } 9551a39cfb0SJung-uk Kim 9561a39cfb0SJung-uk Kim return (AE_OK); 9571a39cfb0SJung-uk Kim } 9581a39cfb0SJung-uk Kim 9591a39cfb0SJung-uk Kim 9601a39cfb0SJung-uk Kim /******************************************************************************* 9611a39cfb0SJung-uk Kim * 9621a39cfb0SJung-uk Kim * FUNCTION: AcpiDmInspectPossibleArgs 9631a39cfb0SJung-uk Kim * 9641a39cfb0SJung-uk Kim * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the 9651a39cfb0SJung-uk Kim * possible method invocation found 9661a39cfb0SJung-uk Kim * TargetCount - Number of targets (0,1,2) for this op 9671a39cfb0SJung-uk Kim * Op - Parse op 9681a39cfb0SJung-uk Kim * 9691a39cfb0SJung-uk Kim * RETURN: Status 9701a39cfb0SJung-uk Kim * 9711a39cfb0SJung-uk Kim * DESCRIPTION: Examine following args and next ops for possible arguments 9721a39cfb0SJung-uk Kim * for an unrecognized method invocation. 9731a39cfb0SJung-uk Kim * 9741a39cfb0SJung-uk Kim ******************************************************************************/ 9751a39cfb0SJung-uk Kim 9761a39cfb0SJung-uk Kim static UINT32 9771a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs ( 9781a39cfb0SJung-uk Kim UINT32 CurrentOpArgCount, 9791a39cfb0SJung-uk Kim UINT32 TargetCount, 9801a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op) 9811a39cfb0SJung-uk Kim { 9821a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 9831a39cfb0SJung-uk Kim UINT32 i; 9841a39cfb0SJung-uk Kim UINT32 Last = 0; 9851a39cfb0SJung-uk Kim UINT32 Lookahead; 9861a39cfb0SJung-uk Kim 9871a39cfb0SJung-uk Kim 9881a39cfb0SJung-uk Kim Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount; 9891a39cfb0SJung-uk Kim 9901a39cfb0SJung-uk Kim /* Lookahead for the maximum number of possible arguments */ 9911a39cfb0SJung-uk Kim 9921a39cfb0SJung-uk Kim for (i = 0; i < Lookahead; i++) 9931a39cfb0SJung-uk Kim { 9941a39cfb0SJung-uk Kim if (!Op) 9951a39cfb0SJung-uk Kim { 9961a39cfb0SJung-uk Kim break; 9971a39cfb0SJung-uk Kim } 9981a39cfb0SJung-uk Kim 9991a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 10001a39cfb0SJung-uk Kim 10011a39cfb0SJung-uk Kim /* 10021a39cfb0SJung-uk Kim * Any one of these operators is "very probably" not a method arg 10031a39cfb0SJung-uk Kim */ 10041a39cfb0SJung-uk Kim if ((Op->Common.AmlOpcode == AML_STORE_OP) || 10051a39cfb0SJung-uk Kim (Op->Common.AmlOpcode == AML_NOTIFY_OP)) 10061a39cfb0SJung-uk Kim { 10071a39cfb0SJung-uk Kim break; 10081a39cfb0SJung-uk Kim } 10091a39cfb0SJung-uk Kim 10101a39cfb0SJung-uk Kim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 10111a39cfb0SJung-uk Kim (OpInfo->Class != AML_CLASS_CONTROL)) 10121a39cfb0SJung-uk Kim { 10131a39cfb0SJung-uk Kim Last = i+1; 10141a39cfb0SJung-uk Kim } 10151a39cfb0SJung-uk Kim 10161a39cfb0SJung-uk Kim Op = Op->Common.Next; 10171a39cfb0SJung-uk Kim } 10181a39cfb0SJung-uk Kim 10191a39cfb0SJung-uk Kim return (Last); 10201a39cfb0SJung-uk Kim } 1021