1100966Siwasaki/******************************************************************************* 2100966Siwasaki * 3100966Siwasaki * Module Name: dmutils - AML disassembler utilities 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/amlcode.h> 47193341Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 48151937Sjkim 49151937Sjkim#ifdef ACPI_ASL_COMPILER 50193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 51151937Sjkim#endif 52100966Siwasaki 53100966Siwasaki 54102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 55100966Siwasaki ACPI_MODULE_NAME ("dmutils") 56100966Siwasaki 57100966Siwasaki 58100966Siwasaki/* Data used in keeping track of fields */ 59100966Siwasaki#if 0 60167802Sjkimconst char *AcpiGbl_FENames[] = 61100966Siwasaki{ 62100966Siwasaki "skip", 63100966Siwasaki "?access?" 64100966Siwasaki}; /* FE = Field Element */ 65100966Siwasaki#endif 66100966Siwasaki 67167802Sjkim/* Operators for Match() */ 68100966Siwasaki 69167802Sjkimconst char *AcpiGbl_MatchOps[] = 70100966Siwasaki{ 71100966Siwasaki "MTR", 72100966Siwasaki "MEQ", 73100966Siwasaki "MLE", 74100966Siwasaki "MLT", 75100966Siwasaki "MGE", 76100966Siwasaki "MGT" 77100966Siwasaki}; 78100966Siwasaki 79100966Siwasaki/* Access type decoding */ 80100966Siwasaki 81167802Sjkimconst char *AcpiGbl_AccessTypes[] = 82100966Siwasaki{ 83100966Siwasaki "AnyAcc", 84100966Siwasaki "ByteAcc", 85100966Siwasaki "WordAcc", 86100966Siwasaki "DWordAcc", 87100966Siwasaki "QWordAcc", 88100966Siwasaki "BufferAcc", 89167802Sjkim "InvalidAccType", 90167802Sjkim "InvalidAccType" 91100966Siwasaki}; 92100966Siwasaki 93100966Siwasaki/* Lock rule decoding */ 94100966Siwasaki 95167802Sjkimconst char *AcpiGbl_LockRule[] = 96100966Siwasaki{ 97100966Siwasaki "NoLock", 98100966Siwasaki "Lock" 99100966Siwasaki}; 100100966Siwasaki 101100966Siwasaki/* Update rule decoding */ 102100966Siwasaki 103167802Sjkimconst char *AcpiGbl_UpdateRules[] = 104100966Siwasaki{ 105100966Siwasaki "Preserve", 106100966Siwasaki "WriteAsOnes", 107167802Sjkim "WriteAsZeros", 108167802Sjkim "InvalidUpdateRule" 109100966Siwasaki}; 110100966Siwasaki 111167802Sjkim/* Strings used to decode resource descriptors */ 112100966Siwasaki 113167802Sjkimconst char *AcpiGbl_WordDecode[] = 114100966Siwasaki{ 115151937Sjkim "Memory", 116151937Sjkim "IO", 117151937Sjkim "BusNumber", 118167802Sjkim "UnknownResourceType" 119100966Siwasaki}; 120100966Siwasaki 121167802Sjkimconst char *AcpiGbl_IrqDecode[] = 122100966Siwasaki{ 123100966Siwasaki "IRQNoFlags", 124100966Siwasaki "IRQ" 125100966Siwasaki}; 126100966Siwasaki 127100966Siwasaki 128100966Siwasaki/******************************************************************************* 129100966Siwasaki * 130107325Siwasaki * FUNCTION: AcpiDmDecodeAttribute 131107325Siwasaki * 132107325Siwasaki * PARAMETERS: Attribute - Attribute field of AccessAs keyword 133107325Siwasaki * 134107325Siwasaki * RETURN: None 135107325Siwasaki * 136228110Sjkim * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus and 137228110Sjkim * GenericSerialBus stuff.) 138107325Siwasaki * 139107325Siwasaki ******************************************************************************/ 140107325Siwasaki 141107325Siwasakivoid 142107325SiwasakiAcpiDmDecodeAttribute ( 143107325Siwasaki UINT8 Attribute) 144107325Siwasaki{ 145107325Siwasaki 146107325Siwasaki switch (Attribute) 147107325Siwasaki { 148228110Sjkim case AML_FIELD_ATTRIB_QUICK: 149107325Siwasaki 150228110Sjkim AcpiOsPrintf ("AttribQuick"); 151107325Siwasaki break; 152107325Siwasaki 153228110Sjkim case AML_FIELD_ATTRIB_SEND_RCV: 154107325Siwasaki 155228110Sjkim AcpiOsPrintf ("AttribSendReceive"); 156107325Siwasaki break; 157107325Siwasaki 158228110Sjkim case AML_FIELD_ATTRIB_BYTE: 159107325Siwasaki 160228110Sjkim AcpiOsPrintf ("AttribByte"); 161107325Siwasaki break; 162107325Siwasaki 163228110Sjkim case AML_FIELD_ATTRIB_WORD: 164107325Siwasaki 165228110Sjkim AcpiOsPrintf ("AttribWord"); 166107325Siwasaki break; 167107325Siwasaki 168228110Sjkim case AML_FIELD_ATTRIB_BLOCK: 169107325Siwasaki 170228110Sjkim AcpiOsPrintf ("AttribBlock"); 171107325Siwasaki break; 172107325Siwasaki 173228110Sjkim case AML_FIELD_ATTRIB_MULTIBYTE: 174107325Siwasaki 175228110Sjkim AcpiOsPrintf ("AttribBytes"); 176107325Siwasaki break; 177107325Siwasaki 178228110Sjkim case AML_FIELD_ATTRIB_WORD_CALL: 179107325Siwasaki 180228110Sjkim AcpiOsPrintf ("AttribProcessCall"); 181107325Siwasaki break; 182107325Siwasaki 183228110Sjkim case AML_FIELD_ATTRIB_BLOCK_CALL: 184228110Sjkim 185228110Sjkim AcpiOsPrintf ("AttribBlockProcessCall"); 186228110Sjkim break; 187228110Sjkim 188228110Sjkim case AML_FIELD_ATTRIB_RAW_BYTES: 189228110Sjkim 190228110Sjkim AcpiOsPrintf ("AttribRawBytes"); 191228110Sjkim break; 192228110Sjkim 193228110Sjkim case AML_FIELD_ATTRIB_RAW_PROCESS: 194228110Sjkim 195228110Sjkim AcpiOsPrintf ("AttribRawProcessBytes"); 196228110Sjkim break; 197228110Sjkim 198107325Siwasaki default: 199107325Siwasaki 200228110Sjkim /* A ByteConst is allowed by the grammar */ 201228110Sjkim 202228110Sjkim AcpiOsPrintf ("0x%2.2X", Attribute); 203107325Siwasaki break; 204107325Siwasaki } 205107325Siwasaki} 206107325Siwasaki 207107325Siwasaki 208107325Siwasaki/******************************************************************************* 209107325Siwasaki * 210100966Siwasaki * FUNCTION: AcpiDmIndent 211100966Siwasaki * 212100966Siwasaki * PARAMETERS: Level - Current source code indentation level 213100966Siwasaki * 214100966Siwasaki * RETURN: None 215100966Siwasaki * 216100966Siwasaki * DESCRIPTION: Indent 4 spaces per indentation level. 217100966Siwasaki * 218100966Siwasaki ******************************************************************************/ 219100966Siwasaki 220100966Siwasakivoid 221100966SiwasakiAcpiDmIndent ( 222100966Siwasaki UINT32 Level) 223100966Siwasaki{ 224100966Siwasaki 225100966Siwasaki if (!Level) 226100966Siwasaki { 227100966Siwasaki return; 228100966Siwasaki } 229100966Siwasaki 230306536Sjkim AcpiOsPrintf ("%*.s", (Level * 4), " "); 231100966Siwasaki} 232100966Siwasaki 233100966Siwasaki 234100966Siwasaki/******************************************************************************* 235100966Siwasaki * 236100966Siwasaki * FUNCTION: AcpiDmCommaIfListMember 237100966Siwasaki * 238100966Siwasaki * PARAMETERS: Op - Current operator/operand 239100966Siwasaki * 240100966Siwasaki * RETURN: TRUE if a comma was inserted 241100966Siwasaki * 242100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of an argument list. 243100966Siwasaki * 244100966Siwasaki ******************************************************************************/ 245100966Siwasaki 246100966SiwasakiBOOLEAN 247100966SiwasakiAcpiDmCommaIfListMember ( 248100966Siwasaki ACPI_PARSE_OBJECT *Op) 249100966Siwasaki{ 250100966Siwasaki 251100966Siwasaki if (!Op->Common.Next) 252100966Siwasaki { 253241973Sjkim return (FALSE); 254100966Siwasaki } 255100966Siwasaki 256100966Siwasaki if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST) 257100966Siwasaki { 258281075Sdim /* Exit if Target has been marked IGNORE */ 259281075Sdim 260281075Sdim if (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) 261281075Sdim { 262281075Sdim return (FALSE); 263281075Sdim } 264281075Sdim 265100966Siwasaki /* Check for a NULL target operand */ 266100966Siwasaki 267100966Siwasaki if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 268100966Siwasaki (!Op->Common.Next->Common.Value.String)) 269100966Siwasaki { 270100966Siwasaki /* 271100966Siwasaki * To handle the Divide() case where there are two optional 272241973Sjkim * targets, look ahead one more op. If null, this null target 273241973Sjkim * is the one and only target -- no comma needed. Otherwise, 274100966Siwasaki * we need a comma to prepare for the next target. 275100966Siwasaki */ 276100966Siwasaki if (!Op->Common.Next->Common.Next) 277100966Siwasaki { 278241973Sjkim return (FALSE); 279100966Siwasaki } 280100966Siwasaki } 281100966Siwasaki 282306536Sjkim if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) && 283306536Sjkim (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST))) 284100966Siwasaki { 285241973Sjkim return (FALSE); 286100966Siwasaki } 287100966Siwasaki 288281075Sdim /* Emit comma only if this is not a C-style operator */ 289281075Sdim 290281075Sdim if (!Op->Common.OperatorSymbol) 291281075Sdim { 292281075Sdim AcpiOsPrintf (", "); 293281075Sdim } 294281075Sdim 295100966Siwasaki return (TRUE); 296100966Siwasaki } 297100966Siwasaki 298306536Sjkim else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST) && 299306536Sjkim (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMETER_LIST)) 300100966Siwasaki { 301100966Siwasaki AcpiOsPrintf (", "); 302100966Siwasaki return (TRUE); 303100966Siwasaki } 304100966Siwasaki 305100966Siwasaki return (FALSE); 306100966Siwasaki} 307100966Siwasaki 308100966Siwasaki 309100966Siwasaki/******************************************************************************* 310100966Siwasaki * 311100966Siwasaki * FUNCTION: AcpiDmCommaIfFieldMember 312100966Siwasaki * 313100966Siwasaki * PARAMETERS: Op - Current operator/operand 314100966Siwasaki * 315100966Siwasaki * RETURN: None 316100966Siwasaki * 317100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list. 318100966Siwasaki * 319100966Siwasaki ******************************************************************************/ 320100966Siwasaki 321100966Siwasakivoid 322100966SiwasakiAcpiDmCommaIfFieldMember ( 323100966Siwasaki ACPI_PARSE_OBJECT *Op) 324100966Siwasaki{ 325100966Siwasaki 326100966Siwasaki if (Op->Common.Next) 327100966Siwasaki { 328100966Siwasaki AcpiOsPrintf (", "); 329100966Siwasaki } 330100966Siwasaki} 331