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 /* 8*f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, 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 44ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 51ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 521a39cfb0SJung-uk Kim 531a39cfb0SJung-uk Kim 541a39cfb0SJung-uk Kim #define _COMPONENT ACPI_TOOLS 551a39cfb0SJung-uk Kim ACPI_MODULE_NAME ("adwalk") 561a39cfb0SJung-uk Kim 571a39cfb0SJung-uk Kim /* 581a39cfb0SJung-uk Kim * aslmap - opcode mappings and reserved method names 591a39cfb0SJung-uk Kim */ 601a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE 611a39cfb0SJung-uk Kim AslMapNamedOpcodeToDataType ( 621a39cfb0SJung-uk Kim UINT16 Opcode); 631a39cfb0SJung-uk Kim 641a39cfb0SJung-uk Kim /* Local prototypes */ 651a39cfb0SJung-uk Kim 661a39cfb0SJung-uk Kim static ACPI_STATUS 671a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending ( 681a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 691a39cfb0SJung-uk Kim UINT32 Level, 701a39cfb0SJung-uk Kim void *Context); 711a39cfb0SJung-uk Kim 721a39cfb0SJung-uk Kim static ACPI_STATUS 731a39cfb0SJung-uk Kim AcpiDmDumpDescending ( 741a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 751a39cfb0SJung-uk Kim UINT32 Level, 761a39cfb0SJung-uk Kim void *Context); 771a39cfb0SJung-uk Kim 781a39cfb0SJung-uk Kim static ACPI_STATUS 791a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp ( 801a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 811a39cfb0SJung-uk Kim UINT32 Level, 821a39cfb0SJung-uk Kim void *Context); 831a39cfb0SJung-uk Kim 841a39cfb0SJung-uk Kim static ACPI_STATUS 851a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp ( 861a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 871a39cfb0SJung-uk Kim UINT32 Level, 881a39cfb0SJung-uk Kim void *Context); 891a39cfb0SJung-uk Kim 901a39cfb0SJung-uk Kim static ACPI_STATUS 911a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp ( 921a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 931a39cfb0SJung-uk Kim UINT32 Level, 941a39cfb0SJung-uk Kim void *Context); 951a39cfb0SJung-uk Kim 961a39cfb0SJung-uk Kim static UINT32 971a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs ( 981a39cfb0SJung-uk Kim UINT32 CurrentOpArgCount, 991a39cfb0SJung-uk Kim UINT32 TargetCount, 1001a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op); 1011a39cfb0SJung-uk Kim 1021a39cfb0SJung-uk Kim static ACPI_STATUS 1031a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp ( 1041a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1051a39cfb0SJung-uk Kim UINT32 Level, 1061a39cfb0SJung-uk Kim void *Context); 1071a39cfb0SJung-uk Kim 1081a39cfb0SJung-uk Kim 1091a39cfb0SJung-uk Kim /******************************************************************************* 1101a39cfb0SJung-uk Kim * 1111a39cfb0SJung-uk Kim * FUNCTION: AcpiDmDumpTree 1121a39cfb0SJung-uk Kim * 1131a39cfb0SJung-uk Kim * PARAMETERS: Origin - Starting object 1141a39cfb0SJung-uk Kim * 1151a39cfb0SJung-uk Kim * RETURN: None 1161a39cfb0SJung-uk Kim * 1171a39cfb0SJung-uk Kim * DESCRIPTION: Parse tree walk to format and output the nodes 1181a39cfb0SJung-uk Kim * 1191a39cfb0SJung-uk Kim ******************************************************************************/ 1201a39cfb0SJung-uk Kim 1211a39cfb0SJung-uk Kim void 1221a39cfb0SJung-uk Kim AcpiDmDumpTree ( 1231a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Origin) 1241a39cfb0SJung-uk Kim { 1251a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 1261a39cfb0SJung-uk Kim 1271a39cfb0SJung-uk Kim 1281a39cfb0SJung-uk Kim if (!Origin) 1291a39cfb0SJung-uk Kim { 1301a39cfb0SJung-uk Kim return; 1311a39cfb0SJung-uk Kim } 1321a39cfb0SJung-uk Kim 1331a39cfb0SJung-uk Kim AcpiOsPrintf ("/*\nAML Parse Tree\n\n"); 1341a39cfb0SJung-uk Kim Info.Flags = 0; 1351a39cfb0SJung-uk Kim Info.Count = 0; 1361a39cfb0SJung-uk Kim Info.Level = 0; 1371a39cfb0SJung-uk Kim Info.WalkState = NULL; 138*f8146b88SJung-uk Kim 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; 172*f8146b88SJung-uk Kim 1731a39cfb0SJung-uk Kim AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info); 1741a39cfb0SJung-uk Kim } 1751a39cfb0SJung-uk Kim 1761a39cfb0SJung-uk Kim 1771a39cfb0SJung-uk Kim /******************************************************************************* 1781a39cfb0SJung-uk Kim * 1791a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFinishNamespaceLoad 1801a39cfb0SJung-uk Kim * 1811a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 1821a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 183a9f12690SJung-uk Kim * OwnerId - OwnerId of the table to be disassembled 1841a39cfb0SJung-uk Kim * 1851a39cfb0SJung-uk Kim * RETURN: None 1861a39cfb0SJung-uk Kim * 1871a39cfb0SJung-uk Kim * DESCRIPTION: Load all namespace items that are created within control 1881a39cfb0SJung-uk Kim * methods. Used before namespace cross reference 1891a39cfb0SJung-uk Kim * 1901a39cfb0SJung-uk Kim ******************************************************************************/ 1911a39cfb0SJung-uk Kim 1921a39cfb0SJung-uk Kim void 1931a39cfb0SJung-uk Kim AcpiDmFinishNamespaceLoad ( 1941a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 195a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot, 196a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId) 1971a39cfb0SJung-uk Kim { 1981a39cfb0SJung-uk Kim ACPI_STATUS Status; 1991a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 2001a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 2011a39cfb0SJung-uk Kim 2021a39cfb0SJung-uk Kim 2031a39cfb0SJung-uk Kim if (!ParseTreeRoot) 2041a39cfb0SJung-uk Kim { 2051a39cfb0SJung-uk Kim return; 2061a39cfb0SJung-uk Kim } 2071a39cfb0SJung-uk Kim 2081a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 2091a39cfb0SJung-uk Kim 210a9f12690SJung-uk Kim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 2111a39cfb0SJung-uk Kim if (!WalkState) 2121a39cfb0SJung-uk Kim { 2131a39cfb0SJung-uk Kim return; 2141a39cfb0SJung-uk Kim } 2151a39cfb0SJung-uk Kim 216*f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, 217*f8146b88SJung-uk Kim WalkState); 2181a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 2191a39cfb0SJung-uk Kim { 2201a39cfb0SJung-uk Kim return; 2211a39cfb0SJung-uk Kim } 2221a39cfb0SJung-uk Kim 2231a39cfb0SJung-uk Kim Info.Flags = 0; 2241a39cfb0SJung-uk Kim Info.Level = 0; 2251a39cfb0SJung-uk Kim Info.WalkState = WalkState; 226*f8146b88SJung-uk Kim 2271a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp, 2281a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 2291a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 2301a39cfb0SJung-uk Kim } 2311a39cfb0SJung-uk Kim 2321a39cfb0SJung-uk Kim 2331a39cfb0SJung-uk Kim /******************************************************************************* 2341a39cfb0SJung-uk Kim * 2351a39cfb0SJung-uk Kim * FUNCTION: AcpiDmCrossReferenceNamespace 2361a39cfb0SJung-uk Kim * 2371a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 2381a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 239a9f12690SJung-uk Kim * OwnerId - OwnerId of the table to be disassembled 2401a39cfb0SJung-uk Kim * 2411a39cfb0SJung-uk Kim * RETURN: None 2421a39cfb0SJung-uk Kim * 2431a39cfb0SJung-uk Kim * DESCRIPTION: Cross reference the namespace to create externals 2441a39cfb0SJung-uk Kim * 2451a39cfb0SJung-uk Kim ******************************************************************************/ 2461a39cfb0SJung-uk Kim 2471a39cfb0SJung-uk Kim void 2481a39cfb0SJung-uk Kim AcpiDmCrossReferenceNamespace ( 2491a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 250a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot, 251a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId) 2521a39cfb0SJung-uk Kim { 2531a39cfb0SJung-uk Kim ACPI_STATUS Status; 2541a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 2551a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 2561a39cfb0SJung-uk Kim 2571a39cfb0SJung-uk Kim 2581a39cfb0SJung-uk Kim if (!ParseTreeRoot) 2591a39cfb0SJung-uk Kim { 2601a39cfb0SJung-uk Kim return; 2611a39cfb0SJung-uk Kim } 2621a39cfb0SJung-uk Kim 2631a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 2641a39cfb0SJung-uk Kim 265a9f12690SJung-uk Kim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 2661a39cfb0SJung-uk Kim if (!WalkState) 2671a39cfb0SJung-uk Kim { 2681a39cfb0SJung-uk Kim return; 2691a39cfb0SJung-uk Kim } 2701a39cfb0SJung-uk Kim 271*f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, 272*f8146b88SJung-uk Kim WalkState); 2731a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 2741a39cfb0SJung-uk Kim { 2751a39cfb0SJung-uk Kim return; 2761a39cfb0SJung-uk Kim } 2771a39cfb0SJung-uk Kim 2781a39cfb0SJung-uk Kim Info.Flags = 0; 2791a39cfb0SJung-uk Kim Info.Level = 0; 2801a39cfb0SJung-uk Kim Info.WalkState = WalkState; 281*f8146b88SJung-uk Kim 2821a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp, 2831a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 2841a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 2851a39cfb0SJung-uk Kim } 2861a39cfb0SJung-uk Kim 2871a39cfb0SJung-uk Kim 2881a39cfb0SJung-uk Kim /******************************************************************************* 2891a39cfb0SJung-uk Kim * 2901a39cfb0SJung-uk Kim * FUNCTION: AcpiDmConvertResourceIndexes 2911a39cfb0SJung-uk Kim * 2921a39cfb0SJung-uk Kim * PARAMETERS: ParseTreeRoot - Root of the parse tree 2931a39cfb0SJung-uk Kim * NamespaceRoot - Root of the internal namespace 2941a39cfb0SJung-uk Kim * 2951a39cfb0SJung-uk Kim * RETURN: None 2961a39cfb0SJung-uk Kim * 2971a39cfb0SJung-uk Kim * DESCRIPTION: Convert fixed-offset references to resource descriptors to 2981a39cfb0SJung-uk Kim * symbolic references. Should only be called after namespace has 2991a39cfb0SJung-uk Kim * been cross referenced. 3001a39cfb0SJung-uk Kim * 3011a39cfb0SJung-uk Kim ******************************************************************************/ 3021a39cfb0SJung-uk Kim 3031a39cfb0SJung-uk Kim void 3041a39cfb0SJung-uk Kim AcpiDmConvertResourceIndexes ( 3051a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParseTreeRoot, 3061a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *NamespaceRoot) 3071a39cfb0SJung-uk Kim { 3081a39cfb0SJung-uk Kim ACPI_STATUS Status; 3091a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO Info; 3101a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 3111a39cfb0SJung-uk Kim 3121a39cfb0SJung-uk Kim 3131a39cfb0SJung-uk Kim if (!ParseTreeRoot) 3141a39cfb0SJung-uk Kim { 3151a39cfb0SJung-uk Kim return; 3161a39cfb0SJung-uk Kim } 3171a39cfb0SJung-uk Kim 3181a39cfb0SJung-uk Kim /* Create and initialize a new walk state */ 3191a39cfb0SJung-uk Kim 3201a39cfb0SJung-uk Kim WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL); 3211a39cfb0SJung-uk Kim if (!WalkState) 3221a39cfb0SJung-uk Kim { 3231a39cfb0SJung-uk Kim return; 3241a39cfb0SJung-uk Kim } 3251a39cfb0SJung-uk Kim 326*f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, 327*f8146b88SJung-uk Kim WalkState); 3281a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 3291a39cfb0SJung-uk Kim { 330*f8146b88SJung-uk Kim ACPI_FREE (WalkState); 3311a39cfb0SJung-uk Kim return; 3321a39cfb0SJung-uk Kim } 3331a39cfb0SJung-uk Kim 3341a39cfb0SJung-uk Kim Info.Flags = 0; 3351a39cfb0SJung-uk Kim Info.Level = 0; 3361a39cfb0SJung-uk Kim Info.WalkState = WalkState; 337*f8146b88SJung-uk Kim 3381a39cfb0SJung-uk Kim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp, 3391a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp, &Info); 3401a39cfb0SJung-uk Kim ACPI_FREE (WalkState); 3411a39cfb0SJung-uk Kim return; 3421a39cfb0SJung-uk Kim } 3431a39cfb0SJung-uk Kim 3441a39cfb0SJung-uk Kim 3451a39cfb0SJung-uk Kim /******************************************************************************* 3461a39cfb0SJung-uk Kim * 3471a39cfb0SJung-uk Kim * FUNCTION: AcpiDmDumpDescending 3481a39cfb0SJung-uk Kim * 3491a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 3501a39cfb0SJung-uk Kim * 3511a39cfb0SJung-uk Kim * RETURN: Status 3521a39cfb0SJung-uk Kim * 3531a39cfb0SJung-uk Kim * DESCRIPTION: Format and print contents of one parse Op. 3541a39cfb0SJung-uk Kim * 3551a39cfb0SJung-uk Kim ******************************************************************************/ 3561a39cfb0SJung-uk Kim 3571a39cfb0SJung-uk Kim static ACPI_STATUS 3581a39cfb0SJung-uk Kim AcpiDmDumpDescending ( 3591a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 3601a39cfb0SJung-uk Kim UINT32 Level, 3611a39cfb0SJung-uk Kim void *Context) 3621a39cfb0SJung-uk Kim { 3631a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 3641a39cfb0SJung-uk Kim char *Path; 3651a39cfb0SJung-uk Kim 3661a39cfb0SJung-uk Kim 3671a39cfb0SJung-uk Kim if (!Op) 3681a39cfb0SJung-uk Kim { 3691a39cfb0SJung-uk Kim return (AE_OK); 3701a39cfb0SJung-uk Kim } 3711a39cfb0SJung-uk Kim 3721a39cfb0SJung-uk Kim /* Most of the information (count, level, name) here */ 3731a39cfb0SJung-uk Kim 374f556842eSJung-uk Kim Info->Count++; 3751a39cfb0SJung-uk Kim AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level); 3761a39cfb0SJung-uk Kim AcpiDmIndent (Level); 3771a39cfb0SJung-uk Kim AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode)); 3781a39cfb0SJung-uk Kim 3791a39cfb0SJung-uk Kim /* Extra info is helpful */ 3801a39cfb0SJung-uk Kim 3811a39cfb0SJung-uk Kim switch (Op->Common.AmlOpcode) 3821a39cfb0SJung-uk Kim { 3831a39cfb0SJung-uk Kim case AML_BYTE_OP: 38479c6d946SJung-uk Kim 38579c6d946SJung-uk Kim AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer); 38679c6d946SJung-uk Kim break; 38779c6d946SJung-uk Kim 3881a39cfb0SJung-uk Kim case AML_WORD_OP: 38979c6d946SJung-uk Kim 39079c6d946SJung-uk Kim AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer); 39179c6d946SJung-uk Kim break; 39279c6d946SJung-uk Kim 3931a39cfb0SJung-uk Kim case AML_DWORD_OP: 394a9d8d09cSJung-uk Kim 39579c6d946SJung-uk Kim AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer); 3961a39cfb0SJung-uk Kim break; 3971a39cfb0SJung-uk Kim 3983f0275a0SJung-uk Kim case AML_QWORD_OP: 399a9d8d09cSJung-uk Kim 4003f0275a0SJung-uk Kim AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); 4013f0275a0SJung-uk Kim break; 4023f0275a0SJung-uk Kim 4031a39cfb0SJung-uk Kim case AML_INT_NAMEPATH_OP: 404a9d8d09cSJung-uk Kim 4051a39cfb0SJung-uk Kim if (Op->Common.Value.String) 4061a39cfb0SJung-uk Kim { 4071a39cfb0SJung-uk Kim AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String, 4081a39cfb0SJung-uk Kim NULL, &Path); 4091a39cfb0SJung-uk Kim AcpiOsPrintf ("%s %p", Path, Op->Common.Node); 4101a39cfb0SJung-uk Kim ACPI_FREE (Path); 4111a39cfb0SJung-uk Kim } 4121a39cfb0SJung-uk Kim else 4131a39cfb0SJung-uk Kim { 4141a39cfb0SJung-uk Kim AcpiOsPrintf ("[NULL]"); 4151a39cfb0SJung-uk Kim } 4161a39cfb0SJung-uk Kim break; 4171a39cfb0SJung-uk Kim 4181a39cfb0SJung-uk Kim case AML_NAME_OP: 4191a39cfb0SJung-uk Kim case AML_METHOD_OP: 4201a39cfb0SJung-uk Kim case AML_DEVICE_OP: 4211a39cfb0SJung-uk Kim case AML_INT_NAMEDFIELD_OP: 422a9d8d09cSJung-uk Kim 423f556842eSJung-uk Kim AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name)); 4241a39cfb0SJung-uk Kim break; 425a9f12690SJung-uk Kim 426a9f12690SJung-uk Kim default: 427a9d8d09cSJung-uk Kim 428a9f12690SJung-uk Kim break; 4291a39cfb0SJung-uk Kim } 4301a39cfb0SJung-uk Kim 4311a39cfb0SJung-uk Kim AcpiOsPrintf ("\n"); 4321a39cfb0SJung-uk Kim return (AE_OK); 4331a39cfb0SJung-uk Kim } 4341a39cfb0SJung-uk Kim 4351a39cfb0SJung-uk Kim 4361a39cfb0SJung-uk Kim /******************************************************************************* 4371a39cfb0SJung-uk Kim * 4381a39cfb0SJung-uk Kim * FUNCTION: AcpiDmFindOrphanDescending 4391a39cfb0SJung-uk Kim * 4401a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 4411a39cfb0SJung-uk Kim * 4421a39cfb0SJung-uk Kim * RETURN: Status 4431a39cfb0SJung-uk Kim * 4441a39cfb0SJung-uk Kim * DESCRIPTION: Check namepath Ops for orphaned method invocations 4451a39cfb0SJung-uk Kim * 446*f8146b88SJung-uk Kim * Note: Parts of this are experimental, under possible further development. 4471a39cfb0SJung-uk Kim * 4481a39cfb0SJung-uk Kim ******************************************************************************/ 4491a39cfb0SJung-uk Kim 4501a39cfb0SJung-uk Kim static ACPI_STATUS 4511a39cfb0SJung-uk Kim AcpiDmFindOrphanDescending ( 4521a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 4531a39cfb0SJung-uk Kim UINT32 Level, 4541a39cfb0SJung-uk Kim void *Context) 4551a39cfb0SJung-uk Kim { 4561a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 4571a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ChildOp; 4581a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 4591a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp; 4601a39cfb0SJung-uk Kim UINT32 ArgCount; 4611a39cfb0SJung-uk Kim 4621a39cfb0SJung-uk Kim 4631a39cfb0SJung-uk Kim if (!Op) 4641a39cfb0SJung-uk Kim { 4651a39cfb0SJung-uk Kim return (AE_OK); 4661a39cfb0SJung-uk Kim } 4671a39cfb0SJung-uk Kim 4681a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 4691a39cfb0SJung-uk Kim 4701a39cfb0SJung-uk Kim switch (Op->Common.AmlOpcode) 4711a39cfb0SJung-uk Kim { 4721a39cfb0SJung-uk Kim #ifdef ACPI_UNDER_DEVELOPMENT 4731a39cfb0SJung-uk Kim case AML_ADD_OP: 474a9d8d09cSJung-uk Kim 4751a39cfb0SJung-uk Kim ChildOp = Op->Common.Value.Arg; 4761a39cfb0SJung-uk Kim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 4771a39cfb0SJung-uk Kim !ChildOp->Common.Node) 4781a39cfb0SJung-uk Kim { 4791a39cfb0SJung-uk Kim AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String, 4801a39cfb0SJung-uk Kim NULL, &Path); 481313a0c13SJung-uk Kim AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n", 482313a0c13SJung-uk Kim Op->Common.AmlOpName, Path); 4831a39cfb0SJung-uk Kim ACPI_FREE (Path); 4841a39cfb0SJung-uk Kim 4851a39cfb0SJung-uk Kim NextOp = Op->Common.Next; 4861a39cfb0SJung-uk Kim if (!NextOp) 4871a39cfb0SJung-uk Kim { 4881a39cfb0SJung-uk Kim /* This NamePath has no args, assume it is an integer */ 4891a39cfb0SJung-uk Kim 490313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp, 491313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 4921a39cfb0SJung-uk Kim return (AE_OK); 4931a39cfb0SJung-uk Kim } 4941a39cfb0SJung-uk Kim 4951a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp); 496313a0c13SJung-uk Kim AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n", 497313a0c13SJung-uk Kim ArgCount, AcpiDmCountChildren (Op)); 4981a39cfb0SJung-uk Kim 4991a39cfb0SJung-uk Kim if (ArgCount < 1) 5001a39cfb0SJung-uk Kim { 5011a39cfb0SJung-uk Kim /* One Arg means this is just a Store(Name,Target) */ 5021a39cfb0SJung-uk Kim 503313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp, 504313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 5051a39cfb0SJung-uk Kim return (AE_OK); 5061a39cfb0SJung-uk Kim } 5071a39cfb0SJung-uk Kim 508313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp, 509313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 5101a39cfb0SJung-uk Kim } 5111a39cfb0SJung-uk Kim break; 512*f8146b88SJung-uk Kim 5131a39cfb0SJung-uk Kim #endif 5141a39cfb0SJung-uk Kim 5151a39cfb0SJung-uk Kim case AML_STORE_OP: 5161a39cfb0SJung-uk Kim 5171a39cfb0SJung-uk Kim ChildOp = Op->Common.Value.Arg; 5181a39cfb0SJung-uk Kim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 5191a39cfb0SJung-uk Kim !ChildOp->Common.Node) 5201a39cfb0SJung-uk Kim { 5211a39cfb0SJung-uk Kim NextOp = Op->Common.Next; 5221a39cfb0SJung-uk Kim if (!NextOp) 5231a39cfb0SJung-uk Kim { 5241a39cfb0SJung-uk Kim /* This NamePath has no args, assume it is an integer */ 5251a39cfb0SJung-uk Kim 526313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp, 527313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 5281a39cfb0SJung-uk Kim return (AE_OK); 5291a39cfb0SJung-uk Kim } 5301a39cfb0SJung-uk Kim 5311a39cfb0SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp); 5321a39cfb0SJung-uk Kim if (ArgCount <= 1) 5331a39cfb0SJung-uk Kim { 5341a39cfb0SJung-uk Kim /* One Arg means this is just a Store(Name,Target) */ 5351a39cfb0SJung-uk Kim 536313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp, 537*f8146b88SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, ArgCount, 0); 5381a39cfb0SJung-uk Kim return (AE_OK); 5391a39cfb0SJung-uk Kim } 5401a39cfb0SJung-uk Kim 541313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (ChildOp, 542313a0c13SJung-uk Kim ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 5431a39cfb0SJung-uk Kim } 5441a39cfb0SJung-uk Kim break; 5451a39cfb0SJung-uk Kim 5461a39cfb0SJung-uk Kim case AML_INT_NAMEPATH_OP: 5471a39cfb0SJung-uk Kim 5481a39cfb0SJung-uk Kim /* Must examine parent to see if this namepath is an argument */ 5491a39cfb0SJung-uk Kim 5501a39cfb0SJung-uk Kim ParentOp = Op->Common.Parent; 5511a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode); 5521a39cfb0SJung-uk Kim 5531a39cfb0SJung-uk Kim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 5541a39cfb0SJung-uk Kim (OpInfo->Class != AML_CLASS_CREATE) && 555a7a3b383SJung-uk Kim (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) && 5561a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && 5571a39cfb0SJung-uk Kim !Op->Common.Node) 5581a39cfb0SJung-uk Kim { 559*f8146b88SJung-uk Kim ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op); 5601a39cfb0SJung-uk Kim 5611a39cfb0SJung-uk Kim /* 5621a39cfb0SJung-uk Kim * Check if namepath is a predicate for if/while or lone parameter to 5631a39cfb0SJung-uk Kim * a return. 5641a39cfb0SJung-uk Kim */ 5651a39cfb0SJung-uk Kim if (ArgCount == 0) 5661a39cfb0SJung-uk Kim { 5671a39cfb0SJung-uk Kim if (((ParentOp->Common.AmlOpcode == AML_IF_OP) || 5681a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_WHILE_OP) || 5691a39cfb0SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) && 5701a39cfb0SJung-uk Kim 5711a39cfb0SJung-uk Kim /* And namepath is the first argument */ 5721a39cfb0SJung-uk Kim (ParentOp->Common.Value.Arg == Op)) 5731a39cfb0SJung-uk Kim { 574313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (Op, 575313a0c13SJung-uk Kim Op->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 5761a39cfb0SJung-uk Kim break; 5771a39cfb0SJung-uk Kim } 5781a39cfb0SJung-uk Kim } 5791a39cfb0SJung-uk Kim 5801a39cfb0SJung-uk Kim /* 5811a39cfb0SJung-uk Kim * This is a standalone namestring (not a parameter to another 5821a39cfb0SJung-uk Kim * operator) - it *must* be a method invocation, nothing else is 5831a39cfb0SJung-uk Kim * grammatically possible. 5841a39cfb0SJung-uk Kim */ 585313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (Op, 586313a0c13SJung-uk Kim Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 5871a39cfb0SJung-uk Kim } 5881a39cfb0SJung-uk Kim break; 589a9f12690SJung-uk Kim 590a9f12690SJung-uk Kim default: 591a9d8d09cSJung-uk Kim 592a9f12690SJung-uk Kim break; 5931a39cfb0SJung-uk Kim } 5941a39cfb0SJung-uk Kim 5951a39cfb0SJung-uk Kim return (AE_OK); 5961a39cfb0SJung-uk Kim } 5971a39cfb0SJung-uk Kim 5981a39cfb0SJung-uk Kim 5991a39cfb0SJung-uk Kim /******************************************************************************* 6001a39cfb0SJung-uk Kim * 6011a39cfb0SJung-uk Kim * FUNCTION: AcpiDmLoadDescendingOp 6021a39cfb0SJung-uk Kim * 6031a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 6041a39cfb0SJung-uk Kim * 6051a39cfb0SJung-uk Kim * RETURN: Status 6061a39cfb0SJung-uk Kim * 6071a39cfb0SJung-uk Kim * DESCRIPTION: Descending handler for namespace control method object load 6081a39cfb0SJung-uk Kim * 6091a39cfb0SJung-uk Kim ******************************************************************************/ 6101a39cfb0SJung-uk Kim 6111a39cfb0SJung-uk Kim static ACPI_STATUS 6121a39cfb0SJung-uk Kim AcpiDmLoadDescendingOp ( 6131a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 6141a39cfb0SJung-uk Kim UINT32 Level, 6151a39cfb0SJung-uk Kim void *Context) 6161a39cfb0SJung-uk Kim { 6171a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 6181a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 6191a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 6201a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 6211a39cfb0SJung-uk Kim ACPI_STATUS Status; 6221a39cfb0SJung-uk Kim char *Path = NULL; 6231a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 6241a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 625a9f12690SJung-uk Kim char FieldPath[5]; 626a9f12690SJung-uk Kim BOOLEAN PreDefined = FALSE; 627a9f12690SJung-uk Kim UINT8 PreDefineIndex = 0; 6281a39cfb0SJung-uk Kim 6291a39cfb0SJung-uk Kim 6301a39cfb0SJung-uk Kim WalkState = Info->WalkState; 6311a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 6321a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 6331a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 6341a39cfb0SJung-uk Kim 6351a39cfb0SJung-uk Kim /* Only interested in operators that create new names */ 6361a39cfb0SJung-uk Kim 6371a39cfb0SJung-uk Kim if (!(OpInfo->Flags & AML_NAMED) && 6381a39cfb0SJung-uk Kim !(OpInfo->Flags & AML_CREATE)) 6391a39cfb0SJung-uk Kim { 6401a39cfb0SJung-uk Kim goto Exit; 6411a39cfb0SJung-uk Kim } 6421a39cfb0SJung-uk Kim 6431a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */ 6441a39cfb0SJung-uk Kim 6451a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED) 6461a39cfb0SJung-uk Kim { 6471a39cfb0SJung-uk Kim /* For all named operators, get the new name */ 6481a39cfb0SJung-uk Kim 6491a39cfb0SJung-uk Kim Path = (char *) Op->Named.Path; 650a9f12690SJung-uk Kim 651a9f12690SJung-uk Kim if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 652a9f12690SJung-uk Kim { 653a9f12690SJung-uk Kim *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name; 654a9f12690SJung-uk Kim FieldPath[4] = 0; 655a9f12690SJung-uk Kim Path = FieldPath; 656a9f12690SJung-uk Kim } 6571a39cfb0SJung-uk Kim } 6581a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE) 6591a39cfb0SJung-uk Kim { 6601a39cfb0SJung-uk Kim /* New name is the last child */ 6611a39cfb0SJung-uk Kim 6621a39cfb0SJung-uk Kim NextOp = Op->Common.Value.Arg; 6631a39cfb0SJung-uk Kim 6641a39cfb0SJung-uk Kim while (NextOp->Common.Next) 6651a39cfb0SJung-uk Kim { 6661a39cfb0SJung-uk Kim NextOp = NextOp->Common.Next; 6671a39cfb0SJung-uk Kim } 668*f8146b88SJung-uk Kim 6691a39cfb0SJung-uk Kim Path = NextOp->Common.Value.String; 6701a39cfb0SJung-uk Kim } 6711a39cfb0SJung-uk Kim 6721a39cfb0SJung-uk Kim if (!Path) 6731a39cfb0SJung-uk Kim { 6741a39cfb0SJung-uk Kim goto Exit; 6751a39cfb0SJung-uk Kim } 6761a39cfb0SJung-uk Kim 6771a39cfb0SJung-uk Kim /* Insert the name into the namespace */ 6781a39cfb0SJung-uk Kim 6791a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 6801a39cfb0SJung-uk Kim ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE, 6811a39cfb0SJung-uk Kim WalkState, &Node); 6821a39cfb0SJung-uk Kim 6831a39cfb0SJung-uk Kim Op->Common.Node = Node; 6841a39cfb0SJung-uk Kim 685a9f12690SJung-uk Kim if (ACPI_SUCCESS (Status)) 686a9f12690SJung-uk Kim { 687a9f12690SJung-uk Kim /* Check if it's a predefined node */ 688a9f12690SJung-uk Kim 689a9f12690SJung-uk Kim while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name) 690a9f12690SJung-uk Kim { 6918ef1a331SJung-uk Kim if (ACPI_COMPARE_NAME (Node->Name.Ascii, 6928ef1a331SJung-uk Kim AcpiGbl_PreDefinedNames[PreDefineIndex].Name)) 693a9f12690SJung-uk Kim { 694a9f12690SJung-uk Kim PreDefined = TRUE; 695a9f12690SJung-uk Kim break; 696a9f12690SJung-uk Kim } 697a9f12690SJung-uk Kim 698a9f12690SJung-uk Kim PreDefineIndex++; 699a9f12690SJung-uk Kim } 700a9f12690SJung-uk Kim 701a9f12690SJung-uk Kim /* 702a9f12690SJung-uk Kim * Set node owner id if it satisfies all the following conditions: 703a9f12690SJung-uk Kim * 1) Not a predefined node, _SB_ etc 704a9f12690SJung-uk Kim * 2) Not the root node 705a9f12690SJung-uk Kim * 3) Not a node created by Scope 706a9f12690SJung-uk Kim */ 707a9f12690SJung-uk Kim 708a9f12690SJung-uk Kim if (!PreDefined && Node != AcpiGbl_RootNode && 709a9f12690SJung-uk Kim Op->Common.AmlOpcode != AML_SCOPE_OP) 710a9f12690SJung-uk Kim { 711a9f12690SJung-uk Kim Node->OwnerId = WalkState->OwnerId; 712a9f12690SJung-uk Kim } 713a9f12690SJung-uk Kim } 714a9f12690SJung-uk Kim 7151a39cfb0SJung-uk Kim 7161a39cfb0SJung-uk Kim Exit: 7171a39cfb0SJung-uk Kim 7181a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 7191a39cfb0SJung-uk Kim { 7201a39cfb0SJung-uk Kim if (Op->Common.Node) 7211a39cfb0SJung-uk Kim { 722*f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, 723*f8146b88SJung-uk Kim WalkState); 7241a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 7251a39cfb0SJung-uk Kim { 7261a39cfb0SJung-uk Kim return (Status); 7271a39cfb0SJung-uk Kim } 7281a39cfb0SJung-uk Kim } 7291a39cfb0SJung-uk Kim } 7301a39cfb0SJung-uk Kim 7311a39cfb0SJung-uk Kim return (AE_OK); 7321a39cfb0SJung-uk Kim } 7331a39cfb0SJung-uk Kim 7341a39cfb0SJung-uk Kim 7351a39cfb0SJung-uk Kim /******************************************************************************* 7361a39cfb0SJung-uk Kim * 7371a39cfb0SJung-uk Kim * FUNCTION: AcpiDmXrefDescendingOp 7381a39cfb0SJung-uk Kim * 7391a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 7401a39cfb0SJung-uk Kim * 7411a39cfb0SJung-uk Kim * RETURN: Status 7421a39cfb0SJung-uk Kim * 7431a39cfb0SJung-uk Kim * DESCRIPTION: Descending handler for namespace cross reference 7441a39cfb0SJung-uk Kim * 7451a39cfb0SJung-uk Kim ******************************************************************************/ 7461a39cfb0SJung-uk Kim 7471a39cfb0SJung-uk Kim static ACPI_STATUS 7481a39cfb0SJung-uk Kim AcpiDmXrefDescendingOp ( 7491a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 7501a39cfb0SJung-uk Kim UINT32 Level, 7511a39cfb0SJung-uk Kim void *Context) 7521a39cfb0SJung-uk Kim { 7531a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 7541a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 7551a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 7561a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 757a9f12690SJung-uk Kim ACPI_OBJECT_TYPE ObjectType2; 7581a39cfb0SJung-uk Kim ACPI_STATUS Status; 7591a39cfb0SJung-uk Kim char *Path = NULL; 7601a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 7611a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 762a9f12690SJung-uk Kim ACPI_OPERAND_OBJECT *Object; 76342fecd12SJung-uk Kim UINT32 ParamCount = 0; 764313a0c13SJung-uk Kim char *Pathname; 765*f8146b88SJung-uk Kim UINT16 Flags = 0; 7661a39cfb0SJung-uk Kim 7671a39cfb0SJung-uk Kim 7681a39cfb0SJung-uk Kim WalkState = Info->WalkState; 7691a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 7701a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 7711a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 7721a39cfb0SJung-uk Kim 7731a39cfb0SJung-uk Kim if ((!(OpInfo->Flags & AML_NAMED)) && 7741a39cfb0SJung-uk Kim (!(OpInfo->Flags & AML_CREATE)) && 775313a0c13SJung-uk Kim (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP) && 776313a0c13SJung-uk Kim (Op->Common.AmlOpcode != AML_NOTIFY_OP)) 7771a39cfb0SJung-uk Kim { 7781a39cfb0SJung-uk Kim goto Exit; 7791a39cfb0SJung-uk Kim } 780*f8146b88SJung-uk Kim else if (Op->Common.Parent && 781*f8146b88SJung-uk Kim Op->Common.Parent->Common.AmlOpcode == AML_EXTERNAL_OP) 782*f8146b88SJung-uk Kim { 783*f8146b88SJung-uk Kim /* External() NamePath */ 7841a39cfb0SJung-uk Kim 785*f8146b88SJung-uk Kim Path = Op->Common.Value.String; 786*f8146b88SJung-uk Kim ObjectType = (ACPI_OBJECT_TYPE) Op->Common.Next->Common.Value.Integer; 787*f8146b88SJung-uk Kim if (ObjectType == ACPI_TYPE_METHOD) 788*f8146b88SJung-uk Kim { 789*f8146b88SJung-uk Kim ParamCount = (UINT32) 790*f8146b88SJung-uk Kim Op->Common.Next->Common.Next->Common.Value.Integer; 791*f8146b88SJung-uk Kim } 792*f8146b88SJung-uk Kim 793*f8146b88SJung-uk Kim Flags |= ACPI_EXT_RESOLVED_REFERENCE | ACPI_EXT_ORIGIN_FROM_OPCODE; 794*f8146b88SJung-uk Kim AcpiDmAddOpToExternalList (Op, Path, 795*f8146b88SJung-uk Kim (UINT8) ObjectType, ParamCount, Flags); 796*f8146b88SJung-uk Kim 797*f8146b88SJung-uk Kim goto Exit; 798*f8146b88SJung-uk Kim } 799313a0c13SJung-uk Kim 8001a39cfb0SJung-uk Kim /* Get the NamePath from the appropriate place */ 8011a39cfb0SJung-uk Kim 8021a39cfb0SJung-uk Kim if (OpInfo->Flags & AML_NAMED) 8031a39cfb0SJung-uk Kim { 8041a39cfb0SJung-uk Kim /* 805a7a3b383SJung-uk Kim * Only these two operators (Alias, Scope) refer to an existing 806a7a3b383SJung-uk Kim * name, it is the first argument 8071a39cfb0SJung-uk Kim */ 808a7a3b383SJung-uk Kim if (Op->Common.AmlOpcode == AML_ALIAS_OP) 809a7a3b383SJung-uk Kim { 810a7a3b383SJung-uk Kim ObjectType = ACPI_TYPE_ANY; 811a7a3b383SJung-uk Kim 812a7a3b383SJung-uk Kim NextOp = Op->Common.Value.Arg; 813a7a3b383SJung-uk Kim NextOp = NextOp->Common.Value.Arg; 814a7a3b383SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 815a7a3b383SJung-uk Kim { 816a7a3b383SJung-uk Kim Path = NextOp->Common.Value.String; 817a7a3b383SJung-uk Kim } 818a7a3b383SJung-uk Kim } 819a7a3b383SJung-uk Kim else if (Op->Common.AmlOpcode == AML_SCOPE_OP) 820a7a3b383SJung-uk Kim { 8211a39cfb0SJung-uk Kim Path = (char *) Op->Named.Path; 8221a39cfb0SJung-uk Kim } 8231a39cfb0SJung-uk Kim } 8241a39cfb0SJung-uk Kim else if (OpInfo->Flags & AML_CREATE) 8251a39cfb0SJung-uk Kim { 8261a39cfb0SJung-uk Kim /* Referenced Buffer Name is the first child */ 8271a39cfb0SJung-uk Kim 828a7a3b383SJung-uk Kim ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */ 829a7a3b383SJung-uk Kim 8301a39cfb0SJung-uk Kim NextOp = Op->Common.Value.Arg; 8311a39cfb0SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 8321a39cfb0SJung-uk Kim { 8331a39cfb0SJung-uk Kim Path = NextOp->Common.Value.String; 8341a39cfb0SJung-uk Kim } 8351a39cfb0SJung-uk Kim } 836313a0c13SJung-uk Kim else if (Op->Common.AmlOpcode == AML_NOTIFY_OP) 837313a0c13SJung-uk Kim { 838313a0c13SJung-uk Kim Path = Op->Common.Value.Arg->Asl.Value.String; 839313a0c13SJung-uk Kim } 8401a39cfb0SJung-uk Kim else 8411a39cfb0SJung-uk Kim { 8421a39cfb0SJung-uk Kim Path = Op->Common.Value.String; 8431a39cfb0SJung-uk Kim } 8441a39cfb0SJung-uk Kim 8451a39cfb0SJung-uk Kim if (!Path) 8461a39cfb0SJung-uk Kim { 8471a39cfb0SJung-uk Kim goto Exit; 8481a39cfb0SJung-uk Kim } 8491a39cfb0SJung-uk Kim 8501a39cfb0SJung-uk Kim /* 8511a39cfb0SJung-uk Kim * Lookup the name in the namespace. Name must exist at this point, or it 8521a39cfb0SJung-uk Kim * is an invalid reference. 8531a39cfb0SJung-uk Kim * 8541a39cfb0SJung-uk Kim * The namespace is also used as a lookup table for references to resource 8551a39cfb0SJung-uk Kim * descriptors and the fields within them. 8561a39cfb0SJung-uk Kim */ 857313a0c13SJung-uk Kim Node = NULL; 8581a39cfb0SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 8591a39cfb0SJung-uk Kim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 8601a39cfb0SJung-uk Kim WalkState, &Node); 861*f8146b88SJung-uk Kim 862a7a3b383SJung-uk Kim if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL)) 863a7a3b383SJung-uk Kim { 864313a0c13SJung-uk Kim /* Node was created by an External() statement */ 865313a0c13SJung-uk Kim 866a7a3b383SJung-uk Kim Status = AE_NOT_FOUND; 867a7a3b383SJung-uk Kim } 868a7a3b383SJung-uk Kim 8691a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 8701a39cfb0SJung-uk Kim { 8711a39cfb0SJung-uk Kim if (Status == AE_NOT_FOUND) 8721a39cfb0SJung-uk Kim { 8731a39cfb0SJung-uk Kim /* 874313a0c13SJung-uk Kim * Add this symbol as an external declaration, except if the 875313a0c13SJung-uk Kim * parent is a CondRefOf operator. For this operator, we do not 876313a0c13SJung-uk Kim * need an external, nor do we want one, since this can cause 877313a0c13SJung-uk Kim * disassembly problems if the symbol is actually a control 878313a0c13SJung-uk Kim * method. 8791a39cfb0SJung-uk Kim */ 880313a0c13SJung-uk Kim if (!(Op->Asl.Parent && 881313a0c13SJung-uk Kim (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP))) 882313a0c13SJung-uk Kim { 883313a0c13SJung-uk Kim if (Node) 884313a0c13SJung-uk Kim { 885313a0c13SJung-uk Kim AcpiDmAddNodeToExternalList (Node, 886*f8146b88SJung-uk Kim (UINT8) ObjectType, 7, Flags); 887313a0c13SJung-uk Kim } 888313a0c13SJung-uk Kim else 889313a0c13SJung-uk Kim { 890313a0c13SJung-uk Kim AcpiDmAddOpToExternalList (Op, Path, 891*f8146b88SJung-uk Kim (UINT8) ObjectType, 7, Flags); 892313a0c13SJung-uk Kim } 893313a0c13SJung-uk Kim } 8941a39cfb0SJung-uk Kim } 8951a39cfb0SJung-uk Kim } 896a9f12690SJung-uk Kim 897a9f12690SJung-uk Kim /* 898313a0c13SJung-uk Kim * Found the node, but check if it came from an external table. 899313a0c13SJung-uk Kim * Add it to external list. Note: Node->OwnerId == 0 indicates 900313a0c13SJung-uk Kim * one of the built-in ACPI Names (_OS_ etc.) which can safely 901313a0c13SJung-uk Kim * be ignored. 902a9f12690SJung-uk Kim */ 903313a0c13SJung-uk Kim else if (Node->OwnerId && 904313a0c13SJung-uk Kim (WalkState->OwnerId != Node->OwnerId)) 905a9f12690SJung-uk Kim { 906a9f12690SJung-uk Kim ObjectType2 = ObjectType; 907a9f12690SJung-uk Kim 908a9f12690SJung-uk Kim Object = AcpiNsGetAttachedObject (Node); 909a9f12690SJung-uk Kim if (Object) 910a9f12690SJung-uk Kim { 911a9f12690SJung-uk Kim ObjectType2 = Object->Common.Type; 912a9f12690SJung-uk Kim if (ObjectType2 == ACPI_TYPE_METHOD) 913a9f12690SJung-uk Kim { 91442fecd12SJung-uk Kim ParamCount = Object->Method.ParamCount; 915a9f12690SJung-uk Kim } 916a9f12690SJung-uk Kim } 917a9f12690SJung-uk Kim 918313a0c13SJung-uk Kim Pathname = AcpiNsGetExternalPathname (Node); 919313a0c13SJung-uk Kim if (!Pathname) 920313a0c13SJung-uk Kim { 921313a0c13SJung-uk Kim return (AE_NO_MEMORY); 922313a0c13SJung-uk Kim } 923313a0c13SJung-uk Kim 924313a0c13SJung-uk Kim AcpiDmAddNodeToExternalList (Node, (UINT8) ObjectType2, 925313a0c13SJung-uk Kim ParamCount, ACPI_EXT_RESOLVED_REFERENCE); 926313a0c13SJung-uk Kim 927313a0c13SJung-uk Kim ACPI_FREE (Pathname); 928a9f12690SJung-uk Kim Op->Common.Node = Node; 929a9f12690SJung-uk Kim } 9301a39cfb0SJung-uk Kim else 9311a39cfb0SJung-uk Kim { 9321a39cfb0SJung-uk Kim Op->Common.Node = Node; 9331a39cfb0SJung-uk Kim } 9341a39cfb0SJung-uk Kim 9351a39cfb0SJung-uk Kim 9361a39cfb0SJung-uk Kim Exit: 9371a39cfb0SJung-uk Kim /* Open new scope if necessary */ 9381a39cfb0SJung-uk Kim 9391a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 9401a39cfb0SJung-uk Kim { 9411a39cfb0SJung-uk Kim if (Op->Common.Node) 9421a39cfb0SJung-uk Kim { 943*f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, 944*f8146b88SJung-uk Kim WalkState); 9451a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 9461a39cfb0SJung-uk Kim { 9471a39cfb0SJung-uk Kim return (Status); 9481a39cfb0SJung-uk Kim } 9491a39cfb0SJung-uk Kim } 9501a39cfb0SJung-uk Kim } 9511a39cfb0SJung-uk Kim 9521a39cfb0SJung-uk Kim return (AE_OK); 9531a39cfb0SJung-uk Kim } 9541a39cfb0SJung-uk Kim 9551a39cfb0SJung-uk Kim 9561a39cfb0SJung-uk Kim /******************************************************************************* 9571a39cfb0SJung-uk Kim * 9581a39cfb0SJung-uk Kim * FUNCTION: AcpiDmResourceDescendingOp 9591a39cfb0SJung-uk Kim * 9601a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 9611a39cfb0SJung-uk Kim * 9621a39cfb0SJung-uk Kim * RETURN: None 9631a39cfb0SJung-uk Kim * 9641a39cfb0SJung-uk Kim * DESCRIPTION: Process one parse op during symbolic resource index conversion. 9651a39cfb0SJung-uk Kim * 9661a39cfb0SJung-uk Kim ******************************************************************************/ 9671a39cfb0SJung-uk Kim 9681a39cfb0SJung-uk Kim static ACPI_STATUS 9691a39cfb0SJung-uk Kim AcpiDmResourceDescendingOp ( 9701a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 9711a39cfb0SJung-uk Kim UINT32 Level, 9721a39cfb0SJung-uk Kim void *Context) 9731a39cfb0SJung-uk Kim { 9741a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 9751a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 9761a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState; 9771a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 9781a39cfb0SJung-uk Kim ACPI_STATUS Status; 9791a39cfb0SJung-uk Kim 9801a39cfb0SJung-uk Kim 9811a39cfb0SJung-uk Kim WalkState = Info->WalkState; 9821a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 9831a39cfb0SJung-uk Kim 9841a39cfb0SJung-uk Kim /* Open new scope if necessary */ 9851a39cfb0SJung-uk Kim 9861a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 9871a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 9881a39cfb0SJung-uk Kim { 9891a39cfb0SJung-uk Kim if (Op->Common.Node) 9901a39cfb0SJung-uk Kim { 9911a39cfb0SJung-uk Kim 992*f8146b88SJung-uk Kim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, 993*f8146b88SJung-uk Kim WalkState); 9941a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 9951a39cfb0SJung-uk Kim { 9961a39cfb0SJung-uk Kim return (Status); 9971a39cfb0SJung-uk Kim } 9981a39cfb0SJung-uk Kim } 9991a39cfb0SJung-uk Kim } 10001a39cfb0SJung-uk Kim 10011a39cfb0SJung-uk Kim /* 10021a39cfb0SJung-uk Kim * Check if this operator contains a reference to a resource descriptor. 10031a39cfb0SJung-uk Kim * If so, convert the reference into a symbolic reference. 10041a39cfb0SJung-uk Kim */ 10051a39cfb0SJung-uk Kim AcpiDmCheckResourceReference (Op, WalkState); 10061a39cfb0SJung-uk Kim return (AE_OK); 10071a39cfb0SJung-uk Kim } 10081a39cfb0SJung-uk Kim 10091a39cfb0SJung-uk Kim 10101a39cfb0SJung-uk Kim /******************************************************************************* 10111a39cfb0SJung-uk Kim * 10121a39cfb0SJung-uk Kim * FUNCTION: AcpiDmCommonAscendingOp 10131a39cfb0SJung-uk Kim * 10141a39cfb0SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 10151a39cfb0SJung-uk Kim * 10161a39cfb0SJung-uk Kim * RETURN: None 10171a39cfb0SJung-uk Kim * 10181a39cfb0SJung-uk Kim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes 10191a39cfb0SJung-uk Kim * scope if necessary. 10201a39cfb0SJung-uk Kim * 10211a39cfb0SJung-uk Kim ******************************************************************************/ 10221a39cfb0SJung-uk Kim 10231a39cfb0SJung-uk Kim static ACPI_STATUS 10241a39cfb0SJung-uk Kim AcpiDmCommonAscendingOp ( 10251a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op, 10261a39cfb0SJung-uk Kim UINT32 Level, 10271a39cfb0SJung-uk Kim void *Context) 10281a39cfb0SJung-uk Kim { 10291a39cfb0SJung-uk Kim ACPI_OP_WALK_INFO *Info = Context; 10301a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 10311a39cfb0SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 10321a39cfb0SJung-uk Kim 10331a39cfb0SJung-uk Kim 10341a39cfb0SJung-uk Kim /* Close scope if necessary */ 10351a39cfb0SJung-uk Kim 10361a39cfb0SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 10371a39cfb0SJung-uk Kim ObjectType = OpInfo->ObjectType; 10381a39cfb0SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 10391a39cfb0SJung-uk Kim 10401a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 10411a39cfb0SJung-uk Kim { 10421a39cfb0SJung-uk Kim (void) AcpiDsScopeStackPop (Info->WalkState); 10431a39cfb0SJung-uk Kim } 10441a39cfb0SJung-uk Kim 10451a39cfb0SJung-uk Kim return (AE_OK); 10461a39cfb0SJung-uk Kim } 10471a39cfb0SJung-uk Kim 10481a39cfb0SJung-uk Kim 10491a39cfb0SJung-uk Kim /******************************************************************************* 10501a39cfb0SJung-uk Kim * 10511a39cfb0SJung-uk Kim * FUNCTION: AcpiDmInspectPossibleArgs 10521a39cfb0SJung-uk Kim * 10531a39cfb0SJung-uk Kim * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the 10541a39cfb0SJung-uk Kim * possible method invocation found 10551a39cfb0SJung-uk Kim * TargetCount - Number of targets (0,1,2) for this op 10561a39cfb0SJung-uk Kim * Op - Parse op 10571a39cfb0SJung-uk Kim * 10581a39cfb0SJung-uk Kim * RETURN: Status 10591a39cfb0SJung-uk Kim * 10601a39cfb0SJung-uk Kim * DESCRIPTION: Examine following args and next ops for possible arguments 10611a39cfb0SJung-uk Kim * for an unrecognized method invocation. 10621a39cfb0SJung-uk Kim * 10631a39cfb0SJung-uk Kim ******************************************************************************/ 10641a39cfb0SJung-uk Kim 10651a39cfb0SJung-uk Kim static UINT32 10661a39cfb0SJung-uk Kim AcpiDmInspectPossibleArgs ( 10671a39cfb0SJung-uk Kim UINT32 CurrentOpArgCount, 10681a39cfb0SJung-uk Kim UINT32 TargetCount, 10691a39cfb0SJung-uk Kim ACPI_PARSE_OBJECT *Op) 10701a39cfb0SJung-uk Kim { 10711a39cfb0SJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 10721a39cfb0SJung-uk Kim UINT32 i; 1073*f8146b88SJung-uk Kim UINT32 ArgumentCount = 0; 1074*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 1075*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *ExecuteOp; 10761a39cfb0SJung-uk Kim 10771a39cfb0SJung-uk Kim 1078*f8146b88SJung-uk Kim if (!Op) 1079*f8146b88SJung-uk Kim { 1080*f8146b88SJung-uk Kim return (0); 1081*f8146b88SJung-uk Kim } 10821a39cfb0SJung-uk Kim 10831a39cfb0SJung-uk Kim /* Lookahead for the maximum number of possible arguments */ 10841a39cfb0SJung-uk Kim 1085*f8146b88SJung-uk Kim NextOp = Op->Common.Next; 1086*f8146b88SJung-uk Kim 1087*f8146b88SJung-uk Kim for (i = 0; (i < ACPI_METHOD_NUM_ARGS) && NextOp; i++) 10881a39cfb0SJung-uk Kim { 1089*f8146b88SJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (NextOp->Common.AmlOpcode); 1090*f8146b88SJung-uk Kim 1091*f8146b88SJung-uk Kim /* Any one of these operators is "very probably" not a method arg */ 1092*f8146b88SJung-uk Kim 1093*f8146b88SJung-uk Kim if ((NextOp->Common.AmlOpcode == AML_STORE_OP) || 1094*f8146b88SJung-uk Kim (NextOp->Common.AmlOpcode == AML_NOTIFY_OP) || 1095*f8146b88SJung-uk Kim (OpInfo->Class == AML_CLASS_CONTROL) || 1096*f8146b88SJung-uk Kim (OpInfo->Class == AML_CLASS_CREATE) || 1097*f8146b88SJung-uk Kim (OpInfo->Class == AML_CLASS_NAMED_OBJECT)) 10981a39cfb0SJung-uk Kim { 10991a39cfb0SJung-uk Kim break; 11001a39cfb0SJung-uk Kim } 11011a39cfb0SJung-uk Kim 1102*f8146b88SJung-uk Kim if (OpInfo->Class == AML_CLASS_EXECUTE) 1103*f8146b88SJung-uk Kim { 1104*f8146b88SJung-uk Kim /* Probable that this is method arg if there is no target */ 11051a39cfb0SJung-uk Kim 1106*f8146b88SJung-uk Kim ExecuteOp = NextOp->Common.Value.Arg; 1107*f8146b88SJung-uk Kim while (ExecuteOp) 1108*f8146b88SJung-uk Kim { 1109*f8146b88SJung-uk Kim if ((ExecuteOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 1110*f8146b88SJung-uk Kim (ExecuteOp->Common.Value.Arg == NULL)) 1111*f8146b88SJung-uk Kim { 1112*f8146b88SJung-uk Kim /* No target, could be a method arg */ 1113*f8146b88SJung-uk Kim 1114*f8146b88SJung-uk Kim break; 1115*f8146b88SJung-uk Kim } 1116*f8146b88SJung-uk Kim 1117*f8146b88SJung-uk Kim if (NextOp->Common.AmlOpcode == AML_REF_OF_OP) 11181a39cfb0SJung-uk Kim { 11191a39cfb0SJung-uk Kim break; 11201a39cfb0SJung-uk Kim } 11211a39cfb0SJung-uk Kim 1122*f8146b88SJung-uk Kim ExecuteOp = ExecuteOp->Common.Next; 1123*f8146b88SJung-uk Kim } 1124*f8146b88SJung-uk Kim 1125*f8146b88SJung-uk Kim if (!ExecuteOp) 11261a39cfb0SJung-uk Kim { 1127*f8146b88SJung-uk Kim /* Has a target, not method arg */ 1128*f8146b88SJung-uk Kim 1129*f8146b88SJung-uk Kim return (ArgumentCount); 1130*f8146b88SJung-uk Kim } 11311a39cfb0SJung-uk Kim } 11321a39cfb0SJung-uk Kim 1133*f8146b88SJung-uk Kim ArgumentCount++; 1134*f8146b88SJung-uk Kim NextOp = NextOp->Common.Next; 11351a39cfb0SJung-uk Kim } 11361a39cfb0SJung-uk Kim 1137*f8146b88SJung-uk Kim return (ArgumentCount); 11381a39cfb0SJung-uk Kim } 1139