dmwalk.c revision 287168
1100966Siwasaki/******************************************************************************* 2100966Siwasaki * 3100966Siwasaki * Module Name: dmwalk - AML disassembly tree walk 4100966Siwasaki * 5100966Siwasaki ******************************************************************************/ 6100966Siwasaki 7217365Sjkim/* 8278970Sjkim * Copyright (C) 2000 - 2015, Intel Corp. 9100966Siwasaki * All rights reserved. 10100966Siwasaki * 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. 25100966Siwasaki * 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. 29100966Siwasaki * 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 */ 43100966Siwasaki 44193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193341Sjkim#include <contrib/dev/acpica/include/acparser.h> 47193341Sjkim#include <contrib/dev/acpica/include/amlcode.h> 48193341Sjkim#include <contrib/dev/acpica/include/acdebug.h> 49100966Siwasaki 50100966Siwasaki 51102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 52100966Siwasaki ACPI_MODULE_NAME ("dmwalk") 53100966Siwasaki 54100966Siwasaki 55151937Sjkim#define DB_FULL_OP_INFO "[%4.4s] @%5.5X #%4.4X: " 56100966Siwasaki 57198237Sjkim/* Stub for non-compiler code */ 58198237Sjkim 59198237Sjkim#ifndef ACPI_ASL_COMPILER 60198237Sjkimvoid 61198237SjkimAcpiDmEmitExternals ( 62198237Sjkim void) 63198237Sjkim{ 64198237Sjkim return; 65198237Sjkim} 66198237Sjkim#endif 67198237Sjkim 68151937Sjkim/* Local prototypes */ 69100966Siwasaki 70151937Sjkimstatic ACPI_STATUS 71151937SjkimAcpiDmDescendingOp ( 72151937Sjkim ACPI_PARSE_OBJECT *Op, 73151937Sjkim UINT32 Level, 74151937Sjkim void *Context); 75151937Sjkim 76151937Sjkimstatic ACPI_STATUS 77151937SjkimAcpiDmAscendingOp ( 78151937Sjkim ACPI_PARSE_OBJECT *Op, 79151937Sjkim UINT32 Level, 80151937Sjkim void *Context); 81151937Sjkim 82151937Sjkimstatic UINT32 83151937SjkimAcpiDmBlockType ( 84151937Sjkim ACPI_PARSE_OBJECT *Op); 85151937Sjkim 86151937Sjkim 87100966Siwasaki/******************************************************************************* 88100966Siwasaki * 89100966Siwasaki * FUNCTION: AcpiDmDisassemble 90100966Siwasaki * 91151937Sjkim * PARAMETERS: WalkState - Current state 92151937Sjkim * Origin - Starting object 93100966Siwasaki * NumOpcodes - Max number of opcodes to be displayed 94100966Siwasaki * 95100966Siwasaki * RETURN: None 96100966Siwasaki * 97241973Sjkim * DESCRIPTION: Disassemble parser object and its children. This is the 98100966Siwasaki * main entry point of the disassembler. 99100966Siwasaki * 100100966Siwasaki ******************************************************************************/ 101100966Siwasaki 102100966Siwasakivoid 103100966SiwasakiAcpiDmDisassemble ( 104100966Siwasaki ACPI_WALK_STATE *WalkState, 105100966Siwasaki ACPI_PARSE_OBJECT *Origin, 106100966Siwasaki UINT32 NumOpcodes) 107100966Siwasaki{ 108100966Siwasaki ACPI_PARSE_OBJECT *Op = Origin; 109100966Siwasaki ACPI_OP_WALK_INFO Info; 110100966Siwasaki 111100966Siwasaki 112100966Siwasaki if (!Op) 113100966Siwasaki { 114100966Siwasaki return; 115100966Siwasaki } 116100966Siwasaki 117287168Sjkim memset (&Info, 0, sizeof (ACPI_OP_WALK_INFO)); 118151937Sjkim Info.WalkState = WalkState; 119287168Sjkim Info.StartAml = Op->Common.Aml - sizeof (ACPI_TABLE_HEADER); 120287168Sjkim Info.AmlOffset = Op->Common.Aml - Info.StartAml; 121287168Sjkim 122100966Siwasaki AcpiDmWalkParseTree (Op, AcpiDmDescendingOp, AcpiDmAscendingOp, &Info); 123100966Siwasaki return; 124100966Siwasaki} 125100966Siwasaki 126100966Siwasaki 127100966Siwasaki/******************************************************************************* 128100966Siwasaki * 129100966Siwasaki * FUNCTION: AcpiDmWalkParseTree 130100966Siwasaki * 131151937Sjkim * PARAMETERS: Op - Root Op object 132151937Sjkim * DescendingCallback - Called during tree descent 133100966Siwasaki * AscendingCallback - Called during tree ascent 134100966Siwasaki * Context - To be passed to the callbacks 135100966Siwasaki * 136100966Siwasaki * RETURN: Status from callback(s) 137100966Siwasaki * 138100966Siwasaki * DESCRIPTION: Walk the entire parse tree. 139100966Siwasaki * 140100966Siwasaki ******************************************************************************/ 141100966Siwasaki 142167802Sjkimvoid 143100966SiwasakiAcpiDmWalkParseTree ( 144100966Siwasaki ACPI_PARSE_OBJECT *Op, 145100966Siwasaki ASL_WALK_CALLBACK DescendingCallback, 146100966Siwasaki ASL_WALK_CALLBACK AscendingCallback, 147100966Siwasaki void *Context) 148100966Siwasaki{ 149100966Siwasaki BOOLEAN NodePreviouslyVisited; 150100966Siwasaki ACPI_PARSE_OBJECT *StartOp = Op; 151100966Siwasaki ACPI_STATUS Status; 152100966Siwasaki ACPI_PARSE_OBJECT *Next; 153100966Siwasaki ACPI_OP_WALK_INFO *Info = Context; 154100966Siwasaki 155100966Siwasaki 156100966Siwasaki Info->Level = 0; 157100966Siwasaki NodePreviouslyVisited = FALSE; 158100966Siwasaki 159100966Siwasaki while (Op) 160100966Siwasaki { 161100966Siwasaki if (NodePreviouslyVisited) 162100966Siwasaki { 163167802Sjkim if (AscendingCallback) 164100966Siwasaki { 165167802Sjkim Status = AscendingCallback (Op, Info->Level, Context); 166167802Sjkim if (ACPI_FAILURE (Status)) 167167802Sjkim { 168167802Sjkim return; 169167802Sjkim } 170100966Siwasaki } 171100966Siwasaki } 172100966Siwasaki else 173100966Siwasaki { 174117521Snjl /* Let the callback process the node */ 175117521Snjl 176100966Siwasaki Status = DescendingCallback (Op, Info->Level, Context); 177100966Siwasaki if (ACPI_SUCCESS (Status)) 178100966Siwasaki { 179100966Siwasaki /* Visit children first, once */ 180100966Siwasaki 181100966Siwasaki Next = AcpiPsGetArg (Op, 0); 182100966Siwasaki if (Next) 183100966Siwasaki { 184100966Siwasaki Info->Level++; 185100966Siwasaki Op = Next; 186100966Siwasaki continue; 187100966Siwasaki } 188100966Siwasaki } 189100966Siwasaki else if (Status != AE_CTRL_DEPTH) 190100966Siwasaki { 191100966Siwasaki /* Exit immediately on any error */ 192100966Siwasaki 193100966Siwasaki return; 194100966Siwasaki } 195100966Siwasaki } 196100966Siwasaki 197100966Siwasaki /* Terminate walk at start op */ 198100966Siwasaki 199100966Siwasaki if (Op == StartOp) 200100966Siwasaki { 201100966Siwasaki break; 202100966Siwasaki } 203100966Siwasaki 204100966Siwasaki /* No more children, re-visit this node */ 205100966Siwasaki 206100966Siwasaki if (!NodePreviouslyVisited) 207100966Siwasaki { 208100966Siwasaki NodePreviouslyVisited = TRUE; 209100966Siwasaki continue; 210100966Siwasaki } 211100966Siwasaki 212100966Siwasaki /* No more children, visit peers */ 213100966Siwasaki 214100966Siwasaki if (Op->Common.Next) 215100966Siwasaki { 216100966Siwasaki Op = Op->Common.Next; 217100966Siwasaki NodePreviouslyVisited = FALSE; 218100966Siwasaki } 219100966Siwasaki else 220100966Siwasaki { 221100966Siwasaki /* No peers, re-visit parent */ 222100966Siwasaki 223100966Siwasaki if (Info->Level != 0 ) 224100966Siwasaki { 225100966Siwasaki Info->Level--; 226100966Siwasaki } 227100966Siwasaki 228100966Siwasaki Op = Op->Common.Parent; 229100966Siwasaki NodePreviouslyVisited = TRUE; 230100966Siwasaki } 231100966Siwasaki } 232100966Siwasaki 233100966Siwasaki /* If we get here, the walk completed with no errors */ 234100966Siwasaki 235100966Siwasaki return; 236100966Siwasaki} 237100966Siwasaki 238100966Siwasaki 239100966Siwasaki/******************************************************************************* 240100966Siwasaki * 241100966Siwasaki * FUNCTION: AcpiDmBlockType 242100966Siwasaki * 243100966Siwasaki * PARAMETERS: Op - Object to be examined 244100966Siwasaki * 245151937Sjkim * RETURN: BlockType - not a block, parens, braces, or even both. 246100966Siwasaki * 247100966Siwasaki * DESCRIPTION: Type of block for this op (parens or braces) 248100966Siwasaki * 249100966Siwasaki ******************************************************************************/ 250100966Siwasaki 251151937Sjkimstatic UINT32 252100966SiwasakiAcpiDmBlockType ( 253100966Siwasaki ACPI_PARSE_OBJECT *Op) 254100966Siwasaki{ 255100966Siwasaki const ACPI_OPCODE_INFO *OpInfo; 256100966Siwasaki 257100966Siwasaki 258100966Siwasaki if (!Op) 259100966Siwasaki { 260100966Siwasaki return (BLOCK_NONE); 261100966Siwasaki } 262100966Siwasaki 263100966Siwasaki switch (Op->Common.AmlOpcode) 264100966Siwasaki { 265100966Siwasaki case AML_ELSE_OP: 266100966Siwasaki 267100966Siwasaki return (BLOCK_BRACE); 268100966Siwasaki 269100966Siwasaki case AML_METHOD_OP: 270100966Siwasaki case AML_DEVICE_OP: 271100966Siwasaki case AML_SCOPE_OP: 272100966Siwasaki case AML_PROCESSOR_OP: 273100966Siwasaki case AML_POWER_RES_OP: 274100966Siwasaki case AML_THERMAL_ZONE_OP: 275100966Siwasaki case AML_IF_OP: 276100966Siwasaki case AML_WHILE_OP: 277100966Siwasaki case AML_FIELD_OP: 278100966Siwasaki case AML_INDEX_FIELD_OP: 279100966Siwasaki case AML_BANK_FIELD_OP: 280100966Siwasaki 281100966Siwasaki return (BLOCK_PAREN | BLOCK_BRACE); 282100966Siwasaki 283100966Siwasaki case AML_BUFFER_OP: 284100966Siwasaki 285272444Sjkim if ((Op->Common.DisasmOpcode == ACPI_DASM_UNICODE) || 286278970Sjkim (Op->Common.DisasmOpcode == ACPI_DASM_UUID) || 287278970Sjkim (Op->Common.DisasmOpcode == ACPI_DASM_PLD_METHOD)) 288100966Siwasaki { 289100966Siwasaki return (BLOCK_NONE); 290100966Siwasaki } 291100966Siwasaki 292100966Siwasaki /*lint -fallthrough */ 293100966Siwasaki 294100966Siwasaki case AML_PACKAGE_OP: 295100966Siwasaki case AML_VAR_PACKAGE_OP: 296100966Siwasaki 297100966Siwasaki return (BLOCK_PAREN | BLOCK_BRACE); 298100966Siwasaki 299100966Siwasaki case AML_EVENT_OP: 300100966Siwasaki 301100966Siwasaki return (BLOCK_PAREN); 302100966Siwasaki 303278970Sjkim case AML_INT_METHODCALL_OP: 304278970Sjkim 305278970Sjkim if (Op->Common.Parent && 306278970Sjkim ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) || 307278970Sjkim (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))) 308278970Sjkim { 309278970Sjkim /* This is a reference to a method, not an invocation */ 310278970Sjkim 311278970Sjkim return (BLOCK_NONE); 312278970Sjkim } 313278970Sjkim 314285797Sjkim /*lint -fallthrough */ 315285797Sjkim 316100966Siwasaki default: 317100966Siwasaki 318100966Siwasaki OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 319100966Siwasaki if (OpInfo->Flags & AML_HAS_ARGS) 320100966Siwasaki { 321100966Siwasaki return (BLOCK_PAREN); 322100966Siwasaki } 323100966Siwasaki 324100966Siwasaki return (BLOCK_NONE); 325100966Siwasaki } 326100966Siwasaki} 327100966Siwasaki 328100966Siwasaki 329100966Siwasaki/******************************************************************************* 330100966Siwasaki * 331100966Siwasaki * FUNCTION: AcpiDmListType 332100966Siwasaki * 333100966Siwasaki * PARAMETERS: Op - Object to be examined 334100966Siwasaki * 335151937Sjkim * RETURN: ListType - has commas or not. 336100966Siwasaki * 337100966Siwasaki * DESCRIPTION: Type of block for this op (parens or braces) 338100966Siwasaki * 339100966Siwasaki ******************************************************************************/ 340100966Siwasaki 341100966SiwasakiUINT32 342100966SiwasakiAcpiDmListType ( 343100966Siwasaki ACPI_PARSE_OBJECT *Op) 344100966Siwasaki{ 345100966Siwasaki const ACPI_OPCODE_INFO *OpInfo; 346100966Siwasaki 347100966Siwasaki 348100966Siwasaki if (!Op) 349100966Siwasaki { 350100966Siwasaki return (BLOCK_NONE); 351100966Siwasaki } 352100966Siwasaki 353100966Siwasaki switch (Op->Common.AmlOpcode) 354100966Siwasaki { 355100966Siwasaki 356100966Siwasaki case AML_ELSE_OP: 357100966Siwasaki case AML_METHOD_OP: 358100966Siwasaki case AML_DEVICE_OP: 359100966Siwasaki case AML_SCOPE_OP: 360100966Siwasaki case AML_POWER_RES_OP: 361100966Siwasaki case AML_PROCESSOR_OP: 362100966Siwasaki case AML_THERMAL_ZONE_OP: 363100966Siwasaki case AML_IF_OP: 364100966Siwasaki case AML_WHILE_OP: 365100966Siwasaki case AML_FIELD_OP: 366100966Siwasaki case AML_INDEX_FIELD_OP: 367100966Siwasaki case AML_BANK_FIELD_OP: 368100966Siwasaki 369151937Sjkim return (BLOCK_NONE); 370100966Siwasaki 371100966Siwasaki case AML_BUFFER_OP: 372100966Siwasaki case AML_PACKAGE_OP: 373100966Siwasaki case AML_VAR_PACKAGE_OP: 374100966Siwasaki 375100966Siwasaki return (BLOCK_COMMA_LIST); 376100966Siwasaki 377100966Siwasaki default: 378100966Siwasaki 379100966Siwasaki OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 380100966Siwasaki if (OpInfo->Flags & AML_HAS_ARGS) 381100966Siwasaki { 382100966Siwasaki return (BLOCK_COMMA_LIST); 383100966Siwasaki } 384100966Siwasaki 385100966Siwasaki return (BLOCK_NONE); 386100966Siwasaki } 387100966Siwasaki} 388100966Siwasaki 389100966Siwasaki 390100966Siwasaki/******************************************************************************* 391100966Siwasaki * 392100966Siwasaki * FUNCTION: AcpiDmDescendingOp 393100966Siwasaki * 394100966Siwasaki * PARAMETERS: ASL_WALK_CALLBACK 395100966Siwasaki * 396100966Siwasaki * RETURN: Status 397100966Siwasaki * 398102550Siwasaki * DESCRIPTION: First visitation of a parse object during tree descent. 399100966Siwasaki * Decode opcode name and begin parameter list(s), if any. 400100966Siwasaki * 401100966Siwasaki ******************************************************************************/ 402100966Siwasaki 403151937Sjkimstatic ACPI_STATUS 404100966SiwasakiAcpiDmDescendingOp ( 405100966Siwasaki ACPI_PARSE_OBJECT *Op, 406100966Siwasaki UINT32 Level, 407100966Siwasaki void *Context) 408100966Siwasaki{ 409100966Siwasaki ACPI_OP_WALK_INFO *Info = Context; 410100966Siwasaki const ACPI_OPCODE_INFO *OpInfo; 411100966Siwasaki UINT32 Name; 412100966Siwasaki ACPI_PARSE_OBJECT *NextOp; 413285797Sjkim UINT32 AmlOffset; 414100966Siwasaki 415100966Siwasaki 416287168Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 417287168Sjkim 418287168Sjkim /* Listing support to dump the AML code after the ASL statement */ 419287168Sjkim 420287168Sjkim if (AcpiGbl_DmOpt_Listing) 421285797Sjkim { 422287168Sjkim /* We only care about these classes of objects */ 423285797Sjkim 424287168Sjkim if ((OpInfo->Class == AML_CLASS_NAMED_OBJECT) || 425287168Sjkim (OpInfo->Class == AML_CLASS_CONTROL) || 426287168Sjkim (OpInfo->Class == AML_CLASS_CREATE) || 427287168Sjkim ((OpInfo->Class == AML_CLASS_EXECUTE) && (!Op->Common.Next))) 428285797Sjkim { 429287168Sjkim if (AcpiGbl_DmOpt_Listing && Info->PreviousAml) 430287168Sjkim { 431287168Sjkim /* Dump the AML byte code for the previous Op */ 432287168Sjkim 433287168Sjkim if (Op->Common.Aml > Info->PreviousAml) 434287168Sjkim { 435287168Sjkim AcpiOsPrintf ("\n"); 436287168Sjkim AcpiUtDumpBuffer ( 437287168Sjkim (Info->StartAml + Info->AmlOffset), 438287168Sjkim (Op->Common.Aml - Info->PreviousAml), 439287168Sjkim DB_BYTE_DISPLAY, 440287168Sjkim Info->AmlOffset); 441287168Sjkim AcpiOsPrintf ("\n"); 442287168Sjkim } 443287168Sjkim 444287168Sjkim Info->AmlOffset = (Op->Common.Aml - Info->StartAml); 445287168Sjkim } 446287168Sjkim 447287168Sjkim Info->PreviousAml = Op->Common.Aml; 448285797Sjkim } 449285797Sjkim } 450285797Sjkim 451100966Siwasaki if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) 452100966Siwasaki { 453100966Siwasaki /* Ignore this op -- it was handled elsewhere */ 454100966Siwasaki 455100966Siwasaki return (AE_CTRL_DEPTH); 456100966Siwasaki } 457100966Siwasaki 458128212Snjl /* Level 0 is at the Definition Block level */ 459100966Siwasaki 460100966Siwasaki if (Level == 0) 461100966Siwasaki { 462100966Siwasaki /* In verbose mode, print the AML offset, opcode and depth count */ 463100966Siwasaki 464151937Sjkim if (Info->WalkState) 465151937Sjkim { 466285797Sjkim AmlOffset = (UINT32) ACPI_PTR_DIFF (Op->Common.Aml, 467285797Sjkim Info->WalkState->ParserState.AmlStart); 468287168Sjkim if (AcpiGbl_DmOpt_Verbose) 469287168Sjkim { 470287168Sjkim AcpiOsPrintf (DB_FULL_OP_INFO, 471287168Sjkim (Info->WalkState->MethodNode ? 472287168Sjkim Info->WalkState->MethodNode->Name.Ascii : " "), 473287168Sjkim AmlOffset, (UINT32) Op->Common.AmlOpcode); 474287168Sjkim } 475151937Sjkim } 476100966Siwasaki 477100966Siwasaki if (Op->Common.AmlOpcode == AML_SCOPE_OP) 478100966Siwasaki { 479128212Snjl /* This is the beginning of the Definition Block */ 480128212Snjl 481100966Siwasaki AcpiOsPrintf ("{\n"); 482128212Snjl 483128212Snjl /* Emit all External() declarations here */ 484128212Snjl 485198237Sjkim AcpiDmEmitExternals (); 486100966Siwasaki return (AE_OK); 487100966Siwasaki } 488100966Siwasaki } 489100966Siwasaki else if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 490100966Siwasaki (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) && 491100966Siwasaki (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 492100966Siwasaki { 493151937Sjkim /* 494151937Sjkim * This is a first-level element of a term list, 495151937Sjkim * indent a new line 496151937Sjkim */ 497245582Sjkim switch (Op->Common.AmlOpcode) 498245582Sjkim { 499245582Sjkim case AML_NOOP_OP: 500245582Sjkim /* 501245582Sjkim * Optionally just ignore this opcode. Some tables use 502245582Sjkim * NoOp opcodes for "padding" out packages that the BIOS 503245582Sjkim * changes dynamically. This can leave hundreds or 504245582Sjkim * thousands of NoOp opcodes that if disassembled, 505245582Sjkim * cannot be compiled because they are syntactically 506245582Sjkim * incorrect. 507245582Sjkim */ 508245582Sjkim if (AcpiGbl_IgnoreNoopOperator) 509245582Sjkim { 510245582Sjkim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 511245582Sjkim return (AE_OK); 512245582Sjkim } 513245582Sjkim 514245582Sjkim /* Fallthrough */ 515245582Sjkim 516245582Sjkim default: 517250838Sjkim 518245582Sjkim AcpiDmIndent (Level); 519245582Sjkim break; 520245582Sjkim } 521245582Sjkim 522167802Sjkim Info->LastLevel = Level; 523167802Sjkim Info->Count = 0; 524100966Siwasaki } 525100966Siwasaki 526167802Sjkim /* 527167802Sjkim * This is an inexpensive mechanism to try and keep lines from getting 528167802Sjkim * too long. When the limit is hit, start a new line at the previous 529167802Sjkim * indent plus one. A better but more expensive mechanism would be to 530167802Sjkim * keep track of the current column. 531167802Sjkim */ 532167802Sjkim Info->Count++; 533278970Sjkim if (Info->Count /* +Info->LastLevel */ > 12) 534167802Sjkim { 535167802Sjkim Info->Count = 0; 536167802Sjkim AcpiOsPrintf ("\n"); 537167802Sjkim AcpiDmIndent (Info->LastLevel + 1); 538167802Sjkim } 539167802Sjkim 540278970Sjkim /* If ASL+ is enabled, check for a C-style operator */ 541278970Sjkim 542278970Sjkim if (AcpiDmCheckForSymbolicOpcode (Op, Info)) 543278970Sjkim { 544278970Sjkim return (AE_OK); 545278970Sjkim } 546278970Sjkim 547100966Siwasaki /* Print the opcode name */ 548100966Siwasaki 549100966Siwasaki AcpiDmDisassembleOneOp (NULL, Info, Op); 550100966Siwasaki 551228110Sjkim if ((Op->Common.DisasmOpcode == ACPI_DASM_LNOT_PREFIX) || 552228110Sjkim (Op->Common.AmlOpcode == AML_INT_CONNECTION_OP)) 553167802Sjkim { 554167802Sjkim return (AE_OK); 555167802Sjkim } 556167802Sjkim 557100966Siwasaki if ((Op->Common.AmlOpcode == AML_NAME_OP) || 558100966Siwasaki (Op->Common.AmlOpcode == AML_RETURN_OP)) 559100966Siwasaki { 560100966Siwasaki Info->Level--; 561100966Siwasaki } 562100966Siwasaki 563117521Snjl /* Start the opcode argument list if necessary */ 564117521Snjl 565102550Siwasaki if ((OpInfo->Flags & AML_HAS_ARGS) || 566100966Siwasaki (Op->Common.AmlOpcode == AML_EVENT_OP)) 567100966Siwasaki { 568100966Siwasaki /* This opcode has an argument list */ 569100966Siwasaki 570100966Siwasaki if (AcpiDmBlockType (Op) & BLOCK_PAREN) 571100966Siwasaki { 572100966Siwasaki AcpiOsPrintf (" ("); 573100966Siwasaki } 574100966Siwasaki 575117521Snjl /* If this is a named opcode, print the associated name value */ 576117521Snjl 577100966Siwasaki if (OpInfo->Flags & AML_NAMED) 578100966Siwasaki { 579100966Siwasaki switch (Op->Common.AmlOpcode) 580100966Siwasaki { 581100966Siwasaki case AML_ALIAS_OP: 582100966Siwasaki 583100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 584100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 585100966Siwasaki AcpiDmNamestring (NextOp->Common.Value.Name); 586100966Siwasaki AcpiOsPrintf (", "); 587100966Siwasaki 588100966Siwasaki /*lint -fallthrough */ 589100966Siwasaki 590100966Siwasaki default: 591100966Siwasaki 592100966Siwasaki Name = AcpiPsGetName (Op); 593100966Siwasaki if (Op->Named.Path) 594100966Siwasaki { 595100966Siwasaki AcpiDmNamestring ((char *) Op->Named.Path); 596100966Siwasaki } 597100966Siwasaki else 598100966Siwasaki { 599193267Sjkim AcpiDmDumpName (Name); 600100966Siwasaki } 601100966Siwasaki 602100966Siwasaki if (Op->Common.AmlOpcode != AML_INT_NAMEDFIELD_OP) 603100966Siwasaki { 604287168Sjkim if (AcpiGbl_DmOpt_Verbose) 605100966Siwasaki { 606100966Siwasaki (void) AcpiPsDisplayObjectPathname (NULL, Op); 607100966Siwasaki } 608100966Siwasaki } 609100966Siwasaki break; 610100966Siwasaki } 611100966Siwasaki 612100966Siwasaki switch (Op->Common.AmlOpcode) 613100966Siwasaki { 614100966Siwasaki case AML_METHOD_OP: 615100966Siwasaki 616100966Siwasaki AcpiDmMethodFlags (Op); 617100966Siwasaki AcpiOsPrintf (")"); 618237412Sjkim 619237412Sjkim /* Emit description comment for Method() with a predefined ACPI name */ 620237412Sjkim 621237412Sjkim AcpiDmPredefinedDescription (Op); 622100966Siwasaki break; 623100966Siwasaki 624100966Siwasaki case AML_NAME_OP: 625100966Siwasaki 626100966Siwasaki /* Check for _HID and related EISAID() */ 627100966Siwasaki 628272444Sjkim AcpiDmCheckForHardwareId (Op); 629100966Siwasaki AcpiOsPrintf (", "); 630100966Siwasaki break; 631100966Siwasaki 632100966Siwasaki case AML_REGION_OP: 633100966Siwasaki 634100966Siwasaki AcpiDmRegionFlags (Op); 635100966Siwasaki break; 636100966Siwasaki 637100966Siwasaki case AML_POWER_RES_OP: 638100966Siwasaki 639100966Siwasaki /* Mark the next two Ops as part of the parameter list */ 640100966Siwasaki 641100966Siwasaki AcpiOsPrintf (", "); 642100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 643100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 644100966Siwasaki 645100966Siwasaki NextOp = NextOp->Common.Next; 646100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 647100966Siwasaki return (AE_OK); 648100966Siwasaki 649100966Siwasaki case AML_PROCESSOR_OP: 650100966Siwasaki 651100966Siwasaki /* Mark the next three Ops as part of the parameter list */ 652100966Siwasaki 653100966Siwasaki AcpiOsPrintf (", "); 654100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 655100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 656100966Siwasaki 657100966Siwasaki NextOp = NextOp->Common.Next; 658100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 659100966Siwasaki 660100966Siwasaki NextOp = NextOp->Common.Next; 661100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 662100966Siwasaki return (AE_OK); 663100966Siwasaki 664100966Siwasaki case AML_MUTEX_OP: 665167802Sjkim case AML_DATA_REGION_OP: 666100966Siwasaki 667100966Siwasaki AcpiOsPrintf (", "); 668100966Siwasaki return (AE_OK); 669100966Siwasaki 670100966Siwasaki case AML_EVENT_OP: 671100966Siwasaki case AML_ALIAS_OP: 672100966Siwasaki 673100966Siwasaki return (AE_OK); 674100966Siwasaki 675100966Siwasaki case AML_SCOPE_OP: 676100966Siwasaki case AML_DEVICE_OP: 677100966Siwasaki case AML_THERMAL_ZONE_OP: 678100966Siwasaki 679100966Siwasaki AcpiOsPrintf (")"); 680100966Siwasaki break; 681100966Siwasaki 682100966Siwasaki default: 683100966Siwasaki 684237412Sjkim AcpiOsPrintf ("*** Unhandled named opcode %X\n", 685237412Sjkim Op->Common.AmlOpcode); 686100966Siwasaki break; 687100966Siwasaki } 688100966Siwasaki } 689100966Siwasaki 690100966Siwasaki else switch (Op->Common.AmlOpcode) 691100966Siwasaki { 692100966Siwasaki case AML_FIELD_OP: 693100966Siwasaki case AML_BANK_FIELD_OP: 694100966Siwasaki case AML_INDEX_FIELD_OP: 695100966Siwasaki 696100966Siwasaki Info->BitOffset = 0; 697100966Siwasaki 698100966Siwasaki /* Name of the parent OperationRegion */ 699100966Siwasaki 700100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 701100966Siwasaki AcpiDmNamestring (NextOp->Common.Value.Name); 702100966Siwasaki AcpiOsPrintf (", "); 703100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 704100966Siwasaki 705100966Siwasaki switch (Op->Common.AmlOpcode) 706100966Siwasaki { 707100966Siwasaki case AML_BANK_FIELD_OP: 708100966Siwasaki 709167802Sjkim /* Namestring - Bank Name */ 710100966Siwasaki 711100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, NextOp); 712100966Siwasaki AcpiDmNamestring (NextOp->Common.Value.Name); 713100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 714100966Siwasaki AcpiOsPrintf (", "); 715100966Siwasaki 716167802Sjkim /* 717167802Sjkim * Bank Value. This is a TermArg in the middle of the parameter 718167802Sjkim * list, must handle it here. 719167802Sjkim * 720167802Sjkim * Disassemble the TermArg parse tree. ACPI_PARSEOP_PARAMLIST 721167802Sjkim * eliminates newline in the output. 722167802Sjkim */ 723167802Sjkim NextOp = NextOp->Common.Next; 724100966Siwasaki 725167802Sjkim Info->Flags = ACPI_PARSEOP_PARAMLIST; 726237412Sjkim AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, 727237412Sjkim AcpiDmAscendingOp, Info); 728167802Sjkim Info->Flags = 0; 729167802Sjkim Info->Level = Level; 730167802Sjkim 731100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 732100966Siwasaki AcpiOsPrintf (", "); 733100966Siwasaki break; 734100966Siwasaki 735100966Siwasaki case AML_INDEX_FIELD_OP: 736100966Siwasaki 737167802Sjkim /* Namestring - Data Name */ 738100966Siwasaki 739100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, NextOp); 740100966Siwasaki AcpiDmNamestring (NextOp->Common.Value.Name); 741100966Siwasaki AcpiOsPrintf (", "); 742100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 743100966Siwasaki break; 744100966Siwasaki 745100966Siwasaki default: 746100966Siwasaki 747100966Siwasaki break; 748100966Siwasaki } 749100966Siwasaki 750100966Siwasaki AcpiDmFieldFlags (NextOp); 751100966Siwasaki break; 752100966Siwasaki 753100966Siwasaki case AML_BUFFER_OP: 754100966Siwasaki 755100966Siwasaki /* The next op is the size parameter */ 756100966Siwasaki 757100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 758100966Siwasaki if (!NextOp) 759100966Siwasaki { 760100966Siwasaki /* Single-step support */ 761100966Siwasaki 762100966Siwasaki return (AE_OK); 763100966Siwasaki } 764100966Siwasaki 765100966Siwasaki if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE) 766100966Siwasaki { 767100966Siwasaki /* 768237412Sjkim * We have a resource list. Don't need to output 769237412Sjkim * the buffer size Op. Open up a new block 770100966Siwasaki */ 771100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 772100966Siwasaki NextOp = NextOp->Common.Next; 773237412Sjkim AcpiOsPrintf (")"); 774237412Sjkim 775237412Sjkim /* Emit description comment for Name() with a predefined ACPI name */ 776237412Sjkim 777237412Sjkim AcpiDmPredefinedDescription (Op->Asl.Parent); 778237412Sjkim 779237412Sjkim AcpiOsPrintf ("\n"); 780100966Siwasaki AcpiDmIndent (Info->Level); 781100966Siwasaki AcpiOsPrintf ("{\n"); 782100966Siwasaki return (AE_OK); 783100966Siwasaki } 784100966Siwasaki 785100966Siwasaki /* Normal Buffer, mark size as in the parameter list */ 786100966Siwasaki 787100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 788100966Siwasaki return (AE_OK); 789100966Siwasaki 790100966Siwasaki case AML_VAR_PACKAGE_OP: 791100966Siwasaki case AML_IF_OP: 792100966Siwasaki case AML_WHILE_OP: 793100966Siwasaki 794100966Siwasaki /* The next op is the size or predicate parameter */ 795100966Siwasaki 796100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 797100966Siwasaki if (NextOp) 798100966Siwasaki { 799100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 800100966Siwasaki } 801100966Siwasaki return (AE_OK); 802100966Siwasaki 803100966Siwasaki case AML_PACKAGE_OP: 804100966Siwasaki 805237412Sjkim /* The next op is the size parameter */ 806100966Siwasaki 807100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 808100966Siwasaki if (NextOp) 809100966Siwasaki { 810100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; 811100966Siwasaki } 812100966Siwasaki return (AE_OK); 813100966Siwasaki 814100966Siwasaki case AML_MATCH_OP: 815100966Siwasaki 816100966Siwasaki AcpiDmMatchOp (Op); 817100966Siwasaki break; 818100966Siwasaki 819100966Siwasaki default: 820100966Siwasaki 821100966Siwasaki break; 822100966Siwasaki } 823100966Siwasaki 824100966Siwasaki if (AcpiDmBlockType (Op) & BLOCK_BRACE) 825100966Siwasaki { 826100966Siwasaki AcpiOsPrintf ("\n"); 827100966Siwasaki AcpiDmIndent (Level); 828100966Siwasaki AcpiOsPrintf ("{\n"); 829100966Siwasaki } 830100966Siwasaki } 831100966Siwasaki 832100966Siwasaki return (AE_OK); 833100966Siwasaki} 834100966Siwasaki 835100966Siwasaki 836100966Siwasaki/******************************************************************************* 837100966Siwasaki * 838100966Siwasaki * FUNCTION: AcpiDmAscendingOp 839100966Siwasaki * 840100966Siwasaki * PARAMETERS: ASL_WALK_CALLBACK 841100966Siwasaki * 842100966Siwasaki * RETURN: Status 843100966Siwasaki * 844100966Siwasaki * DESCRIPTION: Second visitation of a parse object, during ascent of parse 845241973Sjkim * tree. Close out any parameter lists and complete the opcode. 846100966Siwasaki * 847100966Siwasaki ******************************************************************************/ 848100966Siwasaki 849151937Sjkimstatic ACPI_STATUS 850100966SiwasakiAcpiDmAscendingOp ( 851100966Siwasaki ACPI_PARSE_OBJECT *Op, 852100966Siwasaki UINT32 Level, 853100966Siwasaki void *Context) 854100966Siwasaki{ 855100966Siwasaki ACPI_OP_WALK_INFO *Info = Context; 856237412Sjkim ACPI_PARSE_OBJECT *ParentOp; 857100966Siwasaki 858100966Siwasaki 859100966Siwasaki if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) 860100966Siwasaki { 861100966Siwasaki /* Ignore this op -- it was handled elsewhere */ 862100966Siwasaki 863100966Siwasaki return (AE_OK); 864100966Siwasaki } 865100966Siwasaki 866100966Siwasaki if ((Level == 0) && (Op->Common.AmlOpcode == AML_SCOPE_OP)) 867100966Siwasaki { 868100966Siwasaki /* Indicates the end of the current descriptor block (table) */ 869100966Siwasaki 870100966Siwasaki AcpiOsPrintf ("}\n\n"); 871100966Siwasaki return (AE_OK); 872100966Siwasaki } 873100966Siwasaki 874100966Siwasaki switch (AcpiDmBlockType (Op)) 875100966Siwasaki { 876100966Siwasaki case BLOCK_PAREN: 877100966Siwasaki 878278970Sjkim /* Completed an op that has arguments, add closing paren if needed */ 879100966Siwasaki 880278970Sjkim AcpiDmCloseOperator (Op); 881100966Siwasaki 882237412Sjkim if (Op->Common.AmlOpcode == AML_NAME_OP) 883237412Sjkim { 884237412Sjkim /* Emit description comment for Name() with a predefined ACPI name */ 885237412Sjkim 886237412Sjkim AcpiDmPredefinedDescription (Op); 887237412Sjkim } 888237412Sjkim else 889237412Sjkim { 890237412Sjkim /* For Create* operators, attempt to emit resource tag description */ 891237412Sjkim 892237412Sjkim AcpiDmFieldPredefinedDescription (Op); 893237412Sjkim } 894237412Sjkim 895272444Sjkim /* Decode Notify() values */ 896272444Sjkim 897272444Sjkim if (Op->Common.AmlOpcode == AML_NOTIFY_OP) 898272444Sjkim { 899272444Sjkim AcpiDmNotifyDescription (Op); 900272444Sjkim } 901272444Sjkim 902272444Sjkim AcpiDmDisplayTargetPathname (Op); 903272444Sjkim 904100966Siwasaki /* Could be a nested operator, check if comma required */ 905100966Siwasaki 906100966Siwasaki if (!AcpiDmCommaIfListMember (Op)) 907100966Siwasaki { 908100966Siwasaki if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 909100966Siwasaki (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) && 910100966Siwasaki (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 911100966Siwasaki { 912151937Sjkim /* 913151937Sjkim * This is a first-level element of a term list 914151937Sjkim * start a new line 915151937Sjkim */ 916167802Sjkim if (!(Info->Flags & ACPI_PARSEOP_PARAMLIST)) 917167802Sjkim { 918167802Sjkim AcpiOsPrintf ("\n"); 919167802Sjkim } 920100966Siwasaki } 921100966Siwasaki } 922100966Siwasaki break; 923100966Siwasaki 924100966Siwasaki case BLOCK_BRACE: 925100966Siwasaki case (BLOCK_BRACE | BLOCK_PAREN): 926100966Siwasaki 927100966Siwasaki /* Completed an op that has a term list, add closing brace */ 928100966Siwasaki 929100966Siwasaki if (Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST) 930100966Siwasaki { 931100966Siwasaki AcpiOsPrintf ("}"); 932100966Siwasaki } 933100966Siwasaki else 934100966Siwasaki { 935100966Siwasaki AcpiDmIndent (Level); 936100966Siwasaki AcpiOsPrintf ("}"); 937100966Siwasaki } 938100966Siwasaki 939100966Siwasaki AcpiDmCommaIfListMember (Op); 940100966Siwasaki 941100966Siwasaki if (AcpiDmBlockType (Op->Common.Parent) != BLOCK_PAREN) 942100966Siwasaki { 943100966Siwasaki AcpiOsPrintf ("\n"); 944100966Siwasaki if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST)) 945100966Siwasaki { 946100966Siwasaki if ((Op->Common.AmlOpcode == AML_IF_OP) && 947100966Siwasaki (Op->Common.Next) && 948100966Siwasaki (Op->Common.Next->Common.AmlOpcode == AML_ELSE_OP)) 949100966Siwasaki { 950100966Siwasaki break; 951100966Siwasaki } 952100966Siwasaki 953100966Siwasaki if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 954100966Siwasaki (!Op->Common.Next)) 955100966Siwasaki { 956100966Siwasaki break; 957100966Siwasaki } 958100966Siwasaki AcpiOsPrintf ("\n"); 959100966Siwasaki } 960100966Siwasaki } 961100966Siwasaki break; 962100966Siwasaki 963100966Siwasaki case BLOCK_NONE: 964100966Siwasaki default: 965100966Siwasaki 966100966Siwasaki /* Could be a nested operator, check if comma required */ 967100966Siwasaki 968100966Siwasaki if (!AcpiDmCommaIfListMember (Op)) 969100966Siwasaki { 970100966Siwasaki if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 971100966Siwasaki (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) && 972100966Siwasaki (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 973100966Siwasaki { 974151937Sjkim /* 975151937Sjkim * This is a first-level element of a term list 976151937Sjkim * start a new line 977151937Sjkim */ 978100966Siwasaki AcpiOsPrintf ("\n"); 979100966Siwasaki } 980100966Siwasaki } 981100966Siwasaki else if (Op->Common.Parent) 982100966Siwasaki { 983100966Siwasaki switch (Op->Common.Parent->Common.AmlOpcode) 984100966Siwasaki { 985100966Siwasaki case AML_PACKAGE_OP: 986100966Siwasaki case AML_VAR_PACKAGE_OP: 987100966Siwasaki 988100966Siwasaki if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) 989100966Siwasaki { 990100966Siwasaki AcpiOsPrintf ("\n"); 991100966Siwasaki } 992100966Siwasaki break; 993100966Siwasaki 994100966Siwasaki default: 995100966Siwasaki 996100966Siwasaki break; 997100966Siwasaki } 998100966Siwasaki } 999100966Siwasaki break; 1000100966Siwasaki } 1001100966Siwasaki 1002100966Siwasaki if (Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) 1003100966Siwasaki { 1004100966Siwasaki if ((Op->Common.Next) && 1005100966Siwasaki (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) 1006100966Siwasaki { 1007100966Siwasaki return (AE_OK); 1008100966Siwasaki } 1009100966Siwasaki 1010100966Siwasaki /* 1011272444Sjkim * The parent Op is guaranteed to be valid because of the flag 1012272444Sjkim * ACPI_PARSEOP_PARAMLIST -- which means that this op is part of 1013272444Sjkim * a parameter list and thus has a valid parent. 1014272444Sjkim */ 1015272444Sjkim ParentOp = Op->Common.Parent; 1016272444Sjkim 1017272444Sjkim /* 1018100966Siwasaki * Just completed a parameter node for something like "Buffer (param)". 1019100966Siwasaki * Close the paren and open up the term list block with a brace 1020100966Siwasaki */ 1021100966Siwasaki if (Op->Common.Next) 1022100966Siwasaki { 1023237412Sjkim AcpiOsPrintf (")"); 1024237412Sjkim 1025272444Sjkim /* 1026272444Sjkim * Emit a description comment for a Name() operator that is a 1027272444Sjkim * predefined ACPI name. Must check the grandparent. 1028272444Sjkim */ 1029272444Sjkim ParentOp = ParentOp->Common.Parent; 1030272444Sjkim if (ParentOp && 1031272444Sjkim (ParentOp->Asl.AmlOpcode == AML_NAME_OP)) 1032237412Sjkim { 1033272444Sjkim AcpiDmPredefinedDescription (ParentOp); 1034237412Sjkim } 1035272444Sjkim 1036237412Sjkim AcpiOsPrintf ("\n"); 1037100966Siwasaki AcpiDmIndent (Level - 1); 1038100966Siwasaki AcpiOsPrintf ("{\n"); 1039100966Siwasaki } 1040100966Siwasaki else 1041100966Siwasaki { 1042272444Sjkim ParentOp->Common.DisasmFlags |= ACPI_PARSEOP_EMPTY_TERMLIST; 1043100966Siwasaki AcpiOsPrintf (") {"); 1044100966Siwasaki } 1045100966Siwasaki } 1046100966Siwasaki 1047100966Siwasaki if ((Op->Common.AmlOpcode == AML_NAME_OP) || 1048100966Siwasaki (Op->Common.AmlOpcode == AML_RETURN_OP)) 1049100966Siwasaki { 1050100966Siwasaki Info->Level++; 1051100966Siwasaki } 1052278970Sjkim 1053278970Sjkim /* 1054278970Sjkim * For ASL+, check for and emit a C-style symbol. If valid, the 1055278970Sjkim * symbol string has been deferred until after the first operand 1056278970Sjkim */ 1057278970Sjkim if (AcpiGbl_CstyleDisassembly) 1058278970Sjkim { 1059278970Sjkim if (Op->Asl.OperatorSymbol) 1060278970Sjkim { 1061278970Sjkim AcpiOsPrintf ("%s", Op->Asl.OperatorSymbol); 1062278970Sjkim Op->Asl.OperatorSymbol = NULL; 1063278970Sjkim } 1064278970Sjkim } 1065278970Sjkim 1066100966Siwasaki return (AE_OK); 1067100966Siwasaki} 1068