adwalk.c revision 193529
1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: adwalk - Application-level disassembler parse tree walk routines 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7167802Sjkim/****************************************************************************** 8167802Sjkim * 9167802Sjkim * 1. Copyright Notice 10167802Sjkim * 11193529Sjkim * Some or all of this work - Copyright (c) 1999 - 2009, 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/acdebug.h> 122193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 123193529Sjkim#include <contrib/dev/acpica/include/acdispat.h> 124193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 125193529Sjkim#include <contrib/dev/acpica/include/acapps.h> 126167802Sjkim 127167802Sjkim 128167802Sjkim#define _COMPONENT ACPI_TOOLS 129167802Sjkim ACPI_MODULE_NAME ("adwalk") 130167802Sjkim 131167802Sjkim/* 132167802Sjkim * aslmap - opcode mappings and reserved method names 133167802Sjkim */ 134167802SjkimACPI_OBJECT_TYPE 135167802SjkimAslMapNamedOpcodeToDataType ( 136167802Sjkim UINT16 Opcode); 137167802Sjkim 138167802Sjkim/* Local prototypes */ 139167802Sjkim 140167802Sjkimstatic ACPI_STATUS 141167802SjkimAcpiDmFindOrphanDescending ( 142167802Sjkim ACPI_PARSE_OBJECT *Op, 143167802Sjkim UINT32 Level, 144167802Sjkim void *Context); 145167802Sjkim 146167802Sjkimstatic ACPI_STATUS 147167802SjkimAcpiDmDumpDescending ( 148167802Sjkim ACPI_PARSE_OBJECT *Op, 149167802Sjkim UINT32 Level, 150167802Sjkim void *Context); 151167802Sjkim 152167802Sjkimstatic ACPI_STATUS 153167802SjkimAcpiDmXrefDescendingOp ( 154167802Sjkim ACPI_PARSE_OBJECT *Op, 155167802Sjkim UINT32 Level, 156167802Sjkim void *Context); 157167802Sjkim 158167802Sjkimstatic ACPI_STATUS 159167802SjkimAcpiDmCommonAscendingOp ( 160167802Sjkim ACPI_PARSE_OBJECT *Op, 161167802Sjkim UINT32 Level, 162167802Sjkim void *Context); 163167802Sjkim 164167802Sjkimstatic ACPI_STATUS 165167802SjkimAcpiDmLoadDescendingOp ( 166167802Sjkim ACPI_PARSE_OBJECT *Op, 167167802Sjkim UINT32 Level, 168167802Sjkim void *Context); 169167802Sjkim 170167802Sjkimstatic UINT32 171167802SjkimAcpiDmInspectPossibleArgs ( 172167802Sjkim UINT32 CurrentOpArgCount, 173167802Sjkim UINT32 TargetCount, 174167802Sjkim ACPI_PARSE_OBJECT *Op); 175167802Sjkim 176167802Sjkimstatic ACPI_STATUS 177167802SjkimAcpiDmResourceDescendingOp ( 178167802Sjkim ACPI_PARSE_OBJECT *Op, 179167802Sjkim UINT32 Level, 180167802Sjkim void *Context); 181167802Sjkim 182167802Sjkim 183167802Sjkim/******************************************************************************* 184167802Sjkim * 185167802Sjkim * FUNCTION: AcpiDmDumpTree 186167802Sjkim * 187167802Sjkim * PARAMETERS: Origin - Starting object 188167802Sjkim * 189167802Sjkim * RETURN: None 190167802Sjkim * 191167802Sjkim * DESCRIPTION: Parse tree walk to format and output the nodes 192167802Sjkim * 193167802Sjkim ******************************************************************************/ 194167802Sjkim 195167802Sjkimvoid 196167802SjkimAcpiDmDumpTree ( 197167802Sjkim ACPI_PARSE_OBJECT *Origin) 198167802Sjkim{ 199167802Sjkim ACPI_OP_WALK_INFO Info; 200167802Sjkim 201167802Sjkim 202167802Sjkim if (!Origin) 203167802Sjkim { 204167802Sjkim return; 205167802Sjkim } 206167802Sjkim 207167802Sjkim AcpiOsPrintf ("/*\nAML Parse Tree\n\n"); 208167802Sjkim Info.Flags = 0; 209167802Sjkim Info.Count = 0; 210167802Sjkim Info.Level = 0; 211167802Sjkim Info.WalkState = NULL; 212167802Sjkim AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info); 213167802Sjkim AcpiOsPrintf ("*/\n\n"); 214167802Sjkim} 215167802Sjkim 216167802Sjkim 217167802Sjkim/******************************************************************************* 218167802Sjkim * 219167802Sjkim * FUNCTION: AcpiDmFindOrphanMethods 220167802Sjkim * 221167802Sjkim * PARAMETERS: Origin - Starting object 222167802Sjkim * 223167802Sjkim * RETURN: None 224167802Sjkim * 225167802Sjkim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods 226167802Sjkim * that are not resolved in the namespace 227167802Sjkim * 228167802Sjkim ******************************************************************************/ 229167802Sjkim 230167802Sjkimvoid 231167802SjkimAcpiDmFindOrphanMethods ( 232167802Sjkim ACPI_PARSE_OBJECT *Origin) 233167802Sjkim{ 234167802Sjkim ACPI_OP_WALK_INFO Info; 235167802Sjkim 236167802Sjkim 237167802Sjkim if (!Origin) 238167802Sjkim { 239167802Sjkim return; 240167802Sjkim } 241167802Sjkim 242167802Sjkim Info.Flags = 0; 243167802Sjkim Info.Level = 0; 244167802Sjkim Info.WalkState = NULL; 245167802Sjkim AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info); 246167802Sjkim} 247167802Sjkim 248167802Sjkim 249167802Sjkim/******************************************************************************* 250167802Sjkim * 251167802Sjkim * FUNCTION: AcpiDmFinishNamespaceLoad 252167802Sjkim * 253167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 254167802Sjkim * NamespaceRoot - Root of the internal namespace 255193529Sjkim * OwnerId - OwnerId of the table to be disassembled 256167802Sjkim * 257167802Sjkim * RETURN: None 258167802Sjkim * 259167802Sjkim * DESCRIPTION: Load all namespace items that are created within control 260167802Sjkim * methods. Used before namespace cross reference 261167802Sjkim * 262167802Sjkim ******************************************************************************/ 263167802Sjkim 264167802Sjkimvoid 265167802SjkimAcpiDmFinishNamespaceLoad ( 266167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 267193529Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot, 268193529Sjkim ACPI_OWNER_ID OwnerId) 269167802Sjkim{ 270167802Sjkim ACPI_STATUS Status; 271167802Sjkim ACPI_OP_WALK_INFO Info; 272167802Sjkim ACPI_WALK_STATE *WalkState; 273167802Sjkim 274167802Sjkim 275167802Sjkim if (!ParseTreeRoot) 276167802Sjkim { 277167802Sjkim return; 278167802Sjkim } 279167802Sjkim 280167802Sjkim /* Create and initialize a new walk state */ 281167802Sjkim 282193529Sjkim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 283167802Sjkim if (!WalkState) 284167802Sjkim { 285167802Sjkim return; 286167802Sjkim } 287167802Sjkim 288167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 289167802Sjkim if (ACPI_FAILURE (Status)) 290167802Sjkim { 291167802Sjkim return; 292167802Sjkim } 293167802Sjkim 294167802Sjkim Info.Flags = 0; 295167802Sjkim Info.Level = 0; 296167802Sjkim Info.WalkState = WalkState; 297167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp, 298167802Sjkim AcpiDmCommonAscendingOp, &Info); 299167802Sjkim ACPI_FREE (WalkState); 300167802Sjkim} 301167802Sjkim 302167802Sjkim 303167802Sjkim/******************************************************************************* 304167802Sjkim * 305167802Sjkim * FUNCTION: AcpiDmCrossReferenceNamespace 306167802Sjkim * 307167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 308167802Sjkim * NamespaceRoot - Root of the internal namespace 309193529Sjkim * OwnerId - OwnerId of the table to be disassembled 310167802Sjkim * 311167802Sjkim * RETURN: None 312167802Sjkim * 313167802Sjkim * DESCRIPTION: Cross reference the namespace to create externals 314167802Sjkim * 315167802Sjkim ******************************************************************************/ 316167802Sjkim 317167802Sjkimvoid 318167802SjkimAcpiDmCrossReferenceNamespace ( 319167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 320193529Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot, 321193529Sjkim ACPI_OWNER_ID OwnerId) 322167802Sjkim{ 323167802Sjkim ACPI_STATUS Status; 324167802Sjkim ACPI_OP_WALK_INFO Info; 325167802Sjkim ACPI_WALK_STATE *WalkState; 326167802Sjkim 327167802Sjkim 328167802Sjkim if (!ParseTreeRoot) 329167802Sjkim { 330167802Sjkim return; 331167802Sjkim } 332167802Sjkim 333167802Sjkim /* Create and initialize a new walk state */ 334167802Sjkim 335193529Sjkim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 336167802Sjkim if (!WalkState) 337167802Sjkim { 338167802Sjkim return; 339167802Sjkim } 340167802Sjkim 341167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 342167802Sjkim if (ACPI_FAILURE (Status)) 343167802Sjkim { 344167802Sjkim return; 345167802Sjkim } 346167802Sjkim 347167802Sjkim Info.Flags = 0; 348167802Sjkim Info.Level = 0; 349167802Sjkim Info.WalkState = WalkState; 350167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp, 351167802Sjkim AcpiDmCommonAscendingOp, &Info); 352167802Sjkim ACPI_FREE (WalkState); 353167802Sjkim} 354167802Sjkim 355167802Sjkim 356167802Sjkim/******************************************************************************* 357167802Sjkim * 358167802Sjkim * FUNCTION: AcpiDmConvertResourceIndexes 359167802Sjkim * 360167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 361167802Sjkim * NamespaceRoot - Root of the internal namespace 362167802Sjkim * 363167802Sjkim * RETURN: None 364167802Sjkim * 365167802Sjkim * DESCRIPTION: Convert fixed-offset references to resource descriptors to 366167802Sjkim * symbolic references. Should only be called after namespace has 367167802Sjkim * been cross referenced. 368167802Sjkim * 369167802Sjkim ******************************************************************************/ 370167802Sjkim 371167802Sjkimvoid 372167802SjkimAcpiDmConvertResourceIndexes ( 373167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 374167802Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot) 375167802Sjkim{ 376167802Sjkim ACPI_STATUS Status; 377167802Sjkim ACPI_OP_WALK_INFO Info; 378167802Sjkim ACPI_WALK_STATE *WalkState; 379167802Sjkim 380167802Sjkim 381167802Sjkim if (!ParseTreeRoot) 382167802Sjkim { 383167802Sjkim return; 384167802Sjkim } 385167802Sjkim 386167802Sjkim /* Create and initialize a new walk state */ 387167802Sjkim 388167802Sjkim WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL); 389167802Sjkim if (!WalkState) 390167802Sjkim { 391167802Sjkim return; 392167802Sjkim } 393167802Sjkim 394167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 395167802Sjkim if (ACPI_FAILURE (Status)) 396167802Sjkim { 397167802Sjkim return; 398167802Sjkim } 399167802Sjkim 400167802Sjkim Info.Flags = 0; 401167802Sjkim Info.Level = 0; 402167802Sjkim Info.WalkState = WalkState; 403167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp, 404167802Sjkim AcpiDmCommonAscendingOp, &Info); 405167802Sjkim ACPI_FREE (WalkState); 406167802Sjkim return; 407167802Sjkim} 408167802Sjkim 409167802Sjkim 410167802Sjkim/******************************************************************************* 411167802Sjkim * 412167802Sjkim * FUNCTION: AcpiDmDumpDescending 413167802Sjkim * 414167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 415167802Sjkim * 416167802Sjkim * RETURN: Status 417167802Sjkim * 418167802Sjkim * DESCRIPTION: Format and print contents of one parse Op. 419167802Sjkim * 420167802Sjkim ******************************************************************************/ 421167802Sjkim 422167802Sjkimstatic ACPI_STATUS 423167802SjkimAcpiDmDumpDescending ( 424167802Sjkim ACPI_PARSE_OBJECT *Op, 425167802Sjkim UINT32 Level, 426167802Sjkim void *Context) 427167802Sjkim{ 428167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 429167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 430167802Sjkim char *Path; 431167802Sjkim 432167802Sjkim 433167802Sjkim if (!Op) 434167802Sjkim { 435167802Sjkim return (AE_OK); 436167802Sjkim } 437167802Sjkim 438167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 439167802Sjkim Info->Count++; 440167802Sjkim 441167802Sjkim /* Most of the information (count, level, name) here */ 442167802Sjkim 443167802Sjkim AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level); 444167802Sjkim AcpiDmIndent (Level); 445167802Sjkim AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode)); 446167802Sjkim 447167802Sjkim /* Extra info is helpful */ 448167802Sjkim 449167802Sjkim switch (Op->Common.AmlOpcode) 450167802Sjkim { 451167802Sjkim case AML_BYTE_OP: 452167802Sjkim case AML_WORD_OP: 453167802Sjkim case AML_DWORD_OP: 454167802Sjkim AcpiOsPrintf ("%X", (UINT32) Op->Common.Value.Integer); 455167802Sjkim break; 456167802Sjkim 457167802Sjkim case AML_INT_NAMEPATH_OP: 458167802Sjkim if (Op->Common.Value.String) 459167802Sjkim { 460167802Sjkim AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String, 461167802Sjkim NULL, &Path); 462167802Sjkim AcpiOsPrintf ("%s %p", Path, Op->Common.Node); 463167802Sjkim ACPI_FREE (Path); 464167802Sjkim } 465167802Sjkim else 466167802Sjkim { 467167802Sjkim AcpiOsPrintf ("[NULL]"); 468167802Sjkim } 469167802Sjkim break; 470167802Sjkim 471167802Sjkim case AML_NAME_OP: 472167802Sjkim case AML_METHOD_OP: 473167802Sjkim case AML_DEVICE_OP: 474167802Sjkim case AML_INT_NAMEDFIELD_OP: 475167802Sjkim AcpiOsPrintf ("%4.4s", &Op->Named.Name); 476167802Sjkim break; 477193529Sjkim 478193529Sjkim default: 479193529Sjkim break; 480167802Sjkim } 481167802Sjkim 482167802Sjkim AcpiOsPrintf ("\n"); 483167802Sjkim return (AE_OK); 484167802Sjkim} 485167802Sjkim 486167802Sjkim 487167802Sjkim/******************************************************************************* 488167802Sjkim * 489167802Sjkim * FUNCTION: AcpiDmFindOrphanDescending 490167802Sjkim * 491167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 492167802Sjkim * 493167802Sjkim * RETURN: Status 494167802Sjkim * 495167802Sjkim * DESCRIPTION: Check namepath Ops for orphaned method invocations 496167802Sjkim * 497167802Sjkim * Note: Experimental. 498167802Sjkim * 499167802Sjkim ******************************************************************************/ 500167802Sjkim 501167802Sjkimstatic ACPI_STATUS 502167802SjkimAcpiDmFindOrphanDescending ( 503167802Sjkim ACPI_PARSE_OBJECT *Op, 504167802Sjkim UINT32 Level, 505167802Sjkim void *Context) 506167802Sjkim{ 507167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 508167802Sjkim ACPI_PARSE_OBJECT *ChildOp; 509167802Sjkim ACPI_PARSE_OBJECT *NextOp; 510167802Sjkim ACPI_PARSE_OBJECT *ParentOp; 511167802Sjkim UINT32 ArgCount; 512167802Sjkim 513167802Sjkim 514167802Sjkim if (!Op) 515167802Sjkim { 516167802Sjkim return (AE_OK); 517167802Sjkim } 518167802Sjkim 519167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 520167802Sjkim 521167802Sjkim switch (Op->Common.AmlOpcode) 522167802Sjkim { 523167802Sjkim#ifdef ACPI_UNDER_DEVELOPMENT 524167802Sjkim case AML_ADD_OP: 525167802Sjkim ChildOp = Op->Common.Value.Arg; 526167802Sjkim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 527167802Sjkim !ChildOp->Common.Node) 528167802Sjkim { 529167802Sjkim AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String, 530167802Sjkim NULL, &Path); 531167802Sjkim AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n", Op->Common.AmlOpName, Path); 532167802Sjkim ACPI_FREE (Path); 533167802Sjkim 534167802Sjkim NextOp = Op->Common.Next; 535167802Sjkim if (!NextOp) 536167802Sjkim { 537167802Sjkim /* This NamePath has no args, assume it is an integer */ 538167802Sjkim 539167802Sjkim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 540167802Sjkim return (AE_OK); 541167802Sjkim } 542167802Sjkim 543167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp); 544167802Sjkim AcpiOsPrintf ("/* A-CHILDREN: %d Actual %d */\n", ArgCount, AcpiDmCountChildren (Op)); 545167802Sjkim 546167802Sjkim if (ArgCount < 1) 547167802Sjkim { 548167802Sjkim /* One Arg means this is just a Store(Name,Target) */ 549167802Sjkim 550167802Sjkim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 551167802Sjkim return (AE_OK); 552167802Sjkim } 553167802Sjkim 554167802Sjkim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 555167802Sjkim } 556167802Sjkim break; 557167802Sjkim#endif 558167802Sjkim 559167802Sjkim case AML_STORE_OP: 560167802Sjkim 561167802Sjkim ChildOp = Op->Common.Value.Arg; 562167802Sjkim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 563167802Sjkim !ChildOp->Common.Node) 564167802Sjkim { 565167802Sjkim NextOp = Op->Common.Next; 566167802Sjkim if (!NextOp) 567167802Sjkim { 568167802Sjkim /* This NamePath has no args, assume it is an integer */ 569167802Sjkim 570167802Sjkim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 571167802Sjkim return (AE_OK); 572167802Sjkim } 573167802Sjkim 574167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp); 575167802Sjkim if (ArgCount <= 1) 576167802Sjkim { 577167802Sjkim /* One Arg means this is just a Store(Name,Target) */ 578167802Sjkim 579167802Sjkim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); 580167802Sjkim return (AE_OK); 581167802Sjkim } 582167802Sjkim 583167802Sjkim AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 584167802Sjkim } 585167802Sjkim break; 586167802Sjkim 587167802Sjkim case AML_INT_NAMEPATH_OP: 588167802Sjkim 589167802Sjkim /* Must examine parent to see if this namepath is an argument */ 590167802Sjkim 591167802Sjkim ParentOp = Op->Common.Parent; 592167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode); 593167802Sjkim 594167802Sjkim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 595167802Sjkim (OpInfo->Class != AML_CLASS_CREATE) && 596167802Sjkim (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && 597167802Sjkim !Op->Common.Node) 598167802Sjkim { 599167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next); 600167802Sjkim 601167802Sjkim /* 602167802Sjkim * Check if namepath is a predicate for if/while or lone parameter to 603167802Sjkim * a return. 604167802Sjkim */ 605167802Sjkim if (ArgCount == 0) 606167802Sjkim { 607167802Sjkim if (((ParentOp->Common.AmlOpcode == AML_IF_OP) || 608167802Sjkim (ParentOp->Common.AmlOpcode == AML_WHILE_OP) || 609167802Sjkim (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) && 610167802Sjkim 611167802Sjkim /* And namepath is the first argument */ 612167802Sjkim (ParentOp->Common.Value.Arg == Op)) 613167802Sjkim { 614167802Sjkim AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_INTEGER, 0); 615167802Sjkim break; 616167802Sjkim } 617167802Sjkim } 618167802Sjkim 619167802Sjkim /* 620167802Sjkim * This is a standalone namestring (not a parameter to another 621167802Sjkim * operator) - it *must* be a method invocation, nothing else is 622167802Sjkim * grammatically possible. 623167802Sjkim */ 624167802Sjkim AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); 625167802Sjkim 626167802Sjkim } 627167802Sjkim break; 628193529Sjkim 629193529Sjkim default: 630193529Sjkim break; 631167802Sjkim } 632167802Sjkim 633167802Sjkim return (AE_OK); 634167802Sjkim} 635167802Sjkim 636167802Sjkim 637167802Sjkim/******************************************************************************* 638167802Sjkim * 639167802Sjkim * FUNCTION: AcpiDmLoadDescendingOp 640167802Sjkim * 641167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 642167802Sjkim * 643167802Sjkim * RETURN: Status 644167802Sjkim * 645167802Sjkim * DESCRIPTION: Descending handler for namespace control method object load 646167802Sjkim * 647167802Sjkim ******************************************************************************/ 648167802Sjkim 649167802Sjkimstatic ACPI_STATUS 650167802SjkimAcpiDmLoadDescendingOp ( 651167802Sjkim ACPI_PARSE_OBJECT *Op, 652167802Sjkim UINT32 Level, 653167802Sjkim void *Context) 654167802Sjkim{ 655167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 656167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 657167802Sjkim ACPI_WALK_STATE *WalkState; 658167802Sjkim ACPI_OBJECT_TYPE ObjectType; 659167802Sjkim ACPI_STATUS Status; 660167802Sjkim char *Path = NULL; 661167802Sjkim ACPI_PARSE_OBJECT *NextOp; 662167802Sjkim ACPI_NAMESPACE_NODE *Node; 663193529Sjkim char FieldPath[5]; 664193529Sjkim BOOLEAN PreDefined = FALSE; 665193529Sjkim UINT8 PreDefineIndex = 0; 666167802Sjkim 667167802Sjkim 668167802Sjkim WalkState = Info->WalkState; 669167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 670167802Sjkim ObjectType = OpInfo->ObjectType; 671167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 672167802Sjkim 673167802Sjkim /* Only interested in operators that create new names */ 674167802Sjkim 675167802Sjkim if (!(OpInfo->Flags & AML_NAMED) && 676167802Sjkim !(OpInfo->Flags & AML_CREATE)) 677167802Sjkim { 678167802Sjkim goto Exit; 679167802Sjkim } 680167802Sjkim 681167802Sjkim /* Get the NamePath from the appropriate place */ 682167802Sjkim 683167802Sjkim if (OpInfo->Flags & AML_NAMED) 684167802Sjkim { 685167802Sjkim /* For all named operators, get the new name */ 686167802Sjkim 687167802Sjkim Path = (char *) Op->Named.Path; 688193529Sjkim 689193529Sjkim if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 690193529Sjkim { 691193529Sjkim *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name; 692193529Sjkim FieldPath[4] = 0; 693193529Sjkim Path = FieldPath; 694193529Sjkim } 695167802Sjkim } 696167802Sjkim else if (OpInfo->Flags & AML_CREATE) 697167802Sjkim { 698167802Sjkim /* New name is the last child */ 699167802Sjkim 700167802Sjkim NextOp = Op->Common.Value.Arg; 701167802Sjkim 702167802Sjkim while (NextOp->Common.Next) 703167802Sjkim { 704167802Sjkim NextOp = NextOp->Common.Next; 705167802Sjkim } 706167802Sjkim Path = NextOp->Common.Value.String; 707167802Sjkim } 708167802Sjkim 709167802Sjkim if (!Path) 710167802Sjkim { 711167802Sjkim goto Exit; 712167802Sjkim } 713167802Sjkim 714167802Sjkim /* Insert the name into the namespace */ 715167802Sjkim 716167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 717167802Sjkim ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE, 718167802Sjkim WalkState, &Node); 719167802Sjkim 720167802Sjkim Op->Common.Node = Node; 721167802Sjkim 722193529Sjkim if (ACPI_SUCCESS (Status)) 723193529Sjkim { 724193529Sjkim /* Check if it's a predefined node */ 725167802Sjkim 726193529Sjkim while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name) 727193529Sjkim { 728193529Sjkim if (!ACPI_STRNCMP (Node->Name.Ascii, 729193529Sjkim AcpiGbl_PreDefinedNames[PreDefineIndex].Name, 4)) 730193529Sjkim { 731193529Sjkim PreDefined = TRUE; 732193529Sjkim break; 733193529Sjkim } 734193529Sjkim 735193529Sjkim PreDefineIndex++; 736193529Sjkim } 737193529Sjkim 738193529Sjkim /* 739193529Sjkim * Set node owner id if it satisfies all the following conditions: 740193529Sjkim * 1) Not a predefined node, _SB_ etc 741193529Sjkim * 2) Not the root node 742193529Sjkim * 3) Not a node created by Scope 743193529Sjkim */ 744193529Sjkim 745193529Sjkim if (!PreDefined && Node != AcpiGbl_RootNode && 746193529Sjkim Op->Common.AmlOpcode != AML_SCOPE_OP) 747193529Sjkim { 748193529Sjkim Node->OwnerId = WalkState->OwnerId; 749193529Sjkim } 750193529Sjkim } 751193529Sjkim 752193529Sjkim 753167802SjkimExit: 754167802Sjkim 755167802Sjkim if (AcpiNsOpensScope (ObjectType)) 756167802Sjkim { 757167802Sjkim if (Op->Common.Node) 758167802Sjkim { 759167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 760167802Sjkim if (ACPI_FAILURE (Status)) 761167802Sjkim { 762167802Sjkim return (Status); 763167802Sjkim } 764167802Sjkim } 765167802Sjkim } 766167802Sjkim 767167802Sjkim return (AE_OK); 768167802Sjkim} 769167802Sjkim 770167802Sjkim 771167802Sjkim/******************************************************************************* 772167802Sjkim * 773167802Sjkim * FUNCTION: AcpiDmXrefDescendingOp 774167802Sjkim * 775167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 776167802Sjkim * 777167802Sjkim * RETURN: Status 778167802Sjkim * 779167802Sjkim * DESCRIPTION: Descending handler for namespace cross reference 780167802Sjkim * 781167802Sjkim ******************************************************************************/ 782167802Sjkim 783167802Sjkimstatic ACPI_STATUS 784167802SjkimAcpiDmXrefDescendingOp ( 785167802Sjkim ACPI_PARSE_OBJECT *Op, 786167802Sjkim UINT32 Level, 787167802Sjkim void *Context) 788167802Sjkim{ 789167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 790167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 791167802Sjkim ACPI_WALK_STATE *WalkState; 792167802Sjkim ACPI_OBJECT_TYPE ObjectType; 793193529Sjkim ACPI_OBJECT_TYPE ObjectType2; 794167802Sjkim ACPI_STATUS Status; 795167802Sjkim char *Path = NULL; 796167802Sjkim ACPI_PARSE_OBJECT *NextOp; 797167802Sjkim ACPI_NAMESPACE_NODE *Node; 798193529Sjkim ACPI_OPERAND_OBJECT *Object; 799167802Sjkim 800167802Sjkim 801167802Sjkim WalkState = Info->WalkState; 802167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 803167802Sjkim ObjectType = OpInfo->ObjectType; 804167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 805167802Sjkim 806167802Sjkim if ((!(OpInfo->Flags & AML_NAMED)) && 807167802Sjkim (!(OpInfo->Flags & AML_CREATE)) && 808167802Sjkim (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP)) 809167802Sjkim { 810167802Sjkim goto Exit; 811167802Sjkim } 812167802Sjkim 813167802Sjkim /* Get the NamePath from the appropriate place */ 814167802Sjkim 815167802Sjkim if (OpInfo->Flags & AML_NAMED) 816167802Sjkim { 817167802Sjkim if ((Op->Common.AmlOpcode == AML_ALIAS_OP) || 818167802Sjkim (Op->Common.AmlOpcode == AML_SCOPE_OP)) 819167802Sjkim { 820167802Sjkim /* 821167802Sjkim * Only these two operators refer to an existing name, 822167802Sjkim * first argument 823167802Sjkim */ 824167802Sjkim Path = (char *) Op->Named.Path; 825167802Sjkim } 826167802Sjkim } 827167802Sjkim else if (OpInfo->Flags & AML_CREATE) 828167802Sjkim { 829167802Sjkim /* Referenced Buffer Name is the first child */ 830167802Sjkim 831167802Sjkim NextOp = Op->Common.Value.Arg; 832167802Sjkim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 833167802Sjkim { 834167802Sjkim Path = NextOp->Common.Value.String; 835167802Sjkim } 836167802Sjkim } 837167802Sjkim else 838167802Sjkim { 839167802Sjkim Path = Op->Common.Value.String; 840167802Sjkim } 841167802Sjkim 842167802Sjkim if (!Path) 843167802Sjkim { 844167802Sjkim goto Exit; 845167802Sjkim } 846167802Sjkim 847167802Sjkim /* 848167802Sjkim * Lookup the name in the namespace. Name must exist at this point, or it 849167802Sjkim * is an invalid reference. 850167802Sjkim * 851167802Sjkim * The namespace is also used as a lookup table for references to resource 852167802Sjkim * descriptors and the fields within them. 853167802Sjkim */ 854167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 855167802Sjkim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 856167802Sjkim WalkState, &Node); 857167802Sjkim if (ACPI_FAILURE (Status)) 858167802Sjkim { 859167802Sjkim if (Status == AE_NOT_FOUND) 860167802Sjkim { 861167802Sjkim AcpiDmAddToExternalList (Path, (UINT8) ObjectType, 0); 862167802Sjkim 863167802Sjkim /* 864167802Sjkim * We could install this into the namespace, but we catch duplicate 865167802Sjkim * externals when they are added to the list. 866167802Sjkim */ 867167802Sjkim#if 0 868167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 869167802Sjkim ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE, 870167802Sjkim WalkState, &Node); 871167802Sjkim#endif 872167802Sjkim } 873167802Sjkim } 874193529Sjkim 875193529Sjkim /* 876193529Sjkim * Found the node in external table, add it to external list 877193529Sjkim * Node->OwnerId == 0 indicates built-in ACPI Names, _OS_ etc 878193529Sjkim */ 879193529Sjkim else if (Node->OwnerId && WalkState->OwnerId != Node->OwnerId) 880193529Sjkim { 881193529Sjkim ObjectType2 = ObjectType; 882193529Sjkim 883193529Sjkim Object = AcpiNsGetAttachedObject (Node); 884193529Sjkim if (Object) 885193529Sjkim { 886193529Sjkim ObjectType2 = Object->Common.Type; 887193529Sjkim } 888193529Sjkim 889193529Sjkim if (ObjectType2 == ACPI_TYPE_METHOD) 890193529Sjkim { 891193529Sjkim AcpiDmAddToExternalList (Path, ACPI_TYPE_METHOD, 892193529Sjkim Object->Method.ParamCount); 893193529Sjkim } 894193529Sjkim else 895193529Sjkim { 896193529Sjkim AcpiDmAddToExternalList (Path, (UINT8) ObjectType2, 0); 897193529Sjkim } 898193529Sjkim 899193529Sjkim Op->Common.Node = Node; 900193529Sjkim } 901167802Sjkim else 902167802Sjkim { 903167802Sjkim Op->Common.Node = Node; 904167802Sjkim } 905167802Sjkim 906167802Sjkim 907167802SjkimExit: 908167802Sjkim /* Open new scope if necessary */ 909167802Sjkim 910167802Sjkim if (AcpiNsOpensScope (ObjectType)) 911167802Sjkim { 912167802Sjkim if (Op->Common.Node) 913167802Sjkim { 914167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 915167802Sjkim if (ACPI_FAILURE (Status)) 916167802Sjkim { 917167802Sjkim return (Status); 918167802Sjkim } 919167802Sjkim } 920167802Sjkim } 921167802Sjkim 922167802Sjkim return (AE_OK); 923167802Sjkim} 924167802Sjkim 925167802Sjkim 926167802Sjkim/******************************************************************************* 927167802Sjkim * 928167802Sjkim * FUNCTION: AcpiDmResourceDescendingOp 929167802Sjkim * 930167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 931167802Sjkim * 932167802Sjkim * RETURN: None 933167802Sjkim * 934167802Sjkim * DESCRIPTION: Process one parse op during symbolic resource index conversion. 935167802Sjkim * 936167802Sjkim ******************************************************************************/ 937167802Sjkim 938167802Sjkimstatic ACPI_STATUS 939167802SjkimAcpiDmResourceDescendingOp ( 940167802Sjkim ACPI_PARSE_OBJECT *Op, 941167802Sjkim UINT32 Level, 942167802Sjkim void *Context) 943167802Sjkim{ 944167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 945167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 946167802Sjkim ACPI_WALK_STATE *WalkState; 947167802Sjkim ACPI_OBJECT_TYPE ObjectType; 948167802Sjkim ACPI_STATUS Status; 949167802Sjkim 950167802Sjkim 951167802Sjkim WalkState = Info->WalkState; 952167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 953167802Sjkim 954167802Sjkim /* Open new scope if necessary */ 955167802Sjkim 956167802Sjkim ObjectType = OpInfo->ObjectType; 957167802Sjkim if (AcpiNsOpensScope (ObjectType)) 958167802Sjkim { 959167802Sjkim if (Op->Common.Node) 960167802Sjkim { 961167802Sjkim 962167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 963167802Sjkim if (ACPI_FAILURE (Status)) 964167802Sjkim { 965167802Sjkim return (Status); 966167802Sjkim } 967167802Sjkim } 968167802Sjkim } 969167802Sjkim 970167802Sjkim /* 971167802Sjkim * Check if this operator contains a reference to a resource descriptor. 972167802Sjkim * If so, convert the reference into a symbolic reference. 973167802Sjkim */ 974167802Sjkim AcpiDmCheckResourceReference (Op, WalkState); 975167802Sjkim return (AE_OK); 976167802Sjkim} 977167802Sjkim 978167802Sjkim 979167802Sjkim/******************************************************************************* 980167802Sjkim * 981167802Sjkim * FUNCTION: AcpiDmCommonAscendingOp 982167802Sjkim * 983167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 984167802Sjkim * 985167802Sjkim * RETURN: None 986167802Sjkim * 987167802Sjkim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes 988167802Sjkim * scope if necessary. 989167802Sjkim * 990167802Sjkim ******************************************************************************/ 991167802Sjkim 992167802Sjkimstatic ACPI_STATUS 993167802SjkimAcpiDmCommonAscendingOp ( 994167802Sjkim ACPI_PARSE_OBJECT *Op, 995167802Sjkim UINT32 Level, 996167802Sjkim void *Context) 997167802Sjkim{ 998167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 999167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 1000167802Sjkim ACPI_OBJECT_TYPE ObjectType; 1001167802Sjkim 1002167802Sjkim 1003167802Sjkim /* Close scope if necessary */ 1004167802Sjkim 1005167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 1006167802Sjkim ObjectType = OpInfo->ObjectType; 1007167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 1008167802Sjkim 1009167802Sjkim if (AcpiNsOpensScope (ObjectType)) 1010167802Sjkim { 1011167802Sjkim (void) AcpiDsScopeStackPop (Info->WalkState); 1012167802Sjkim } 1013167802Sjkim 1014167802Sjkim return (AE_OK); 1015167802Sjkim} 1016167802Sjkim 1017167802Sjkim 1018167802Sjkim/******************************************************************************* 1019167802Sjkim * 1020167802Sjkim * FUNCTION: AcpiDmInspectPossibleArgs 1021167802Sjkim * 1022167802Sjkim * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the 1023167802Sjkim * possible method invocation found 1024167802Sjkim * TargetCount - Number of targets (0,1,2) for this op 1025167802Sjkim * Op - Parse op 1026167802Sjkim * 1027167802Sjkim * RETURN: Status 1028167802Sjkim * 1029167802Sjkim * DESCRIPTION: Examine following args and next ops for possible arguments 1030167802Sjkim * for an unrecognized method invocation. 1031167802Sjkim * 1032167802Sjkim ******************************************************************************/ 1033167802Sjkim 1034167802Sjkimstatic UINT32 1035167802SjkimAcpiDmInspectPossibleArgs ( 1036167802Sjkim UINT32 CurrentOpArgCount, 1037167802Sjkim UINT32 TargetCount, 1038167802Sjkim ACPI_PARSE_OBJECT *Op) 1039167802Sjkim{ 1040167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 1041167802Sjkim UINT32 i; 1042167802Sjkim UINT32 Last = 0; 1043167802Sjkim UINT32 Lookahead; 1044167802Sjkim 1045167802Sjkim 1046167802Sjkim Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount; 1047167802Sjkim 1048167802Sjkim /* Lookahead for the maximum number of possible arguments */ 1049167802Sjkim 1050167802Sjkim for (i = 0; i < Lookahead; i++) 1051167802Sjkim { 1052167802Sjkim if (!Op) 1053167802Sjkim { 1054167802Sjkim break; 1055167802Sjkim } 1056167802Sjkim 1057167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 1058167802Sjkim 1059167802Sjkim /* 1060167802Sjkim * Any one of these operators is "very probably" not a method arg 1061167802Sjkim */ 1062167802Sjkim if ((Op->Common.AmlOpcode == AML_STORE_OP) || 1063167802Sjkim (Op->Common.AmlOpcode == AML_NOTIFY_OP)) 1064167802Sjkim { 1065167802Sjkim break; 1066167802Sjkim } 1067167802Sjkim 1068167802Sjkim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 1069167802Sjkim (OpInfo->Class != AML_CLASS_CONTROL)) 1070167802Sjkim { 1071167802Sjkim Last = i+1; 1072167802Sjkim } 1073167802Sjkim 1074167802Sjkim Op = Op->Common.Next; 1075167802Sjkim } 1076167802Sjkim 1077167802Sjkim return (Last); 1078167802Sjkim} 1079167802Sjkim 1080167802Sjkim 1081