1100966Siwasaki/******************************************************************************* 2100966Siwasaki * 3100966Siwasaki * Module Name: dmutils - AML disassembler utilities 4100966Siwasaki * 5100966Siwasaki ******************************************************************************/ 6100966Siwasaki 7217365Sjkim/* 8281075Sdim * 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/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#ifdef ACPI_DISASSEMBLER 54100966Siwasaki 55102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 56100966Siwasaki ACPI_MODULE_NAME ("dmutils") 57100966Siwasaki 58100966Siwasaki 59100966Siwasaki/* Data used in keeping track of fields */ 60100966Siwasaki#if 0 61167802Sjkimconst char *AcpiGbl_FENames[] = 62100966Siwasaki{ 63100966Siwasaki "skip", 64100966Siwasaki "?access?" 65100966Siwasaki}; /* FE = Field Element */ 66100966Siwasaki#endif 67100966Siwasaki 68167802Sjkim/* Operators for Match() */ 69100966Siwasaki 70167802Sjkimconst char *AcpiGbl_MatchOps[] = 71100966Siwasaki{ 72100966Siwasaki "MTR", 73100966Siwasaki "MEQ", 74100966Siwasaki "MLE", 75100966Siwasaki "MLT", 76100966Siwasaki "MGE", 77100966Siwasaki "MGT" 78100966Siwasaki}; 79100966Siwasaki 80100966Siwasaki/* Access type decoding */ 81100966Siwasaki 82167802Sjkimconst char *AcpiGbl_AccessTypes[] = 83100966Siwasaki{ 84100966Siwasaki "AnyAcc", 85100966Siwasaki "ByteAcc", 86100966Siwasaki "WordAcc", 87100966Siwasaki "DWordAcc", 88100966Siwasaki "QWordAcc", 89100966Siwasaki "BufferAcc", 90167802Sjkim "InvalidAccType", 91167802Sjkim "InvalidAccType" 92100966Siwasaki}; 93100966Siwasaki 94100966Siwasaki/* Lock rule decoding */ 95100966Siwasaki 96167802Sjkimconst char *AcpiGbl_LockRule[] = 97100966Siwasaki{ 98100966Siwasaki "NoLock", 99100966Siwasaki "Lock" 100100966Siwasaki}; 101100966Siwasaki 102100966Siwasaki/* Update rule decoding */ 103100966Siwasaki 104167802Sjkimconst char *AcpiGbl_UpdateRules[] = 105100966Siwasaki{ 106100966Siwasaki "Preserve", 107100966Siwasaki "WriteAsOnes", 108167802Sjkim "WriteAsZeros", 109167802Sjkim "InvalidUpdateRule" 110100966Siwasaki}; 111100966Siwasaki 112167802Sjkim/* Strings used to decode resource descriptors */ 113100966Siwasaki 114167802Sjkimconst char *AcpiGbl_WordDecode[] = 115100966Siwasaki{ 116151937Sjkim "Memory", 117151937Sjkim "IO", 118151937Sjkim "BusNumber", 119167802Sjkim "UnknownResourceType" 120100966Siwasaki}; 121100966Siwasaki 122167802Sjkimconst char *AcpiGbl_IrqDecode[] = 123100966Siwasaki{ 124100966Siwasaki "IRQNoFlags", 125100966Siwasaki "IRQ" 126100966Siwasaki}; 127100966Siwasaki 128100966Siwasaki 129100966Siwasaki/******************************************************************************* 130100966Siwasaki * 131107325Siwasaki * FUNCTION: AcpiDmDecodeAttribute 132107325Siwasaki * 133107325Siwasaki * PARAMETERS: Attribute - Attribute field of AccessAs keyword 134107325Siwasaki * 135107325Siwasaki * RETURN: None 136107325Siwasaki * 137228110Sjkim * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus and 138228110Sjkim * GenericSerialBus stuff.) 139107325Siwasaki * 140107325Siwasaki ******************************************************************************/ 141107325Siwasaki 142107325Siwasakivoid 143107325SiwasakiAcpiDmDecodeAttribute ( 144107325Siwasaki UINT8 Attribute) 145107325Siwasaki{ 146107325Siwasaki 147107325Siwasaki switch (Attribute) 148107325Siwasaki { 149228110Sjkim case AML_FIELD_ATTRIB_QUICK: 150107325Siwasaki 151228110Sjkim AcpiOsPrintf ("AttribQuick"); 152107325Siwasaki break; 153107325Siwasaki 154228110Sjkim case AML_FIELD_ATTRIB_SEND_RCV: 155107325Siwasaki 156228110Sjkim AcpiOsPrintf ("AttribSendReceive"); 157107325Siwasaki break; 158107325Siwasaki 159228110Sjkim case AML_FIELD_ATTRIB_BYTE: 160107325Siwasaki 161228110Sjkim AcpiOsPrintf ("AttribByte"); 162107325Siwasaki break; 163107325Siwasaki 164228110Sjkim case AML_FIELD_ATTRIB_WORD: 165107325Siwasaki 166228110Sjkim AcpiOsPrintf ("AttribWord"); 167107325Siwasaki break; 168107325Siwasaki 169228110Sjkim case AML_FIELD_ATTRIB_BLOCK: 170107325Siwasaki 171228110Sjkim AcpiOsPrintf ("AttribBlock"); 172107325Siwasaki break; 173107325Siwasaki 174228110Sjkim case AML_FIELD_ATTRIB_MULTIBYTE: 175107325Siwasaki 176228110Sjkim AcpiOsPrintf ("AttribBytes"); 177107325Siwasaki break; 178107325Siwasaki 179228110Sjkim case AML_FIELD_ATTRIB_WORD_CALL: 180107325Siwasaki 181228110Sjkim AcpiOsPrintf ("AttribProcessCall"); 182107325Siwasaki break; 183107325Siwasaki 184228110Sjkim case AML_FIELD_ATTRIB_BLOCK_CALL: 185228110Sjkim 186228110Sjkim AcpiOsPrintf ("AttribBlockProcessCall"); 187228110Sjkim break; 188228110Sjkim 189228110Sjkim case AML_FIELD_ATTRIB_RAW_BYTES: 190228110Sjkim 191228110Sjkim AcpiOsPrintf ("AttribRawBytes"); 192228110Sjkim break; 193228110Sjkim 194228110Sjkim case AML_FIELD_ATTRIB_RAW_PROCESS: 195228110Sjkim 196228110Sjkim AcpiOsPrintf ("AttribRawProcessBytes"); 197228110Sjkim break; 198228110Sjkim 199107325Siwasaki default: 200107325Siwasaki 201228110Sjkim /* A ByteConst is allowed by the grammar */ 202228110Sjkim 203228110Sjkim AcpiOsPrintf ("0x%2.2X", Attribute); 204107325Siwasaki break; 205107325Siwasaki } 206107325Siwasaki} 207107325Siwasaki 208107325Siwasaki 209107325Siwasaki/******************************************************************************* 210107325Siwasaki * 211100966Siwasaki * FUNCTION: AcpiDmIndent 212100966Siwasaki * 213100966Siwasaki * PARAMETERS: Level - Current source code indentation level 214100966Siwasaki * 215100966Siwasaki * RETURN: None 216100966Siwasaki * 217100966Siwasaki * DESCRIPTION: Indent 4 spaces per indentation level. 218100966Siwasaki * 219100966Siwasaki ******************************************************************************/ 220100966Siwasaki 221100966Siwasakivoid 222100966SiwasakiAcpiDmIndent ( 223100966Siwasaki UINT32 Level) 224100966Siwasaki{ 225100966Siwasaki 226100966Siwasaki if (!Level) 227100966Siwasaki { 228100966Siwasaki return; 229100966Siwasaki } 230100966Siwasaki 231100966Siwasaki AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " "); 232100966Siwasaki} 233100966Siwasaki 234100966Siwasaki 235100966Siwasaki/******************************************************************************* 236100966Siwasaki * 237100966Siwasaki * FUNCTION: AcpiDmCommaIfListMember 238100966Siwasaki * 239100966Siwasaki * PARAMETERS: Op - Current operator/operand 240100966Siwasaki * 241100966Siwasaki * RETURN: TRUE if a comma was inserted 242100966Siwasaki * 243100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of an argument list. 244100966Siwasaki * 245100966Siwasaki ******************************************************************************/ 246100966Siwasaki 247100966SiwasakiBOOLEAN 248100966SiwasakiAcpiDmCommaIfListMember ( 249100966Siwasaki ACPI_PARSE_OBJECT *Op) 250100966Siwasaki{ 251100966Siwasaki 252100966Siwasaki if (!Op->Common.Next) 253100966Siwasaki { 254241973Sjkim return (FALSE); 255100966Siwasaki } 256100966Siwasaki 257100966Siwasaki if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST) 258100966Siwasaki { 259281075Sdim /* Exit if Target has been marked IGNORE */ 260281075Sdim 261281075Sdim if (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) 262281075Sdim { 263281075Sdim return (FALSE); 264281075Sdim } 265281075Sdim 266100966Siwasaki /* Check for a NULL target operand */ 267100966Siwasaki 268100966Siwasaki if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 269100966Siwasaki (!Op->Common.Next->Common.Value.String)) 270100966Siwasaki { 271100966Siwasaki /* 272100966Siwasaki * To handle the Divide() case where there are two optional 273241973Sjkim * targets, look ahead one more op. If null, this null target 274241973Sjkim * is the one and only target -- no comma needed. Otherwise, 275100966Siwasaki * we need a comma to prepare for the next target. 276100966Siwasaki */ 277100966Siwasaki if (!Op->Common.Next->Common.Next) 278100966Siwasaki { 279241973Sjkim return (FALSE); 280100966Siwasaki } 281100966Siwasaki } 282100966Siwasaki 283100966Siwasaki if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) && 284100966Siwasaki (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))) 285100966Siwasaki { 286241973Sjkim return (FALSE); 287100966Siwasaki } 288100966Siwasaki 289281075Sdim /* Emit comma only if this is not a C-style operator */ 290281075Sdim 291281075Sdim if (!Op->Common.OperatorSymbol) 292281075Sdim { 293281075Sdim AcpiOsPrintf (", "); 294281075Sdim } 295281075Sdim 296100966Siwasaki return (TRUE); 297100966Siwasaki } 298100966Siwasaki 299100966Siwasaki else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) && 300100966Siwasaki (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) 301100966Siwasaki { 302100966Siwasaki AcpiOsPrintf (", "); 303100966Siwasaki return (TRUE); 304100966Siwasaki } 305100966Siwasaki 306100966Siwasaki return (FALSE); 307100966Siwasaki} 308100966Siwasaki 309100966Siwasaki 310100966Siwasaki/******************************************************************************* 311100966Siwasaki * 312100966Siwasaki * FUNCTION: AcpiDmCommaIfFieldMember 313100966Siwasaki * 314100966Siwasaki * PARAMETERS: Op - Current operator/operand 315100966Siwasaki * 316100966Siwasaki * RETURN: None 317100966Siwasaki * 318100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list. 319100966Siwasaki * 320100966Siwasaki ******************************************************************************/ 321100966Siwasaki 322100966Siwasakivoid 323100966SiwasakiAcpiDmCommaIfFieldMember ( 324100966Siwasaki ACPI_PARSE_OBJECT *Op) 325100966Siwasaki{ 326100966Siwasaki 327100966Siwasaki if (Op->Common.Next) 328100966Siwasaki { 329100966Siwasaki AcpiOsPrintf (", "); 330100966Siwasaki } 331100966Siwasaki} 332100966Siwasaki 333100966Siwasaki#endif 334