1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: adwalk - Application-level disassembler parse tree walk routines 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, 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; 138306536Sjkim 139167802Sjkim AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info); 140167802Sjkim AcpiOsPrintf ("*/\n\n"); 141167802Sjkim} 142167802Sjkim 143167802Sjkim 144167802Sjkim/******************************************************************************* 145167802Sjkim * 146167802Sjkim * FUNCTION: AcpiDmFindOrphanMethods 147167802Sjkim * 148198237Sjkim * PARAMETERS: Origin - Starting object 149167802Sjkim * 150167802Sjkim * RETURN: None 151167802Sjkim * 152167802Sjkim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods 153167802Sjkim * that are not resolved in the namespace 154167802Sjkim * 155167802Sjkim ******************************************************************************/ 156167802Sjkim 157167802Sjkimvoid 158167802SjkimAcpiDmFindOrphanMethods ( 159167802Sjkim ACPI_PARSE_OBJECT *Origin) 160167802Sjkim{ 161167802Sjkim ACPI_OP_WALK_INFO Info; 162167802Sjkim 163167802Sjkim 164167802Sjkim if (!Origin) 165167802Sjkim { 166167802Sjkim return; 167167802Sjkim } 168167802Sjkim 169167802Sjkim Info.Flags = 0; 170167802Sjkim Info.Level = 0; 171167802Sjkim Info.WalkState = NULL; 172306536Sjkim 173167802Sjkim AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info); 174167802Sjkim} 175167802Sjkim 176167802Sjkim 177167802Sjkim/******************************************************************************* 178167802Sjkim * 179167802Sjkim * FUNCTION: AcpiDmFinishNamespaceLoad 180167802Sjkim * 181167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 182167802Sjkim * NamespaceRoot - Root of the internal namespace 183193529Sjkim * OwnerId - OwnerId of the table to be disassembled 184167802Sjkim * 185167802Sjkim * RETURN: None 186167802Sjkim * 187167802Sjkim * DESCRIPTION: Load all namespace items that are created within control 188167802Sjkim * methods. Used before namespace cross reference 189167802Sjkim * 190167802Sjkim ******************************************************************************/ 191167802Sjkim 192167802Sjkimvoid 193167802SjkimAcpiDmFinishNamespaceLoad ( 194167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 195193529Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot, 196193529Sjkim ACPI_OWNER_ID OwnerId) 197167802Sjkim{ 198167802Sjkim ACPI_STATUS Status; 199167802Sjkim ACPI_OP_WALK_INFO Info; 200167802Sjkim ACPI_WALK_STATE *WalkState; 201167802Sjkim 202167802Sjkim 203167802Sjkim if (!ParseTreeRoot) 204167802Sjkim { 205167802Sjkim return; 206167802Sjkim } 207167802Sjkim 208167802Sjkim /* Create and initialize a new walk state */ 209167802Sjkim 210193529Sjkim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 211167802Sjkim if (!WalkState) 212167802Sjkim { 213167802Sjkim return; 214167802Sjkim } 215167802Sjkim 216306536Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, 217306536Sjkim WalkState); 218167802Sjkim if (ACPI_FAILURE (Status)) 219167802Sjkim { 220167802Sjkim return; 221167802Sjkim } 222167802Sjkim 223167802Sjkim Info.Flags = 0; 224167802Sjkim Info.Level = 0; 225167802Sjkim Info.WalkState = WalkState; 226306536Sjkim 227167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp, 228167802Sjkim AcpiDmCommonAscendingOp, &Info); 229167802Sjkim ACPI_FREE (WalkState); 230167802Sjkim} 231167802Sjkim 232167802Sjkim 233167802Sjkim/******************************************************************************* 234167802Sjkim * 235167802Sjkim * FUNCTION: AcpiDmCrossReferenceNamespace 236167802Sjkim * 237167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 238167802Sjkim * NamespaceRoot - Root of the internal namespace 239193529Sjkim * OwnerId - OwnerId of the table to be disassembled 240167802Sjkim * 241167802Sjkim * RETURN: None 242167802Sjkim * 243167802Sjkim * DESCRIPTION: Cross reference the namespace to create externals 244167802Sjkim * 245167802Sjkim ******************************************************************************/ 246167802Sjkim 247167802Sjkimvoid 248167802SjkimAcpiDmCrossReferenceNamespace ( 249167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 250193529Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot, 251193529Sjkim ACPI_OWNER_ID OwnerId) 252167802Sjkim{ 253167802Sjkim ACPI_STATUS Status; 254167802Sjkim ACPI_OP_WALK_INFO Info; 255167802Sjkim ACPI_WALK_STATE *WalkState; 256167802Sjkim 257167802Sjkim 258167802Sjkim if (!ParseTreeRoot) 259167802Sjkim { 260167802Sjkim return; 261167802Sjkim } 262167802Sjkim 263167802Sjkim /* Create and initialize a new walk state */ 264167802Sjkim 265193529Sjkim WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL); 266167802Sjkim if (!WalkState) 267167802Sjkim { 268167802Sjkim return; 269167802Sjkim } 270167802Sjkim 271306536Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, 272306536Sjkim WalkState); 273167802Sjkim if (ACPI_FAILURE (Status)) 274167802Sjkim { 275167802Sjkim return; 276167802Sjkim } 277167802Sjkim 278167802Sjkim Info.Flags = 0; 279167802Sjkim Info.Level = 0; 280167802Sjkim Info.WalkState = WalkState; 281306536Sjkim 282167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp, 283167802Sjkim AcpiDmCommonAscendingOp, &Info); 284167802Sjkim ACPI_FREE (WalkState); 285167802Sjkim} 286167802Sjkim 287167802Sjkim 288167802Sjkim/******************************************************************************* 289167802Sjkim * 290167802Sjkim * FUNCTION: AcpiDmConvertResourceIndexes 291167802Sjkim * 292167802Sjkim * PARAMETERS: ParseTreeRoot - Root of the parse tree 293167802Sjkim * NamespaceRoot - Root of the internal namespace 294167802Sjkim * 295167802Sjkim * RETURN: None 296167802Sjkim * 297167802Sjkim * DESCRIPTION: Convert fixed-offset references to resource descriptors to 298167802Sjkim * symbolic references. Should only be called after namespace has 299167802Sjkim * been cross referenced. 300167802Sjkim * 301167802Sjkim ******************************************************************************/ 302167802Sjkim 303167802Sjkimvoid 304167802SjkimAcpiDmConvertResourceIndexes ( 305167802Sjkim ACPI_PARSE_OBJECT *ParseTreeRoot, 306167802Sjkim ACPI_NAMESPACE_NODE *NamespaceRoot) 307167802Sjkim{ 308167802Sjkim ACPI_STATUS Status; 309167802Sjkim ACPI_OP_WALK_INFO Info; 310167802Sjkim ACPI_WALK_STATE *WalkState; 311167802Sjkim 312167802Sjkim 313167802Sjkim if (!ParseTreeRoot) 314167802Sjkim { 315167802Sjkim return; 316167802Sjkim } 317167802Sjkim 318167802Sjkim /* Create and initialize a new walk state */ 319167802Sjkim 320167802Sjkim WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL); 321167802Sjkim if (!WalkState) 322167802Sjkim { 323167802Sjkim return; 324167802Sjkim } 325167802Sjkim 326306536Sjkim Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, 327306536Sjkim WalkState); 328167802Sjkim if (ACPI_FAILURE (Status)) 329167802Sjkim { 330306536Sjkim ACPI_FREE (WalkState); 331167802Sjkim return; 332167802Sjkim } 333167802Sjkim 334167802Sjkim Info.Flags = 0; 335167802Sjkim Info.Level = 0; 336167802Sjkim Info.WalkState = WalkState; 337306536Sjkim 338167802Sjkim AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp, 339167802Sjkim AcpiDmCommonAscendingOp, &Info); 340167802Sjkim ACPI_FREE (WalkState); 341167802Sjkim return; 342167802Sjkim} 343167802Sjkim 344167802Sjkim 345167802Sjkim/******************************************************************************* 346167802Sjkim * 347167802Sjkim * FUNCTION: AcpiDmDumpDescending 348167802Sjkim * 349167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 350167802Sjkim * 351167802Sjkim * RETURN: Status 352167802Sjkim * 353167802Sjkim * DESCRIPTION: Format and print contents of one parse Op. 354167802Sjkim * 355167802Sjkim ******************************************************************************/ 356167802Sjkim 357167802Sjkimstatic ACPI_STATUS 358167802SjkimAcpiDmDumpDescending ( 359167802Sjkim ACPI_PARSE_OBJECT *Op, 360167802Sjkim UINT32 Level, 361167802Sjkim void *Context) 362167802Sjkim{ 363167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 364167802Sjkim char *Path; 365167802Sjkim 366167802Sjkim 367167802Sjkim if (!Op) 368167802Sjkim { 369167802Sjkim return (AE_OK); 370167802Sjkim } 371167802Sjkim 372167802Sjkim /* Most of the information (count, level, name) here */ 373167802Sjkim 374198237Sjkim Info->Count++; 375167802Sjkim AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level); 376167802Sjkim AcpiDmIndent (Level); 377167802Sjkim AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode)); 378167802Sjkim 379167802Sjkim /* Extra info is helpful */ 380167802Sjkim 381167802Sjkim switch (Op->Common.AmlOpcode) 382167802Sjkim { 383167802Sjkim case AML_BYTE_OP: 384254745Sjkim 385254745Sjkim AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer); 386254745Sjkim break; 387254745Sjkim 388167802Sjkim case AML_WORD_OP: 389254745Sjkim 390254745Sjkim AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer); 391254745Sjkim break; 392254745Sjkim 393167802Sjkim case AML_DWORD_OP: 394250838Sjkim 395254745Sjkim AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer); 396167802Sjkim break; 397167802Sjkim 398228110Sjkim case AML_QWORD_OP: 399250838Sjkim 400228110Sjkim AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); 401228110Sjkim break; 402228110Sjkim 403167802Sjkim case AML_INT_NAMEPATH_OP: 404250838Sjkim 405167802Sjkim if (Op->Common.Value.String) 406167802Sjkim { 407167802Sjkim AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String, 408306536Sjkim NULL, &Path); 409167802Sjkim AcpiOsPrintf ("%s %p", Path, Op->Common.Node); 410167802Sjkim ACPI_FREE (Path); 411167802Sjkim } 412167802Sjkim else 413167802Sjkim { 414167802Sjkim AcpiOsPrintf ("[NULL]"); 415167802Sjkim } 416167802Sjkim break; 417167802Sjkim 418167802Sjkim case AML_NAME_OP: 419167802Sjkim case AML_METHOD_OP: 420167802Sjkim case AML_DEVICE_OP: 421167802Sjkim case AML_INT_NAMEDFIELD_OP: 422250838Sjkim 423198237Sjkim AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name)); 424167802Sjkim break; 425193529Sjkim 426193529Sjkim default: 427250838Sjkim 428193529Sjkim break; 429167802Sjkim } 430167802Sjkim 431167802Sjkim AcpiOsPrintf ("\n"); 432167802Sjkim return (AE_OK); 433167802Sjkim} 434167802Sjkim 435167802Sjkim 436167802Sjkim/******************************************************************************* 437167802Sjkim * 438167802Sjkim * FUNCTION: AcpiDmFindOrphanDescending 439167802Sjkim * 440167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 441167802Sjkim * 442167802Sjkim * RETURN: Status 443167802Sjkim * 444167802Sjkim * DESCRIPTION: Check namepath Ops for orphaned method invocations 445167802Sjkim * 446306536Sjkim * Note: Parts of this are experimental, under possible further development. 447167802Sjkim * 448167802Sjkim ******************************************************************************/ 449167802Sjkim 450167802Sjkimstatic ACPI_STATUS 451167802SjkimAcpiDmFindOrphanDescending ( 452167802Sjkim ACPI_PARSE_OBJECT *Op, 453167802Sjkim UINT32 Level, 454167802Sjkim void *Context) 455167802Sjkim{ 456167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 457167802Sjkim ACPI_PARSE_OBJECT *ChildOp; 458167802Sjkim ACPI_PARSE_OBJECT *NextOp; 459167802Sjkim ACPI_PARSE_OBJECT *ParentOp; 460167802Sjkim UINT32 ArgCount; 461167802Sjkim 462167802Sjkim 463167802Sjkim if (!Op) 464167802Sjkim { 465167802Sjkim return (AE_OK); 466167802Sjkim } 467167802Sjkim 468167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 469167802Sjkim 470167802Sjkim switch (Op->Common.AmlOpcode) 471167802Sjkim { 472167802Sjkim#ifdef ACPI_UNDER_DEVELOPMENT 473167802Sjkim case AML_ADD_OP: 474250838Sjkim 475167802Sjkim ChildOp = Op->Common.Value.Arg; 476167802Sjkim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 477167802Sjkim !ChildOp->Common.Node) 478167802Sjkim { 479167802Sjkim AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String, 480281075Sdim NULL, &Path); 481281075Sdim AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n", 482281075Sdim Op->Common.AmlOpName, Path); 483167802Sjkim ACPI_FREE (Path); 484167802Sjkim 485167802Sjkim NextOp = Op->Common.Next; 486167802Sjkim if (!NextOp) 487167802Sjkim { 488167802Sjkim /* This NamePath has no args, assume it is an integer */ 489167802Sjkim 490281075Sdim AcpiDmAddOpToExternalList (ChildOp, 491281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 492167802Sjkim return (AE_OK); 493167802Sjkim } 494167802Sjkim 495167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp); 496281075Sdim AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n", 497281075Sdim ArgCount, AcpiDmCountChildren (Op)); 498167802Sjkim 499167802Sjkim if (ArgCount < 1) 500167802Sjkim { 501167802Sjkim /* One Arg means this is just a Store(Name,Target) */ 502167802Sjkim 503281075Sdim AcpiDmAddOpToExternalList (ChildOp, 504281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 505167802Sjkim return (AE_OK); 506167802Sjkim } 507167802Sjkim 508281075Sdim AcpiDmAddOpToExternalList (ChildOp, 509281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 510167802Sjkim } 511167802Sjkim break; 512306536Sjkim 513167802Sjkim#endif 514167802Sjkim 515167802Sjkim case AML_STORE_OP: 516167802Sjkim 517167802Sjkim ChildOp = Op->Common.Value.Arg; 518167802Sjkim if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 519167802Sjkim !ChildOp->Common.Node) 520167802Sjkim { 521167802Sjkim NextOp = Op->Common.Next; 522167802Sjkim if (!NextOp) 523167802Sjkim { 524167802Sjkim /* This NamePath has no args, assume it is an integer */ 525167802Sjkim 526281075Sdim AcpiDmAddOpToExternalList (ChildOp, 527281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 528167802Sjkim return (AE_OK); 529167802Sjkim } 530167802Sjkim 531167802Sjkim ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp); 532167802Sjkim if (ArgCount <= 1) 533167802Sjkim { 534167802Sjkim /* One Arg means this is just a Store(Name,Target) */ 535167802Sjkim 536281075Sdim AcpiDmAddOpToExternalList (ChildOp, 537306536Sjkim ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, ArgCount, 0); 538167802Sjkim return (AE_OK); 539167802Sjkim } 540167802Sjkim 541281075Sdim AcpiDmAddOpToExternalList (ChildOp, 542281075Sdim ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 543167802Sjkim } 544167802Sjkim break; 545167802Sjkim 546167802Sjkim case AML_INT_NAMEPATH_OP: 547167802Sjkim 548167802Sjkim /* Must examine parent to see if this namepath is an argument */ 549167802Sjkim 550167802Sjkim ParentOp = Op->Common.Parent; 551167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode); 552167802Sjkim 553167802Sjkim if ((OpInfo->Class != AML_CLASS_EXECUTE) && 554167802Sjkim (OpInfo->Class != AML_CLASS_CREATE) && 555235945Sjkim (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) && 556167802Sjkim (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) && 557167802Sjkim !Op->Common.Node) 558167802Sjkim { 559306536Sjkim ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op); 560167802Sjkim 561167802Sjkim /* 562167802Sjkim * Check if namepath is a predicate for if/while or lone parameter to 563167802Sjkim * a return. 564167802Sjkim */ 565167802Sjkim if (ArgCount == 0) 566167802Sjkim { 567167802Sjkim if (((ParentOp->Common.AmlOpcode == AML_IF_OP) || 568167802Sjkim (ParentOp->Common.AmlOpcode == AML_WHILE_OP) || 569167802Sjkim (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) && 570167802Sjkim 571167802Sjkim /* And namepath is the first argument */ 572167802Sjkim (ParentOp->Common.Value.Arg == Op)) 573167802Sjkim { 574281075Sdim AcpiDmAddOpToExternalList (Op, 575281075Sdim Op->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0); 576167802Sjkim break; 577167802Sjkim } 578167802Sjkim } 579167802Sjkim 580167802Sjkim /* 581167802Sjkim * This is a standalone namestring (not a parameter to another 582167802Sjkim * operator) - it *must* be a method invocation, nothing else is 583167802Sjkim * grammatically possible. 584167802Sjkim */ 585281075Sdim AcpiDmAddOpToExternalList (Op, 586281075Sdim Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0); 587167802Sjkim } 588167802Sjkim break; 589193529Sjkim 590193529Sjkim default: 591250838Sjkim 592193529Sjkim break; 593167802Sjkim } 594167802Sjkim 595167802Sjkim return (AE_OK); 596167802Sjkim} 597167802Sjkim 598167802Sjkim 599167802Sjkim/******************************************************************************* 600167802Sjkim * 601167802Sjkim * FUNCTION: AcpiDmLoadDescendingOp 602167802Sjkim * 603167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 604167802Sjkim * 605167802Sjkim * RETURN: Status 606167802Sjkim * 607167802Sjkim * DESCRIPTION: Descending handler for namespace control method object load 608167802Sjkim * 609167802Sjkim ******************************************************************************/ 610167802Sjkim 611167802Sjkimstatic ACPI_STATUS 612167802SjkimAcpiDmLoadDescendingOp ( 613167802Sjkim ACPI_PARSE_OBJECT *Op, 614167802Sjkim UINT32 Level, 615167802Sjkim void *Context) 616167802Sjkim{ 617167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 618167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 619167802Sjkim ACPI_WALK_STATE *WalkState; 620167802Sjkim ACPI_OBJECT_TYPE ObjectType; 621167802Sjkim ACPI_STATUS Status; 622167802Sjkim char *Path = NULL; 623167802Sjkim ACPI_PARSE_OBJECT *NextOp; 624167802Sjkim ACPI_NAMESPACE_NODE *Node; 625193529Sjkim char FieldPath[5]; 626193529Sjkim BOOLEAN PreDefined = FALSE; 627193529Sjkim UINT8 PreDefineIndex = 0; 628167802Sjkim 629167802Sjkim 630167802Sjkim WalkState = Info->WalkState; 631167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 632167802Sjkim ObjectType = OpInfo->ObjectType; 633167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 634167802Sjkim 635167802Sjkim /* Only interested in operators that create new names */ 636167802Sjkim 637167802Sjkim if (!(OpInfo->Flags & AML_NAMED) && 638167802Sjkim !(OpInfo->Flags & AML_CREATE)) 639167802Sjkim { 640167802Sjkim goto Exit; 641167802Sjkim } 642167802Sjkim 643167802Sjkim /* Get the NamePath from the appropriate place */ 644167802Sjkim 645167802Sjkim if (OpInfo->Flags & AML_NAMED) 646167802Sjkim { 647167802Sjkim /* For all named operators, get the new name */ 648167802Sjkim 649167802Sjkim Path = (char *) Op->Named.Path; 650193529Sjkim 651193529Sjkim if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 652193529Sjkim { 653193529Sjkim *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name; 654193529Sjkim FieldPath[4] = 0; 655193529Sjkim Path = FieldPath; 656193529Sjkim } 657167802Sjkim } 658167802Sjkim else if (OpInfo->Flags & AML_CREATE) 659167802Sjkim { 660167802Sjkim /* New name is the last child */ 661167802Sjkim 662167802Sjkim NextOp = Op->Common.Value.Arg; 663167802Sjkim 664167802Sjkim while (NextOp->Common.Next) 665167802Sjkim { 666167802Sjkim NextOp = NextOp->Common.Next; 667167802Sjkim } 668306536Sjkim 669167802Sjkim Path = NextOp->Common.Value.String; 670167802Sjkim } 671167802Sjkim 672167802Sjkim if (!Path) 673167802Sjkim { 674167802Sjkim goto Exit; 675167802Sjkim } 676167802Sjkim 677167802Sjkim /* Insert the name into the namespace */ 678167802Sjkim 679167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 680306536Sjkim ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE, 681306536Sjkim WalkState, &Node); 682167802Sjkim 683167802Sjkim Op->Common.Node = Node; 684167802Sjkim 685193529Sjkim if (ACPI_SUCCESS (Status)) 686193529Sjkim { 687193529Sjkim /* Check if it's a predefined node */ 688167802Sjkim 689193529Sjkim while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name) 690193529Sjkim { 691241973Sjkim if (ACPI_COMPARE_NAME (Node->Name.Ascii, 692241973Sjkim AcpiGbl_PreDefinedNames[PreDefineIndex].Name)) 693193529Sjkim { 694193529Sjkim PreDefined = TRUE; 695193529Sjkim break; 696193529Sjkim } 697193529Sjkim 698193529Sjkim PreDefineIndex++; 699193529Sjkim } 700193529Sjkim 701193529Sjkim /* 702193529Sjkim * Set node owner id if it satisfies all the following conditions: 703193529Sjkim * 1) Not a predefined node, _SB_ etc 704193529Sjkim * 2) Not the root node 705193529Sjkim * 3) Not a node created by Scope 706193529Sjkim */ 707193529Sjkim 708193529Sjkim if (!PreDefined && Node != AcpiGbl_RootNode && 709193529Sjkim Op->Common.AmlOpcode != AML_SCOPE_OP) 710193529Sjkim { 711193529Sjkim Node->OwnerId = WalkState->OwnerId; 712193529Sjkim } 713193529Sjkim } 714193529Sjkim 715193529Sjkim 716167802SjkimExit: 717167802Sjkim 718167802Sjkim if (AcpiNsOpensScope (ObjectType)) 719167802Sjkim { 720167802Sjkim if (Op->Common.Node) 721167802Sjkim { 722306536Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, 723306536Sjkim WalkState); 724167802Sjkim if (ACPI_FAILURE (Status)) 725167802Sjkim { 726167802Sjkim return (Status); 727167802Sjkim } 728167802Sjkim } 729167802Sjkim } 730167802Sjkim 731167802Sjkim return (AE_OK); 732167802Sjkim} 733167802Sjkim 734167802Sjkim 735167802Sjkim/******************************************************************************* 736167802Sjkim * 737167802Sjkim * FUNCTION: AcpiDmXrefDescendingOp 738167802Sjkim * 739167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 740167802Sjkim * 741167802Sjkim * RETURN: Status 742167802Sjkim * 743167802Sjkim * DESCRIPTION: Descending handler for namespace cross reference 744167802Sjkim * 745167802Sjkim ******************************************************************************/ 746167802Sjkim 747167802Sjkimstatic ACPI_STATUS 748167802SjkimAcpiDmXrefDescendingOp ( 749167802Sjkim ACPI_PARSE_OBJECT *Op, 750167802Sjkim UINT32 Level, 751167802Sjkim void *Context) 752167802Sjkim{ 753167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 754167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 755167802Sjkim ACPI_WALK_STATE *WalkState; 756167802Sjkim ACPI_OBJECT_TYPE ObjectType; 757193529Sjkim ACPI_OBJECT_TYPE ObjectType2; 758167802Sjkim ACPI_STATUS Status; 759167802Sjkim char *Path = NULL; 760167802Sjkim ACPI_PARSE_OBJECT *NextOp; 761167802Sjkim ACPI_NAMESPACE_NODE *Node; 762193529Sjkim ACPI_OPERAND_OBJECT *Object; 763212761Sjkim UINT32 ParamCount = 0; 764281075Sdim char *Pathname; 765306536Sjkim UINT16 Flags = 0; 766167802Sjkim 767167802Sjkim 768167802Sjkim WalkState = Info->WalkState; 769167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 770167802Sjkim ObjectType = OpInfo->ObjectType; 771167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 772167802Sjkim 773167802Sjkim if ((!(OpInfo->Flags & AML_NAMED)) && 774167802Sjkim (!(OpInfo->Flags & AML_CREATE)) && 775281075Sdim (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP) && 776281075Sdim (Op->Common.AmlOpcode != AML_NOTIFY_OP)) 777167802Sjkim { 778167802Sjkim goto Exit; 779167802Sjkim } 780306536Sjkim else if (Op->Common.Parent && 781306536Sjkim Op->Common.Parent->Common.AmlOpcode == AML_EXTERNAL_OP) 782306536Sjkim { 783306536Sjkim /* External() NamePath */ 784167802Sjkim 785306536Sjkim Path = Op->Common.Value.String; 786306536Sjkim ObjectType = (ACPI_OBJECT_TYPE) Op->Common.Next->Common.Value.Integer; 787306536Sjkim if (ObjectType == ACPI_TYPE_METHOD) 788306536Sjkim { 789306536Sjkim ParamCount = (UINT32) 790306536Sjkim Op->Common.Next->Common.Next->Common.Value.Integer; 791306536Sjkim } 792281075Sdim 793306536Sjkim Flags |= ACPI_EXT_RESOLVED_REFERENCE | ACPI_EXT_ORIGIN_FROM_OPCODE; 794306536Sjkim AcpiDmAddOpToExternalList (Op, Path, 795306536Sjkim (UINT8) ObjectType, ParamCount, Flags); 796306536Sjkim 797306536Sjkim goto Exit; 798306536Sjkim } 799306536Sjkim 800167802Sjkim /* Get the NamePath from the appropriate place */ 801167802Sjkim 802167802Sjkim if (OpInfo->Flags & AML_NAMED) 803167802Sjkim { 804235945Sjkim /* 805235945Sjkim * Only these two operators (Alias, Scope) refer to an existing 806235945Sjkim * name, it is the first argument 807235945Sjkim */ 808235945Sjkim if (Op->Common.AmlOpcode == AML_ALIAS_OP) 809167802Sjkim { 810235945Sjkim ObjectType = ACPI_TYPE_ANY; 811235945Sjkim 812235945Sjkim NextOp = Op->Common.Value.Arg; 813235945Sjkim NextOp = NextOp->Common.Value.Arg; 814235945Sjkim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 815235945Sjkim { 816235945Sjkim Path = NextOp->Common.Value.String; 817235945Sjkim } 818235945Sjkim } 819235945Sjkim else if (Op->Common.AmlOpcode == AML_SCOPE_OP) 820235945Sjkim { 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 828235945Sjkim ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */ 829235945Sjkim 830167802Sjkim NextOp = Op->Common.Value.Arg; 831167802Sjkim if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) 832167802Sjkim { 833167802Sjkim Path = NextOp->Common.Value.String; 834167802Sjkim } 835167802Sjkim } 836281075Sdim else if (Op->Common.AmlOpcode == AML_NOTIFY_OP) 837281075Sdim { 838281075Sdim Path = Op->Common.Value.Arg->Asl.Value.String; 839281075Sdim } 840167802Sjkim else 841167802Sjkim { 842167802Sjkim Path = Op->Common.Value.String; 843167802Sjkim } 844167802Sjkim 845167802Sjkim if (!Path) 846167802Sjkim { 847167802Sjkim goto Exit; 848167802Sjkim } 849167802Sjkim 850167802Sjkim /* 851241973Sjkim * Lookup the name in the namespace. Name must exist at this point, or it 852167802Sjkim * is an invalid reference. 853167802Sjkim * 854167802Sjkim * The namespace is also used as a lookup table for references to resource 855167802Sjkim * descriptors and the fields within them. 856167802Sjkim */ 857281075Sdim Node = NULL; 858167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 859306536Sjkim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 860306536Sjkim WalkState, &Node); 861306536Sjkim 862235945Sjkim if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL)) 863235945Sjkim { 864281075Sdim /* Node was created by an External() statement */ 865281075Sdim 866235945Sjkim Status = AE_NOT_FOUND; 867235945Sjkim } 868235945Sjkim 869167802Sjkim if (ACPI_FAILURE (Status)) 870167802Sjkim { 871167802Sjkim if (Status == AE_NOT_FOUND) 872167802Sjkim { 873167802Sjkim /* 874281075Sdim * Add this symbol as an external declaration, except if the 875281075Sdim * parent is a CondRefOf operator. For this operator, we do not 876281075Sdim * need an external, nor do we want one, since this can cause 877281075Sdim * disassembly problems if the symbol is actually a control 878281075Sdim * method. 879167802Sjkim */ 880281075Sdim if (!(Op->Asl.Parent && 881281075Sdim (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP))) 882281075Sdim { 883281075Sdim if (Node) 884281075Sdim { 885281075Sdim AcpiDmAddNodeToExternalList (Node, 886306536Sjkim (UINT8) ObjectType, 7, Flags); 887281075Sdim } 888281075Sdim else 889281075Sdim { 890281075Sdim AcpiDmAddOpToExternalList (Op, Path, 891306536Sjkim (UINT8) ObjectType, 7, Flags); 892281075Sdim } 893281075Sdim } 894167802Sjkim } 895167802Sjkim } 896193529Sjkim 897193529Sjkim /* 898281075Sdim * Found the node, but check if it came from an external table. 899281075Sdim * Add it to external list. Note: Node->OwnerId == 0 indicates 900281075Sdim * one of the built-in ACPI Names (_OS_ etc.) which can safely 901281075Sdim * be ignored. 902193529Sjkim */ 903281075Sdim else if (Node->OwnerId && 904281075Sdim (WalkState->OwnerId != Node->OwnerId)) 905193529Sjkim { 906193529Sjkim ObjectType2 = ObjectType; 907193529Sjkim 908193529Sjkim Object = AcpiNsGetAttachedObject (Node); 909193529Sjkim if (Object) 910193529Sjkim { 911193529Sjkim ObjectType2 = Object->Common.Type; 912212761Sjkim if (ObjectType2 == ACPI_TYPE_METHOD) 913212761Sjkim { 914212761Sjkim ParamCount = Object->Method.ParamCount; 915212761Sjkim } 916193529Sjkim } 917193529Sjkim 918281075Sdim Pathname = AcpiNsGetExternalPathname (Node); 919281075Sdim if (!Pathname) 920281075Sdim { 921281075Sdim return (AE_NO_MEMORY); 922281075Sdim } 923281075Sdim 924281075Sdim AcpiDmAddNodeToExternalList (Node, (UINT8) ObjectType2, 925281075Sdim ParamCount, ACPI_EXT_RESOLVED_REFERENCE); 926281075Sdim 927281075Sdim ACPI_FREE (Pathname); 928193529Sjkim Op->Common.Node = Node; 929193529Sjkim } 930167802Sjkim else 931167802Sjkim { 932167802Sjkim Op->Common.Node = Node; 933167802Sjkim } 934167802Sjkim 935167802Sjkim 936167802SjkimExit: 937167802Sjkim /* Open new scope if necessary */ 938167802Sjkim 939167802Sjkim if (AcpiNsOpensScope (ObjectType)) 940167802Sjkim { 941167802Sjkim if (Op->Common.Node) 942167802Sjkim { 943306536Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, 944306536Sjkim WalkState); 945167802Sjkim if (ACPI_FAILURE (Status)) 946167802Sjkim { 947167802Sjkim return (Status); 948167802Sjkim } 949167802Sjkim } 950167802Sjkim } 951167802Sjkim 952167802Sjkim return (AE_OK); 953167802Sjkim} 954167802Sjkim 955167802Sjkim 956167802Sjkim/******************************************************************************* 957167802Sjkim * 958167802Sjkim * FUNCTION: AcpiDmResourceDescendingOp 959167802Sjkim * 960167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 961167802Sjkim * 962167802Sjkim * RETURN: None 963167802Sjkim * 964167802Sjkim * DESCRIPTION: Process one parse op during symbolic resource index conversion. 965167802Sjkim * 966167802Sjkim ******************************************************************************/ 967167802Sjkim 968167802Sjkimstatic ACPI_STATUS 969167802SjkimAcpiDmResourceDescendingOp ( 970167802Sjkim ACPI_PARSE_OBJECT *Op, 971167802Sjkim UINT32 Level, 972167802Sjkim void *Context) 973167802Sjkim{ 974167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 975167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 976167802Sjkim ACPI_WALK_STATE *WalkState; 977167802Sjkim ACPI_OBJECT_TYPE ObjectType; 978167802Sjkim ACPI_STATUS Status; 979167802Sjkim 980167802Sjkim 981167802Sjkim WalkState = Info->WalkState; 982167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 983167802Sjkim 984167802Sjkim /* Open new scope if necessary */ 985167802Sjkim 986167802Sjkim ObjectType = OpInfo->ObjectType; 987167802Sjkim if (AcpiNsOpensScope (ObjectType)) 988167802Sjkim { 989167802Sjkim if (Op->Common.Node) 990167802Sjkim { 991167802Sjkim 992306536Sjkim Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, 993306536Sjkim WalkState); 994167802Sjkim if (ACPI_FAILURE (Status)) 995167802Sjkim { 996167802Sjkim return (Status); 997167802Sjkim } 998167802Sjkim } 999167802Sjkim } 1000167802Sjkim 1001167802Sjkim /* 1002167802Sjkim * Check if this operator contains a reference to a resource descriptor. 1003167802Sjkim * If so, convert the reference into a symbolic reference. 1004167802Sjkim */ 1005167802Sjkim AcpiDmCheckResourceReference (Op, WalkState); 1006167802Sjkim return (AE_OK); 1007167802Sjkim} 1008167802Sjkim 1009167802Sjkim 1010167802Sjkim/******************************************************************************* 1011167802Sjkim * 1012167802Sjkim * FUNCTION: AcpiDmCommonAscendingOp 1013167802Sjkim * 1014167802Sjkim * PARAMETERS: ASL_WALK_CALLBACK 1015167802Sjkim * 1016167802Sjkim * RETURN: None 1017167802Sjkim * 1018167802Sjkim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes 1019167802Sjkim * scope if necessary. 1020167802Sjkim * 1021167802Sjkim ******************************************************************************/ 1022167802Sjkim 1023167802Sjkimstatic ACPI_STATUS 1024167802SjkimAcpiDmCommonAscendingOp ( 1025167802Sjkim ACPI_PARSE_OBJECT *Op, 1026167802Sjkim UINT32 Level, 1027167802Sjkim void *Context) 1028167802Sjkim{ 1029167802Sjkim ACPI_OP_WALK_INFO *Info = Context; 1030167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 1031167802Sjkim ACPI_OBJECT_TYPE ObjectType; 1032167802Sjkim 1033167802Sjkim 1034167802Sjkim /* Close scope if necessary */ 1035167802Sjkim 1036167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 1037167802Sjkim ObjectType = OpInfo->ObjectType; 1038167802Sjkim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 1039167802Sjkim 1040167802Sjkim if (AcpiNsOpensScope (ObjectType)) 1041167802Sjkim { 1042167802Sjkim (void) AcpiDsScopeStackPop (Info->WalkState); 1043167802Sjkim } 1044167802Sjkim 1045167802Sjkim return (AE_OK); 1046167802Sjkim} 1047167802Sjkim 1048167802Sjkim 1049167802Sjkim/******************************************************************************* 1050167802Sjkim * 1051167802Sjkim * FUNCTION: AcpiDmInspectPossibleArgs 1052167802Sjkim * 1053167802Sjkim * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the 1054167802Sjkim * possible method invocation found 1055167802Sjkim * TargetCount - Number of targets (0,1,2) for this op 1056167802Sjkim * Op - Parse op 1057167802Sjkim * 1058167802Sjkim * RETURN: Status 1059167802Sjkim * 1060167802Sjkim * DESCRIPTION: Examine following args and next ops for possible arguments 1061167802Sjkim * for an unrecognized method invocation. 1062167802Sjkim * 1063167802Sjkim ******************************************************************************/ 1064167802Sjkim 1065167802Sjkimstatic UINT32 1066167802SjkimAcpiDmInspectPossibleArgs ( 1067167802Sjkim UINT32 CurrentOpArgCount, 1068167802Sjkim UINT32 TargetCount, 1069167802Sjkim ACPI_PARSE_OBJECT *Op) 1070167802Sjkim{ 1071167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 1072167802Sjkim UINT32 i; 1073306536Sjkim UINT32 ArgumentCount = 0; 1074306536Sjkim ACPI_PARSE_OBJECT *NextOp; 1075306536Sjkim ACPI_PARSE_OBJECT *ExecuteOp; 1076167802Sjkim 1077167802Sjkim 1078306536Sjkim if (!Op) 1079306536Sjkim { 1080306536Sjkim return (0); 1081306536Sjkim } 1082167802Sjkim 1083167802Sjkim /* Lookahead for the maximum number of possible arguments */ 1084167802Sjkim 1085306536Sjkim NextOp = Op->Common.Next; 1086306536Sjkim 1087306536Sjkim for (i = 0; (i < ACPI_METHOD_NUM_ARGS) && NextOp; i++) 1088167802Sjkim { 1089306536Sjkim OpInfo = AcpiPsGetOpcodeInfo (NextOp->Common.AmlOpcode); 1090167802Sjkim 1091306536Sjkim /* Any one of these operators is "very probably" not a method arg */ 1092167802Sjkim 1093306536Sjkim if ((NextOp->Common.AmlOpcode == AML_STORE_OP) || 1094306536Sjkim (NextOp->Common.AmlOpcode == AML_NOTIFY_OP) || 1095306536Sjkim (OpInfo->Class == AML_CLASS_CONTROL) || 1096306536Sjkim (OpInfo->Class == AML_CLASS_CREATE) || 1097306536Sjkim (OpInfo->Class == AML_CLASS_NAMED_OBJECT)) 1098167802Sjkim { 1099167802Sjkim break; 1100167802Sjkim } 1101167802Sjkim 1102306536Sjkim if (OpInfo->Class == AML_CLASS_EXECUTE) 1103167802Sjkim { 1104306536Sjkim /* Probable that this is method arg if there is no target */ 1105306536Sjkim 1106306536Sjkim ExecuteOp = NextOp->Common.Value.Arg; 1107306536Sjkim while (ExecuteOp) 1108306536Sjkim { 1109306536Sjkim if ((ExecuteOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 1110306536Sjkim (ExecuteOp->Common.Value.Arg == NULL)) 1111306536Sjkim { 1112306536Sjkim /* No target, could be a method arg */ 1113306536Sjkim 1114306536Sjkim break; 1115306536Sjkim } 1116306536Sjkim 1117306536Sjkim if (NextOp->Common.AmlOpcode == AML_REF_OF_OP) 1118306536Sjkim { 1119306536Sjkim break; 1120306536Sjkim } 1121306536Sjkim 1122306536Sjkim ExecuteOp = ExecuteOp->Common.Next; 1123306536Sjkim } 1124306536Sjkim 1125306536Sjkim if (!ExecuteOp) 1126306536Sjkim { 1127306536Sjkim /* Has a target, not method arg */ 1128306536Sjkim 1129306536Sjkim return (ArgumentCount); 1130306536Sjkim } 1131167802Sjkim } 1132167802Sjkim 1133306536Sjkim ArgumentCount++; 1134306536Sjkim NextOp = NextOp->Common.Next; 1135167802Sjkim } 1136167802Sjkim 1137306536Sjkim return (ArgumentCount); 1138167802Sjkim} 1139