1100966Siwasaki/******************************************************************************* 2100966Siwasaki * 3100966Siwasaki * Module Name: dmwalk - AML disassembly tree walk 4100966Siwasaki * 5100966Siwasaki ******************************************************************************/ 6100966Siwasaki 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, 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 117306536Sjkim memset (&Info, 0, sizeof (ACPI_OP_WALK_INFO)); 118151937Sjkim Info.WalkState = WalkState; 119306536Sjkim Info.StartAml = Op->Common.Aml - sizeof (ACPI_TABLE_HEADER); 120306536Sjkim Info.AmlOffset = Op->Common.Aml - Info.StartAml; 121306536Sjkim 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 285281075Sdim if ((Op->Common.DisasmOpcode == ACPI_DASM_UNICODE) || 286281075Sdim (Op->Common.DisasmOpcode == ACPI_DASM_UUID) || 287281075Sdim (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 303281075Sdim case AML_INT_METHODCALL_OP: 304281075Sdim 305281075Sdim if (Op->Common.Parent && 306281075Sdim ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) || 307281075Sdim (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))) 308281075Sdim { 309281075Sdim /* This is a reference to a method, not an invocation */ 310281075Sdim 311281075Sdim return (BLOCK_NONE); 312281075Sdim } 313281075Sdim 314306536Sjkim /*lint -fallthrough */ 315306536Sjkim 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; 413306536Sjkim ACPI_PARSE_OBJECT *NextOp2; 414306536Sjkim UINT32 AmlOffset; 415100966Siwasaki 416100966Siwasaki 417306536Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 418306536Sjkim 419306536Sjkim /* Listing support to dump the AML code after the ASL statement */ 420306536Sjkim 421306536Sjkim if (AcpiGbl_DmOpt_Listing) 422306536Sjkim { 423306536Sjkim /* We only care about these classes of objects */ 424306536Sjkim 425306536Sjkim if ((OpInfo->Class == AML_CLASS_NAMED_OBJECT) || 426306536Sjkim (OpInfo->Class == AML_CLASS_CONTROL) || 427306536Sjkim (OpInfo->Class == AML_CLASS_CREATE) || 428306536Sjkim ((OpInfo->Class == AML_CLASS_EXECUTE) && (!Op->Common.Next))) 429306536Sjkim { 430306536Sjkim if (AcpiGbl_DmOpt_Listing && Info->PreviousAml) 431306536Sjkim { 432306536Sjkim /* Dump the AML byte code for the previous Op */ 433306536Sjkim 434306536Sjkim if (Op->Common.Aml > Info->PreviousAml) 435306536Sjkim { 436306536Sjkim AcpiOsPrintf ("\n"); 437306536Sjkim AcpiUtDumpBuffer ( 438306536Sjkim (Info->StartAml + Info->AmlOffset), 439306536Sjkim (Op->Common.Aml - Info->PreviousAml), 440306536Sjkim DB_BYTE_DISPLAY, Info->AmlOffset); 441306536Sjkim AcpiOsPrintf ("\n"); 442306536Sjkim } 443306536Sjkim 444306536Sjkim Info->AmlOffset = (Op->Common.Aml - Info->StartAml); 445306536Sjkim } 446306536Sjkim 447306536Sjkim Info->PreviousAml = Op->Common.Aml; 448306536Sjkim } 449306536Sjkim } 450306536Sjkim 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 458306536Sjkim if (Op->Common.AmlOpcode == AML_IF_OP) 459306536Sjkim { 460306536Sjkim NextOp = AcpiPsGetDepthNext (NULL, Op); 461306536Sjkim if (NextOp) 462306536Sjkim { 463306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 464306536Sjkim 465306536Sjkim /* Don't emit the actual embedded externals unless asked */ 466306536Sjkim 467306536Sjkim if (!AcpiGbl_DmEmitExternalOpcodes) 468306536Sjkim { 469306536Sjkim /* 470306536Sjkim * A Zero predicate indicates the possibility of one or more 471306536Sjkim * External() opcodes within the If() block. 472306536Sjkim */ 473306536Sjkim if (NextOp->Common.AmlOpcode == AML_ZERO_OP) 474306536Sjkim { 475306536Sjkim NextOp2 = NextOp->Common.Next; 476306536Sjkim 477306536Sjkim if (NextOp2 && 478306536Sjkim (NextOp2->Common.AmlOpcode == AML_EXTERNAL_OP)) 479306536Sjkim { 480306536Sjkim /* Ignore the If 0 block and all children */ 481306536Sjkim 482306536Sjkim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 483306536Sjkim return (AE_CTRL_DEPTH); 484306536Sjkim } 485306536Sjkim } 486306536Sjkim } 487306536Sjkim } 488306536Sjkim } 489306536Sjkim 490128212Snjl /* Level 0 is at the Definition Block level */ 491100966Siwasaki 492100966Siwasaki if (Level == 0) 493100966Siwasaki { 494100966Siwasaki /* In verbose mode, print the AML offset, opcode and depth count */ 495100966Siwasaki 496151937Sjkim if (Info->WalkState) 497151937Sjkim { 498306536Sjkim AmlOffset = (UINT32) ACPI_PTR_DIFF (Op->Common.Aml, 499306536Sjkim Info->WalkState->ParserState.AmlStart); 500306536Sjkim if (AcpiGbl_DmOpt_Verbose) 501306536Sjkim { 502306536Sjkim AcpiOsPrintf (DB_FULL_OP_INFO, 503306536Sjkim (Info->WalkState->MethodNode ? 504306536Sjkim Info->WalkState->MethodNode->Name.Ascii : " "), 505306536Sjkim AmlOffset, (UINT32) Op->Common.AmlOpcode); 506306536Sjkim } 507151937Sjkim } 508100966Siwasaki 509100966Siwasaki if (Op->Common.AmlOpcode == AML_SCOPE_OP) 510100966Siwasaki { 511128212Snjl /* This is the beginning of the Definition Block */ 512128212Snjl 513100966Siwasaki AcpiOsPrintf ("{\n"); 514128212Snjl 515128212Snjl /* Emit all External() declarations here */ 516128212Snjl 517198237Sjkim AcpiDmEmitExternals (); 518100966Siwasaki return (AE_OK); 519100966Siwasaki } 520100966Siwasaki } 521100966Siwasaki else if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 522306536Sjkim (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) && 523306536Sjkim (!(Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)) && 524306536Sjkim (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 525100966Siwasaki { 526306536Sjkim /* 527306536Sjkim * This is a first-level element of a term list, 528306536Sjkim * indent a new line 529306536Sjkim */ 530306536Sjkim switch (Op->Common.AmlOpcode) 531306536Sjkim { 532306536Sjkim case AML_NOOP_OP: 533151937Sjkim /* 534306536Sjkim * Optionally just ignore this opcode. Some tables use 535306536Sjkim * NoOp opcodes for "padding" out packages that the BIOS 536306536Sjkim * changes dynamically. This can leave hundreds or 537306536Sjkim * thousands of NoOp opcodes that if disassembled, 538306536Sjkim * cannot be compiled because they are syntactically 539306536Sjkim * incorrect. 540151937Sjkim */ 541306536Sjkim if (AcpiGbl_IgnoreNoopOperator) 542245582Sjkim { 543306536Sjkim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 544306536Sjkim return (AE_OK); 545306536Sjkim } 546245582Sjkim 547306536Sjkim /* Fallthrough */ 548245582Sjkim 549306536Sjkim default: 550250838Sjkim 551306536Sjkim AcpiDmIndent (Level); 552306536Sjkim break; 553306536Sjkim } 554245582Sjkim 555306536Sjkim Info->LastLevel = Level; 556306536Sjkim Info->Count = 0; 557100966Siwasaki } 558100966Siwasaki 559167802Sjkim /* 560167802Sjkim * This is an inexpensive mechanism to try and keep lines from getting 561167802Sjkim * too long. When the limit is hit, start a new line at the previous 562167802Sjkim * indent plus one. A better but more expensive mechanism would be to 563167802Sjkim * keep track of the current column. 564167802Sjkim */ 565167802Sjkim Info->Count++; 566281075Sdim if (Info->Count /* +Info->LastLevel */ > 12) 567167802Sjkim { 568167802Sjkim Info->Count = 0; 569167802Sjkim AcpiOsPrintf ("\n"); 570167802Sjkim AcpiDmIndent (Info->LastLevel + 1); 571167802Sjkim } 572167802Sjkim 573281075Sdim /* If ASL+ is enabled, check for a C-style operator */ 574281075Sdim 575281075Sdim if (AcpiDmCheckForSymbolicOpcode (Op, Info)) 576281075Sdim { 577281075Sdim return (AE_OK); 578281075Sdim } 579281075Sdim 580100966Siwasaki /* Print the opcode name */ 581100966Siwasaki 582100966Siwasaki AcpiDmDisassembleOneOp (NULL, Info, Op); 583100966Siwasaki 584228110Sjkim if ((Op->Common.DisasmOpcode == ACPI_DASM_LNOT_PREFIX) || 585228110Sjkim (Op->Common.AmlOpcode == AML_INT_CONNECTION_OP)) 586167802Sjkim { 587167802Sjkim return (AE_OK); 588167802Sjkim } 589167802Sjkim 590100966Siwasaki if ((Op->Common.AmlOpcode == AML_NAME_OP) || 591100966Siwasaki (Op->Common.AmlOpcode == AML_RETURN_OP)) 592100966Siwasaki { 593100966Siwasaki Info->Level--; 594100966Siwasaki } 595100966Siwasaki 596117521Snjl /* Start the opcode argument list if necessary */ 597117521Snjl 598102550Siwasaki if ((OpInfo->Flags & AML_HAS_ARGS) || 599100966Siwasaki (Op->Common.AmlOpcode == AML_EVENT_OP)) 600100966Siwasaki { 601100966Siwasaki /* This opcode has an argument list */ 602100966Siwasaki 603100966Siwasaki if (AcpiDmBlockType (Op) & BLOCK_PAREN) 604100966Siwasaki { 605100966Siwasaki AcpiOsPrintf (" ("); 606100966Siwasaki } 607100966Siwasaki 608117521Snjl /* If this is a named opcode, print the associated name value */ 609117521Snjl 610100966Siwasaki if (OpInfo->Flags & AML_NAMED) 611100966Siwasaki { 612100966Siwasaki switch (Op->Common.AmlOpcode) 613100966Siwasaki { 614100966Siwasaki case AML_ALIAS_OP: 615100966Siwasaki 616100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 617100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 618100966Siwasaki AcpiDmNamestring (NextOp->Common.Value.Name); 619100966Siwasaki AcpiOsPrintf (", "); 620100966Siwasaki 621100966Siwasaki /*lint -fallthrough */ 622100966Siwasaki 623100966Siwasaki default: 624100966Siwasaki 625100966Siwasaki Name = AcpiPsGetName (Op); 626100966Siwasaki if (Op->Named.Path) 627100966Siwasaki { 628100966Siwasaki AcpiDmNamestring ((char *) Op->Named.Path); 629100966Siwasaki } 630100966Siwasaki else 631100966Siwasaki { 632193267Sjkim AcpiDmDumpName (Name); 633100966Siwasaki } 634100966Siwasaki 635100966Siwasaki if (Op->Common.AmlOpcode != AML_INT_NAMEDFIELD_OP) 636100966Siwasaki { 637306536Sjkim if (AcpiGbl_DmOpt_Verbose) 638100966Siwasaki { 639100966Siwasaki (void) AcpiPsDisplayObjectPathname (NULL, Op); 640100966Siwasaki } 641100966Siwasaki } 642100966Siwasaki break; 643100966Siwasaki } 644100966Siwasaki 645100966Siwasaki switch (Op->Common.AmlOpcode) 646100966Siwasaki { 647100966Siwasaki case AML_METHOD_OP: 648100966Siwasaki 649100966Siwasaki AcpiDmMethodFlags (Op); 650100966Siwasaki AcpiOsPrintf (")"); 651237412Sjkim 652237412Sjkim /* Emit description comment for Method() with a predefined ACPI name */ 653237412Sjkim 654237412Sjkim AcpiDmPredefinedDescription (Op); 655100966Siwasaki break; 656100966Siwasaki 657100966Siwasaki case AML_NAME_OP: 658100966Siwasaki 659100966Siwasaki /* Check for _HID and related EISAID() */ 660100966Siwasaki 661281075Sdim AcpiDmCheckForHardwareId (Op); 662100966Siwasaki AcpiOsPrintf (", "); 663100966Siwasaki break; 664100966Siwasaki 665100966Siwasaki case AML_REGION_OP: 666100966Siwasaki 667100966Siwasaki AcpiDmRegionFlags (Op); 668100966Siwasaki break; 669100966Siwasaki 670100966Siwasaki case AML_POWER_RES_OP: 671100966Siwasaki 672100966Siwasaki /* Mark the next two Ops as part of the parameter list */ 673100966Siwasaki 674100966Siwasaki AcpiOsPrintf (", "); 675100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 676306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 677100966Siwasaki 678100966Siwasaki NextOp = NextOp->Common.Next; 679306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 680100966Siwasaki return (AE_OK); 681100966Siwasaki 682100966Siwasaki case AML_PROCESSOR_OP: 683100966Siwasaki 684100966Siwasaki /* Mark the next three Ops as part of the parameter list */ 685100966Siwasaki 686100966Siwasaki AcpiOsPrintf (", "); 687100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 688306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 689100966Siwasaki 690100966Siwasaki NextOp = NextOp->Common.Next; 691306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 692100966Siwasaki 693100966Siwasaki NextOp = NextOp->Common.Next; 694306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 695100966Siwasaki return (AE_OK); 696100966Siwasaki 697100966Siwasaki case AML_MUTEX_OP: 698167802Sjkim case AML_DATA_REGION_OP: 699100966Siwasaki 700100966Siwasaki AcpiOsPrintf (", "); 701100966Siwasaki return (AE_OK); 702100966Siwasaki 703100966Siwasaki case AML_EVENT_OP: 704100966Siwasaki case AML_ALIAS_OP: 705100966Siwasaki 706100966Siwasaki return (AE_OK); 707100966Siwasaki 708100966Siwasaki case AML_SCOPE_OP: 709100966Siwasaki case AML_DEVICE_OP: 710100966Siwasaki case AML_THERMAL_ZONE_OP: 711100966Siwasaki 712100966Siwasaki AcpiOsPrintf (")"); 713100966Siwasaki break; 714100966Siwasaki 715100966Siwasaki default: 716100966Siwasaki 717237412Sjkim AcpiOsPrintf ("*** Unhandled named opcode %X\n", 718237412Sjkim Op->Common.AmlOpcode); 719100966Siwasaki break; 720100966Siwasaki } 721100966Siwasaki } 722100966Siwasaki 723100966Siwasaki else switch (Op->Common.AmlOpcode) 724100966Siwasaki { 725100966Siwasaki case AML_FIELD_OP: 726100966Siwasaki case AML_BANK_FIELD_OP: 727100966Siwasaki case AML_INDEX_FIELD_OP: 728100966Siwasaki 729100966Siwasaki Info->BitOffset = 0; 730100966Siwasaki 731100966Siwasaki /* Name of the parent OperationRegion */ 732100966Siwasaki 733100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 734100966Siwasaki AcpiDmNamestring (NextOp->Common.Value.Name); 735100966Siwasaki AcpiOsPrintf (", "); 736100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 737100966Siwasaki 738100966Siwasaki switch (Op->Common.AmlOpcode) 739100966Siwasaki { 740100966Siwasaki case AML_BANK_FIELD_OP: 741100966Siwasaki 742167802Sjkim /* Namestring - Bank Name */ 743100966Siwasaki 744100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, NextOp); 745100966Siwasaki AcpiDmNamestring (NextOp->Common.Value.Name); 746100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 747100966Siwasaki AcpiOsPrintf (", "); 748100966Siwasaki 749167802Sjkim /* 750167802Sjkim * Bank Value. This is a TermArg in the middle of the parameter 751167802Sjkim * list, must handle it here. 752167802Sjkim * 753306536Sjkim * Disassemble the TermArg parse tree. ACPI_PARSEOP_PARAMETER_LIST 754167802Sjkim * eliminates newline in the output. 755167802Sjkim */ 756167802Sjkim NextOp = NextOp->Common.Next; 757100966Siwasaki 758306536Sjkim Info->Flags = ACPI_PARSEOP_PARAMETER_LIST; 759237412Sjkim AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, 760237412Sjkim AcpiDmAscendingOp, Info); 761167802Sjkim Info->Flags = 0; 762167802Sjkim Info->Level = Level; 763167802Sjkim 764100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 765100966Siwasaki AcpiOsPrintf (", "); 766100966Siwasaki break; 767100966Siwasaki 768100966Siwasaki case AML_INDEX_FIELD_OP: 769100966Siwasaki 770167802Sjkim /* Namestring - Data Name */ 771100966Siwasaki 772100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, NextOp); 773100966Siwasaki AcpiDmNamestring (NextOp->Common.Value.Name); 774100966Siwasaki AcpiOsPrintf (", "); 775100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 776100966Siwasaki break; 777100966Siwasaki 778100966Siwasaki default: 779100966Siwasaki 780100966Siwasaki break; 781100966Siwasaki } 782100966Siwasaki 783100966Siwasaki AcpiDmFieldFlags (NextOp); 784100966Siwasaki break; 785100966Siwasaki 786100966Siwasaki case AML_BUFFER_OP: 787100966Siwasaki 788100966Siwasaki /* The next op is the size parameter */ 789100966Siwasaki 790100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 791100966Siwasaki if (!NextOp) 792100966Siwasaki { 793100966Siwasaki /* Single-step support */ 794100966Siwasaki 795100966Siwasaki return (AE_OK); 796100966Siwasaki } 797100966Siwasaki 798100966Siwasaki if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE) 799100966Siwasaki { 800100966Siwasaki /* 801237412Sjkim * We have a resource list. Don't need to output 802237412Sjkim * the buffer size Op. Open up a new block 803100966Siwasaki */ 804100966Siwasaki NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 805100966Siwasaki NextOp = NextOp->Common.Next; 806237412Sjkim AcpiOsPrintf (")"); 807237412Sjkim 808237412Sjkim /* Emit description comment for Name() with a predefined ACPI name */ 809237412Sjkim 810237412Sjkim AcpiDmPredefinedDescription (Op->Asl.Parent); 811237412Sjkim 812237412Sjkim AcpiOsPrintf ("\n"); 813100966Siwasaki AcpiDmIndent (Info->Level); 814100966Siwasaki AcpiOsPrintf ("{\n"); 815100966Siwasaki return (AE_OK); 816100966Siwasaki } 817100966Siwasaki 818100966Siwasaki /* Normal Buffer, mark size as in the parameter list */ 819100966Siwasaki 820306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 821100966Siwasaki return (AE_OK); 822100966Siwasaki 823306536Sjkim case AML_IF_OP: 824100966Siwasaki case AML_VAR_PACKAGE_OP: 825100966Siwasaki case AML_WHILE_OP: 826100966Siwasaki 827100966Siwasaki /* The next op is the size or predicate parameter */ 828100966Siwasaki 829100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 830100966Siwasaki if (NextOp) 831100966Siwasaki { 832306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 833100966Siwasaki } 834100966Siwasaki return (AE_OK); 835100966Siwasaki 836100966Siwasaki case AML_PACKAGE_OP: 837100966Siwasaki 838237412Sjkim /* The next op is the size parameter */ 839100966Siwasaki 840100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 841100966Siwasaki if (NextOp) 842100966Siwasaki { 843306536Sjkim NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMETER_LIST; 844100966Siwasaki } 845100966Siwasaki return (AE_OK); 846100966Siwasaki 847100966Siwasaki case AML_MATCH_OP: 848100966Siwasaki 849100966Siwasaki AcpiDmMatchOp (Op); 850100966Siwasaki break; 851100966Siwasaki 852100966Siwasaki default: 853100966Siwasaki 854100966Siwasaki break; 855100966Siwasaki } 856100966Siwasaki 857100966Siwasaki if (AcpiDmBlockType (Op) & BLOCK_BRACE) 858100966Siwasaki { 859100966Siwasaki AcpiOsPrintf ("\n"); 860100966Siwasaki AcpiDmIndent (Level); 861100966Siwasaki AcpiOsPrintf ("{\n"); 862100966Siwasaki } 863100966Siwasaki } 864100966Siwasaki 865100966Siwasaki return (AE_OK); 866100966Siwasaki} 867100966Siwasaki 868100966Siwasaki 869100966Siwasaki/******************************************************************************* 870100966Siwasaki * 871100966Siwasaki * FUNCTION: AcpiDmAscendingOp 872100966Siwasaki * 873100966Siwasaki * PARAMETERS: ASL_WALK_CALLBACK 874100966Siwasaki * 875100966Siwasaki * RETURN: Status 876100966Siwasaki * 877100966Siwasaki * DESCRIPTION: Second visitation of a parse object, during ascent of parse 878241973Sjkim * tree. Close out any parameter lists and complete the opcode. 879100966Siwasaki * 880100966Siwasaki ******************************************************************************/ 881100966Siwasaki 882151937Sjkimstatic ACPI_STATUS 883100966SiwasakiAcpiDmAscendingOp ( 884100966Siwasaki ACPI_PARSE_OBJECT *Op, 885100966Siwasaki UINT32 Level, 886100966Siwasaki void *Context) 887100966Siwasaki{ 888100966Siwasaki ACPI_OP_WALK_INFO *Info = Context; 889237412Sjkim ACPI_PARSE_OBJECT *ParentOp; 890100966Siwasaki 891100966Siwasaki 892100966Siwasaki if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) 893100966Siwasaki { 894100966Siwasaki /* Ignore this op -- it was handled elsewhere */ 895100966Siwasaki 896100966Siwasaki return (AE_OK); 897100966Siwasaki } 898100966Siwasaki 899100966Siwasaki if ((Level == 0) && (Op->Common.AmlOpcode == AML_SCOPE_OP)) 900100966Siwasaki { 901100966Siwasaki /* Indicates the end of the current descriptor block (table) */ 902100966Siwasaki 903100966Siwasaki AcpiOsPrintf ("}\n\n"); 904100966Siwasaki return (AE_OK); 905100966Siwasaki } 906100966Siwasaki 907100966Siwasaki switch (AcpiDmBlockType (Op)) 908100966Siwasaki { 909100966Siwasaki case BLOCK_PAREN: 910100966Siwasaki 911281075Sdim /* Completed an op that has arguments, add closing paren if needed */ 912100966Siwasaki 913281075Sdim AcpiDmCloseOperator (Op); 914100966Siwasaki 915237412Sjkim if (Op->Common.AmlOpcode == AML_NAME_OP) 916237412Sjkim { 917237412Sjkim /* Emit description comment for Name() with a predefined ACPI name */ 918237412Sjkim 919237412Sjkim AcpiDmPredefinedDescription (Op); 920237412Sjkim } 921237412Sjkim else 922237412Sjkim { 923237412Sjkim /* For Create* operators, attempt to emit resource tag description */ 924237412Sjkim 925237412Sjkim AcpiDmFieldPredefinedDescription (Op); 926237412Sjkim } 927237412Sjkim 928281075Sdim /* Decode Notify() values */ 929281075Sdim 930281075Sdim if (Op->Common.AmlOpcode == AML_NOTIFY_OP) 931281075Sdim { 932281075Sdim AcpiDmNotifyDescription (Op); 933281075Sdim } 934281075Sdim 935281075Sdim AcpiDmDisplayTargetPathname (Op); 936281075Sdim 937100966Siwasaki /* Could be a nested operator, check if comma required */ 938100966Siwasaki 939100966Siwasaki if (!AcpiDmCommaIfListMember (Op)) 940100966Siwasaki { 941100966Siwasaki if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 942306536Sjkim (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) && 943306536Sjkim (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 944100966Siwasaki { 945151937Sjkim /* 946151937Sjkim * This is a first-level element of a term list 947151937Sjkim * start a new line 948151937Sjkim */ 949306536Sjkim if (!(Info->Flags & ACPI_PARSEOP_PARAMETER_LIST)) 950167802Sjkim { 951167802Sjkim AcpiOsPrintf ("\n"); 952167802Sjkim } 953100966Siwasaki } 954100966Siwasaki } 955100966Siwasaki break; 956100966Siwasaki 957100966Siwasaki case BLOCK_BRACE: 958100966Siwasaki case (BLOCK_BRACE | BLOCK_PAREN): 959100966Siwasaki 960100966Siwasaki /* Completed an op that has a term list, add closing brace */ 961100966Siwasaki 962100966Siwasaki if (Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST) 963100966Siwasaki { 964100966Siwasaki AcpiOsPrintf ("}"); 965100966Siwasaki } 966100966Siwasaki else 967100966Siwasaki { 968100966Siwasaki AcpiDmIndent (Level); 969100966Siwasaki AcpiOsPrintf ("}"); 970100966Siwasaki } 971100966Siwasaki 972100966Siwasaki AcpiDmCommaIfListMember (Op); 973100966Siwasaki 974100966Siwasaki if (AcpiDmBlockType (Op->Common.Parent) != BLOCK_PAREN) 975100966Siwasaki { 976100966Siwasaki AcpiOsPrintf ("\n"); 977100966Siwasaki if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST)) 978100966Siwasaki { 979100966Siwasaki if ((Op->Common.AmlOpcode == AML_IF_OP) && 980100966Siwasaki (Op->Common.Next) && 981100966Siwasaki (Op->Common.Next->Common.AmlOpcode == AML_ELSE_OP)) 982100966Siwasaki { 983100966Siwasaki break; 984100966Siwasaki } 985100966Siwasaki 986100966Siwasaki if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 987100966Siwasaki (!Op->Common.Next)) 988100966Siwasaki { 989100966Siwasaki break; 990100966Siwasaki } 991100966Siwasaki AcpiOsPrintf ("\n"); 992100966Siwasaki } 993100966Siwasaki } 994100966Siwasaki break; 995100966Siwasaki 996100966Siwasaki case BLOCK_NONE: 997100966Siwasaki default: 998100966Siwasaki 999100966Siwasaki /* Could be a nested operator, check if comma required */ 1000100966Siwasaki 1001100966Siwasaki if (!AcpiDmCommaIfListMember (Op)) 1002100966Siwasaki { 1003100966Siwasaki if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) && 1004306536Sjkim (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) && 1005306536Sjkim (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP)) 1006100966Siwasaki { 1007151937Sjkim /* 1008151937Sjkim * This is a first-level element of a term list 1009151937Sjkim * start a new line 1010151937Sjkim */ 1011100966Siwasaki AcpiOsPrintf ("\n"); 1012100966Siwasaki } 1013100966Siwasaki } 1014100966Siwasaki else if (Op->Common.Parent) 1015100966Siwasaki { 1016100966Siwasaki switch (Op->Common.Parent->Common.AmlOpcode) 1017100966Siwasaki { 1018100966Siwasaki case AML_PACKAGE_OP: 1019100966Siwasaki case AML_VAR_PACKAGE_OP: 1020100966Siwasaki 1021306536Sjkim if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) 1022100966Siwasaki { 1023100966Siwasaki AcpiOsPrintf ("\n"); 1024100966Siwasaki } 1025100966Siwasaki break; 1026100966Siwasaki 1027100966Siwasaki default: 1028100966Siwasaki 1029100966Siwasaki break; 1030100966Siwasaki } 1031100966Siwasaki } 1032100966Siwasaki break; 1033100966Siwasaki } 1034100966Siwasaki 1035306536Sjkim if (Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) 1036100966Siwasaki { 1037100966Siwasaki if ((Op->Common.Next) && 1038306536Sjkim (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) 1039100966Siwasaki { 1040100966Siwasaki return (AE_OK); 1041100966Siwasaki } 1042100966Siwasaki 1043100966Siwasaki /* 1044281075Sdim * The parent Op is guaranteed to be valid because of the flag 1045306536Sjkim * ACPI_PARSEOP_PARAMETER_LIST -- which means that this op is part of 1046281075Sdim * a parameter list and thus has a valid parent. 1047281075Sdim */ 1048281075Sdim ParentOp = Op->Common.Parent; 1049281075Sdim 1050281075Sdim /* 1051100966Siwasaki * Just completed a parameter node for something like "Buffer (param)". 1052100966Siwasaki * Close the paren and open up the term list block with a brace 1053100966Siwasaki */ 1054100966Siwasaki if (Op->Common.Next) 1055100966Siwasaki { 1056237412Sjkim AcpiOsPrintf (")"); 1057237412Sjkim 1058281075Sdim /* 1059281075Sdim * Emit a description comment for a Name() operator that is a 1060281075Sdim * predefined ACPI name. Must check the grandparent. 1061281075Sdim */ 1062281075Sdim ParentOp = ParentOp->Common.Parent; 1063281075Sdim if (ParentOp && 1064281075Sdim (ParentOp->Asl.AmlOpcode == AML_NAME_OP)) 1065237412Sjkim { 1066281075Sdim AcpiDmPredefinedDescription (ParentOp); 1067237412Sjkim } 1068281075Sdim 1069237412Sjkim AcpiOsPrintf ("\n"); 1070100966Siwasaki AcpiDmIndent (Level - 1); 1071100966Siwasaki AcpiOsPrintf ("{\n"); 1072100966Siwasaki } 1073100966Siwasaki else 1074100966Siwasaki { 1075281075Sdim ParentOp->Common.DisasmFlags |= ACPI_PARSEOP_EMPTY_TERMLIST; 1076100966Siwasaki AcpiOsPrintf (") {"); 1077100966Siwasaki } 1078100966Siwasaki } 1079100966Siwasaki 1080100966Siwasaki if ((Op->Common.AmlOpcode == AML_NAME_OP) || 1081100966Siwasaki (Op->Common.AmlOpcode == AML_RETURN_OP)) 1082100966Siwasaki { 1083100966Siwasaki Info->Level++; 1084100966Siwasaki } 1085281075Sdim 1086281075Sdim /* 1087281075Sdim * For ASL+, check for and emit a C-style symbol. If valid, the 1088281075Sdim * symbol string has been deferred until after the first operand 1089281075Sdim */ 1090281075Sdim if (AcpiGbl_CstyleDisassembly) 1091281075Sdim { 1092281075Sdim if (Op->Asl.OperatorSymbol) 1093281075Sdim { 1094281075Sdim AcpiOsPrintf ("%s", Op->Asl.OperatorSymbol); 1095281075Sdim Op->Asl.OperatorSymbol = NULL; 1096281075Sdim } 1097281075Sdim } 1098281075Sdim 1099100966Siwasaki return (AE_OK); 1100100966Siwasaki} 1101