Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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