dmutils.c revision 281075
1247720Sjilles/******************************************************************************* 2247720Sjilles * 3247720Sjilles * Module Name: dmutils - AML disassembler utilities 4247720Sjilles * 5247720Sjilles ******************************************************************************/ 6247720Sjilles 7247720Sjilles/* 8247720Sjilles * Copyright (C) 2000 - 2015, Intel Corp. 9247720Sjilles * All rights reserved. 10247720Sjilles * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44#include <contrib/dev/acpica/include/acpi.h> 45#include <contrib/dev/acpica/include/accommon.h> 46#include <contrib/dev/acpica/include/amlcode.h> 47#include <contrib/dev/acpica/include/acdisasm.h> 48 49#ifdef ACPI_ASL_COMPILER 50#include <contrib/dev/acpica/include/acnamesp.h> 51#endif 52 53#ifdef ACPI_DISASSEMBLER 54 55#define _COMPONENT ACPI_CA_DEBUGGER 56 ACPI_MODULE_NAME ("dmutils") 57 58 59/* Data used in keeping track of fields */ 60#if 0 61const char *AcpiGbl_FENames[] = 62{ 63 "skip", 64 "?access?" 65}; /* FE = Field Element */ 66#endif 67 68/* Operators for Match() */ 69 70const char *AcpiGbl_MatchOps[] = 71{ 72 "MTR", 73 "MEQ", 74 "MLE", 75 "MLT", 76 "MGE", 77 "MGT" 78}; 79 80/* Access type decoding */ 81 82const char *AcpiGbl_AccessTypes[] = 83{ 84 "AnyAcc", 85 "ByteAcc", 86 "WordAcc", 87 "DWordAcc", 88 "QWordAcc", 89 "BufferAcc", 90 "InvalidAccType", 91 "InvalidAccType" 92}; 93 94/* Lock rule decoding */ 95 96const char *AcpiGbl_LockRule[] = 97{ 98 "NoLock", 99 "Lock" 100}; 101 102/* Update rule decoding */ 103 104const char *AcpiGbl_UpdateRules[] = 105{ 106 "Preserve", 107 "WriteAsOnes", 108 "WriteAsZeros", 109 "InvalidUpdateRule" 110}; 111 112/* Strings used to decode resource descriptors */ 113 114const char *AcpiGbl_WordDecode[] = 115{ 116 "Memory", 117 "IO", 118 "BusNumber", 119 "UnknownResourceType" 120}; 121 122const char *AcpiGbl_IrqDecode[] = 123{ 124 "IRQNoFlags", 125 "IRQ" 126}; 127 128 129/******************************************************************************* 130 * 131 * FUNCTION: AcpiDmDecodeAttribute 132 * 133 * PARAMETERS: Attribute - Attribute field of AccessAs keyword 134 * 135 * RETURN: None 136 * 137 * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus and 138 * GenericSerialBus stuff.) 139 * 140 ******************************************************************************/ 141 142void 143AcpiDmDecodeAttribute ( 144 UINT8 Attribute) 145{ 146 147 switch (Attribute) 148 { 149 case AML_FIELD_ATTRIB_QUICK: 150 151 AcpiOsPrintf ("AttribQuick"); 152 break; 153 154 case AML_FIELD_ATTRIB_SEND_RCV: 155 156 AcpiOsPrintf ("AttribSendReceive"); 157 break; 158 159 case AML_FIELD_ATTRIB_BYTE: 160 161 AcpiOsPrintf ("AttribByte"); 162 break; 163 164 case AML_FIELD_ATTRIB_WORD: 165 166 AcpiOsPrintf ("AttribWord"); 167 break; 168 169 case AML_FIELD_ATTRIB_BLOCK: 170 171 AcpiOsPrintf ("AttribBlock"); 172 break; 173 174 case AML_FIELD_ATTRIB_MULTIBYTE: 175 176 AcpiOsPrintf ("AttribBytes"); 177 break; 178 179 case AML_FIELD_ATTRIB_WORD_CALL: 180 181 AcpiOsPrintf ("AttribProcessCall"); 182 break; 183 184 case AML_FIELD_ATTRIB_BLOCK_CALL: 185 186 AcpiOsPrintf ("AttribBlockProcessCall"); 187 break; 188 189 case AML_FIELD_ATTRIB_RAW_BYTES: 190 191 AcpiOsPrintf ("AttribRawBytes"); 192 break; 193 194 case AML_FIELD_ATTRIB_RAW_PROCESS: 195 196 AcpiOsPrintf ("AttribRawProcessBytes"); 197 break; 198 199 default: 200 201 /* A ByteConst is allowed by the grammar */ 202 203 AcpiOsPrintf ("0x%2.2X", Attribute); 204 break; 205 } 206} 207 208 209/******************************************************************************* 210 * 211 * FUNCTION: AcpiDmIndent 212 * 213 * PARAMETERS: Level - Current source code indentation level 214 * 215 * RETURN: None 216 * 217 * DESCRIPTION: Indent 4 spaces per indentation level. 218 * 219 ******************************************************************************/ 220 221void 222AcpiDmIndent ( 223 UINT32 Level) 224{ 225 226 if (!Level) 227 { 228 return; 229 } 230 231 AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " "); 232} 233 234 235/******************************************************************************* 236 * 237 * FUNCTION: AcpiDmCommaIfListMember 238 * 239 * PARAMETERS: Op - Current operator/operand 240 * 241 * RETURN: TRUE if a comma was inserted 242 * 243 * DESCRIPTION: Insert a comma if this Op is a member of an argument list. 244 * 245 ******************************************************************************/ 246 247BOOLEAN 248AcpiDmCommaIfListMember ( 249 ACPI_PARSE_OBJECT *Op) 250{ 251 252 if (!Op->Common.Next) 253 { 254 return (FALSE); 255 } 256 257 if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST) 258 { 259 /* Exit if Target has been marked IGNORE */ 260 261 if (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) 262 { 263 return (FALSE); 264 } 265 266 /* Check for a NULL target operand */ 267 268 if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && 269 (!Op->Common.Next->Common.Value.String)) 270 { 271 /* 272 * To handle the Divide() case where there are two optional 273 * targets, look ahead one more op. If null, this null target 274 * is the one and only target -- no comma needed. Otherwise, 275 * we need a comma to prepare for the next target. 276 */ 277 if (!Op->Common.Next->Common.Next) 278 { 279 return (FALSE); 280 } 281 } 282 283 if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) && 284 (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))) 285 { 286 return (FALSE); 287 } 288 289 /* Emit comma only if this is not a C-style operator */ 290 291 if (!Op->Common.OperatorSymbol) 292 { 293 AcpiOsPrintf (", "); 294 } 295 296 return (TRUE); 297 } 298 299 else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) && 300 (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) 301 { 302 AcpiOsPrintf (", "); 303 return (TRUE); 304 } 305 306 return (FALSE); 307} 308 309 310/******************************************************************************* 311 * 312 * FUNCTION: AcpiDmCommaIfFieldMember 313 * 314 * PARAMETERS: Op - Current operator/operand 315 * 316 * RETURN: None 317 * 318 * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list. 319 * 320 ******************************************************************************/ 321 322void 323AcpiDmCommaIfFieldMember ( 324 ACPI_PARSE_OBJECT *Op) 325{ 326 327 if (Op->Common.Next) 328 { 329 AcpiOsPrintf (", "); 330 } 331} 332 333#endif 334