1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: adwalk - Application-level disassembler parse tree walk routines 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp. 9167802Sjkim * All rights reserved. 10167802Sjkim * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25167802Sjkim * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29167802Sjkim * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43167802Sjkim 44193529Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193529Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193529Sjkim#include <contrib/dev/acpica/include/acparser.h> 47193529Sjkim#include <contrib/dev/acpica/include/amlcode.h> 48193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 49193529Sjkim#include <contrib/dev/acpica/include/acdispat.h> 50193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 51193529Sjkim#include <contrib/dev/acpica/include/acapps.h> 52167802Sjkim 53167802Sjkim 54167802Sjkim#define _COMPONENT ACPI_TOOLS 55167802Sjkim ACPI_MODULE_NAME ("adwalk") 56167802Sjkim 57167802Sjkim/* 58167802Sjkim * aslmap - opcode mappings and reserved method names 59167802Sjkim */ 60167802SjkimACPI_OBJECT_TYPE 61167802SjkimAslMapNamedOpcodeToDataType ( 62167802Sjkim UINT16 Opcode); 63167802Sjkim 64167802Sjkim/* Local prototypes */ 65167802Sjkim 66167802Sjkimstatic ACPI_STATUS 67167802SjkimAcpiDmFindOrphanDescending ( 68167802Sjkim ACPI_PARSE_OBJECT *Op, 69167802Sjkim UINT32 Level, 70167802Sjkim void *Context); 71167802Sjkim 72167802Sjkimstatic ACPI_STATUS 73167802SjkimAcpiDmDumpDescending ( 74167802Sjkim ACPI_PARSE_OBJECT *Op, 75167802Sjkim UINT32 Level, 76167802Sjkim void *Context); 77167802Sjkim 78167802Sjkimstatic ACPI_STATUS 79167802SjkimAcpiDmXrefDescendingOp ( 80167802Sjkim ACPI_PARSE_OBJECT *Op, 81167802Sjkim UINT32 Level, 82167802Sjkim void *Context); 83167802Sjkim 84167802Sjkimstatic ACPI_STATUS 85167802SjkimAcpiDmCommonAscendingOp ( 86167802Sjkim ACPI_PARSE_OBJECT *Op, 87167802Sjkim UINT32 Level, 88167802Sjkim void *Context); 89167802Sjkim 90167802Sjkimstatic ACPI_STATUS 91167802SjkimAcpiDmLoadDescendingOp ( 92167802Sjkim ACPI_PARSE_OBJECT *Op, 93167802Sjkim UINT32 Level, 94167802Sjkim void *Context); 95167802Sjkim 96167802Sjkimstatic UINT32 97167802SjkimAcpiDmInspectPossibleArgs ( 98167802Sjkim UINT32 CurrentOpArgCount, 99167802Sjkim UINT32 TargetCount, 100167802Sjkim ACPI_PARSE_OBJECT *Op); 101167802Sjkim 102167802Sjkimstatic ACPI_STATUS 103167802SjkimAcpiDmResourceDescendingOp ( 104167802Sjkim ACPI_PARSE_OBJECT *Op, 105167802Sjkim UINT32 Level, 106167802Sjkim void *Context); 107167802Sjkim 108167802Sjkim 109167802Sjkim/******************************************************************************* 110167802Sjkim * 111167802Sjkim * FUNCTION: AcpiDmDumpTree 112167802Sjkim * 113198237Sjkim * PARAMETERS: Origin - Starting object 114167802Sjkim * 115167802Sjkim * RETURN: None 116167802Sjkim * 117167802Sjkim * DESCRIPTION: Parse tree walk to format and output the nodes 118167802Sjkim * 119167802Sjkim ******************************************************************************/ 120167802Sjkim 121167802Sjkimvoid 122167802SjkimAcpiDmDumpTree ( 123167802Sjkim ACPI_PARSE_OBJECT *Origin) 124167802Sjkim{ 125167802Sjkim ACPI_OP_WALK_INFO Info; 126167802Sjkim 127167802Sjkim 128167802Sjkim if (!Origin) 129167802Sjkim { 130167802Sjkim return; 131167802Sjkim } 132167802Sjkim 133167802Sjkim AcpiOsPrintf ("/*\nAML Parse Tree\n\n"); 134167802Sjkim Info.Flags = 0; 135167802Sjkim Info.Count = 0; 136167802Sjkim Info.Level = 0; 137167802Sjkim Info.WalkState = NULL; 138167802Sjkim AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info); 139167802Sjkim AcpiOsPrintf ("*/\n\n"); 140167802Sjkim} 141167802Sjkim 142167802Sjkim 143167802Sjkim/******************************************************************************* 144167802Sjkim * 145167802Sjkim * FUNCTION: AcpiDmFindOrphanMethods 146167802Sjkim * 147198237Sjkim * PARAMETERS: Origin - Starting object 148167802Sjkim * 149167802Sjkim * RETURN: None 150167802Sjkim * 151167802Sjkim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods 152167802Sjkim * that are not resolved in the namespace 153167802Sjkim * 154167802Sjkim ******************************************************************************/ 155167802Sjkim 156167802Sjkimvoid 157167802SjkimAcpiDmFindOrphanMethods ( 158167802Sjkim ACPI_PARSE_OBJECT *Origin) 159167802Sjkim{ 160167802Sjkim ACPI_OP_WALK_INFO Info; 161167802Sjkim 162167802Sjkim 163167802Sjkim if (!Origin) 164167802Sjkim { 165167802Sjkim return; 166167802Sjkim } 167167802Sjkim 168167802Sjkim Info.Flags = 0; 169167802Sjkim Info.Level = 0; 170167802Sjkim Info.WalkState = NULL; 171167802Sjkim AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info); 172167802Sjkim} 173167802Sjkim 174167802Sjkim 175167802Sjkim/******************************************************************************* 176167802Sjkim * 177167802Sjkim * FUNCTION: AcpiDmFinishNamespaceLoad 178167802Sjkim * 179167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 180167802Sjkim * NamespaceRoot - Root of the internal namespace 181193529Sjkim * OwnerId - OwnerId of the table to be disassembled 182167802Sjkim * 183167802Sjkim * RETURN: None 184167802Sjkim * 185167802Sjkim * DESCRIPTION: Load all namespace items that are created within control 186167802Sjkim * methods. Used before namespace cross reference 187167802Sjkim * 188167802Sjkim ******************************************************************************/ 189167802Sjkim 190167802Sjkimvoid 191167802SjkimAcpiDmFinishNamespaceLoad ( 192167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 193193529Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot, 194193529Sjkim ACPI_OWNER_ID OwnerId) 195167802Sjkim{ 196167802Sjkim ACPI_STATUS Status; 197167802Sjkim ACPI_OP_WALK_INFO Info; 198167802Sjkim ACPI_WALK_STATE *WalkState; 199167802Sjkim 200167802Sjkim 201167802Sjkim if (!ParseTreeRoot) 202167802Sjkim { 203167802Sjkim return; 204167802Sjkim } 205167802Sjkim 206167802Sjkim /* Create and initialize a new walk state */ 207167802Sjkim 208193529Sjkim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 209167802Sjkim if (!WalkState) 210167802Sjkim { 211167802Sjkim return; 212167802Sjkim } 213167802Sjkim 214167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 215167802Sjkim if (ACPI_FAILURE (Status)) 216167802Sjkim { 217167802Sjkim return; 218167802Sjkim } 219167802Sjkim 220167802Sjkim Info.Flags = 0; 221167802Sjkim Info.Level = 0; 222167802Sjkim Info.WalkState = WalkState; 223167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp, 224167802Sjkim AcpiDmCommonAscendingOp, &Info); 225167802Sjkim ACPI_FREE (WalkState); 226167802Sjkim} 227167802Sjkim 228167802Sjkim 229167802Sjkim/******************************************************************************* 230167802Sjkim * 231167802Sjkim * FUNCTION: AcpiDmCrossReferenceNamespace 232167802Sjkim * 233167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 234167802Sjkim * NamespaceRoot - Root of the internal namespace 235193529Sjkim * OwnerId - OwnerId of the table to be disassembled 236167802Sjkim * 237167802Sjkim * RETURN: None 238167802Sjkim * 239167802Sjkim * DESCRIPTION: Cross reference the namespace to create externals 240167802Sjkim * 241167802Sjkim ******************************************************************************/ 242167802Sjkim 243167802Sjkimvoid 244167802SjkimAcpiDmCrossReferenceNamespace ( 245167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 246193529Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot, 247193529Sjkim ACPI_OWNER_ID OwnerId) 248167802Sjkim{ 249167802Sjkim ACPI_STATUS Status; 250167802Sjkim ACPI_OP_WALK_INFO Info; 251167802Sjkim ACPI_WALK_STATE *WalkState; 252167802Sjkim 253167802Sjkim 254167802Sjkim if (!ParseTreeRoot) 255167802Sjkim { 256167802Sjkim return; 257167802Sjkim } 258167802Sjkim 259167802Sjkim /* Create and initialize a new walk state */ 260167802Sjkim 261193529Sjkim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 262167802Sjkim if (!WalkState) 263167802Sjkim { 264167802Sjkim return; 265167802Sjkim } 266167802Sjkim 267167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 268167802Sjkim if (ACPI_FAILURE (Status)) 269167802Sjkim { 270167802Sjkim return; 271167802Sjkim } 272167802Sjkim 273167802Sjkim Info.Flags = 0; 274167802Sjkim Info.Level = 0; 275167802Sjkim Info.WalkState = WalkState; 276167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp, 277167802Sjkim AcpiDmCommonAscendingOp, &Info); 278167802Sjkim ACPI_FREE (WalkState); 279167802Sjkim} 280167802Sjkim 281167802Sjkim 282167802Sjkim/******************************************************************************* 283167802Sjkim * 284167802Sjkim * FUNCTION: AcpiDmConvertResourceIndexes 285167802Sjkim * 286167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 287167802Sjkim * NamespaceRoot - Root of the internal namespace 288167802Sjkim * 289167802Sjkim * RETURN: None 290167802Sjkim * 291167802Sjkim * DESCRIPTION: Convert fixed-offset references to resource descriptors to 292167802Sjkim * symbolic references. Should only be called after namespace has 293167802Sjkim * been cross referenced. 294167802Sjkim * 295167802Sjkim ******************************************************************************/ 296167802Sjkim 297167802Sjkimvoid 298167802SjkimAcpiDmConvertResourceIndexes ( 299167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 300167802Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot) 301167802Sjkim{ 302167802Sjkim ACPI_STATUS Status; 303167802Sjkim ACPI_OP_WALK_INFO Info; 304167802Sjkim ACPI_WALK_STATE *WalkState; 305167802Sjkim 306167802Sjkim 307167802Sjkim if (!ParseTreeRoot) 308167802Sjkim { 309167802Sjkim return; 310167802Sjkim } 311167802Sjkim 312167802Sjkim /* Create and initialize a new walk state */ 313167802Sjkim 314167802Sjkim WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL); 315167802Sjkim if (!WalkState) 316167802Sjkim { 317167802Sjkim return; 318167802Sjkim } 319167802Sjkim 320167802Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState); 321167802Sjkim if (ACPI_FAILURE (Status)) 322167802Sjkim { 323167802Sjkim return; 324167802Sjkim } 325167802Sjkim 326167802Sjkim Info.Flags = 0; 327167802Sjkim Info.Level = 0; 328167802Sjkim Info.WalkState = WalkState; 329167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp, 330167802Sjkim AcpiDmCommonAscendingOp, &Info); 331167802Sjkim ACPI_FREE (WalkState); 332167802Sjkim return; 333167802Sjkim} 334167802Sjkim 335167802Sjkim 336167802Sjkim/******************************************************************************* 337167802Sjkim * 338167802Sjkim * FUNCTION: AcpiDmDumpDescending 339167802Sjkim * 340167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 341167802Sjkim * 342167802Sjkim * RETURN: Status 343167802Sjkim * 344167802Sjkim * DESCRIPTION: Format and print contents of one parse Op. 345167802Sjkim * 346167802Sjkim ******************************************************************************/ 347167802Sjkim 348167802Sjkimstatic ACPI_STATUS 349167802SjkimAcpiDmDumpDescending ( 350167802Sjkim ACPI_PARSE_OBJECT *Op, 351167802Sjkim UINT32 Level, 352167802Sjkim void *Context) 353167802Sjkim{ 354167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 355167802Sjkim char *Path; 356167802Sjkim 357167802Sjkim 358167802Sjkim if (!Op) 359167802Sjkim { 360167802Sjkim return (AE_OK); 361167802Sjkim } 362167802Sjkim 363167802Sjkim /* Most of the information (count, level, name) here */ 364167802Sjkim 365198237Sjkim Info->Count++; 366167802Sjkim AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level); 367167802Sjkim AcpiDmIndent (Level); 368167802Sjkim AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode)); 369167802Sjkim 370167802Sjkim /* Extra info is helpful */ 371167802Sjkim 372167802Sjkim switch (Op->Common.AmlOpcode) 373167802Sjkim { 374167802Sjkim case AML_BYTE_OP: 375254745Sjkim 376254745Sjkim AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer); 377254745Sjkim break; 378254745Sjkim 379167802Sjkim case AML_WORD_OP: 380254745Sjkim 381254745Sjkim AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer); 382254745Sjkim break; 383254745Sjkim 384167802Sjkim case AML_DWORD_OP: 385250838Sjkim 386254745Sjkim AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer); 387167802Sjkim break; 388167802Sjkim 389228110Sjkim case AML_QWORD_OP: 390250838Sjkim 391228110Sjkim AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); 392228110Sjkim break; 393228110Sjkim 394167802Sjkim case AML_INT_NAMEPATH_OP: 395250838Sjkim 396167802Sjkim if (Op->Common.Value.String) 397167802Sjkim { 398167802Sjkim AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String, 399167802Sjkim NULL, &Path); 400167802Sjkim AcpiOsPrintf ("%s %p", Path, Op->Common.Node); 401167802Sjkim ACPI_FREE (Path); 402167802Sjkim } 403167802Sjkim else 404167802Sjkim { 405167802Sjkim AcpiOsPrintf ("[NULL]"); 406167802Sjkim } 407167802Sjkim break; 408167802Sjkim 409167802Sjkim case AML_NAME_OP: 410167802Sjkim case AML_METHOD_OP: 411167802Sjkim case AML_DEVICE_OP: 412167802Sjkim case AML_INT_NAMEDFIELD_OP: 413250838Sjkim 414198237Sjkim AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name)); 415167802Sjkim break; 416193529Sjkim 417193529Sjkim default: 418250838Sjkim 419193529Sjkim break; 420167802Sjkim } 421167802Sjkim 422167802Sjkim AcpiOsPrintf ("\n"); 423167802Sjkim return (AE_OK); 424167802Sjkim} 425167802Sjkim 426167802Sjkim 427167802Sjkim/******************************************************************************* 428167802Sjkim * 429167802Sjkim * FUNCTION: AcpiDmFindOrphanDescending 430167802Sjkim * 431167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 432167802Sjkim * 433167802Sjkim * RETURN: Status 434167802Sjkim * 435167802Sjkim * DESCRIPTION: Check namepath Ops for orphaned method invocations 436167802Sjkim * 437167802Sjkim * Note: Experimental. 438167802Sjkim * 439167802Sjkim ******************************************************************************/ 440167802Sjkim 441167802Sjkimstatic ACPI_STATUS 442167802SjkimAcpiDmFindOrphanDescending ( 443167802Sjkim ACPI_PARSE_OBJECT *Op, 444167802Sjkim UINT32 Level, 445167802Sjkim void *Context) 446167802Sjkim{ 447167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 448167802Sjkim ACPI_PARSE_OBJECT *ChildOp; 449167802Sjkim ACPI_PARSE_OBJECT *NextOp; 450167802Sjkim ACPI_PARSE_OBJECT *ParentOp; 451167802Sjkim UINT32 ArgCount; 452167802Sjkim 453167802Sjkim 454167802Sjkim if (!Op) 455167802Sjkim { 456167802Sjkim return (AE_OK); 457167802Sjkim } 458167802Sjkim 459167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 460167802Sjkim 461167802Sjkim switch (Op->Common.AmlOpcode) 462167802Sjkim { 463167802Sjkim#ifdef ACPI_UNDER_DEVELOPMENT 464167802Sjkim case AML_ADD_OP: 465250838Sjkim 466167802Sjkim ChildOp = Op->Common.Value.Arg; 467167802Sjkim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 468167802Sjkim !ChildOp->Common.Node) 469167802Sjkim { 470167802Sjkim AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String, 471281075Sdim NULL, &Path); 472281075Sdim AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n", 473281075Sdim Op->Common.AmlOpName, Path); 474167802Sjkim ACPI_FREE (Path); 475167802Sjkim 476167802Sjkim NextOp = Op->Common.Next; 477167802Sjkim if (!NextOp) 478167802Sjkim { 479167802Sjkim /* This NamePath has no args, assume it is an integer */ 480167802Sjkim 481281075Sdim AcpiDmAddOpToExternalList (ChildOp, 482281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 483167802Sjkim return (AE_OK); 484167802Sjkim } 485167802Sjkim 486167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp); 487281075Sdim AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n", 488281075Sdim ArgCount, AcpiDmCountChildren (Op)); 489167802Sjkim 490167802Sjkim if (ArgCount < 1) 491167802Sjkim { 492167802Sjkim /* One Arg means this is just a Store(Name,Target) */ 493167802Sjkim 494281075Sdim AcpiDmAddOpToExternalList (ChildOp, 495281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 496167802Sjkim return (AE_OK); 497167802Sjkim } 498167802Sjkim 499281075Sdim AcpiDmAddOpToExternalList (ChildOp, 500281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 501167802Sjkim } 502167802Sjkim break; 503167802Sjkim#endif 504167802Sjkim 505167802Sjkim case AML_STORE_OP: 506167802Sjkim 507167802Sjkim ChildOp = Op->Common.Value.Arg; 508167802Sjkim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 509167802Sjkim !ChildOp->Common.Node) 510167802Sjkim { 511167802Sjkim NextOp = Op->Common.Next; 512167802Sjkim if (!NextOp) 513167802Sjkim { 514167802Sjkim /* This NamePath has no args, assume it is an integer */ 515167802Sjkim 516281075Sdim AcpiDmAddOpToExternalList (ChildOp, 517281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 518167802Sjkim return (AE_OK); 519167802Sjkim } 520167802Sjkim 521167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp); 522167802Sjkim if (ArgCount <= 1) 523167802Sjkim { 524167802Sjkim /* One Arg means this is just a Store(Name,Target) */ 525167802Sjkim 526281075Sdim AcpiDmAddOpToExternalList (ChildOp, 527281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 528167802Sjkim return (AE_OK); 529167802Sjkim } 530167802Sjkim 531281075Sdim AcpiDmAddOpToExternalList (ChildOp, 532281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 533167802Sjkim } 534167802Sjkim break; 535167802Sjkim 536167802Sjkim case AML_INT_NAMEPATH_OP: 537167802Sjkim 538167802Sjkim /* Must examine parent to see if this namepath is an argument */ 539167802Sjkim 540167802Sjkim ParentOp = Op->Common.Parent; 541167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode); 542167802Sjkim 543167802Sjkim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 544167802Sjkim (OpInfo->Class != AML_CLASS_CREATE) && 545235945Sjkim (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) && 546167802Sjkim (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && 547167802Sjkim !Op->Common.Node) 548167802Sjkim { 549167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next); 550167802Sjkim 551167802Sjkim /* 552167802Sjkim * Check if namepath is a predicate for if/while or lone parameter to 553167802Sjkim * a return. 554167802Sjkim */ 555167802Sjkim if (ArgCount == 0) 556167802Sjkim { 557167802Sjkim if (((ParentOp->Common.AmlOpcode == AML_IF_OP) || 558167802Sjkim (ParentOp->Common.AmlOpcode == AML_WHILE_OP) || 559167802Sjkim (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) && 560167802Sjkim 561167802Sjkim /* And namepath is the first argument */ 562167802Sjkim (ParentOp->Common.Value.Arg == Op)) 563167802Sjkim { 564281075Sdim AcpiDmAddOpToExternalList (Op, 565281075Sdim Op->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 566167802Sjkim break; 567167802Sjkim } 568167802Sjkim } 569167802Sjkim 570167802Sjkim /* 571167802Sjkim * This is a standalone namestring (not a parameter to another 572167802Sjkim * operator) - it *must* be a method invocation, nothing else is 573167802Sjkim * grammatically possible. 574167802Sjkim */ 575281075Sdim AcpiDmAddOpToExternalList (Op, 576281075Sdim Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 577167802Sjkim } 578167802Sjkim break; 579193529Sjkim 580193529Sjkim default: 581250838Sjkim 582193529Sjkim break; 583167802Sjkim } 584167802Sjkim 585167802Sjkim return (AE_OK); 586167802Sjkim} 587167802Sjkim 588167802Sjkim 589167802Sjkim/******************************************************************************* 590167802Sjkim * 591167802Sjkim * FUNCTION: AcpiDmLoadDescendingOp 592167802Sjkim * 593167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 594167802Sjkim * 595167802Sjkim * RETURN: Status 596167802Sjkim * 597167802Sjkim * DESCRIPTION: Descending handler for namespace control method object load 598167802Sjkim * 599167802Sjkim ******************************************************************************/ 600167802Sjkim 601167802Sjkimstatic ACPI_STATUS 602167802SjkimAcpiDmLoadDescendingOp ( 603167802Sjkim ACPI_PARSE_OBJECT *Op, 604167802Sjkim UINT32 Level, 605167802Sjkim void *Context) 606167802Sjkim{ 607167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 608167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 609167802Sjkim ACPI_WALK_STATE *WalkState; 610167802Sjkim ACPI_OBJECT_TYPE ObjectType; 611167802Sjkim ACPI_STATUS Status; 612167802Sjkim char *Path = NULL; 613167802Sjkim ACPI_PARSE_OBJECT *NextOp; 614167802Sjkim ACPI_NAMESPACE_NODE *Node; 615193529Sjkim char FieldPath[5]; 616193529Sjkim BOOLEAN PreDefined = FALSE; 617193529Sjkim UINT8 PreDefineIndex = 0; 618167802Sjkim 619167802Sjkim 620167802Sjkim WalkState = Info->WalkState; 621167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 622167802Sjkim ObjectType = OpInfo->ObjectType; 623167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 624167802Sjkim 625167802Sjkim /* Only interested in operators that create new names */ 626167802Sjkim 627167802Sjkim if (!(OpInfo->Flags & AML_NAMED) && 628167802Sjkim !(OpInfo->Flags & AML_CREATE)) 629167802Sjkim { 630167802Sjkim goto Exit; 631167802Sjkim } 632167802Sjkim 633167802Sjkim /* Get the NamePath from the appropriate place */ 634167802Sjkim 635167802Sjkim if (OpInfo->Flags & AML_NAMED) 636167802Sjkim { 637167802Sjkim /* For all named operators, get the new name */ 638167802Sjkim 639167802Sjkim Path = (char *) Op->Named.Path; 640193529Sjkim 641193529Sjkim if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 642193529Sjkim { 643193529Sjkim *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name; 644193529Sjkim FieldPath[4] = 0; 645193529Sjkim Path = FieldPath; 646193529Sjkim } 647167802Sjkim } 648167802Sjkim else if (OpInfo->Flags & AML_CREATE) 649167802Sjkim { 650167802Sjkim /* New name is the last child */ 651167802Sjkim 652167802Sjkim NextOp = Op->Common.Value.Arg; 653167802Sjkim 654167802Sjkim while (NextOp->Common.Next) 655167802Sjkim { 656167802Sjkim NextOp = NextOp->Common.Next; 657167802Sjkim } 658167802Sjkim Path = NextOp->Common.Value.String; 659167802Sjkim } 660167802Sjkim 661167802Sjkim if (!Path) 662167802Sjkim { 663167802Sjkim goto Exit; 664167802Sjkim } 665167802Sjkim 666167802Sjkim /* Insert the name into the namespace */ 667167802Sjkim 668167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 669167802Sjkim ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE, 670167802Sjkim WalkState, &Node); 671167802Sjkim 672167802Sjkim Op->Common.Node = Node; 673167802Sjkim 674193529Sjkim if (ACPI_SUCCESS (Status)) 675193529Sjkim { 676193529Sjkim /* Check if it's a predefined node */ 677167802Sjkim 678193529Sjkim while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name) 679193529Sjkim { 680241973Sjkim if (ACPI_COMPARE_NAME (Node->Name.Ascii, 681241973Sjkim AcpiGbl_PreDefinedNames[PreDefineIndex].Name)) 682193529Sjkim { 683193529Sjkim PreDefined = TRUE; 684193529Sjkim break; 685193529Sjkim } 686193529Sjkim 687193529Sjkim PreDefineIndex++; 688193529Sjkim } 689193529Sjkim 690193529Sjkim /* 691193529Sjkim * Set node owner id if it satisfies all the following conditions: 692193529Sjkim * 1) Not a predefined node, _SB_ etc 693193529Sjkim * 2) Not the root node 694193529Sjkim * 3) Not a node created by Scope 695193529Sjkim */ 696193529Sjkim 697193529Sjkim if (!PreDefined && Node != AcpiGbl_RootNode && 698193529Sjkim Op->Common.AmlOpcode != AML_SCOPE_OP) 699193529Sjkim { 700193529Sjkim Node->OwnerId = WalkState->OwnerId; 701193529Sjkim } 702193529Sjkim } 703193529Sjkim 704193529Sjkim 705167802SjkimExit: 706167802Sjkim 707167802Sjkim if (AcpiNsOpensScope (ObjectType)) 708167802Sjkim { 709167802Sjkim if (Op->Common.Node) 710167802Sjkim { 711167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 712167802Sjkim if (ACPI_FAILURE (Status)) 713167802Sjkim { 714167802Sjkim return (Status); 715167802Sjkim } 716167802Sjkim } 717167802Sjkim } 718167802Sjkim 719167802Sjkim return (AE_OK); 720167802Sjkim} 721167802Sjkim 722167802Sjkim 723167802Sjkim/******************************************************************************* 724167802Sjkim * 725167802Sjkim * FUNCTION: AcpiDmXrefDescendingOp 726167802Sjkim * 727167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 728167802Sjkim * 729167802Sjkim * RETURN: Status 730167802Sjkim * 731167802Sjkim * DESCRIPTION: Descending handler for namespace cross reference 732167802Sjkim * 733167802Sjkim ******************************************************************************/ 734167802Sjkim 735167802Sjkimstatic ACPI_STATUS 736167802SjkimAcpiDmXrefDescendingOp ( 737167802Sjkim ACPI_PARSE_OBJECT *Op, 738167802Sjkim UINT32 Level, 739167802Sjkim void *Context) 740167802Sjkim{ 741167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 742167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 743167802Sjkim ACPI_WALK_STATE *WalkState; 744167802Sjkim ACPI_OBJECT_TYPE ObjectType; 745193529Sjkim ACPI_OBJECT_TYPE ObjectType2; 746167802Sjkim ACPI_STATUS Status; 747167802Sjkim char *Path = NULL; 748167802Sjkim ACPI_PARSE_OBJECT *NextOp; 749167802Sjkim ACPI_NAMESPACE_NODE *Node; 750193529Sjkim ACPI_OPERAND_OBJECT *Object; 751212761Sjkim UINT32 ParamCount = 0; 752281075Sdim char *Pathname; 753167802Sjkim 754167802Sjkim 755167802Sjkim WalkState = Info->WalkState; 756167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 757167802Sjkim ObjectType = OpInfo->ObjectType; 758167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 759167802Sjkim 760167802Sjkim if ((!(OpInfo->Flags & AML_NAMED)) && 761167802Sjkim (!(OpInfo->Flags & AML_CREATE)) && 762281075Sdim (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP) && 763281075Sdim (Op->Common.AmlOpcode != AML_NOTIFY_OP)) 764167802Sjkim { 765167802Sjkim goto Exit; 766167802Sjkim } 767167802Sjkim 768281075Sdim 769167802Sjkim /* Get the NamePath from the appropriate place */ 770167802Sjkim 771167802Sjkim if (OpInfo->Flags & AML_NAMED) 772167802Sjkim { 773235945Sjkim /* 774235945Sjkim * Only these two operators (Alias, Scope) refer to an existing 775235945Sjkim * name, it is the first argument 776235945Sjkim */ 777235945Sjkim if (Op->Common.AmlOpcode == AML_ALIAS_OP) 778167802Sjkim { 779235945Sjkim ObjectType = ACPI_TYPE_ANY; 780235945Sjkim 781235945Sjkim NextOp = Op->Common.Value.Arg; 782235945Sjkim NextOp = NextOp->Common.Value.Arg; 783235945Sjkim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 784235945Sjkim { 785235945Sjkim Path = NextOp->Common.Value.String; 786235945Sjkim } 787235945Sjkim } 788235945Sjkim else if (Op->Common.AmlOpcode == AML_SCOPE_OP) 789235945Sjkim { 790167802Sjkim Path = (char *) Op->Named.Path; 791167802Sjkim } 792167802Sjkim } 793167802Sjkim else if (OpInfo->Flags & AML_CREATE) 794167802Sjkim { 795167802Sjkim /* Referenced Buffer Name is the first child */ 796167802Sjkim 797235945Sjkim ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */ 798235945Sjkim 799167802Sjkim NextOp = Op->Common.Value.Arg; 800167802Sjkim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 801167802Sjkim { 802167802Sjkim Path = NextOp->Common.Value.String; 803167802Sjkim } 804167802Sjkim } 805281075Sdim else if (Op->Common.AmlOpcode == AML_NOTIFY_OP) 806281075Sdim { 807281075Sdim Path = Op->Common.Value.Arg->Asl.Value.String; 808281075Sdim } 809167802Sjkim else 810167802Sjkim { 811167802Sjkim Path = Op->Common.Value.String; 812167802Sjkim } 813167802Sjkim 814167802Sjkim if (!Path) 815167802Sjkim { 816167802Sjkim goto Exit; 817167802Sjkim } 818167802Sjkim 819167802Sjkim /* 820241973Sjkim * Lookup the name in the namespace. Name must exist at this point, or it 821167802Sjkim * is an invalid reference. 822167802Sjkim * 823167802Sjkim * The namespace is also used as a lookup table for references to resource 824167802Sjkim * descriptors and the fields within them. 825167802Sjkim */ 826281075Sdim Node = NULL; 827167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 828167802Sjkim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 829167802Sjkim WalkState, &Node); 830235945Sjkim if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL)) 831235945Sjkim { 832281075Sdim /* Node was created by an External() statement */ 833281075Sdim 834235945Sjkim Status = AE_NOT_FOUND; 835235945Sjkim } 836235945Sjkim 837167802Sjkim if (ACPI_FAILURE (Status)) 838167802Sjkim { 839167802Sjkim if (Status == AE_NOT_FOUND) 840167802Sjkim { 841167802Sjkim /* 842281075Sdim * Add this symbol as an external declaration, except if the 843281075Sdim * parent is a CondRefOf operator. For this operator, we do not 844281075Sdim * need an external, nor do we want one, since this can cause 845281075Sdim * disassembly problems if the symbol is actually a control 846281075Sdim * method. 847167802Sjkim */ 848281075Sdim if (!(Op->Asl.Parent && 849281075Sdim (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP))) 850281075Sdim { 851281075Sdim if (Node) 852281075Sdim { 853281075Sdim AcpiDmAddNodeToExternalList (Node, 854281075Sdim (UINT8) ObjectType, 0, 0); 855281075Sdim } 856281075Sdim else 857281075Sdim { 858281075Sdim AcpiDmAddOpToExternalList (Op, Path, 859281075Sdim (UINT8) ObjectType, 0, 0); 860281075Sdim } 861281075Sdim } 862167802Sjkim } 863167802Sjkim } 864193529Sjkim 865193529Sjkim /* 866281075Sdim * Found the node, but check if it came from an external table. 867281075Sdim * Add it to external list. Note: Node->OwnerId == 0 indicates 868281075Sdim * one of the built-in ACPI Names (_OS_ etc.) which can safely 869281075Sdim * be ignored. 870193529Sjkim */ 871281075Sdim else if (Node->OwnerId && 872281075Sdim (WalkState->OwnerId != Node->OwnerId)) 873193529Sjkim { 874193529Sjkim ObjectType2 = ObjectType; 875193529Sjkim 876193529Sjkim Object = AcpiNsGetAttachedObject (Node); 877193529Sjkim if (Object) 878193529Sjkim { 879193529Sjkim ObjectType2 = Object->Common.Type; 880212761Sjkim if (ObjectType2 == ACPI_TYPE_METHOD) 881212761Sjkim { 882212761Sjkim ParamCount = Object->Method.ParamCount; 883212761Sjkim } 884193529Sjkim } 885193529Sjkim 886281075Sdim Pathname = AcpiNsGetExternalPathname (Node); 887281075Sdim if (!Pathname) 888281075Sdim { 889281075Sdim return (AE_NO_MEMORY); 890281075Sdim } 891281075Sdim 892281075Sdim AcpiDmAddNodeToExternalList (Node, (UINT8) ObjectType2, 893281075Sdim ParamCount, ACPI_EXT_RESOLVED_REFERENCE); 894281075Sdim 895281075Sdim ACPI_FREE (Pathname); 896193529Sjkim Op->Common.Node = Node; 897193529Sjkim } 898167802Sjkim else 899167802Sjkim { 900167802Sjkim Op->Common.Node = Node; 901167802Sjkim } 902167802Sjkim 903167802Sjkim 904167802SjkimExit: 905167802Sjkim /* Open new scope if necessary */ 906167802Sjkim 907167802Sjkim if (AcpiNsOpensScope (ObjectType)) 908167802Sjkim { 909167802Sjkim if (Op->Common.Node) 910167802Sjkim { 911167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 912167802Sjkim if (ACPI_FAILURE (Status)) 913167802Sjkim { 914167802Sjkim return (Status); 915167802Sjkim } 916167802Sjkim } 917167802Sjkim } 918167802Sjkim 919167802Sjkim return (AE_OK); 920167802Sjkim} 921167802Sjkim 922167802Sjkim 923167802Sjkim/******************************************************************************* 924167802Sjkim * 925167802Sjkim * FUNCTION: AcpiDmResourceDescendingOp 926167802Sjkim * 927167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 928167802Sjkim * 929167802Sjkim * RETURN: None 930167802Sjkim * 931167802Sjkim * DESCRIPTION: Process one parse op during symbolic resource index conversion. 932167802Sjkim * 933167802Sjkim ******************************************************************************/ 934167802Sjkim 935167802Sjkimstatic ACPI_STATUS 936167802SjkimAcpiDmResourceDescendingOp ( 937167802Sjkim ACPI_PARSE_OBJECT *Op, 938167802Sjkim UINT32 Level, 939167802Sjkim void *Context) 940167802Sjkim{ 941167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 942167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 943167802Sjkim ACPI_WALK_STATE *WalkState; 944167802Sjkim ACPI_OBJECT_TYPE ObjectType; 945167802Sjkim ACPI_STATUS Status; 946167802Sjkim 947167802Sjkim 948167802Sjkim WalkState = Info->WalkState; 949167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 950167802Sjkim 951167802Sjkim /* Open new scope if necessary */ 952167802Sjkim 953167802Sjkim ObjectType = OpInfo->ObjectType; 954167802Sjkim if (AcpiNsOpensScope (ObjectType)) 955167802Sjkim { 956167802Sjkim if (Op->Common.Node) 957167802Sjkim { 958167802Sjkim 959167802Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState); 960167802Sjkim if (ACPI_FAILURE (Status)) 961167802Sjkim { 962167802Sjkim return (Status); 963167802Sjkim } 964167802Sjkim } 965167802Sjkim } 966167802Sjkim 967167802Sjkim /* 968167802Sjkim * Check if this operator contains a reference to a resource descriptor. 969167802Sjkim * If so, convert the reference into a symbolic reference. 970167802Sjkim */ 971167802Sjkim AcpiDmCheckResourceReference (Op, WalkState); 972167802Sjkim return (AE_OK); 973167802Sjkim} 974167802Sjkim 975167802Sjkim 976167802Sjkim/******************************************************************************* 977167802Sjkim * 978167802Sjkim * FUNCTION: AcpiDmCommonAscendingOp 979167802Sjkim * 980167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 981167802Sjkim * 982167802Sjkim * RETURN: None 983167802Sjkim * 984167802Sjkim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes 985167802Sjkim * scope if necessary. 986167802Sjkim * 987167802Sjkim ******************************************************************************/ 988167802Sjkim 989167802Sjkimstatic ACPI_STATUS 990167802SjkimAcpiDmCommonAscendingOp ( 991167802Sjkim ACPI_PARSE_OBJECT *Op, 992167802Sjkim UINT32 Level, 993167802Sjkim void *Context) 994167802Sjkim{ 995167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 996167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 997167802Sjkim ACPI_OBJECT_TYPE ObjectType; 998167802Sjkim 999167802Sjkim 1000167802Sjkim /* Close scope if necessary */ 1001167802Sjkim 1002167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 1003167802Sjkim ObjectType = OpInfo->ObjectType; 1004167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 1005167802Sjkim 1006167802Sjkim if (AcpiNsOpensScope (ObjectType)) 1007167802Sjkim { 1008167802Sjkim (void) AcpiDsScopeStackPop (Info->WalkState); 1009167802Sjkim } 1010167802Sjkim 1011167802Sjkim return (AE_OK); 1012167802Sjkim} 1013167802Sjkim 1014167802Sjkim 1015167802Sjkim/******************************************************************************* 1016167802Sjkim * 1017167802Sjkim * FUNCTION: AcpiDmInspectPossibleArgs 1018167802Sjkim * 1019167802Sjkim * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the 1020167802Sjkim * possible method invocation found 1021167802Sjkim * TargetCount - Number of targets (0,1,2) for this op 1022167802Sjkim * Op - Parse op 1023167802Sjkim * 1024167802Sjkim * RETURN: Status 1025167802Sjkim * 1026167802Sjkim * DESCRIPTION: Examine following args and next ops for possible arguments 1027167802Sjkim * for an unrecognized method invocation. 1028167802Sjkim * 1029167802Sjkim ******************************************************************************/ 1030167802Sjkim 1031167802Sjkimstatic UINT32 1032167802SjkimAcpiDmInspectPossibleArgs ( 1033167802Sjkim UINT32 CurrentOpArgCount, 1034167802Sjkim UINT32 TargetCount, 1035167802Sjkim ACPI_PARSE_OBJECT *Op) 1036167802Sjkim{ 1037167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 1038167802Sjkim UINT32 i; 1039167802Sjkim UINT32 Last = 0; 1040167802Sjkim UINT32 Lookahead; 1041167802Sjkim 1042167802Sjkim 1043167802Sjkim Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount; 1044167802Sjkim 1045167802Sjkim /* Lookahead for the maximum number of possible arguments */ 1046167802Sjkim 1047167802Sjkim for (i = 0; i < Lookahead; i++) 1048167802Sjkim { 1049167802Sjkim if (!Op) 1050167802Sjkim { 1051167802Sjkim break; 1052167802Sjkim } 1053167802Sjkim 1054167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 1055167802Sjkim 1056167802Sjkim /* 1057167802Sjkim * Any one of these operators is "very probably" not a method arg 1058167802Sjkim */ 1059167802Sjkim if ((Op->Common.AmlOpcode == AML_STORE_OP) || 1060167802Sjkim (Op->Common.AmlOpcode == AML_NOTIFY_OP)) 1061167802Sjkim { 1062167802Sjkim break; 1063167802Sjkim } 1064167802Sjkim 1065167802Sjkim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 1066167802Sjkim (OpInfo->Class != AML_CLASS_CONTROL)) 1067167802Sjkim { 1068167802Sjkim Last = i+1; 1069167802Sjkim } 1070167802Sjkim 1071167802Sjkim Op = Op->Common.Next; 1072167802Sjkim } 1073167802Sjkim 1074167802Sjkim return (Last); 1075167802Sjkim} 1076