dmopcode.c revision 237412
1100966Siwasaki/******************************************************************************* 2100966Siwasaki * 3100966Siwasaki * Module Name: dmopcode - AML disassembler, specific AML opcodes 4100966Siwasaki * 5100966Siwasaki ******************************************************************************/ 6100966Siwasaki 7217365Sjkim/* 8229989Sjkim * Copyright (C) 2000 - 2012, 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/acdisasm.h> 49237412Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 50100966Siwasaki 51100966Siwasaki#ifdef ACPI_DISASSEMBLER 52100966Siwasaki 53102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 54100966Siwasaki ACPI_MODULE_NAME ("dmopcode") 55100966Siwasaki 56151937Sjkim/* Local prototypes */ 57100966Siwasaki 58151937Sjkimstatic void 59151937SjkimAcpiDmMatchKeyword ( 60151937Sjkim ACPI_PARSE_OBJECT *Op); 61151937Sjkim 62151937Sjkim 63100966Siwasaki/******************************************************************************* 64100966Siwasaki * 65237412Sjkim * FUNCTION: AcpiDmPredefinedDescription 66237412Sjkim * 67237412Sjkim * PARAMETERS: Op - Name() parse object 68237412Sjkim * 69237412Sjkim * RETURN: None 70237412Sjkim * 71237412Sjkim * DESCRIPTION: Emit a description comment for a predefined ACPI name. 72237412Sjkim * Used for iASL compiler only. 73237412Sjkim * 74237412Sjkim ******************************************************************************/ 75237412Sjkim 76237412Sjkimvoid 77237412SjkimAcpiDmPredefinedDescription ( 78237412Sjkim ACPI_PARSE_OBJECT *Op) 79237412Sjkim{ 80237412Sjkim#ifdef ACPI_ASL_COMPILER 81237412Sjkim const AH_PREDEFINED_NAME *Info; 82237412Sjkim char *NameString; 83237412Sjkim int LastCharIsDigit; 84237412Sjkim int LastCharsAreHex; 85237412Sjkim 86237412Sjkim 87237412Sjkim if (!Op) 88237412Sjkim { 89237412Sjkim return; 90237412Sjkim } 91237412Sjkim 92237412Sjkim /* Ensure that the comment field is emitted only once */ 93237412Sjkim 94237412Sjkim if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED) 95237412Sjkim { 96237412Sjkim return; 97237412Sjkim } 98237412Sjkim Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED; 99237412Sjkim 100237412Sjkim /* Predefined name must start with an underscore */ 101237412Sjkim 102237412Sjkim NameString = ACPI_CAST_PTR (char, &Op->Named.Name); 103237412Sjkim if (NameString[0] != '_') 104237412Sjkim { 105237412Sjkim return; 106237412Sjkim } 107237412Sjkim 108237412Sjkim /* 109237412Sjkim * Check for the special ACPI names: 110237412Sjkim * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a 111237412Sjkim * (where d=decimal_digit, x=hex_digit, a=anything) 112237412Sjkim * 113237412Sjkim * Convert these to the generic name for table lookup. 114237412Sjkim * Note: NameString is guaranteed to be upper case here. 115237412Sjkim */ 116237412Sjkim LastCharIsDigit = 117237412Sjkim (ACPI_IS_DIGIT (NameString[3])); /* d */ 118237412Sjkim LastCharsAreHex = 119237412Sjkim (ACPI_IS_XDIGIT (NameString[2]) && /* xx */ 120237412Sjkim ACPI_IS_XDIGIT (NameString[3])); 121237412Sjkim 122237412Sjkim switch (NameString[1]) 123237412Sjkim { 124237412Sjkim case 'A': 125237412Sjkim if ((NameString[2] == 'C') && (LastCharIsDigit)) 126237412Sjkim { 127237412Sjkim NameString = "_ACx"; 128237412Sjkim } 129237412Sjkim else if ((NameString[2] == 'L') && (LastCharIsDigit)) 130237412Sjkim { 131237412Sjkim NameString = "_ALx"; 132237412Sjkim } 133237412Sjkim break; 134237412Sjkim 135237412Sjkim case 'E': 136237412Sjkim if ((NameString[2] == 'J') && (LastCharIsDigit)) 137237412Sjkim { 138237412Sjkim NameString = "_EJx"; 139237412Sjkim } 140237412Sjkim else if (LastCharsAreHex) 141237412Sjkim { 142237412Sjkim NameString = "_Exx"; 143237412Sjkim } 144237412Sjkim break; 145237412Sjkim 146237412Sjkim case 'L': 147237412Sjkim if (LastCharsAreHex) 148237412Sjkim { 149237412Sjkim NameString = "_Lxx"; 150237412Sjkim } 151237412Sjkim break; 152237412Sjkim 153237412Sjkim case 'Q': 154237412Sjkim if (LastCharsAreHex) 155237412Sjkim { 156237412Sjkim NameString = "_Qxx"; 157237412Sjkim } 158237412Sjkim break; 159237412Sjkim 160237412Sjkim case 'T': 161237412Sjkim if (NameString[2] == '_') 162237412Sjkim { 163237412Sjkim NameString = "_T_x"; 164237412Sjkim } 165237412Sjkim break; 166237412Sjkim 167237412Sjkim case 'W': 168237412Sjkim if (LastCharsAreHex) 169237412Sjkim { 170237412Sjkim NameString = "_Wxx"; 171237412Sjkim } 172237412Sjkim break; 173237412Sjkim 174237412Sjkim default: 175237412Sjkim break; 176237412Sjkim } 177237412Sjkim 178237412Sjkim /* Match the name in the info table */ 179237412Sjkim 180237412Sjkim for (Info = AslPredefinedInfo; Info->Name; Info++) 181237412Sjkim { 182237412Sjkim if (ACPI_COMPARE_NAME (NameString, Info->Name)) 183237412Sjkim { 184237412Sjkim AcpiOsPrintf (" // %4.4s: %s", 185237412Sjkim NameString, ACPI_CAST_PTR (char, Info->Description)); 186237412Sjkim return; 187237412Sjkim } 188237412Sjkim } 189237412Sjkim 190237412Sjkim#endif 191237412Sjkim return; 192237412Sjkim} 193237412Sjkim 194237412Sjkim 195237412Sjkim/******************************************************************************* 196237412Sjkim * 197237412Sjkim * FUNCTION: AcpiDmFieldPredefinedDescription 198237412Sjkim * 199237412Sjkim * PARAMETERS: Op - Parse object 200237412Sjkim * 201237412Sjkim * RETURN: None 202237412Sjkim * 203237412Sjkim * DESCRIPTION: Emit a description comment for a resource descriptor tag 204237412Sjkim * (which is a predefined ACPI name.) Used for iASL compiler only. 205237412Sjkim * 206237412Sjkim ******************************************************************************/ 207237412Sjkim 208237412Sjkimvoid 209237412SjkimAcpiDmFieldPredefinedDescription ( 210237412Sjkim ACPI_PARSE_OBJECT *Op) 211237412Sjkim{ 212237412Sjkim#ifdef ACPI_ASL_COMPILER 213237412Sjkim ACPI_PARSE_OBJECT *IndexOp; 214237412Sjkim char *Tag; 215237412Sjkim const ACPI_OPCODE_INFO *OpInfo; 216237412Sjkim const AH_PREDEFINED_NAME *Info; 217237412Sjkim 218237412Sjkim 219237412Sjkim if (!Op) 220237412Sjkim { 221237412Sjkim return; 222237412Sjkim } 223237412Sjkim 224237412Sjkim /* Ensure that the comment field is emitted only once */ 225237412Sjkim 226237412Sjkim if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED) 227237412Sjkim { 228237412Sjkim return; 229237412Sjkim } 230237412Sjkim Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED; 231237412Sjkim 232237412Sjkim /* 233237412Sjkim * Op must be one of the Create* operators: CreateField, CreateBitField, 234237412Sjkim * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField 235237412Sjkim */ 236237412Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 237237412Sjkim if (!(OpInfo->Flags & AML_CREATE)) 238237412Sjkim { 239237412Sjkim return; 240237412Sjkim } 241237412Sjkim 242237412Sjkim /* Second argument is the Index argument */ 243237412Sjkim 244237412Sjkim IndexOp = Op->Common.Value.Arg; 245237412Sjkim IndexOp = IndexOp->Common.Next; 246237412Sjkim 247237412Sjkim /* Index argument must be a namepath */ 248237412Sjkim 249237412Sjkim if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP) 250237412Sjkim { 251237412Sjkim return; 252237412Sjkim } 253237412Sjkim 254237412Sjkim /* Major cheat: We previously put the Tag ptr in the Node field */ 255237412Sjkim 256237412Sjkim Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node); 257237412Sjkim 258237412Sjkim /* Match the name in the info table */ 259237412Sjkim 260237412Sjkim for (Info = AslPredefinedInfo; Info->Name; Info++) 261237412Sjkim { 262237412Sjkim if (ACPI_COMPARE_NAME (Tag, Info->Name)) 263237412Sjkim { 264237412Sjkim AcpiOsPrintf (" // %4.4s: %s", Tag, 265237412Sjkim ACPI_CAST_PTR (char, Info->Description)); 266237412Sjkim return; 267237412Sjkim } 268237412Sjkim } 269237412Sjkim 270237412Sjkim#endif 271237412Sjkim return; 272237412Sjkim} 273237412Sjkim 274237412Sjkim 275237412Sjkim/******************************************************************************* 276237412Sjkim * 277100966Siwasaki * FUNCTION: AcpiDmMethodFlags 278100966Siwasaki * 279100966Siwasaki * PARAMETERS: Op - Method Object to be examined 280100966Siwasaki * 281100966Siwasaki * RETURN: None 282100966Siwasaki * 283100966Siwasaki * DESCRIPTION: Decode control method flags 284100966Siwasaki * 285100966Siwasaki ******************************************************************************/ 286100966Siwasaki 287100966Siwasakivoid 288100966SiwasakiAcpiDmMethodFlags ( 289100966Siwasaki ACPI_PARSE_OBJECT *Op) 290100966Siwasaki{ 291100966Siwasaki UINT32 Flags; 292100966Siwasaki UINT32 Args; 293100966Siwasaki 294100966Siwasaki 295100966Siwasaki /* The next Op contains the flags */ 296100966Siwasaki 297100966Siwasaki Op = AcpiPsGetDepthNext (NULL, Op); 298117521Snjl Flags = (UINT8) Op->Common.Value.Integer; 299100966Siwasaki Args = Flags & 0x07; 300100966Siwasaki 301100966Siwasaki /* Mark the Op as completed */ 302100966Siwasaki 303100966Siwasaki Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 304100966Siwasaki 305100966Siwasaki /* 1) Method argument count */ 306100966Siwasaki 307209746Sjkim AcpiOsPrintf (", %u, ", Args); 308100966Siwasaki 309100966Siwasaki /* 2) Serialize rule */ 310100966Siwasaki 311100966Siwasaki if (!(Flags & 0x08)) 312100966Siwasaki { 313100966Siwasaki AcpiOsPrintf ("Not"); 314100966Siwasaki } 315100966Siwasaki 316100966Siwasaki AcpiOsPrintf ("Serialized"); 317100966Siwasaki 318100966Siwasaki /* 3) SyncLevel */ 319100966Siwasaki 320100966Siwasaki if (Flags & 0xF0) 321100966Siwasaki { 322209746Sjkim AcpiOsPrintf (", %u", Flags >> 4); 323100966Siwasaki } 324100966Siwasaki} 325100966Siwasaki 326100966Siwasaki 327100966Siwasaki/******************************************************************************* 328100966Siwasaki * 329100966Siwasaki * FUNCTION: AcpiDmFieldFlags 330100966Siwasaki * 331100966Siwasaki * PARAMETERS: Op - Field Object to be examined 332100966Siwasaki * 333100966Siwasaki * RETURN: None 334100966Siwasaki * 335100966Siwasaki * DESCRIPTION: Decode Field definition flags 336100966Siwasaki * 337100966Siwasaki ******************************************************************************/ 338100966Siwasaki 339100966Siwasakivoid 340100966SiwasakiAcpiDmFieldFlags ( 341100966Siwasaki ACPI_PARSE_OBJECT *Op) 342100966Siwasaki{ 343100966Siwasaki UINT32 Flags; 344100966Siwasaki 345100966Siwasaki 346167802Sjkim Op = Op->Common.Next; 347117521Snjl Flags = (UINT8) Op->Common.Value.Integer; 348100966Siwasaki 349100966Siwasaki /* Mark the Op as completed */ 350100966Siwasaki 351100966Siwasaki Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 352100966Siwasaki 353167802Sjkim AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]); 354100966Siwasaki AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]); 355100966Siwasaki AcpiOsPrintf ("%s)", AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]); 356100966Siwasaki} 357100966Siwasaki 358100966Siwasaki 359100966Siwasaki/******************************************************************************* 360100966Siwasaki * 361100966Siwasaki * FUNCTION: AcpiDmAddressSpace 362100966Siwasaki * 363100966Siwasaki * PARAMETERS: SpaceId - ID to be translated 364100966Siwasaki * 365100966Siwasaki * RETURN: None 366100966Siwasaki * 367100966Siwasaki * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword 368100966Siwasaki * 369100966Siwasaki ******************************************************************************/ 370100966Siwasaki 371100966Siwasakivoid 372100966SiwasakiAcpiDmAddressSpace ( 373100966Siwasaki UINT8 SpaceId) 374100966Siwasaki{ 375100966Siwasaki 376100966Siwasaki if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) 377100966Siwasaki { 378100966Siwasaki if (SpaceId == 0x7F) 379100966Siwasaki { 380100966Siwasaki AcpiOsPrintf ("FFixedHW, "); 381100966Siwasaki } 382100966Siwasaki else 383100966Siwasaki { 384100966Siwasaki AcpiOsPrintf ("0x%.2X, ", SpaceId); 385100966Siwasaki } 386100966Siwasaki } 387100966Siwasaki else 388100966Siwasaki { 389100966Siwasaki AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]); 390100966Siwasaki } 391100966Siwasaki} 392100966Siwasaki 393100966Siwasaki 394100966Siwasaki/******************************************************************************* 395100966Siwasaki * 396100966Siwasaki * FUNCTION: AcpiDmRegionFlags 397100966Siwasaki * 398100966Siwasaki * PARAMETERS: Op - Object to be examined 399100966Siwasaki * 400100966Siwasaki * RETURN: None 401100966Siwasaki * 402100966Siwasaki * DESCRIPTION: Decode OperationRegion flags 403100966Siwasaki * 404100966Siwasaki ******************************************************************************/ 405100966Siwasaki 406100966Siwasakivoid 407100966SiwasakiAcpiDmRegionFlags ( 408100966Siwasaki ACPI_PARSE_OBJECT *Op) 409100966Siwasaki{ 410100966Siwasaki 411100966Siwasaki 412100966Siwasaki /* The next Op contains the SpaceId */ 413100966Siwasaki 414100966Siwasaki Op = AcpiPsGetDepthNext (NULL, Op); 415100966Siwasaki 416100966Siwasaki /* Mark the Op as completed */ 417100966Siwasaki 418100966Siwasaki Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 419100966Siwasaki 420100966Siwasaki AcpiOsPrintf (", "); 421117521Snjl AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer); 422100966Siwasaki} 423100966Siwasaki 424100966Siwasaki 425100966Siwasaki/******************************************************************************* 426100966Siwasaki * 427100966Siwasaki * FUNCTION: AcpiDmMatchOp 428100966Siwasaki * 429100966Siwasaki * PARAMETERS: Op - Match Object to be examined 430100966Siwasaki * 431100966Siwasaki * RETURN: None 432100966Siwasaki * 433100966Siwasaki * DESCRIPTION: Decode Match opcode operands 434100966Siwasaki * 435100966Siwasaki ******************************************************************************/ 436100966Siwasaki 437100966Siwasakivoid 438100966SiwasakiAcpiDmMatchOp ( 439100966Siwasaki ACPI_PARSE_OBJECT *Op) 440100966Siwasaki{ 441100966Siwasaki ACPI_PARSE_OBJECT *NextOp; 442100966Siwasaki 443100966Siwasaki 444100966Siwasaki NextOp = AcpiPsGetDepthNext (NULL, Op); 445100966Siwasaki NextOp = NextOp->Common.Next; 446100966Siwasaki 447100966Siwasaki if (!NextOp) 448100966Siwasaki { 449100966Siwasaki /* Handle partial tree during single-step */ 450100966Siwasaki 451100966Siwasaki return; 452100966Siwasaki } 453100966Siwasaki 454100966Siwasaki /* Mark the two nodes that contain the encoding for the match keywords */ 455100966Siwasaki 456100966Siwasaki NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP; 457100966Siwasaki 458100966Siwasaki NextOp = NextOp->Common.Next; 459100966Siwasaki NextOp = NextOp->Common.Next; 460100966Siwasaki NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP; 461100966Siwasaki} 462100966Siwasaki 463100966Siwasaki 464100966Siwasaki/******************************************************************************* 465100966Siwasaki * 466100966Siwasaki * FUNCTION: AcpiDmMatchKeyword 467100966Siwasaki * 468100966Siwasaki * PARAMETERS: Op - Match Object to be examined 469100966Siwasaki * 470100966Siwasaki * RETURN: None 471100966Siwasaki * 472100966Siwasaki * DESCRIPTION: Decode Match opcode operands 473100966Siwasaki * 474100966Siwasaki ******************************************************************************/ 475100966Siwasaki 476151937Sjkimstatic void 477100966SiwasakiAcpiDmMatchKeyword ( 478100966Siwasaki ACPI_PARSE_OBJECT *Op) 479100966Siwasaki{ 480100966Siwasaki 481100966Siwasaki 482167802Sjkim if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE) 483100966Siwasaki { 484100966Siwasaki AcpiOsPrintf ("/* Unknown Match Keyword encoding */"); 485100966Siwasaki } 486100966Siwasaki else 487100966Siwasaki { 488167802Sjkim AcpiOsPrintf ("%s", ACPI_CAST_PTR (char, 489167802Sjkim AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer])); 490100966Siwasaki } 491100966Siwasaki} 492100966Siwasaki 493100966Siwasaki 494100966Siwasaki/******************************************************************************* 495100966Siwasaki * 496100966Siwasaki * FUNCTION: AcpiDmDisassembleOneOp 497100966Siwasaki * 498100966Siwasaki * PARAMETERS: WalkState - Current walk info 499100966Siwasaki * Info - Parse tree walk info 500100966Siwasaki * Op - Op that is to be printed 501100966Siwasaki * 502100966Siwasaki * RETURN: None 503100966Siwasaki * 504100966Siwasaki * DESCRIPTION: Disassemble a single AML opcode 505100966Siwasaki * 506100966Siwasaki ******************************************************************************/ 507100966Siwasaki 508100966Siwasakivoid 509100966SiwasakiAcpiDmDisassembleOneOp ( 510100966Siwasaki ACPI_WALK_STATE *WalkState, 511100966Siwasaki ACPI_OP_WALK_INFO *Info, 512100966Siwasaki ACPI_PARSE_OBJECT *Op) 513100966Siwasaki{ 514100966Siwasaki const ACPI_OPCODE_INFO *OpInfo = NULL; 515100966Siwasaki UINT32 Offset; 516100966Siwasaki UINT32 Length; 517167802Sjkim ACPI_PARSE_OBJECT *Child; 518167802Sjkim ACPI_STATUS Status; 519228110Sjkim UINT8 *Aml; 520100966Siwasaki 521100966Siwasaki 522100966Siwasaki if (!Op) 523100966Siwasaki { 524100966Siwasaki AcpiOsPrintf ("<NULL OP PTR>"); 525100966Siwasaki return; 526100966Siwasaki } 527100966Siwasaki 528100966Siwasaki switch (Op->Common.DisasmOpcode) 529100966Siwasaki { 530100966Siwasaki case ACPI_DASM_MATCHOP: 531100966Siwasaki 532100966Siwasaki AcpiDmMatchKeyword (Op); 533100966Siwasaki return; 534100966Siwasaki 535167802Sjkim case ACPI_DASM_LNOT_SUFFIX: 536167802Sjkim switch (Op->Common.AmlOpcode) 537167802Sjkim { 538167802Sjkim case AML_LEQUAL_OP: 539167802Sjkim AcpiOsPrintf ("LNotEqual"); 540167802Sjkim break; 541167802Sjkim 542167802Sjkim case AML_LGREATER_OP: 543167802Sjkim AcpiOsPrintf ("LLessEqual"); 544167802Sjkim break; 545167802Sjkim 546167802Sjkim case AML_LLESS_OP: 547167802Sjkim AcpiOsPrintf ("LGreaterEqual"); 548167802Sjkim break; 549193267Sjkim 550193267Sjkim default: 551193267Sjkim break; 552167802Sjkim } 553167802Sjkim Op->Common.DisasmOpcode = 0; 554167802Sjkim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 555167802Sjkim return; 556167802Sjkim 557100966Siwasaki default: 558100966Siwasaki break; 559100966Siwasaki } 560100966Siwasaki 561167802Sjkim 562167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 563167802Sjkim 564117521Snjl /* The op and arguments */ 565100966Siwasaki 566100966Siwasaki switch (Op->Common.AmlOpcode) 567100966Siwasaki { 568167802Sjkim case AML_LNOT_OP: 569100966Siwasaki 570167802Sjkim Child = Op->Common.Value.Arg; 571167802Sjkim if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) || 572167802Sjkim (Child->Common.AmlOpcode == AML_LGREATER_OP) || 573167802Sjkim (Child->Common.AmlOpcode == AML_LLESS_OP)) 574167802Sjkim { 575167802Sjkim Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX; 576167802Sjkim Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX; 577167802Sjkim } 578167802Sjkim else 579167802Sjkim { 580167802Sjkim AcpiOsPrintf ("%s", OpInfo->Name); 581167802Sjkim } 582100966Siwasaki break; 583100966Siwasaki 584100966Siwasaki case AML_BYTE_OP: 585100966Siwasaki 586117521Snjl AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer); 587100966Siwasaki break; 588100966Siwasaki 589100966Siwasaki 590100966Siwasaki case AML_WORD_OP: 591100966Siwasaki 592100966Siwasaki if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) 593100966Siwasaki { 594117521Snjl AcpiDmEisaId ((UINT32) Op->Common.Value.Integer); 595100966Siwasaki } 596100966Siwasaki else 597100966Siwasaki { 598117521Snjl AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer); 599100966Siwasaki } 600100966Siwasaki break; 601100966Siwasaki 602100966Siwasaki 603100966Siwasaki case AML_DWORD_OP: 604100966Siwasaki 605100966Siwasaki if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) 606100966Siwasaki { 607117521Snjl AcpiDmEisaId ((UINT32) Op->Common.Value.Integer); 608100966Siwasaki } 609100966Siwasaki else 610100966Siwasaki { 611117521Snjl AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer); 612100966Siwasaki } 613100966Siwasaki break; 614100966Siwasaki 615100966Siwasaki 616100966Siwasaki case AML_QWORD_OP: 617100966Siwasaki 618202771Sjkim AcpiOsPrintf ("0x%8.8X%8.8X", 619202771Sjkim ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); 620100966Siwasaki break; 621100966Siwasaki 622100966Siwasaki 623100966Siwasaki case AML_STRING_OP: 624100966Siwasaki 625107325Siwasaki AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT8_MAX); 626100966Siwasaki break; 627100966Siwasaki 628100966Siwasaki 629100966Siwasaki case AML_BUFFER_OP: 630100966Siwasaki 631100966Siwasaki /* 632100966Siwasaki * Determine the type of buffer. We can have one of the following: 633100966Siwasaki * 634100966Siwasaki * 1) ResourceTemplate containing Resource Descriptors. 635100966Siwasaki * 2) Unicode String buffer 636100966Siwasaki * 3) ASCII String buffer 637100966Siwasaki * 4) Raw data buffer (if none of the above) 638100966Siwasaki * 639100966Siwasaki * Since there are no special AML opcodes to differentiate these 640100966Siwasaki * types of buffers, we have to closely look at the data in the 641100966Siwasaki * buffer to determine the type. 642100966Siwasaki */ 643228110Sjkim if (!AcpiGbl_NoResourceDisassembly) 644100966Siwasaki { 645228110Sjkim Status = AcpiDmIsResourceTemplate (Op); 646228110Sjkim if (ACPI_SUCCESS (Status)) 647228110Sjkim { 648228110Sjkim Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; 649228110Sjkim AcpiOsPrintf ("ResourceTemplate"); 650228110Sjkim break; 651228110Sjkim } 652228110Sjkim else if (Status == AE_AML_NO_RESOURCE_END_TAG) 653228110Sjkim { 654228110Sjkim AcpiOsPrintf ("/**** Is ResourceTemplate, but EndTag not at buffer end ****/ "); 655228110Sjkim } 656100966Siwasaki } 657167802Sjkim 658167802Sjkim if (AcpiDmIsUnicodeBuffer (Op)) 659167802Sjkim { 660100966Siwasaki Op->Common.DisasmOpcode = ACPI_DASM_UNICODE; 661100966Siwasaki AcpiOsPrintf ("Unicode ("); 662100966Siwasaki } 663100966Siwasaki else if (AcpiDmIsStringBuffer (Op)) 664100966Siwasaki { 665100966Siwasaki Op->Common.DisasmOpcode = ACPI_DASM_STRING; 666100966Siwasaki AcpiOsPrintf ("Buffer"); 667100966Siwasaki } 668100966Siwasaki else 669100966Siwasaki { 670100966Siwasaki Op->Common.DisasmOpcode = ACPI_DASM_BUFFER; 671100966Siwasaki AcpiOsPrintf ("Buffer"); 672100966Siwasaki } 673100966Siwasaki break; 674100966Siwasaki 675100966Siwasaki 676100966Siwasaki case AML_INT_STATICSTRING_OP: 677100966Siwasaki 678100966Siwasaki if (Op->Common.Value.String) 679100966Siwasaki { 680100966Siwasaki AcpiOsPrintf ("%s", Op->Common.Value.String); 681100966Siwasaki } 682100966Siwasaki else 683100966Siwasaki { 684100966Siwasaki AcpiOsPrintf ("\"<NULL STATIC STRING PTR>\""); 685100966Siwasaki } 686100966Siwasaki break; 687100966Siwasaki 688100966Siwasaki 689100966Siwasaki case AML_INT_NAMEPATH_OP: 690100966Siwasaki 691100966Siwasaki AcpiDmNamestring (Op->Common.Value.Name); 692100966Siwasaki break; 693100966Siwasaki 694100966Siwasaki 695100966Siwasaki case AML_INT_NAMEDFIELD_OP: 696100966Siwasaki 697193267Sjkim Length = AcpiDmDumpName (Op->Named.Name); 698209746Sjkim AcpiOsPrintf (",%*.s %u", (unsigned) (5 - Length), " ", 699151937Sjkim (UINT32) Op->Common.Value.Integer); 700100966Siwasaki AcpiDmCommaIfFieldMember (Op); 701100966Siwasaki 702117521Snjl Info->BitOffset += (UINT32) Op->Common.Value.Integer; 703100966Siwasaki break; 704100966Siwasaki 705100966Siwasaki 706100966Siwasaki case AML_INT_RESERVEDFIELD_OP: 707100966Siwasaki 708100966Siwasaki /* Offset() -- Must account for previous offsets */ 709100966Siwasaki 710117521Snjl Offset = (UINT32) Op->Common.Value.Integer; 711100966Siwasaki Info->BitOffset += Offset; 712100966Siwasaki 713100966Siwasaki if (Info->BitOffset % 8 == 0) 714100966Siwasaki { 715228110Sjkim AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset)); 716100966Siwasaki } 717100966Siwasaki else 718100966Siwasaki { 719209746Sjkim AcpiOsPrintf (" , %u", Offset); 720100966Siwasaki } 721100966Siwasaki 722100966Siwasaki AcpiDmCommaIfFieldMember (Op); 723100966Siwasaki break; 724100966Siwasaki 725100966Siwasaki 726100966Siwasaki case AML_INT_ACCESSFIELD_OP: 727228110Sjkim case AML_INT_EXTACCESSFIELD_OP: 728100966Siwasaki 729228110Sjkim AcpiOsPrintf ("AccessAs (%s, ", 730228110Sjkim AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]); 731100966Siwasaki 732228110Sjkim AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8)); 733228110Sjkim 734228110Sjkim if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP) 735228110Sjkim { 736228110Sjkim AcpiOsPrintf (" (0x%2.2X)", (unsigned) ((Op->Common.Value.Integer >> 16) & 0xFF)); 737228110Sjkim } 738228110Sjkim 739107325Siwasaki AcpiOsPrintf (")"); 740100966Siwasaki AcpiDmCommaIfFieldMember (Op); 741100966Siwasaki break; 742100966Siwasaki 743100966Siwasaki 744228110Sjkim case AML_INT_CONNECTION_OP: 745228110Sjkim 746228110Sjkim /* 747228110Sjkim * Two types of Connection() - one with a buffer object, the 748228110Sjkim * other with a namestring that points to a buffer object. 749228110Sjkim */ 750228110Sjkim AcpiOsPrintf ("Connection ("); 751228110Sjkim Child = Op->Common.Value.Arg; 752228110Sjkim 753228110Sjkim if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP) 754228110Sjkim { 755228110Sjkim AcpiOsPrintf ("\n"); 756228110Sjkim 757228110Sjkim Aml = Child->Named.Data; 758228110Sjkim Length = (UINT32) Child->Common.Value.Integer; 759228110Sjkim 760228110Sjkim Info->Level += 1; 761228110Sjkim Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; 762228110Sjkim AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length); 763228110Sjkim 764228110Sjkim Info->Level -= 1; 765228110Sjkim AcpiDmIndent (Info->Level); 766228110Sjkim } 767228110Sjkim else 768228110Sjkim { 769228110Sjkim AcpiDmNamestring (Child->Common.Value.Name); 770228110Sjkim } 771228110Sjkim 772228110Sjkim AcpiOsPrintf (")"); 773228110Sjkim AcpiDmCommaIfFieldMember (Op); 774228110Sjkim AcpiOsPrintf ("\n"); 775228110Sjkim 776228110Sjkim Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */ 777228110Sjkim Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 778228110Sjkim break; 779228110Sjkim 780100966Siwasaki case AML_INT_BYTELIST_OP: 781100966Siwasaki 782100966Siwasaki AcpiDmByteList (Info, Op); 783100966Siwasaki break; 784100966Siwasaki 785100966Siwasaki 786100966Siwasaki case AML_INT_METHODCALL_OP: 787100966Siwasaki 788100966Siwasaki Op = AcpiPsGetDepthNext (NULL, Op); 789100966Siwasaki Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 790100966Siwasaki 791100966Siwasaki AcpiDmNamestring (Op->Common.Value.Name); 792100966Siwasaki break; 793100966Siwasaki 794100966Siwasaki 795100966Siwasaki default: 796100966Siwasaki 797100966Siwasaki /* Just get the opcode name and print it */ 798100966Siwasaki 799100966Siwasaki AcpiOsPrintf ("%s", OpInfo->Name); 800100966Siwasaki 801100966Siwasaki 802102550Siwasaki#ifdef ACPI_DEBUGGER 803100966Siwasaki 804100966Siwasaki if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) && 805100966Siwasaki (WalkState) && 806100966Siwasaki (WalkState->Results) && 807167802Sjkim (WalkState->ResultCount)) 808100966Siwasaki { 809117521Snjl AcpiDmDecodeInternalObject ( 810151937Sjkim WalkState->Results->Results.ObjDesc [ 811167802Sjkim (WalkState->ResultCount - 1) % 812167802Sjkim ACPI_RESULTS_FRAME_OBJ_NUM]); 813100966Siwasaki } 814100966Siwasaki#endif 815167802Sjkim 816100966Siwasaki break; 817100966Siwasaki } 818100966Siwasaki} 819100966Siwasaki 820100966Siwasaki#endif /* ACPI_DISASSEMBLER */ 821