1100966Siwasaki/******************************************************************************* 2100966Siwasaki * 3100966Siwasaki * Module Name: dmutils - AML disassembler utilities 4100966Siwasaki * 5100966Siwasaki ******************************************************************************/ 6100966Siwasaki 7217365Sjkim/* 8217365Sjkim * Copyright (C) 2000 - 2011, 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 44100966Siwasaki 45193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 46193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 47193341Sjkim#include <contrib/dev/acpica/include/amlcode.h> 48193341Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 49151937Sjkim 50151937Sjkim#ifdef ACPI_ASL_COMPILER 51193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 52151937Sjkim#endif 53100966Siwasaki 54100966Siwasaki#ifdef ACPI_DISASSEMBLER 55100966Siwasaki 56102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 57100966Siwasaki ACPI_MODULE_NAME ("dmutils") 58100966Siwasaki 59100966Siwasaki 60100966Siwasaki/* Data used in keeping track of fields */ 61100966Siwasaki#if 0 62167802Sjkimconst char *AcpiGbl_FENames[] = 63100966Siwasaki{ 64100966Siwasaki "skip", 65100966Siwasaki "?access?" 66100966Siwasaki}; /* FE = Field Element */ 67100966Siwasaki#endif 68100966Siwasaki 69167802Sjkim/* Operators for Match() */ 70100966Siwasaki 71167802Sjkimconst char *AcpiGbl_MatchOps[] = 72100966Siwasaki{ 73100966Siwasaki "MTR", 74100966Siwasaki "MEQ", 75100966Siwasaki "MLE", 76100966Siwasaki "MLT", 77100966Siwasaki "MGE", 78100966Siwasaki "MGT" 79100966Siwasaki}; 80100966Siwasaki 81100966Siwasaki/* Access type decoding */ 82100966Siwasaki 83167802Sjkimconst char *AcpiGbl_AccessTypes[] = 84100966Siwasaki{ 85100966Siwasaki "AnyAcc", 86100966Siwasaki "ByteAcc", 87100966Siwasaki "WordAcc", 88100966Siwasaki "DWordAcc", 89100966Siwasaki "QWordAcc", 90100966Siwasaki "BufferAcc", 91167802Sjkim "InvalidAccType", 92167802Sjkim "InvalidAccType" 93100966Siwasaki}; 94100966Siwasaki 95100966Siwasaki/* Lock rule decoding */ 96100966Siwasaki 97167802Sjkimconst char *AcpiGbl_LockRule[] = 98100966Siwasaki{ 99100966Siwasaki "NoLock", 100100966Siwasaki "Lock" 101100966Siwasaki}; 102100966Siwasaki 103100966Siwasaki/* Update rule decoding */ 104100966Siwasaki 105167802Sjkimconst char *AcpiGbl_UpdateRules[] = 106100966Siwasaki{ 107100966Siwasaki "Preserve", 108100966Siwasaki "WriteAsOnes", 109167802Sjkim "WriteAsZeros", 110167802Sjkim "InvalidUpdateRule" 111100966Siwasaki}; 112100966Siwasaki 113167802Sjkim/* Strings used to decode resource descriptors */ 114100966Siwasaki 115167802Sjkimconst char *AcpiGbl_WordDecode[] = 116100966Siwasaki{ 117151937Sjkim "Memory", 118151937Sjkim "IO", 119151937Sjkim "BusNumber", 120167802Sjkim "UnknownResourceType" 121100966Siwasaki}; 122100966Siwasaki 123167802Sjkimconst char *AcpiGbl_IrqDecode[] = 124100966Siwasaki{ 125100966Siwasaki "IRQNoFlags", 126100966Siwasaki "IRQ" 127100966Siwasaki}; 128100966Siwasaki 129100966Siwasaki 130100966Siwasaki/******************************************************************************* 131100966Siwasaki * 132107325Siwasaki * FUNCTION: AcpiDmDecodeAttribute 133107325Siwasaki * 134107325Siwasaki * PARAMETERS: Attribute - Attribute field of AccessAs keyword 135107325Siwasaki * 136107325Siwasaki * RETURN: None 137107325Siwasaki * 138107325Siwasaki * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus stuff) 139107325Siwasaki * 140107325Siwasaki ******************************************************************************/ 141107325Siwasaki 142107325Siwasakivoid 143107325SiwasakiAcpiDmDecodeAttribute ( 144107325Siwasaki UINT8 Attribute) 145107325Siwasaki{ 146107325Siwasaki 147107325Siwasaki switch (Attribute) 148107325Siwasaki { 149107325Siwasaki case AML_FIELD_ATTRIB_SMB_QUICK: 150107325Siwasaki 151107325Siwasaki AcpiOsPrintf ("SMBQuick"); 152107325Siwasaki break; 153107325Siwasaki 154107325Siwasaki case AML_FIELD_ATTRIB_SMB_SEND_RCV: 155107325Siwasaki 156107325Siwasaki AcpiOsPrintf ("SMBSendReceive"); 157107325Siwasaki break; 158107325Siwasaki 159107325Siwasaki case AML_FIELD_ATTRIB_SMB_BYTE: 160107325Siwasaki 161107325Siwasaki AcpiOsPrintf ("SMBByte"); 162107325Siwasaki break; 163107325Siwasaki 164107325Siwasaki case AML_FIELD_ATTRIB_SMB_WORD: 165107325Siwasaki 166107325Siwasaki AcpiOsPrintf ("SMBWord"); 167107325Siwasaki break; 168107325Siwasaki 169107325Siwasaki case AML_FIELD_ATTRIB_SMB_WORD_CALL: 170107325Siwasaki 171107325Siwasaki AcpiOsPrintf ("SMBProcessCall"); 172107325Siwasaki break; 173107325Siwasaki 174107325Siwasaki case AML_FIELD_ATTRIB_SMB_BLOCK: 175107325Siwasaki 176107325Siwasaki AcpiOsPrintf ("SMBBlock"); 177107325Siwasaki break; 178107325Siwasaki 179107325Siwasaki case AML_FIELD_ATTRIB_SMB_BLOCK_CALL: 180107325Siwasaki 181107325Siwasaki AcpiOsPrintf ("SMBBlockProcessCall"); 182107325Siwasaki break; 183107325Siwasaki 184107325Siwasaki default: 185107325Siwasaki 186107325Siwasaki AcpiOsPrintf ("0x%.2X", Attribute); 187107325Siwasaki break; 188107325Siwasaki } 189107325Siwasaki} 190107325Siwasaki 191107325Siwasaki 192107325Siwasaki/******************************************************************************* 193107325Siwasaki * 194100966Siwasaki * FUNCTION: AcpiDmIndent 195100966Siwasaki * 196100966Siwasaki * PARAMETERS: Level - Current source code indentation level 197100966Siwasaki * 198100966Siwasaki * RETURN: None 199100966Siwasaki * 200100966Siwasaki * DESCRIPTION: Indent 4 spaces per indentation level. 201100966Siwasaki * 202100966Siwasaki ******************************************************************************/ 203100966Siwasaki 204100966Siwasakivoid 205100966SiwasakiAcpiDmIndent ( 206100966Siwasaki UINT32 Level) 207100966Siwasaki{ 208100966Siwasaki 209100966Siwasaki if (!Level) 210100966Siwasaki { 211100966Siwasaki return; 212100966Siwasaki } 213100966Siwasaki 214100966Siwasaki AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " "); 215100966Siwasaki} 216100966Siwasaki 217100966Siwasaki 218100966Siwasaki/******************************************************************************* 219100966Siwasaki * 220100966Siwasaki * FUNCTION: AcpiDmCommaIfListMember 221100966Siwasaki * 222100966Siwasaki * PARAMETERS: Op - Current operator/operand 223100966Siwasaki * 224100966Siwasaki * RETURN: TRUE if a comma was inserted 225100966Siwasaki * 226100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of an argument list. 227100966Siwasaki * 228100966Siwasaki ******************************************************************************/ 229100966Siwasaki 230100966SiwasakiBOOLEAN 231100966SiwasakiAcpiDmCommaIfListMember ( 232100966Siwasaki ACPI_PARSE_OBJECT *Op) 233100966Siwasaki{ 234100966Siwasaki 235100966Siwasaki if (!Op->Common.Next) 236100966Siwasaki { 237100966Siwasaki return FALSE; 238100966Siwasaki } 239100966Siwasaki 240100966Siwasaki if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST) 241100966Siwasaki { 242100966Siwasaki /* Check for a NULL target operand */ 243100966Siwasaki 244100966Siwasaki if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 245100966Siwasaki (!Op->Common.Next->Common.Value.String)) 246100966Siwasaki { 247100966Siwasaki /* 248100966Siwasaki * To handle the Divide() case where there are two optional 249100966Siwasaki * targets, look ahead one more op. If null, this null target 250100966Siwasaki * is the one and only target -- no comma needed. Otherwise, 251100966Siwasaki * we need a comma to prepare for the next target. 252100966Siwasaki */ 253100966Siwasaki if (!Op->Common.Next->Common.Next) 254100966Siwasaki { 255100966Siwasaki return FALSE; 256100966Siwasaki } 257100966Siwasaki } 258100966Siwasaki 259100966Siwasaki if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) && 260100966Siwasaki (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))) 261100966Siwasaki { 262100966Siwasaki return FALSE; 263100966Siwasaki } 264100966Siwasaki 265100966Siwasaki AcpiOsPrintf (", "); 266100966Siwasaki return (TRUE); 267100966Siwasaki } 268100966Siwasaki 269100966Siwasaki else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) && 270100966Siwasaki (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) 271100966Siwasaki { 272100966Siwasaki AcpiOsPrintf (", "); 273100966Siwasaki return (TRUE); 274100966Siwasaki } 275100966Siwasaki 276100966Siwasaki return (FALSE); 277100966Siwasaki} 278100966Siwasaki 279100966Siwasaki 280100966Siwasaki/******************************************************************************* 281100966Siwasaki * 282100966Siwasaki * FUNCTION: AcpiDmCommaIfFieldMember 283100966Siwasaki * 284100966Siwasaki * PARAMETERS: Op - Current operator/operand 285100966Siwasaki * 286100966Siwasaki * RETURN: None 287100966Siwasaki * 288100966Siwasaki * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list. 289100966Siwasaki * 290100966Siwasaki ******************************************************************************/ 291100966Siwasaki 292100966Siwasakivoid 293100966SiwasakiAcpiDmCommaIfFieldMember ( 294100966Siwasaki ACPI_PARSE_OBJECT *Op) 295100966Siwasaki{ 296100966Siwasaki 297100966Siwasaki if (Op->Common.Next) 298100966Siwasaki { 299100966Siwasaki AcpiOsPrintf (", "); 300100966Siwasaki } 301100966Siwasaki} 302100966Siwasaki 303100966Siwasaki#endif 304