Home | History | Annotate | Line # | Download | only in parser
psutils.c revision 1.1.1.8
      1      1.1    jruoho /******************************************************************************
      2      1.1    jruoho  *
      3      1.1    jruoho  * Module Name: psutils - Parser miscellaneous utilities (Parser only)
      4      1.1    jruoho  *
      5      1.1    jruoho  *****************************************************************************/
      6      1.1    jruoho 
      7  1.1.1.2    jruoho /*
      8  1.1.1.7  christos  * Copyright (C) 2000 - 2016, Intel Corp.
      9      1.1    jruoho  * All rights reserved.
     10      1.1    jruoho  *
     11  1.1.1.2    jruoho  * Redistribution and use in source and binary forms, with or without
     12  1.1.1.2    jruoho  * modification, are permitted provided that the following conditions
     13  1.1.1.2    jruoho  * are met:
     14  1.1.1.2    jruoho  * 1. Redistributions of source code must retain the above copyright
     15  1.1.1.2    jruoho  *    notice, this list of conditions, and the following disclaimer,
     16  1.1.1.2    jruoho  *    without modification.
     17  1.1.1.2    jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  1.1.1.2    jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  1.1.1.2    jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  1.1.1.2    jruoho  *    including a substantially similar Disclaimer requirement for further
     21  1.1.1.2    jruoho  *    binary redistribution.
     22  1.1.1.2    jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23  1.1.1.2    jruoho  *    of any contributors may be used to endorse or promote products derived
     24  1.1.1.2    jruoho  *    from this software without specific prior written permission.
     25  1.1.1.2    jruoho  *
     26  1.1.1.2    jruoho  * Alternatively, this software may be distributed under the terms of the
     27  1.1.1.2    jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28  1.1.1.2    jruoho  * Software Foundation.
     29  1.1.1.2    jruoho  *
     30  1.1.1.2    jruoho  * NO WARRANTY
     31  1.1.1.2    jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  1.1.1.2    jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.1.1.2    jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  1.1.1.2    jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  1.1.1.2    jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  1.1.1.2    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  1.1.1.2    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  1.1.1.2    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  1.1.1.2    jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  1.1.1.2    jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  1.1.1.2    jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42  1.1.1.2    jruoho  */
     43      1.1    jruoho 
     44      1.1    jruoho #include "acpi.h"
     45      1.1    jruoho #include "accommon.h"
     46      1.1    jruoho #include "acparser.h"
     47      1.1    jruoho #include "amlcode.h"
     48      1.1    jruoho 
     49      1.1    jruoho #define _COMPONENT          ACPI_PARSER
     50      1.1    jruoho         ACPI_MODULE_NAME    ("psutils")
     51      1.1    jruoho 
     52      1.1    jruoho 
     53      1.1    jruoho /*******************************************************************************
     54      1.1    jruoho  *
     55      1.1    jruoho  * FUNCTION:    AcpiPsCreateScopeOp
     56      1.1    jruoho  *
     57      1.1    jruoho  * PARAMETERS:  None
     58      1.1    jruoho  *
     59      1.1    jruoho  * RETURN:      A new Scope object, null on failure
     60      1.1    jruoho  *
     61      1.1    jruoho  * DESCRIPTION: Create a Scope and associated namepath op with the root name
     62      1.1    jruoho  *
     63      1.1    jruoho  ******************************************************************************/
     64      1.1    jruoho 
     65      1.1    jruoho ACPI_PARSE_OBJECT *
     66      1.1    jruoho AcpiPsCreateScopeOp (
     67  1.1.1.6  christos     UINT8                   *Aml)
     68      1.1    jruoho {
     69      1.1    jruoho     ACPI_PARSE_OBJECT       *ScopeOp;
     70      1.1    jruoho 
     71      1.1    jruoho 
     72  1.1.1.6  christos     ScopeOp = AcpiPsAllocOp (AML_SCOPE_OP, Aml);
     73      1.1    jruoho     if (!ScopeOp)
     74      1.1    jruoho     {
     75      1.1    jruoho         return (NULL);
     76      1.1    jruoho     }
     77      1.1    jruoho 
     78      1.1    jruoho     ScopeOp->Named.Name = ACPI_ROOT_NAME;
     79      1.1    jruoho     return (ScopeOp);
     80      1.1    jruoho }
     81      1.1    jruoho 
     82      1.1    jruoho 
     83      1.1    jruoho /*******************************************************************************
     84      1.1    jruoho  *
     85      1.1    jruoho  * FUNCTION:    AcpiPsInitOp
     86      1.1    jruoho  *
     87      1.1    jruoho  * PARAMETERS:  Op              - A newly allocated Op object
     88      1.1    jruoho  *              Opcode          - Opcode to store in the Op
     89      1.1    jruoho  *
     90      1.1    jruoho  * RETURN:      None
     91      1.1    jruoho  *
     92      1.1    jruoho  * DESCRIPTION: Initialize a parse (Op) object
     93      1.1    jruoho  *
     94      1.1    jruoho  ******************************************************************************/
     95      1.1    jruoho 
     96      1.1    jruoho void
     97      1.1    jruoho AcpiPsInitOp (
     98      1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
     99      1.1    jruoho     UINT16                  Opcode)
    100      1.1    jruoho {
    101      1.1    jruoho     ACPI_FUNCTION_ENTRY ();
    102      1.1    jruoho 
    103      1.1    jruoho 
    104      1.1    jruoho     Op->Common.DescriptorType = ACPI_DESC_TYPE_PARSER;
    105      1.1    jruoho     Op->Common.AmlOpcode = Opcode;
    106      1.1    jruoho 
    107  1.1.1.6  christos     ACPI_DISASM_ONLY_MEMBERS (strncpy (Op->Common.AmlOpName,
    108  1.1.1.7  christos         (AcpiPsGetOpcodeInfo (Opcode))->Name,
    109  1.1.1.7  christos         sizeof (Op->Common.AmlOpName)));
    110      1.1    jruoho }
    111      1.1    jruoho 
    112      1.1    jruoho 
    113      1.1    jruoho /*******************************************************************************
    114      1.1    jruoho  *
    115      1.1    jruoho  * FUNCTION:    AcpiPsAllocOp
    116      1.1    jruoho  *
    117      1.1    jruoho  * PARAMETERS:  Opcode          - Opcode that will be stored in the new Op
    118  1.1.1.6  christos  *              Aml             - Address of the opcode
    119      1.1    jruoho  *
    120      1.1    jruoho  * RETURN:      Pointer to the new Op, null on failure
    121      1.1    jruoho  *
    122      1.1    jruoho  * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
    123  1.1.1.3  christos  *              opcode. A cache of opcodes is available for the pure
    124      1.1    jruoho  *              GENERIC_OP, since this is by far the most commonly used.
    125      1.1    jruoho  *
    126      1.1    jruoho  ******************************************************************************/
    127      1.1    jruoho 
    128      1.1    jruoho ACPI_PARSE_OBJECT*
    129      1.1    jruoho AcpiPsAllocOp (
    130  1.1.1.6  christos     UINT16                  Opcode,
    131  1.1.1.6  christos     UINT8                   *Aml)
    132      1.1    jruoho {
    133      1.1    jruoho     ACPI_PARSE_OBJECT       *Op;
    134      1.1    jruoho     const ACPI_OPCODE_INFO  *OpInfo;
    135      1.1    jruoho     UINT8                   Flags = ACPI_PARSEOP_GENERIC;
    136      1.1    jruoho 
    137      1.1    jruoho 
    138      1.1    jruoho     ACPI_FUNCTION_ENTRY ();
    139      1.1    jruoho 
    140      1.1    jruoho 
    141      1.1    jruoho     OpInfo = AcpiPsGetOpcodeInfo (Opcode);
    142      1.1    jruoho 
    143      1.1    jruoho     /* Determine type of ParseOp required */
    144      1.1    jruoho 
    145      1.1    jruoho     if (OpInfo->Flags & AML_DEFER)
    146      1.1    jruoho     {
    147      1.1    jruoho         Flags = ACPI_PARSEOP_DEFERRED;
    148      1.1    jruoho     }
    149      1.1    jruoho     else if (OpInfo->Flags & AML_NAMED)
    150      1.1    jruoho     {
    151  1.1.1.8  christos         Flags = ACPI_PARSEOP_NAMED_OBJECT;
    152      1.1    jruoho     }
    153      1.1    jruoho     else if (Opcode == AML_INT_BYTELIST_OP)
    154      1.1    jruoho     {
    155      1.1    jruoho         Flags = ACPI_PARSEOP_BYTELIST;
    156      1.1    jruoho     }
    157      1.1    jruoho 
    158      1.1    jruoho     /* Allocate the minimum required size object */
    159      1.1    jruoho 
    160      1.1    jruoho     if (Flags == ACPI_PARSEOP_GENERIC)
    161      1.1    jruoho     {
    162      1.1    jruoho         /* The generic op (default) is by far the most common (16 to 1) */
    163      1.1    jruoho 
    164      1.1    jruoho         Op = AcpiOsAcquireObject (AcpiGbl_PsNodeCache);
    165      1.1    jruoho     }
    166      1.1    jruoho     else
    167      1.1    jruoho     {
    168      1.1    jruoho         /* Extended parseop */
    169      1.1    jruoho 
    170      1.1    jruoho         Op = AcpiOsAcquireObject (AcpiGbl_PsNodeExtCache);
    171      1.1    jruoho     }
    172      1.1    jruoho 
    173      1.1    jruoho     /* Initialize the Op */
    174      1.1    jruoho 
    175      1.1    jruoho     if (Op)
    176      1.1    jruoho     {
    177      1.1    jruoho         AcpiPsInitOp (Op, Opcode);
    178  1.1.1.6  christos         Op->Common.Aml = Aml;
    179      1.1    jruoho         Op->Common.Flags = Flags;
    180      1.1    jruoho     }
    181      1.1    jruoho 
    182      1.1    jruoho     return (Op);
    183      1.1    jruoho }
    184      1.1    jruoho 
    185      1.1    jruoho 
    186      1.1    jruoho /*******************************************************************************
    187      1.1    jruoho  *
    188      1.1    jruoho  * FUNCTION:    AcpiPsFreeOp
    189      1.1    jruoho  *
    190      1.1    jruoho  * PARAMETERS:  Op              - Op to be freed
    191      1.1    jruoho  *
    192      1.1    jruoho  * RETURN:      None.
    193      1.1    jruoho  *
    194  1.1.1.3  christos  * DESCRIPTION: Free an Op object. Either put it on the GENERIC_OP cache list
    195      1.1    jruoho  *              or actually free it.
    196      1.1    jruoho  *
    197      1.1    jruoho  ******************************************************************************/
    198      1.1    jruoho 
    199      1.1    jruoho void
    200      1.1    jruoho AcpiPsFreeOp (
    201      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    202      1.1    jruoho {
    203      1.1    jruoho     ACPI_FUNCTION_NAME (PsFreeOp);
    204      1.1    jruoho 
    205      1.1    jruoho 
    206      1.1    jruoho     if (Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
    207      1.1    jruoho     {
    208  1.1.1.7  christos         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
    209  1.1.1.7  christos             "Free retval op: %p\n", Op));
    210      1.1    jruoho     }
    211      1.1    jruoho 
    212      1.1    jruoho     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
    213      1.1    jruoho     {
    214      1.1    jruoho         (void) AcpiOsReleaseObject (AcpiGbl_PsNodeCache, Op);
    215      1.1    jruoho     }
    216      1.1    jruoho     else
    217      1.1    jruoho     {
    218      1.1    jruoho         (void) AcpiOsReleaseObject (AcpiGbl_PsNodeExtCache, Op);
    219      1.1    jruoho     }
    220      1.1    jruoho }
    221      1.1    jruoho 
    222      1.1    jruoho 
    223      1.1    jruoho /*******************************************************************************
    224      1.1    jruoho  *
    225      1.1    jruoho  * FUNCTION:    Utility functions
    226      1.1    jruoho  *
    227      1.1    jruoho  * DESCRIPTION: Low level character and object functions
    228      1.1    jruoho  *
    229      1.1    jruoho  ******************************************************************************/
    230      1.1    jruoho 
    231      1.1    jruoho 
    232      1.1    jruoho /*
    233      1.1    jruoho  * Is "c" a namestring lead character?
    234      1.1    jruoho  */
    235      1.1    jruoho BOOLEAN
    236      1.1    jruoho AcpiPsIsLeadingChar (
    237      1.1    jruoho     UINT32                  c)
    238      1.1    jruoho {
    239      1.1    jruoho     return ((BOOLEAN) (c == '_' || (c >= 'A' && c <= 'Z')));
    240      1.1    jruoho }
    241      1.1    jruoho 
    242      1.1    jruoho 
    243      1.1    jruoho /*
    244      1.1    jruoho  * Get op's name (4-byte name segment) or 0 if unnamed
    245      1.1    jruoho  */
    246      1.1    jruoho UINT32
    247      1.1    jruoho AcpiPsGetName (
    248      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    249      1.1    jruoho {
    250      1.1    jruoho 
    251      1.1    jruoho     /* The "generic" object has no name associated with it */
    252      1.1    jruoho 
    253      1.1    jruoho     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
    254      1.1    jruoho     {
    255      1.1    jruoho         return (0);
    256      1.1    jruoho     }
    257      1.1    jruoho 
    258      1.1    jruoho     /* Only the "Extended" parse objects have a name */
    259      1.1    jruoho 
    260      1.1    jruoho     return (Op->Named.Name);
    261      1.1    jruoho }
    262      1.1    jruoho 
    263      1.1    jruoho 
    264      1.1    jruoho /*
    265      1.1    jruoho  * Set op's name
    266      1.1    jruoho  */
    267      1.1    jruoho void
    268      1.1    jruoho AcpiPsSetName (
    269      1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
    270      1.1    jruoho     UINT32                  name)
    271      1.1    jruoho {
    272      1.1    jruoho 
    273      1.1    jruoho     /* The "generic" object has no name associated with it */
    274      1.1    jruoho 
    275      1.1    jruoho     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
    276      1.1    jruoho     {
    277      1.1    jruoho         return;
    278      1.1    jruoho     }
    279      1.1    jruoho 
    280      1.1    jruoho     Op->Named.Name = name;
    281      1.1    jruoho }
    282