Subversion Repositories Kolibri OS

Rev

Rev 1498 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: psutils - Parser miscellaneous utilities (Parser only)
  4.  *
  5.  *****************************************************************************/
  6.  
  7. /******************************************************************************
  8.  *
  9.  * 1. Copyright Notice
  10.  *
  11.  * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
  12.  * All rights reserved.
  13.  *
  14.  * 2. License
  15.  *
  16.  * 2.1. This is your license from Intel Corp. under its intellectual property
  17.  * rights.  You may have additional license terms from the party that provided
  18.  * you this software, covering your right to use that party's intellectual
  19.  * property rights.
  20.  *
  21.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  22.  * copy of the source code appearing in this file ("Covered Code") an
  23.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  24.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  25.  * make derivatives, distribute, use and display any portion of the Covered
  26.  * Code in any form, with the right to sublicense such rights; and
  27.  *
  28.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  29.  * license (with the right to sublicense), under only those claims of Intel
  30.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  31.  * offer to sell, and import the Covered Code and derivative works thereof
  32.  * solely to the minimum extent necessary to exercise the above copyright
  33.  * license, and in no event shall the patent license extend to any additions
  34.  * to or modifications of the Original Intel Code.  No other license or right
  35.  * is granted directly or by implication, estoppel or otherwise;
  36.  *
  37.  * The above copyright and patent license is granted only if the following
  38.  * conditions are met:
  39.  *
  40.  * 3. Conditions
  41.  *
  42.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  43.  * Redistribution of source code of any substantial portion of the Covered
  44.  * Code or modification with rights to further distribute source must include
  45.  * the above Copyright Notice, the above License, this list of Conditions,
  46.  * and the following Disclaimer and Export Compliance provision.  In addition,
  47.  * Licensee must cause all Covered Code to which Licensee contributes to
  48.  * contain a file documenting the changes Licensee made to create that Covered
  49.  * Code and the date of any change.  Licensee must include in that file the
  50.  * documentation of any changes made by any predecessor Licensee.  Licensee
  51.  * must include a prominent statement that the modification is derived,
  52.  * directly or indirectly, from Original Intel Code.
  53.  *
  54.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  55.  * Redistribution of source code of any substantial portion of the Covered
  56.  * Code or modification without rights to further distribute source must
  57.  * include the following Disclaimer and Export Compliance provision in the
  58.  * documentation and/or other materials provided with distribution.  In
  59.  * addition, Licensee may not authorize further sublicense of source of any
  60.  * portion of the Covered Code, and must include terms to the effect that the
  61.  * license from Licensee to its licensee is limited to the intellectual
  62.  * property embodied in the software Licensee provides to its licensee, and
  63.  * not to intellectual property embodied in modifications its licensee may
  64.  * make.
  65.  *
  66.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  67.  * substantial portion of the Covered Code or modification must reproduce the
  68.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  69.  * provision in the documentation and/or other materials provided with the
  70.  * distribution.
  71.  *
  72.  * 3.4. Intel retains all right, title, and interest in and to the Original
  73.  * Intel Code.
  74.  *
  75.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  76.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  77.  * other dealings in products derived from or relating to the Covered Code
  78.  * without prior written authorization from Intel.
  79.  *
  80.  * 4. Disclaimer and Export Compliance
  81.  *
  82.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  83.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  84.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  85.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  86.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  87.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  88.  * PARTICULAR PURPOSE.
  89.  *
  90.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  91.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  92.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  93.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  94.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  95.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  96.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  97.  * LIMITED REMEDY.
  98.  *
  99.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  100.  * software or system incorporating such software without first obtaining any
  101.  * required license or other approval from the U. S. Department of Commerce or
  102.  * any other agency or department of the United States Government.  In the
  103.  * event Licensee exports any such software from the United States or
  104.  * re-exports any such software from a foreign destination, Licensee shall
  105.  * ensure that the distribution and export/re-export of the software is in
  106.  * compliance with all laws, regulations, orders, or other restrictions of the
  107.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  108.  * any of its subsidiaries will export/re-export any technical data, process,
  109.  * software, or service, directly or indirectly, to any country for which the
  110.  * United States government or any agency thereof requires an export license,
  111.  * other governmental approval, or letter of assurance, without first obtaining
  112.  * such license, approval or letter.
  113.  *
  114.  *****************************************************************************/
  115.  
  116.  
  117. #include "acpi.h"
  118. #include "accommon.h"
  119. #include "acparser.h"
  120. #include "amlcode.h"
  121.  
  122. #define _COMPONENT          ACPI_PARSER
  123.         ACPI_MODULE_NAME    ("psutils")
  124.  
  125.  
  126. /*******************************************************************************
  127.  *
  128.  * FUNCTION:    AcpiPsCreateScopeOp
  129.  *
  130.  * PARAMETERS:  None
  131.  *
  132.  * RETURN:      A new Scope object, null on failure
  133.  *
  134.  * DESCRIPTION: Create a Scope and associated namepath op with the root name
  135.  *
  136.  ******************************************************************************/
  137.  
  138. ACPI_PARSE_OBJECT *
  139. AcpiPsCreateScopeOp (
  140.     void)
  141. {
  142.     ACPI_PARSE_OBJECT       *ScopeOp;
  143.  
  144.  
  145.     ScopeOp = AcpiPsAllocOp (AML_SCOPE_OP);
  146.     if (!ScopeOp)
  147.     {
  148.         return (NULL);
  149.     }
  150.  
  151.     ScopeOp->Named.Name = ACPI_ROOT_NAME;
  152.     return (ScopeOp);
  153. }
  154.  
  155.  
  156. /*******************************************************************************
  157.  *
  158.  * FUNCTION:    AcpiPsInitOp
  159.  *
  160.  * PARAMETERS:  Op              - A newly allocated Op object
  161.  *              Opcode          - Opcode to store in the Op
  162.  *
  163.  * RETURN:      None
  164.  *
  165.  * DESCRIPTION: Initialize a parse (Op) object
  166.  *
  167.  ******************************************************************************/
  168.  
  169. void
  170. AcpiPsInitOp (
  171.     ACPI_PARSE_OBJECT       *Op,
  172.     UINT16                  Opcode)
  173. {
  174.     ACPI_FUNCTION_ENTRY ();
  175.  
  176.  
  177.     Op->Common.DescriptorType = ACPI_DESC_TYPE_PARSER;
  178.     Op->Common.AmlOpcode = Opcode;
  179.  
  180.     ACPI_DISASM_ONLY_MEMBERS (ACPI_STRNCPY (Op->Common.AmlOpName,
  181.             (AcpiPsGetOpcodeInfo (Opcode))->Name,
  182.                 sizeof (Op->Common.AmlOpName)));
  183. }
  184.  
  185.  
  186. /*******************************************************************************
  187.  *
  188.  * FUNCTION:    AcpiPsAllocOp
  189.  *
  190.  * PARAMETERS:  Opcode          - Opcode that will be stored in the new Op
  191.  *
  192.  * RETURN:      Pointer to the new Op, null on failure
  193.  *
  194.  * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
  195.  *              opcode.  A cache of opcodes is available for the pure
  196.  *              GENERIC_OP, since this is by far the most commonly used.
  197.  *
  198.  ******************************************************************************/
  199.  
  200. ACPI_PARSE_OBJECT*
  201. AcpiPsAllocOp (
  202.     UINT16                  Opcode)
  203. {
  204.     ACPI_PARSE_OBJECT       *Op;
  205.     const ACPI_OPCODE_INFO  *OpInfo;
  206.     UINT8                   Flags = ACPI_PARSEOP_GENERIC;
  207.  
  208.  
  209.     ACPI_FUNCTION_ENTRY ();
  210.  
  211.  
  212.     OpInfo = AcpiPsGetOpcodeInfo (Opcode);
  213.  
  214.     /* Determine type of ParseOp required */
  215.  
  216.     if (OpInfo->Flags & AML_DEFER)
  217.     {
  218.         Flags = ACPI_PARSEOP_DEFERRED;
  219.     }
  220.     else if (OpInfo->Flags & AML_NAMED)
  221.     {
  222.         Flags = ACPI_PARSEOP_NAMED;
  223.     }
  224.     else if (Opcode == AML_INT_BYTELIST_OP)
  225.     {
  226.         Flags = ACPI_PARSEOP_BYTELIST;
  227.     }
  228.  
  229.     /* Allocate the minimum required size object */
  230.  
  231.     if (Flags == ACPI_PARSEOP_GENERIC)
  232.     {
  233.         /* The generic op (default) is by far the most common (16 to 1) */
  234.  
  235.         Op = AcpiOsAcquireObject (AcpiGbl_PsNodeCache);
  236.     }
  237.     else
  238.     {
  239.         /* Extended parseop */
  240.  
  241.         Op = AcpiOsAcquireObject (AcpiGbl_PsNodeExtCache);
  242.     }
  243.  
  244.     /* Initialize the Op */
  245.  
  246.     if (Op)
  247.     {
  248.         AcpiPsInitOp (Op, Opcode);
  249.         Op->Common.Flags = Flags;
  250.     }
  251.  
  252.     return (Op);
  253. }
  254.  
  255.  
  256. /*******************************************************************************
  257.  *
  258.  * FUNCTION:    AcpiPsFreeOp
  259.  *
  260.  * PARAMETERS:  Op              - Op to be freed
  261.  *
  262.  * RETURN:      None.
  263.  *
  264.  * DESCRIPTION: Free an Op object.  Either put it on the GENERIC_OP cache list
  265.  *              or actually free it.
  266.  *
  267.  ******************************************************************************/
  268.  
  269. void
  270. AcpiPsFreeOp (
  271.     ACPI_PARSE_OBJECT       *Op)
  272. {
  273.     ACPI_FUNCTION_NAME (PsFreeOp);
  274.  
  275.  
  276.     if (Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
  277.     {
  278.         ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n", Op));
  279.     }
  280.  
  281.     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
  282.     {
  283.         (void) AcpiOsReleaseObject (AcpiGbl_PsNodeCache, Op);
  284.     }
  285.     else
  286.     {
  287.         (void) AcpiOsReleaseObject (AcpiGbl_PsNodeExtCache, Op);
  288.     }
  289. }
  290.  
  291.  
  292. /*******************************************************************************
  293.  *
  294.  * FUNCTION:    Utility functions
  295.  *
  296.  * DESCRIPTION: Low level character and object functions
  297.  *
  298.  ******************************************************************************/
  299.  
  300.  
  301. /*
  302.  * Is "c" a namestring lead character?
  303.  */
  304. BOOLEAN
  305. AcpiPsIsLeadingChar (
  306.     UINT32                  c)
  307. {
  308.     return ((BOOLEAN) (c == '_' || (c >= 'A' && c <= 'Z')));
  309. }
  310.  
  311.  
  312. /*
  313.  * Is "c" a namestring prefix character?
  314.  */
  315. BOOLEAN
  316. AcpiPsIsPrefixChar (
  317.     UINT32                  c)
  318. {
  319.     return ((BOOLEAN) (c == '\\' || c == '^'));
  320. }
  321.  
  322.  
  323. /*
  324.  * Get op's name (4-byte name segment) or 0 if unnamed
  325.  */
  326. UINT32
  327. AcpiPsGetName (
  328.     ACPI_PARSE_OBJECT       *Op)
  329. {
  330.  
  331.     /* The "generic" object has no name associated with it */
  332.  
  333.     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
  334.     {
  335.         return (0);
  336.     }
  337.  
  338.     /* Only the "Extended" parse objects have a name */
  339.  
  340.     return (Op->Named.Name);
  341. }
  342.  
  343.  
  344. /*
  345.  * Set op's name
  346.  */
  347. void
  348. AcpiPsSetName (
  349.     ACPI_PARSE_OBJECT       *Op,
  350.     UINT32                  name)
  351. {
  352.  
  353.     /* The "generic" object has no name associated with it */
  354.  
  355.     if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
  356.     {
  357.         return;
  358.     }
  359.  
  360.     Op->Named.Name = name;
  361. }
  362.  
  363.