Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: psutils - Parser miscellaneous utilities (Parser only)
  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 "amlcode.h"
  48.  
  49. #define _COMPONENT          ACPI_PARSER
  50. ACPI_MODULE_NAME("psutils")
  51.  
  52. /*******************************************************************************
  53.  *
  54.  * FUNCTION:    acpi_ps_create_scope_op
  55.  *
  56.  * PARAMETERS:  None
  57.  *
  58.  * RETURN:      A new Scope object, null on failure
  59.  *
  60.  * DESCRIPTION: Create a Scope and associated namepath op with the root name
  61.  *
  62.  ******************************************************************************/
  63. union acpi_parse_object *acpi_ps_create_scope_op(u8 *aml)
  64. {
  65.         union acpi_parse_object *scope_op;
  66.  
  67.         scope_op = acpi_ps_alloc_op(AML_SCOPE_OP, aml);
  68.         if (!scope_op) {
  69.                 return (NULL);
  70.         }
  71.  
  72.         scope_op->named.name = ACPI_ROOT_NAME;
  73.         return (scope_op);
  74. }
  75.  
  76. /*******************************************************************************
  77.  *
  78.  * FUNCTION:    acpi_ps_init_op
  79.  *
  80.  * PARAMETERS:  op              - A newly allocated Op object
  81.  *              opcode          - Opcode to store in the Op
  82.  *
  83.  * RETURN:      None
  84.  *
  85.  * DESCRIPTION: Initialize a parse (Op) object
  86.  *
  87.  ******************************************************************************/
  88.  
  89. void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode)
  90. {
  91.         ACPI_FUNCTION_ENTRY();
  92.  
  93.         op->common.descriptor_type = ACPI_DESC_TYPE_PARSER;
  94.         op->common.aml_opcode = opcode;
  95.  
  96.         ACPI_DISASM_ONLY_MEMBERS(strncpy(op->common.aml_op_name,
  97.                                          (acpi_ps_get_opcode_info(opcode))->
  98.                                          name, sizeof(op->common.aml_op_name)));
  99. }
  100.  
  101. /*******************************************************************************
  102.  *
  103.  * FUNCTION:    acpi_ps_alloc_op
  104.  *
  105.  * PARAMETERS:  opcode          - Opcode that will be stored in the new Op
  106.  *              aml             - Address of the opcode
  107.  *
  108.  * RETURN:      Pointer to the new Op, null on failure
  109.  *
  110.  * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
  111.  *              opcode. A cache of opcodes is available for the pure
  112.  *              GENERIC_OP, since this is by far the most commonly used.
  113.  *
  114.  ******************************************************************************/
  115.  
  116. union acpi_parse_object *acpi_ps_alloc_op(u16 opcode, u8 *aml)
  117. {
  118.         union acpi_parse_object *op;
  119.         const struct acpi_opcode_info *op_info;
  120.         u8 flags = ACPI_PARSEOP_GENERIC;
  121.  
  122.         ACPI_FUNCTION_ENTRY();
  123.  
  124.         op_info = acpi_ps_get_opcode_info(opcode);
  125.  
  126.         /* Determine type of parse_op required */
  127.  
  128.         if (op_info->flags & AML_DEFER) {
  129.                 flags = ACPI_PARSEOP_DEFERRED;
  130.         } else if (op_info->flags & AML_NAMED) {
  131.                 flags = ACPI_PARSEOP_NAMED;
  132.         } else if (opcode == AML_INT_BYTELIST_OP) {
  133.                 flags = ACPI_PARSEOP_BYTELIST;
  134.         }
  135.  
  136.         /* Allocate the minimum required size object */
  137.  
  138.         if (flags == ACPI_PARSEOP_GENERIC) {
  139.  
  140.                 /* The generic op (default) is by far the most common (16 to 1) */
  141.  
  142.                 op = acpi_os_acquire_object(acpi_gbl_ps_node_cache);
  143.         } else {
  144.                 /* Extended parseop */
  145.  
  146.                 op = acpi_os_acquire_object(acpi_gbl_ps_node_ext_cache);
  147.         }
  148.  
  149.         /* Initialize the Op */
  150.  
  151.         if (op) {
  152.                 acpi_ps_init_op(op, opcode);
  153.                 op->common.aml = aml;
  154.                 op->common.flags = flags;
  155.         }
  156.  
  157.         return (op);
  158. }
  159.  
  160. /*******************************************************************************
  161.  *
  162.  * FUNCTION:    acpi_ps_free_op
  163.  *
  164.  * PARAMETERS:  op              - Op to be freed
  165.  *
  166.  * RETURN:      None.
  167.  *
  168.  * DESCRIPTION: Free an Op object. Either put it on the GENERIC_OP cache list
  169.  *              or actually free it.
  170.  *
  171.  ******************************************************************************/
  172.  
  173. void acpi_ps_free_op(union acpi_parse_object *op)
  174. {
  175.         ACPI_FUNCTION_NAME(ps_free_op);
  176.  
  177.         if (op->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
  178.                 ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n",
  179.                                   op));
  180.         }
  181.  
  182.         if (op->common.flags & ACPI_PARSEOP_GENERIC) {
  183.                 (void)acpi_os_release_object(acpi_gbl_ps_node_cache, op);
  184.         } else {
  185.                 (void)acpi_os_release_object(acpi_gbl_ps_node_ext_cache, op);
  186.         }
  187. }
  188.  
  189. /*******************************************************************************
  190.  *
  191.  * FUNCTION:    Utility functions
  192.  *
  193.  * DESCRIPTION: Low level character and object functions
  194.  *
  195.  ******************************************************************************/
  196.  
  197. /*
  198.  * Is "c" a namestring lead character?
  199.  */
  200. u8 acpi_ps_is_leading_char(u32 c)
  201. {
  202.         return ((u8) (c == '_' || (c >= 'A' && c <= 'Z')));
  203. }
  204.  
  205. /*
  206.  * Get op's name (4-byte name segment) or 0 if unnamed
  207.  */
  208. u32 acpi_ps_get_name(union acpi_parse_object * op)
  209. {
  210.  
  211.         /* The "generic" object has no name associated with it */
  212.  
  213.         if (op->common.flags & ACPI_PARSEOP_GENERIC) {
  214.                 return (0);
  215.         }
  216.  
  217.         /* Only the "Extended" parse objects have a name */
  218.  
  219.         return (op->named.name);
  220. }
  221.  
  222. /*
  223.  * Set op's name
  224.  */
  225. void acpi_ps_set_name(union acpi_parse_object *op, u32 name)
  226. {
  227.  
  228.         /* The "generic" object has no name associated with it */
  229.  
  230.         if (op->common.flags & ACPI_PARSEOP_GENERIC) {
  231.                 return;
  232.         }
  233.  
  234.         op->named.name = name;
  235. }
  236.