adwalk.c revision 212761
1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: adwalk - Application-level disassembler parse tree walk routines 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7167802Sjkim/****************************************************************************** 8167802Sjkim * 9167802Sjkim * 1. Copyright Notice 10167802Sjkim * 11202771Sjkim * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 12167802Sjkim * All rights reserved. 13167802Sjkim * 14167802Sjkim * 2. License 15167802Sjkim * 16167802Sjkim * 2.1. This is your license from Intel Corp. under its intellectual property 17167802Sjkim * rights. You may have additional license terms from the party that provided 18167802Sjkim * you this software, covering your right to use that party's intellectual 19167802Sjkim * property rights. 20167802Sjkim * 21167802Sjkim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22167802Sjkim * copy of the source code appearing in this file ("Covered Code") an 23167802Sjkim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24167802Sjkim * base code distributed originally by Intel ("Original Intel Code") to copy, 25167802Sjkim * make derivatives, distribute, use and display any portion of the Covered 26167802Sjkim * Code in any form, with the right to sublicense such rights; and 27167802Sjkim * 28167802Sjkim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29167802Sjkim * license (with the right to sublicense), under only those claims of Intel 30167802Sjkim * patents that are infringed by the Original Intel Code, to make, use, sell, 31167802Sjkim * offer to sell, and import the Covered Code and derivative works thereof 32167802Sjkim * solely to the minimum extent necessary to exercise the above copyright 33167802Sjkim * license, and in no event shall the patent license extend to any additions 34167802Sjkim * to or modifications of the Original Intel Code. No other license or right 35167802Sjkim * is granted directly or by implication, estoppel or otherwise; 36167802Sjkim * 37167802Sjkim * The above copyright and patent license is granted only if the following 38167802Sjkim * conditions are met: 39167802Sjkim * 40167802Sjkim * 3. Conditions 41167802Sjkim * 42167802Sjkim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43167802Sjkim * Redistribution of source code of any substantial portion of the Covered 44167802Sjkim * Code or modification with rights to further distribute source must include 45167802Sjkim * the above Copyright Notice, the above License, this list of Conditions, 46167802Sjkim * and the following Disclaimer and Export Compliance provision. In addition, 47167802Sjkim * Licensee must cause all Covered Code to which Licensee contributes to 48167802Sjkim * contain a file documenting the changes Licensee made to create that Covered 49167802Sjkim * Code and the date of any change. Licensee must include in that file the 50167802Sjkim * documentation of any changes made by any predecessor Licensee. Licensee 51167802Sjkim * must include a prominent statement that the modification is derived, 52167802Sjkim * directly or indirectly, from Original Intel Code. 53167802Sjkim * 54167802Sjkim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55167802Sjkim * Redistribution of source code of any substantial portion of the Covered 56167802Sjkim * Code or modification without rights to further distribute source must 57167802Sjkim * include the following Disclaimer and Export Compliance provision in the 58167802Sjkim * documentation and/or other materials provided with distribution. In 59167802Sjkim * addition, Licensee may not authorize further sublicense of source of any 60167802Sjkim * portion of the Covered Code, and must include terms to the effect that the 61167802Sjkim * license from Licensee to its licensee is limited to the intellectual 62167802Sjkim * property embodied in the software Licensee provides to its licensee, and 63167802Sjkim * not to intellectual property embodied in modifications its licensee may 64167802Sjkim * make. 65167802Sjkim * 66167802Sjkim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67167802Sjkim * substantial portion of the Covered Code or modification must reproduce the 68167802Sjkim * above Copyright Notice, and the following Disclaimer and Export Compliance 69167802Sjkim * provision in the documentation and/or other materials provided with the 70167802Sjkim * distribution. 71167802Sjkim * 72167802Sjkim * 3.4. Intel retains all right, title, and interest in and to the Original 73167802Sjkim * Intel Code. 74167802Sjkim * 75167802Sjkim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76167802Sjkim * Intel shall be used in advertising or otherwise to promote the sale, use or 77167802Sjkim * other dealings in products derived from or relating to the Covered Code 78167802Sjkim * without prior written authorization from Intel. 79167802Sjkim * 80167802Sjkim * 4. Disclaimer and Export Compliance 81167802Sjkim * 82167802Sjkim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83167802Sjkim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84167802Sjkim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85167802Sjkim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86167802Sjkim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87167802Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88167802Sjkim * PARTICULAR PURPOSE. 89167802Sjkim * 90167802Sjkim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91167802Sjkim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92167802Sjkim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93167802Sjkim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94167802Sjkim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95167802Sjkim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96167802Sjkim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97167802Sjkim * LIMITED REMEDY. 98167802Sjkim * 99167802Sjkim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100167802Sjkim * software or system incorporating such software without first obtaining any 101167802Sjkim * required license or other approval from the U. S. Department of Commerce or 102167802Sjkim * any other agency or department of the United States Government. In the 103167802Sjkim * event Licensee exports any such software from the United States or 104167802Sjkim * re-exports any such software from a foreign destination, Licensee shall 105167802Sjkim * ensure that the distribution and export/re-export of the software is in 106167802Sjkim * compliance with all laws, regulations, orders, or other restrictions of the 107167802Sjkim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108167802Sjkim * any of its subsidiaries will export/re-export any technical data, process, 109167802Sjkim * software, or service, directly or indirectly, to any country for which the 110167802Sjkim * United States government or any agency thereof requires an export license, 111167802Sjkim * other governmental approval, or letter of assurance, without first obtaining 112167802Sjkim * such license, approval or letter. 113167802Sjkim * 114167802Sjkim *****************************************************************************/ 115167802Sjkim 116167802Sjkim 117193529Sjkim#include <contrib/dev/acpica/include/acpi.h> 118193529Sjkim#include <contrib/dev/acpica/include/accommon.h> 119193529Sjkim#include <contrib/dev/acpica/include/acparser.h> 120193529Sjkim#include <contrib/dev/acpica/include/amlcode.h> 121193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 122193529Sjkim#include <contrib/dev/acpica/include/acdispat.h> 123193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 124193529Sjkim#include <contrib/dev/acpica/include/acapps.h> 125167802Sjkim 126167802Sjkim 127167802Sjkim#define _COMPONENT ACPI_TOOLS 128167802Sjkim ACPI_MODULE_NAME ("adwalk") 129167802Sjkim 130167802Sjkim/* 131167802Sjkim * aslmap - opcode mappings and reserved method names 132167802Sjkim */ 133167802SjkimACPI_OBJECT_TYPE 134167802SjkimAslMapNamedOpcodeToDataType ( 135167802Sjkim UINT16 Opcode); 136167802Sjkim 137167802Sjkim/* Local prototypes */ 138167802Sjkim 139167802Sjkimstatic ACPI_STATUS 140167802SjkimAcpiDmFindOrphanDescending ( 141167802Sjkim ACPI_PARSE_OBJECT *Op, 142167802Sjkim UINT32 Level, 143167802Sjkim void *Context); 144167802Sjkim 145167802Sjkimstatic ACPI_STATUS 146167802SjkimAcpiDmDumpDescending ( 147167802Sjkim ACPI_PARSE_OBJECT *Op, 148167802Sjkim UINT32 Level, 149167802Sjkim void *Context); 150167802Sjkim 151167802Sjkimstatic ACPI_STATUS 152167802SjkimAcpiDmXrefDescendingOp ( 153167802Sjkim ACPI_PARSE_OBJECT *Op, 154167802Sjkim UINT32 Level, 155167802Sjkim void *Context); 156167802Sjkim 157167802Sjkimstatic ACPI_STATUS 158167802SjkimAcpiDmCommonAscendingOp ( 159167802Sjkim ACPI_PARSE_OBJECT *Op, 160167802Sjkim UINT32 Level, 161167802Sjkim void *Context); 162167802Sjkim 163167802Sjkimstatic ACPI_STATUS 164167802SjkimAcpiDmLoadDescendingOp ( 165167802Sjkim ACPI_PARSE_OBJECT *Op, 166167802Sjkim UINT32 Level, 167167802Sjkim void *Context); 168167802Sjkim 169167802Sjkimstatic UINT32 170167802SjkimAcpiDmInspectPossibleArgs ( 171167802Sjkim UINT32 CurrentOpArgCount, 172167802Sjkim UINT32 TargetCount, 173167802Sjkim ACPI_PARSE_OBJECT *Op); 174167802Sjkim 175167802Sjkimstatic ACPI_STATUS 176167802SjkimAcpiDmResourceDescendingOp ( 177167802Sjkim ACPI_PARSE_OBJECT *Op, 178167802Sjkim UINT32 Level, 179167802Sjkim void *Context); 180167802Sjkim 181167802Sjkim 182167802Sjkim/******************************************************************************* 183167802Sjkim * 184167802Sjkim * FUNCTION: AcpiDmDumpTree 185167802Sjkim * 186198237Sjkim * PARAMETERS: Origin - Starting object 187167802Sjkim * 188167802Sjkim * RETURN: None 189167802Sjkim * 190167802Sjkim * DESCRIPTION: Parse tree walk to format and output the nodes 191167802Sjkim * 192167802Sjkim ******************************************************************************/ 193167802Sjkim 194167802Sjkimvoid 195167802SjkimAcpiDmDumpTree ( 196167802Sjkim ACPI_PARSE_OBJECT *Origin) 197167802Sjkim{ 198167802Sjkim ACPI_OP_WALK_INFO Info; 199167802Sjkim 200167802Sjkim 201167802Sjkim if (!Origin) 202167802Sjkim { 203167802Sjkim return; 204167802Sjkim } 205167802Sjkim 206167802Sjkim AcpiOsPrintf ("/*\nAML Parse Tree\n\n"); 207167802Sjkim Info.Flags = 0; 208167802Sjkim Info.Count = 0; 209167802Sjkim Info.Level = 0; 210167802Sjkim Info.WalkState = NULL; 211167802Sjkim AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info); 212167802Sjkim AcpiOsPrintf ("*/\n\n"); 213167802Sjkim} 214167802Sjkim 215167802Sjkim 216167802Sjkim/******************************************************************************* 217167802Sjkim * 218167802Sjkim * FUNCTION: AcpiDmFindOrphanMethods 219167802Sjkim * 220198237Sjkim * PARAMETERS: Origin - Starting object 221167802Sjkim * 222167802Sjkim * RETURN: None 223167802Sjkim * 224167802Sjkim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods 225167802Sjkim * that are not resolved in the namespace 226167802Sjkim * 227167802Sjkim ******************************************************************************/ 228167802Sjkim 229167802Sjkimvoid 230167802SjkimAcpiDmFindOrphanMethods ( 231167802Sjkim ACPI_PARSE_OBJECT *Origin) 232167802Sjkim{ 233167802Sjkim ACPI_OP_WALK_INFO Info; 234167802Sjkim 235167802Sjkim 236167802Sjkim if (!Origin) 237167802Sjkim { 238167802Sjkim return; 239167802Sjkim } 240167802Sjkim 241167802Sjkim Info.Flags = 0; 242167802Sjkim Info.Level = 0; 243167802Sjkim Info.WalkState = NULL; 244167802Sjkim AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info); 245167802Sjkim} 246167802Sjkim 247167802Sjkim 248167802Sjkim/******************************************************************************* 249167802Sjkim * 250167802Sjkim * FUNCTION: AcpiDmFinishNamespaceLoad 251167802Sjkim * 252167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 253167802Sjkim * NamespaceRoot - Root of the internal namespace 254193529Sjkim * OwnerId - OwnerId of the table to be disassembled 255167802Sjkim * 256167802Sjkim * RETURN: None 257167802Sjkim * 258167802Sjkim * DESCRIPTION: Load all namespace items that are created within control 259167802Sjkim * methods. Used before namespace cross reference 260167802Sjkim * 261167802Sjkim ******************************************************************************/ 262167802Sjkim 263167802Sjkimvoid 264167802SjkimAcpiDmFinishNamespaceLoad ( 265167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 266193529Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot, 267193529Sjkim ACPI_OWNER_ID OwnerId) 268167802Sjkim{ 269167802Sjkim ACPI_STATUS Status; 270167802Sjkim ACPI_OP_WALK_INFO Info; 271167802Sjkim ACPI_WALK_STATE *WalkState; 272167802Sjkim 273167802Sjkim 274167802Sjkim if (!ParseTreeRoot) 275167802Sjkim { 276167802Sjkim return; 277167802Sjkim } 278167802Sjkim 279167802Sjkim /* Create and initialize a new walk state */ 280167802Sjkim 281193529Sjkim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 282167802Sjkim if (!WalkState) 283167802Sjkim { 284167802Sjkim return; 285167802Sjkim } 286167802Sjkim 287167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 288167802Sjkim if (ACPI_FAILURE (Status)) 289167802Sjkim { 290167802Sjkim return; 291167802Sjkim } 292167802Sjkim 293167802Sjkim Info.Flags = 0; 294167802Sjkim Info.Level = 0; 295167802Sjkim Info.WalkState = WalkState; 296167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp, 297167802Sjkim AcpiDmCommonAscendingOp, &Info); 298167802Sjkim ACPI_FREE (WalkState); 299167802Sjkim} 300167802Sjkim 301167802Sjkim 302167802Sjkim/******************************************************************************* 303167802Sjkim * 304167802Sjkim * FUNCTION: AcpiDmCrossReferenceNamespace 305167802Sjkim * 306167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 307167802Sjkim * NamespaceRoot - Root of the internal namespace 308193529Sjkim * OwnerId - OwnerId of the table to be disassembled 309167802Sjkim * 310167802Sjkim * RETURN: None 311167802Sjkim * 312167802Sjkim * DESCRIPTION: Cross reference the namespace to create externals 313167802Sjkim * 314167802Sjkim ******************************************************************************/ 315167802Sjkim 316167802Sjkimvoid 317167802SjkimAcpiDmCrossReferenceNamespace ( 318167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 319193529Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot, 320193529Sjkim ACPI_OWNER_ID OwnerId) 321167802Sjkim{ 322167802Sjkim ACPI_STATUS Status; 323167802Sjkim ACPI_OP_WALK_INFO Info; 324167802Sjkim ACPI_WALK_STATE *WalkState; 325167802Sjkim 326167802Sjkim 327167802Sjkim if (!ParseTreeRoot) 328167802Sjkim { 329167802Sjkim return; 330167802Sjkim } 331167802Sjkim 332167802Sjkim /* Create and initialize a new walk state */ 333167802Sjkim 334193529Sjkim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 335167802Sjkim if (!WalkState) 336167802Sjkim { 337167802Sjkim return; 338167802Sjkim } 339167802Sjkim 340167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 341167802Sjkim if (ACPI_FAILURE (Status)) 342167802Sjkim { 343167802Sjkim return; 344167802Sjkim } 345167802Sjkim 346167802Sjkim Info.Flags = 0; 347167802Sjkim Info.Level = 0; 348167802Sjkim Info.WalkState = WalkState; 349167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp, 350167802Sjkim AcpiDmCommonAscendingOp, &Info); 351167802Sjkim ACPI_FREE (WalkState); 352167802Sjkim} 353167802Sjkim 354167802Sjkim 355167802Sjkim/******************************************************************************* 356167802Sjkim * 357167802Sjkim * FUNCTION: AcpiDmConvertResourceIndexes 358167802Sjkim * 359167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 360167802Sjkim * NamespaceRoot - Root of the internal namespace 361167802Sjkim * 362167802Sjkim * RETURN: None 363167802Sjkim * 364167802Sjkim * DESCRIPTION: Convert fixed-offset references to resource descriptors to 365167802Sjkim * symbolic references. Should only be called after namespace has 366167802Sjkim * been cross referenced. 367167802Sjkim * 368167802Sjkim ******************************************************************************/ 369167802Sjkim 370167802Sjkimvoid 371167802SjkimAcpiDmConvertResourceIndexes ( 372167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 373167802Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot) 374167802Sjkim{ 375167802Sjkim ACPI_STATUS Status; 376167802Sjkim ACPI_OP_WALK_INFO Info; 377167802Sjkim ACPI_WALK_STATE *WalkState; 378167802Sjkim 379167802Sjkim 380167802Sjkim if (!ParseTreeRoot) 381167802Sjkim { 382167802Sjkim return; 383167802Sjkim } 384167802Sjkim 385167802Sjkim /* Create and initialize a new walk state */ 386167802Sjkim 387167802Sjkim WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL); 388167802Sjkim if (!WalkState) 389167802Sjkim { 390167802Sjkim return; 391167802Sjkim } 392167802Sjkim 393167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 394167802Sjkim if (ACPI_FAILURE (Status)) 395167802Sjkim { 396167802Sjkim return; 397167802Sjkim } 398167802Sjkim 399167802Sjkim Info.Flags = 0; 400167802Sjkim Info.Level = 0; 401167802Sjkim Info.WalkState = WalkState; 402167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp, 403167802Sjkim AcpiDmCommonAscendingOp, &Info); 404167802Sjkim ACPI_FREE (WalkState); 405167802Sjkim return; 406167802Sjkim} 407167802Sjkim 408167802Sjkim 409167802Sjkim/******************************************************************************* 410167802Sjkim * 411167802Sjkim * FUNCTION: AcpiDmDumpDescending 412167802Sjkim * 413167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 414167802Sjkim * 415167802Sjkim * RETURN: Status 416167802Sjkim * 417167802Sjkim * DESCRIPTION: Format and print contents of one parse Op. 418167802Sjkim * 419167802Sjkim ******************************************************************************/ 420167802Sjkim 421167802Sjkimstatic ACPI_STATUS 422167802SjkimAcpiDmDumpDescending ( 423167802Sjkim ACPI_PARSE_OBJECT *Op, 424167802Sjkim UINT32 Level, 425167802Sjkim void *Context) 426167802Sjkim{ 427167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 428167802Sjkim char *Path; 429167802Sjkim 430167802Sjkim 431167802Sjkim if (!Op) 432167802Sjkim { 433167802Sjkim return (AE_OK); 434167802Sjkim } 435167802Sjkim 436167802Sjkim /* Most of the information (count, level, name) here */ 437167802Sjkim 438198237Sjkim Info->Count++; 439167802Sjkim AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level); 440167802Sjkim AcpiDmIndent (Level); 441167802Sjkim AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode)); 442167802Sjkim 443167802Sjkim /* Extra info is helpful */ 444167802Sjkim 445167802Sjkim switch (Op->Common.AmlOpcode) 446167802Sjkim { 447167802Sjkim case AML_BYTE_OP: 448167802Sjkim case AML_WORD_OP: 449167802Sjkim case AML_DWORD_OP: 450167802Sjkim AcpiOsPrintf ("%X", (UINT32) Op->Common.Value.Integer); 451167802Sjkim break; 452167802Sjkim 453167802Sjkim case AML_INT_NAMEPATH_OP: 454167802Sjkim if (Op->Common.Value.String) 455167802Sjkim { 456167802Sjkim AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String, 457167802Sjkim NULL, &Path); 458167802Sjkim AcpiOsPrintf ("%s %p", Path, Op->Common.Node); 459167802Sjkim ACPI_FREE (Path); 460167802Sjkim } 461167802Sjkim else 462167802Sjkim { 463167802Sjkim AcpiOsPrintf ("[NULL]"); 464167802Sjkim } 465167802Sjkim break; 466167802Sjkim 467167802Sjkim case AML_NAME_OP: 468167802Sjkim case AML_METHOD_OP: 469167802Sjkim case AML_DEVICE_OP: 470167802Sjkim case AML_INT_NAMEDFIELD_OP: 471198237Sjkim AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name)); 472167802Sjkim break; 473193529Sjkim 474193529Sjkim default: 475193529Sjkim break; 476167802Sjkim } 477167802Sjkim 478167802Sjkim AcpiOsPrintf ("\n"); 479167802Sjkim return (AE_OK); 480167802Sjkim} 481167802Sjkim 482167802Sjkim 483167802Sjkim/******************************************************************************* 484167802Sjkim * 485167802Sjkim * FUNCTION: AcpiDmFindOrphanDescending 486167802Sjkim * 487167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 488167802Sjkim * 489167802Sjkim * RETURN: Status 490167802Sjkim * 491167802Sjkim * DESCRIPTION: Check namepath Ops for orphaned method invocations 492167802Sjkim * 493167802Sjkim * Note: Experimental. 494167802Sjkim * 495167802Sjkim ******************************************************************************/ 496167802Sjkim 497167802Sjkimstatic ACPI_STATUS 498167802SjkimAcpiDmFindOrphanDescending ( 499167802Sjkim ACPI_PARSE_OBJECT *Op, 500167802Sjkim UINT32 Level, 501167802Sjkim void *Context) 502167802Sjkim{ 503167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 504167802Sjkim ACPI_PARSE_OBJECT *ChildOp; 505167802Sjkim ACPI_PARSE_OBJECT *NextOp; 506167802Sjkim ACPI_PARSE_OBJECT *ParentOp; 507167802Sjkim UINT32 ArgCount; 508167802Sjkim 509167802Sjkim 510167802Sjkim if (!Op) 511167802Sjkim { 512167802Sjkim return (AE_OK); 513167802Sjkim } 514167802Sjkim 515167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 516167802Sjkim 517167802Sjkim switch (Op->Common.AmlOpcode) 518167802Sjkim { 519167802Sjkim#ifdef ACPI_UNDER_DEVELOPMENT 520167802Sjkim case AML_ADD_OP: 521167802Sjkim ChildOp = Op->Common.Value.Arg; 522167802Sjkim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 523167802Sjkim !ChildOp->Common.Node) 524167802Sjkim { 525167802Sjkim AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String, 526167802Sjkim NULL, &Path); 527167802Sjkim AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n", Op->Common.AmlOpName, Path); 528167802Sjkim ACPI_FREE (Path); 529167802Sjkim 530167802Sjkim NextOp = Op->Common.Next; 531167802Sjkim if (!NextOp) 532167802Sjkim { 533167802Sjkim /* This NamePath has no args, assume it is an integer */ 534167802Sjkim 535198237Sjkim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 536167802Sjkim return (AE_OK); 537167802Sjkim } 538167802Sjkim 539167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp); 540209746Sjkim AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n", ArgCount, AcpiDmCountChildren (Op)); 541167802Sjkim 542167802Sjkim if (ArgCount < 1) 543167802Sjkim { 544167802Sjkim /* One Arg means this is just a Store(Name,Target) */ 545167802Sjkim 546198237Sjkim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 547167802Sjkim return (AE_OK); 548167802Sjkim } 549167802Sjkim 550198237Sjkim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 551167802Sjkim } 552167802Sjkim break; 553167802Sjkim#endif 554167802Sjkim 555167802Sjkim case AML_STORE_OP: 556167802Sjkim 557167802Sjkim ChildOp = Op->Common.Value.Arg; 558167802Sjkim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 559167802Sjkim !ChildOp->Common.Node) 560167802Sjkim { 561167802Sjkim NextOp = Op->Common.Next; 562167802Sjkim if (!NextOp) 563167802Sjkim { 564167802Sjkim /* This NamePath has no args, assume it is an integer */ 565167802Sjkim 566198237Sjkim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 567167802Sjkim return (AE_OK); 568167802Sjkim } 569167802Sjkim 570167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp); 571167802Sjkim if (ArgCount <= 1) 572167802Sjkim { 573167802Sjkim /* One Arg means this is just a Store(Name,Target) */ 574167802Sjkim 575198237Sjkim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 576167802Sjkim return (AE_OK); 577167802Sjkim } 578167802Sjkim 579198237Sjkim AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 580167802Sjkim } 581167802Sjkim break; 582167802Sjkim 583167802Sjkim case AML_INT_NAMEPATH_OP: 584167802Sjkim 585167802Sjkim /* Must examine parent to see if this namepath is an argument */ 586167802Sjkim 587167802Sjkim ParentOp = Op->Common.Parent; 588167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode); 589167802Sjkim 590167802Sjkim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 591167802Sjkim (OpInfo->Class != AML_CLASS_CREATE) && 592167802Sjkim (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && 593167802Sjkim !Op->Common.Node) 594167802Sjkim { 595167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next); 596167802Sjkim 597167802Sjkim /* 598167802Sjkim * Check if namepath is a predicate for if/while or lone parameter to 599167802Sjkim * a return. 600167802Sjkim */ 601167802Sjkim if (ArgCount == 0) 602167802Sjkim { 603167802Sjkim if (((ParentOp->Common.AmlOpcode == AML_IF_OP) || 604167802Sjkim (ParentOp->Common.AmlOpcode == AML_WHILE_OP) || 605167802Sjkim (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) && 606167802Sjkim 607167802Sjkim /* And namepath is the first argument */ 608167802Sjkim (ParentOp->Common.Value.Arg == Op)) 609167802Sjkim { 610198237Sjkim AcpiDmAddToExternalList (Op, Op->Common.Value.String, ACPI_TYPE_INTEGER, 0); 611167802Sjkim break; 612167802Sjkim } 613167802Sjkim } 614167802Sjkim 615167802Sjkim /* 616167802Sjkim * This is a standalone namestring (not a parameter to another 617167802Sjkim * operator) - it *must* be a method invocation, nothing else is 618167802Sjkim * grammatically possible. 619167802Sjkim */ 620198237Sjkim AcpiDmAddToExternalList (Op, Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 621167802Sjkim 622167802Sjkim } 623167802Sjkim break; 624193529Sjkim 625193529Sjkim default: 626193529Sjkim break; 627167802Sjkim } 628167802Sjkim 629167802Sjkim return (AE_OK); 630167802Sjkim} 631167802Sjkim 632167802Sjkim 633167802Sjkim/******************************************************************************* 634167802Sjkim * 635167802Sjkim * FUNCTION: AcpiDmLoadDescendingOp 636167802Sjkim * 637167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 638167802Sjkim * 639167802Sjkim * RETURN: Status 640167802Sjkim * 641167802Sjkim * DESCRIPTION: Descending handler for namespace control method object load 642167802Sjkim * 643167802Sjkim ******************************************************************************/ 644167802Sjkim 645167802Sjkimstatic ACPI_STATUS 646167802SjkimAcpiDmLoadDescendingOp ( 647167802Sjkim ACPI_PARSE_OBJECT *Op, 648167802Sjkim UINT32 Level, 649167802Sjkim void *Context) 650167802Sjkim{ 651167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 652167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 653167802Sjkim ACPI_WALK_STATE *WalkState; 654167802Sjkim ACPI_OBJECT_TYPE ObjectType; 655167802Sjkim ACPI_STATUS Status; 656167802Sjkim char *Path = NULL; 657167802Sjkim ACPI_PARSE_OBJECT *NextOp; 658167802Sjkim ACPI_NAMESPACE_NODE *Node; 659193529Sjkim char FieldPath[5]; 660193529Sjkim BOOLEAN PreDefined = FALSE; 661193529Sjkim UINT8 PreDefineIndex = 0; 662167802Sjkim 663167802Sjkim 664167802Sjkim WalkState = Info->WalkState; 665167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 666167802Sjkim ObjectType = OpInfo->ObjectType; 667167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 668167802Sjkim 669167802Sjkim /* Only interested in operators that create new names */ 670167802Sjkim 671167802Sjkim if (!(OpInfo->Flags & AML_NAMED) && 672167802Sjkim !(OpInfo->Flags & AML_CREATE)) 673167802Sjkim { 674167802Sjkim goto Exit; 675167802Sjkim } 676167802Sjkim 677167802Sjkim /* Get the NamePath from the appropriate place */ 678167802Sjkim 679167802Sjkim if (OpInfo->Flags & AML_NAMED) 680167802Sjkim { 681167802Sjkim /* For all named operators, get the new name */ 682167802Sjkim 683167802Sjkim Path = (char *) Op->Named.Path; 684193529Sjkim 685193529Sjkim if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 686193529Sjkim { 687193529Sjkim *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name; 688193529Sjkim FieldPath[4] = 0; 689193529Sjkim Path = FieldPath; 690193529Sjkim } 691167802Sjkim } 692167802Sjkim else if (OpInfo->Flags & AML_CREATE) 693167802Sjkim { 694167802Sjkim /* New name is the last child */ 695167802Sjkim 696167802Sjkim NextOp = Op->Common.Value.Arg; 697167802Sjkim 698167802Sjkim while (NextOp->Common.Next) 699167802Sjkim { 700167802Sjkim NextOp = NextOp->Common.Next; 701167802Sjkim } 702167802Sjkim Path = NextOp->Common.Value.String; 703167802Sjkim } 704167802Sjkim 705167802Sjkim if (!Path) 706167802Sjkim { 707167802Sjkim goto Exit; 708167802Sjkim } 709167802Sjkim 710167802Sjkim /* Insert the name into the namespace */ 711167802Sjkim 712167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 713167802Sjkim ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE, 714167802Sjkim WalkState, &Node); 715167802Sjkim 716167802Sjkim Op->Common.Node = Node; 717167802Sjkim 718193529Sjkim if (ACPI_SUCCESS (Status)) 719193529Sjkim { 720193529Sjkim /* Check if it's a predefined node */ 721167802Sjkim 722193529Sjkim while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name) 723193529Sjkim { 724193529Sjkim if (!ACPI_STRNCMP (Node->Name.Ascii, 725193529Sjkim AcpiGbl_PreDefinedNames[PreDefineIndex].Name, 4)) 726193529Sjkim { 727193529Sjkim PreDefined = TRUE; 728193529Sjkim break; 729193529Sjkim } 730193529Sjkim 731193529Sjkim PreDefineIndex++; 732193529Sjkim } 733193529Sjkim 734193529Sjkim /* 735193529Sjkim * Set node owner id if it satisfies all the following conditions: 736193529Sjkim * 1) Not a predefined node, _SB_ etc 737193529Sjkim * 2) Not the root node 738193529Sjkim * 3) Not a node created by Scope 739193529Sjkim */ 740193529Sjkim 741193529Sjkim if (!PreDefined && Node != AcpiGbl_RootNode && 742193529Sjkim Op->Common.AmlOpcode != AML_SCOPE_OP) 743193529Sjkim { 744193529Sjkim Node->OwnerId = WalkState->OwnerId; 745193529Sjkim } 746193529Sjkim } 747193529Sjkim 748193529Sjkim 749167802SjkimExit: 750167802Sjkim 751167802Sjkim if (AcpiNsOpensScope (ObjectType)) 752167802Sjkim { 753167802Sjkim if (Op->Common.Node) 754167802Sjkim { 755167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 756167802Sjkim if (ACPI_FAILURE (Status)) 757167802Sjkim { 758167802Sjkim return (Status); 759167802Sjkim } 760167802Sjkim } 761167802Sjkim } 762167802Sjkim 763167802Sjkim return (AE_OK); 764167802Sjkim} 765167802Sjkim 766167802Sjkim 767167802Sjkim/******************************************************************************* 768167802Sjkim * 769167802Sjkim * FUNCTION: AcpiDmXrefDescendingOp 770167802Sjkim * 771167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 772167802Sjkim * 773167802Sjkim * RETURN: Status 774167802Sjkim * 775167802Sjkim * DESCRIPTION: Descending handler for namespace cross reference 776167802Sjkim * 777167802Sjkim ******************************************************************************/ 778167802Sjkim 779167802Sjkimstatic ACPI_STATUS 780167802SjkimAcpiDmXrefDescendingOp ( 781167802Sjkim ACPI_PARSE_OBJECT *Op, 782167802Sjkim UINT32 Level, 783167802Sjkim void *Context) 784167802Sjkim{ 785167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 786167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 787167802Sjkim ACPI_WALK_STATE *WalkState; 788167802Sjkim ACPI_OBJECT_TYPE ObjectType; 789193529Sjkim ACPI_OBJECT_TYPE ObjectType2; 790167802Sjkim ACPI_STATUS Status; 791167802Sjkim char *Path = NULL; 792167802Sjkim ACPI_PARSE_OBJECT *NextOp; 793167802Sjkim ACPI_NAMESPACE_NODE *Node; 794193529Sjkim ACPI_OPERAND_OBJECT *Object; 795212761Sjkim UINT32 ParamCount = 0; 796167802Sjkim 797167802Sjkim 798167802Sjkim WalkState = Info->WalkState; 799167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 800167802Sjkim ObjectType = OpInfo->ObjectType; 801167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 802167802Sjkim 803167802Sjkim if ((!(OpInfo->Flags & AML_NAMED)) && 804167802Sjkim (!(OpInfo->Flags & AML_CREATE)) && 805167802Sjkim (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP)) 806167802Sjkim { 807167802Sjkim goto Exit; 808167802Sjkim } 809167802Sjkim 810167802Sjkim /* Get the NamePath from the appropriate place */ 811167802Sjkim 812167802Sjkim if (OpInfo->Flags & AML_NAMED) 813167802Sjkim { 814167802Sjkim if ((Op->Common.AmlOpcode == AML_ALIAS_OP) || 815167802Sjkim (Op->Common.AmlOpcode == AML_SCOPE_OP)) 816167802Sjkim { 817167802Sjkim /* 818167802Sjkim * Only these two operators refer to an existing name, 819167802Sjkim * first argument 820167802Sjkim */ 821167802Sjkim Path = (char *) Op->Named.Path; 822167802Sjkim } 823167802Sjkim } 824167802Sjkim else if (OpInfo->Flags & AML_CREATE) 825167802Sjkim { 826167802Sjkim /* Referenced Buffer Name is the first child */ 827167802Sjkim 828167802Sjkim NextOp = Op->Common.Value.Arg; 829167802Sjkim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 830167802Sjkim { 831167802Sjkim Path = NextOp->Common.Value.String; 832167802Sjkim } 833167802Sjkim } 834167802Sjkim else 835167802Sjkim { 836167802Sjkim Path = Op->Common.Value.String; 837167802Sjkim } 838167802Sjkim 839167802Sjkim if (!Path) 840167802Sjkim { 841167802Sjkim goto Exit; 842167802Sjkim } 843167802Sjkim 844167802Sjkim /* 845167802Sjkim * Lookup the name in the namespace. Name must exist at this point, or it 846167802Sjkim * is an invalid reference. 847167802Sjkim * 848167802Sjkim * The namespace is also used as a lookup table for references to resource 849167802Sjkim * descriptors and the fields within them. 850167802Sjkim */ 851167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 852167802Sjkim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 853167802Sjkim WalkState, &Node); 854167802Sjkim if (ACPI_FAILURE (Status)) 855167802Sjkim { 856167802Sjkim if (Status == AE_NOT_FOUND) 857167802Sjkim { 858198237Sjkim AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0); 859167802Sjkim 860167802Sjkim /* 861167802Sjkim * We could install this into the namespace, but we catch duplicate 862167802Sjkim * externals when they are added to the list. 863167802Sjkim */ 864167802Sjkim#if 0 865167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 866167802Sjkim ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE, 867167802Sjkim WalkState, &Node); 868167802Sjkim#endif 869167802Sjkim } 870167802Sjkim } 871193529Sjkim 872193529Sjkim /* 873193529Sjkim * Found the node in external table, add it to external list 874193529Sjkim * Node->OwnerId == 0 indicates built-in ACPI Names, _OS_ etc 875193529Sjkim */ 876193529Sjkim else if (Node->OwnerId && WalkState->OwnerId != Node->OwnerId) 877193529Sjkim { 878193529Sjkim ObjectType2 = ObjectType; 879193529Sjkim 880193529Sjkim Object = AcpiNsGetAttachedObject (Node); 881193529Sjkim if (Object) 882193529Sjkim { 883193529Sjkim ObjectType2 = Object->Common.Type; 884212761Sjkim if (ObjectType2 == ACPI_TYPE_METHOD) 885212761Sjkim { 886212761Sjkim ParamCount = Object->Method.ParamCount; 887212761Sjkim } 888193529Sjkim } 889193529Sjkim 890212761Sjkim AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType2, ParamCount); 891193529Sjkim Op->Common.Node = Node; 892193529Sjkim } 893167802Sjkim else 894167802Sjkim { 895167802Sjkim Op->Common.Node = Node; 896167802Sjkim } 897167802Sjkim 898167802Sjkim 899167802SjkimExit: 900167802Sjkim /* Open new scope if necessary */ 901167802Sjkim 902167802Sjkim if (AcpiNsOpensScope (ObjectType)) 903167802Sjkim { 904167802Sjkim if (Op->Common.Node) 905167802Sjkim { 906167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 907167802Sjkim if (ACPI_FAILURE (Status)) 908167802Sjkim { 909167802Sjkim return (Status); 910167802Sjkim } 911167802Sjkim } 912167802Sjkim } 913167802Sjkim 914167802Sjkim return (AE_OK); 915167802Sjkim} 916167802Sjkim 917167802Sjkim 918167802Sjkim/******************************************************************************* 919167802Sjkim * 920167802Sjkim * FUNCTION: AcpiDmResourceDescendingOp 921167802Sjkim * 922167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 923167802Sjkim * 924167802Sjkim * RETURN: None 925167802Sjkim * 926167802Sjkim * DESCRIPTION: Process one parse op during symbolic resource index conversion. 927167802Sjkim * 928167802Sjkim ******************************************************************************/ 929167802Sjkim 930167802Sjkimstatic ACPI_STATUS 931167802SjkimAcpiDmResourceDescendingOp ( 932167802Sjkim ACPI_PARSE_OBJECT *Op, 933167802Sjkim UINT32 Level, 934167802Sjkim void *Context) 935167802Sjkim{ 936167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 937167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 938167802Sjkim ACPI_WALK_STATE *WalkState; 939167802Sjkim ACPI_OBJECT_TYPE ObjectType; 940167802Sjkim ACPI_STATUS Status; 941167802Sjkim 942167802Sjkim 943167802Sjkim WalkState = Info->WalkState; 944167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 945167802Sjkim 946167802Sjkim /* Open new scope if necessary */ 947167802Sjkim 948167802Sjkim ObjectType = OpInfo->ObjectType; 949167802Sjkim if (AcpiNsOpensScope (ObjectType)) 950167802Sjkim { 951167802Sjkim if (Op->Common.Node) 952167802Sjkim { 953167802Sjkim 954167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 955167802Sjkim if (ACPI_FAILURE (Status)) 956167802Sjkim { 957167802Sjkim return (Status); 958167802Sjkim } 959167802Sjkim } 960167802Sjkim } 961167802Sjkim 962167802Sjkim /* 963167802Sjkim * Check if this operator contains a reference to a resource descriptor. 964167802Sjkim * If so, convert the reference into a symbolic reference. 965167802Sjkim */ 966167802Sjkim AcpiDmCheckResourceReference (Op, WalkState); 967167802Sjkim return (AE_OK); 968167802Sjkim} 969167802Sjkim 970167802Sjkim 971167802Sjkim/******************************************************************************* 972167802Sjkim * 973167802Sjkim * FUNCTION: AcpiDmCommonAscendingOp 974167802Sjkim * 975167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 976167802Sjkim * 977167802Sjkim * RETURN: None 978167802Sjkim * 979167802Sjkim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes 980167802Sjkim * scope if necessary. 981167802Sjkim * 982167802Sjkim ******************************************************************************/ 983167802Sjkim 984167802Sjkimstatic ACPI_STATUS 985167802SjkimAcpiDmCommonAscendingOp ( 986167802Sjkim ACPI_PARSE_OBJECT *Op, 987167802Sjkim UINT32 Level, 988167802Sjkim void *Context) 989167802Sjkim{ 990167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 991167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 992167802Sjkim ACPI_OBJECT_TYPE ObjectType; 993167802Sjkim 994167802Sjkim 995167802Sjkim /* Close scope if necessary */ 996167802Sjkim 997167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 998167802Sjkim ObjectType = OpInfo->ObjectType; 999167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 1000167802Sjkim 1001167802Sjkim if (AcpiNsOpensScope (ObjectType)) 1002167802Sjkim { 1003167802Sjkim (void) AcpiDsScopeStackPop (Info->WalkState); 1004167802Sjkim } 1005167802Sjkim 1006167802Sjkim return (AE_OK); 1007167802Sjkim} 1008167802Sjkim 1009167802Sjkim 1010167802Sjkim/******************************************************************************* 1011167802Sjkim * 1012167802Sjkim * FUNCTION: AcpiDmInspectPossibleArgs 1013167802Sjkim * 1014167802Sjkim * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the 1015167802Sjkim * possible method invocation found 1016167802Sjkim * TargetCount - Number of targets (0,1,2) for this op 1017167802Sjkim * Op - Parse op 1018167802Sjkim * 1019167802Sjkim * RETURN: Status 1020167802Sjkim * 1021167802Sjkim * DESCRIPTION: Examine following args and next ops for possible arguments 1022167802Sjkim * for an unrecognized method invocation. 1023167802Sjkim * 1024167802Sjkim ******************************************************************************/ 1025167802Sjkim 1026167802Sjkimstatic UINT32 1027167802SjkimAcpiDmInspectPossibleArgs ( 1028167802Sjkim UINT32 CurrentOpArgCount, 1029167802Sjkim UINT32 TargetCount, 1030167802Sjkim ACPI_PARSE_OBJECT *Op) 1031167802Sjkim{ 1032167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 1033167802Sjkim UINT32 i; 1034167802Sjkim UINT32 Last = 0; 1035167802Sjkim UINT32 Lookahead; 1036167802Sjkim 1037167802Sjkim 1038167802Sjkim Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount; 1039167802Sjkim 1040167802Sjkim /* Lookahead for the maximum number of possible arguments */ 1041167802Sjkim 1042167802Sjkim for (i = 0; i < Lookahead; i++) 1043167802Sjkim { 1044167802Sjkim if (!Op) 1045167802Sjkim { 1046167802Sjkim break; 1047167802Sjkim } 1048167802Sjkim 1049167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 1050167802Sjkim 1051167802Sjkim /* 1052167802Sjkim * Any one of these operators is "very probably" not a method arg 1053167802Sjkim */ 1054167802Sjkim if ((Op->Common.AmlOpcode == AML_STORE_OP) || 1055167802Sjkim (Op->Common.AmlOpcode == AML_NOTIFY_OP)) 1056167802Sjkim { 1057167802Sjkim break; 1058167802Sjkim } 1059167802Sjkim 1060167802Sjkim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 1061167802Sjkim (OpInfo->Class != AML_CLASS_CONTROL)) 1062167802Sjkim { 1063167802Sjkim Last = i+1; 1064167802Sjkim } 1065167802Sjkim 1066167802Sjkim Op = Op->Common.Next; 1067167802Sjkim } 1068167802Sjkim 1069167802Sjkim return (Last); 1070167802Sjkim} 1071167802Sjkim 1072167802Sjkim 1073