1 /******************************************************************************
   2  *
   3  * Module Name: psopinfo - AML opcode information functions and dispatch tables
   4  *
   5  *****************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2013, Intel Corp.
   9  * All rights reserved.
  10  *
  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 
  45 #include "acpi.h"
  46 #include "accommon.h"
  47 #include "acparser.h"
  48 #include "acopcode.h"
  49 #include "amlcode.h"
  50 
  51 
  52 #define _COMPONENT          ACPI_PARSER
  53         ACPI_MODULE_NAME    ("psopinfo")
  54 
  55 
  56 extern const UINT8      AcpiGbl_ShortOpIndex[];
  57 extern const UINT8      AcpiGbl_LongOpIndex[];
  58 
  59 static const UINT8      AcpiGbl_ArgumentCount[] = {0,1,1,1,1,2,2,2,2,3,3,6};
  60 
  61 
  62 /*******************************************************************************
  63  *
  64  * FUNCTION:    AcpiPsGetOpcodeInfo
  65  *
  66  * PARAMETERS:  Opcode              - The AML opcode
  67  *
  68  * RETURN:      A pointer to the info about the opcode.
  69  *
  70  * DESCRIPTION: Find AML opcode description based on the opcode.
  71  *              NOTE: This procedure must ALWAYS return a valid pointer!
  72  *
  73  ******************************************************************************/
  74 
  75 const ACPI_OPCODE_INFO *
  76 AcpiPsGetOpcodeInfo (
  77     UINT16                  Opcode)
  78 {
  79 #ifdef ACPI_DEBUG_OUTPUT
  80     const char              *OpcodeName = "Unknown AML opcode";
  81 #endif
  82 
  83     ACPI_FUNCTION_NAME (PsGetOpcodeInfo);
  84 
  85 
  86     /*
  87      * Detect normal 8-bit opcode or extended 16-bit opcode
  88      */
  89     if (!(Opcode & 0xFF00))
  90     {
  91         /* Simple (8-bit) opcode: 0-255, can't index beyond table  */
  92 
  93         return (&AcpiGbl_AmlOpInfo [AcpiGbl_ShortOpIndex [(UINT8) Opcode]]);
  94     }
  95 
  96     if (((Opcode & 0xFF00) == AML_EXTENDED_OPCODE) &&
  97         (((UINT8) Opcode) <= MAX_EXTENDED_OPCODE))
  98     {
  99         /* Valid extended (16-bit) opcode */
 100 
 101         return (&AcpiGbl_AmlOpInfo [AcpiGbl_LongOpIndex [(UINT8) Opcode]]);
 102     }
 103 
 104 #if defined ACPI_ASL_COMPILER && defined ACPI_DEBUG_OUTPUT
 105 #include "asldefine.h"
 106 
 107     switch (Opcode)
 108     {
 109     case AML_RAW_DATA_BYTE:
 110         OpcodeName = "-Raw Data Byte-";
 111         break;
 112 
 113     case AML_RAW_DATA_WORD:
 114         OpcodeName = "-Raw Data Word-";
 115         break;
 116 
 117     case AML_RAW_DATA_DWORD:
 118         OpcodeName = "-Raw Data Dword-";
 119         break;
 120 
 121     case AML_RAW_DATA_QWORD:
 122         OpcodeName = "-Raw Data Qword-";
 123         break;
 124 
 125     case AML_RAW_DATA_BUFFER:
 126         OpcodeName = "-Raw Data Buffer-";
 127         break;
 128 
 129     case AML_RAW_DATA_CHAIN:
 130         OpcodeName = "-Raw Data Buffer Chain-";
 131         break;
 132 
 133     case AML_PACKAGE_LENGTH:
 134         OpcodeName = "-Package Length-";
 135         break;
 136 
 137     case AML_UNASSIGNED_OPCODE:
 138         OpcodeName = "-Unassigned Opcode-";
 139         break;
 140 
 141     case AML_DEFAULT_ARG_OP:
 142         OpcodeName = "-Default Arg-";
 143         break;
 144 
 145     default:
 146         break;
 147     }
 148 #endif
 149 
 150     /* Unknown AML opcode */
 151 
 152     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
 153         "%s [%4.4X]\n", OpcodeName, Opcode));
 154 
 155     return (&AcpiGbl_AmlOpInfo [_UNK]);
 156 }
 157 
 158 
 159 /*******************************************************************************
 160  *
 161  * FUNCTION:    AcpiPsGetOpcodeName
 162  *
 163  * PARAMETERS:  Opcode              - The AML opcode
 164  *
 165  * RETURN:      A pointer to the name of the opcode (ASCII String)
 166  *              Note: Never returns NULL.
 167  *
 168  * DESCRIPTION: Translate an opcode into a human-readable string
 169  *
 170  ******************************************************************************/
 171 
 172 char *
 173 AcpiPsGetOpcodeName (
 174     UINT16                  Opcode)
 175 {
 176 #if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT)
 177 
 178     const ACPI_OPCODE_INFO  *Op;
 179 
 180 
 181     Op = AcpiPsGetOpcodeInfo (Opcode);
 182 
 183     /* Always guaranteed to return a valid pointer */
 184 
 185     return (Op->Name);
 186 
 187 #else
 188     return ("OpcodeName unavailable");
 189 
 190 #endif
 191 }
 192 
 193 
 194 /*******************************************************************************
 195  *
 196  * FUNCTION:    AcpiPsGetArgumentCount
 197  *
 198  * PARAMETERS:  OpType              - Type associated with the AML opcode
 199  *
 200  * RETURN:      Argument count
 201  *
 202  * DESCRIPTION: Obtain the number of expected arguments for an AML opcode
 203  *
 204  ******************************************************************************/
 205 
 206 UINT8
 207 AcpiPsGetArgumentCount (
 208     UINT32                  OpType)
 209 {
 210 
 211     if (OpType <= AML_TYPE_EXEC_6A_0T_1R)
 212     {
 213         return (AcpiGbl_ArgumentCount[OpType]);
 214     }
 215 
 216     return (0);
 217 }
 218 
 219 
 220 /*
 221  * This table is directly indexed by the opcodes It returns
 222  * an index into the opcode table (AcpiGbl_AmlOpInfo)
 223  */
 224 const UINT8 AcpiGbl_ShortOpIndex[256] =
 225 {
 226 /*              0     1     2     3     4     5     6     7  */
 227 /*              8     9     A     B     C     D     E     F  */
 228 /* 0x00 */    0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK,
 229 /* 0x08 */    0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK,
 230 /* 0x10 */    0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK,
 231 /* 0x18 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 232 /* 0x20 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 233 /* 0x28 */    _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX,
 234 /* 0x30 */    0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, 0x7D,
 235 /* 0x38 */    0x7F, 0x80, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 236 /* 0x40 */    _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
 237 /* 0x48 */    _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
 238 /* 0x50 */    _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
 239 /* 0x58 */    _ASC, _ASC, _ASC, _UNK, _PFX, _UNK, _PFX, _ASC,
 240 /* 0x60 */    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
 241 /* 0x68 */    0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, _UNK,
 242 /* 0x70 */    0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22,
 243 /* 0x78 */    0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
 244 /* 0x80 */    0x2b, 0x2c, 0x2d, 0x2e, 0x70, 0x71, 0x2f, 0x30,
 245 /* 0x88 */    0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x72,
 246 /* 0x90 */    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x73, 0x74,
 247 /* 0x98 */    0x75, 0x76, _UNK, _UNK, 0x77, 0x78, 0x79, 0x7A,
 248 /* 0xA0 */    0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x60, 0x61,
 249 /* 0xA8 */    0x62, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 250 /* 0xB0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 251 /* 0xB8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 252 /* 0xC0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 253 /* 0xC8 */    _UNK, _UNK, _UNK, _UNK, 0x44, _UNK, _UNK, _UNK,
 254 /* 0xD0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 255 /* 0xD8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 256 /* 0xE0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 257 /* 0xE8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 258 /* 0xF0 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 259 /* 0xF8 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45,
 260 };
 261 
 262 /*
 263  * This table is indexed by the second opcode of the extended opcode
 264  * pair. It returns an index into the opcode table (AcpiGbl_AmlOpInfo)
 265  */
 266 const UINT8 AcpiGbl_LongOpIndex[NUM_EXTENDED_OPCODE] =
 267 {
 268 /*              0     1     2     3     4     5     6     7  */
 269 /*              8     9     A     B     C     D     E     F  */
 270 /* 0x00 */    _UNK, 0x46, 0x47, _UNK, _UNK, _UNK, _UNK, _UNK,
 271 /* 0x08 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 272 /* 0x10 */    _UNK, _UNK, 0x48, 0x49, _UNK, _UNK, _UNK, _UNK,
 273 /* 0x18 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B,
 274 /* 0x20 */    0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
 275 /* 0x28 */    0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK,
 276 /* 0x30 */    0x55, 0x56, 0x57, 0x7e, _UNK, _UNK, _UNK, _UNK,
 277 /* 0x38 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 278 /* 0x40 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 279 /* 0x48 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 280 /* 0x50 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 281 /* 0x58 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 282 /* 0x60 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 283 /* 0x68 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 284 /* 0x70 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 285 /* 0x78 */    _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
 286 /* 0x80 */    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
 287 /* 0x88 */    0x7C,
 288 };