1 /******************************************************************************
 
   3  * Module Name: psutils - Parser miscellaneous utilities (Parser only)
 
   5  *****************************************************************************/
 
   8  * Copyright (C) 2000 - 2006, R. Byron Moore
 
  11  * Redistribution and use in source and binary forms, with or without
 
  12  * modification, are permitted provided that the following conditions
 
  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.
 
  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.
 
  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.
 
  44 #include <acpi/acpi.h>
 
  45 #include <acpi/acparser.h>
 
  46 #include <acpi/amlcode.h>
 
  48 #define _COMPONENT          ACPI_PARSER
 
  49 ACPI_MODULE_NAME("psutils")
 
  51 /*******************************************************************************
 
  53  * FUNCTION:    acpi_ps_create_scope_op
 
  57  * RETURN:      A new Scope object, null on failure
 
  59  * DESCRIPTION: Create a Scope and associated namepath op with the root name
 
  61  ******************************************************************************/
 
  62 union acpi_parse_object *acpi_ps_create_scope_op(void)
 
  64         union acpi_parse_object *scope_op;
 
  66         scope_op = acpi_ps_alloc_op(AML_SCOPE_OP);
 
  71         scope_op->named.name = ACPI_ROOT_NAME;
 
  75 /*******************************************************************************
 
  77  * FUNCTION:    acpi_ps_init_op
 
  79  * PARAMETERS:  Op              - A newly allocated Op object
 
  80  *              Opcode          - Opcode to store in the Op
 
  84  * DESCRIPTION: Initialize a parse (Op) object
 
  86  ******************************************************************************/
 
  88 void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode)
 
  90         ACPI_FUNCTION_ENTRY();
 
  92         op->common.descriptor_type = ACPI_DESC_TYPE_PARSER;
 
  93         op->common.aml_opcode = opcode;
 
  95         ACPI_DISASM_ONLY_MEMBERS(ACPI_STRNCPY(op->common.aml_op_name,
 
  96                                               (acpi_ps_get_opcode_info
 
  98                                               sizeof(op->common.aml_op_name)));
 
 101 /*******************************************************************************
 
 103  * FUNCTION:    acpi_ps_alloc_op
 
 105  * PARAMETERS:  Opcode          - Opcode that will be stored in the new Op
 
 107  * RETURN:      Pointer to the new Op, null on failure
 
 109  * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
 
 110  *              opcode.  A cache of opcodes is available for the pure
 
 111  *              GENERIC_OP, since this is by far the most commonly used.
 
 113  ******************************************************************************/
 
 115 union acpi_parse_object *acpi_ps_alloc_op(u16 opcode)
 
 117         union acpi_parse_object *op;
 
 118         const struct acpi_opcode_info *op_info;
 
 119         u8 flags = ACPI_PARSEOP_GENERIC;
 
 121         ACPI_FUNCTION_ENTRY();
 
 123         op_info = acpi_ps_get_opcode_info(opcode);
 
 125         /* Determine type of parse_op required */
 
 127         if (op_info->flags & AML_DEFER) {
 
 128                 flags = ACPI_PARSEOP_DEFERRED;
 
 129         } else if (op_info->flags & AML_NAMED) {
 
 130                 flags = ACPI_PARSEOP_NAMED;
 
 131         } else if (opcode == AML_INT_BYTELIST_OP) {
 
 132                 flags = ACPI_PARSEOP_BYTELIST;
 
 135         /* Allocate the minimum required size object */
 
 137         if (flags == ACPI_PARSEOP_GENERIC) {
 
 139                 /* The generic op (default) is by far the most common (16 to 1) */
 
 141                 op = acpi_os_acquire_object(acpi_gbl_ps_node_cache);
 
 143                 /* Extended parseop */
 
 145                 op = acpi_os_acquire_object(acpi_gbl_ps_node_ext_cache);
 
 148         /* Initialize the Op */
 
 151                 acpi_ps_init_op(op, opcode);
 
 152                 op->common.flags = flags;
 
 158 /*******************************************************************************
 
 160  * FUNCTION:    acpi_ps_free_op
 
 162  * PARAMETERS:  Op              - Op to be freed
 
 166  * DESCRIPTION: Free an Op object.  Either put it on the GENERIC_OP cache list
 
 167  *              or actually free it.
 
 169  ******************************************************************************/
 
 171 void acpi_ps_free_op(union acpi_parse_object *op)
 
 173         ACPI_FUNCTION_NAME(ps_free_op);
 
 175         if (op->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
 
 176                 ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n",
 
 180         if (op->common.flags & ACPI_PARSEOP_GENERIC) {
 
 181                 (void)acpi_os_release_object(acpi_gbl_ps_node_cache, op);
 
 183                 (void)acpi_os_release_object(acpi_gbl_ps_node_ext_cache, op);
 
 187 /*******************************************************************************
 
 189  * FUNCTION:    Utility functions
 
 191  * DESCRIPTION: Low level character and object functions
 
 193  ******************************************************************************/
 
 196  * Is "c" a namestring lead character?
 
 198 u8 acpi_ps_is_leading_char(u32 c)
 
 200         return ((u8) (c == '_' || (c >= 'A' && c <= 'Z')));
 
 204  * Is "c" a namestring prefix character?
 
 206 u8 acpi_ps_is_prefix_char(u32 c)
 
 208         return ((u8) (c == '\\' || c == '^'));
 
 212  * Get op's name (4-byte name segment) or 0 if unnamed
 
 214 #ifdef ACPI_FUTURE_USAGE
 
 215 u32 acpi_ps_get_name(union acpi_parse_object * op)
 
 218         /* The "generic" object has no name associated with it */
 
 220         if (op->common.flags & ACPI_PARSEOP_GENERIC) {
 
 224         /* Only the "Extended" parse objects have a name */
 
 226         return (op->named.name);
 
 228 #endif                          /*  ACPI_FUTURE_USAGE  */
 
 233 void acpi_ps_set_name(union acpi_parse_object *op, u32 name)
 
 236         /* The "generic" object has no name associated with it */
 
 238         if (op->common.flags & ACPI_PARSEOP_GENERIC) {
 
 242         op->named.name = name;