Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. /******************************************************************************
  3.  *
  4.  * Module Name: exstoren - AML Interpreter object store support,
  5.  *                        Store to Node (namespace object)
  6.  *
  7.  *****************************************************************************/
  8.  
  9. /******************************************************************************
  10.  *
  11.  * 1. Copyright Notice
  12.  *
  13.  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
  14.  * All rights reserved.
  15.  *
  16.  * 2. License
  17.  *
  18.  * 2.1. This is your license from Intel Corp. under its intellectual property
  19.  * rights.  You may have additional license terms from the party that provided
  20.  * you this software, covering your right to use that party's intellectual
  21.  * property rights.
  22.  *
  23.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  24.  * copy of the source code appearing in this file ("Covered Code") an
  25.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  26.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  27.  * make derivatives, distribute, use and display any portion of the Covered
  28.  * Code in any form, with the right to sublicense such rights; and
  29.  *
  30.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  31.  * license (with the right to sublicense), under only those claims of Intel
  32.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  33.  * offer to sell, and import the Covered Code and derivative works thereof
  34.  * solely to the minimum extent necessary to exercise the above copyright
  35.  * license, and in no event shall the patent license extend to any additions
  36.  * to or modifications of the Original Intel Code.  No other license or right
  37.  * is granted directly or by implication, estoppel or otherwise;
  38.  *
  39.  * The above copyright and patent license is granted only if the following
  40.  * conditions are met:
  41.  *
  42.  * 3. Conditions
  43.  *
  44.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  45.  * Redistribution of source code of any substantial portion of the Covered
  46.  * Code or modification with rights to further distribute source must include
  47.  * the above Copyright Notice, the above License, this list of Conditions,
  48.  * and the following Disclaimer and Export Compliance provision.  In addition,
  49.  * Licensee must cause all Covered Code to which Licensee contributes to
  50.  * contain a file documenting the changes Licensee made to create that Covered
  51.  * Code and the date of any change.  Licensee must include in that file the
  52.  * documentation of any changes made by any predecessor Licensee.  Licensee
  53.  * must include a prominent statement that the modification is derived,
  54.  * directly or indirectly, from Original Intel Code.
  55.  *
  56.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  57.  * Redistribution of source code of any substantial portion of the Covered
  58.  * Code or modification without rights to further distribute source must
  59.  * include the following Disclaimer and Export Compliance provision in the
  60.  * documentation and/or other materials provided with distribution.  In
  61.  * addition, Licensee may not authorize further sublicense of source of any
  62.  * portion of the Covered Code, and must include terms to the effect that the
  63.  * license from Licensee to its licensee is limited to the intellectual
  64.  * property embodied in the software Licensee provides to its licensee, and
  65.  * not to intellectual property embodied in modifications its licensee may
  66.  * make.
  67.  *
  68.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  69.  * substantial portion of the Covered Code or modification must reproduce the
  70.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  71.  * provision in the documentation and/or other materials provided with the
  72.  * distribution.
  73.  *
  74.  * 3.4. Intel retains all right, title, and interest in and to the Original
  75.  * Intel Code.
  76.  *
  77.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  78.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  79.  * other dealings in products derived from or relating to the Covered Code
  80.  * without prior written authorization from Intel.
  81.  *
  82.  * 4. Disclaimer and Export Compliance
  83.  *
  84.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  85.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  86.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  87.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  88.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  89.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  90.  * PARTICULAR PURPOSE.
  91.  *
  92.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  93.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  94.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  95.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  96.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  97.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  98.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  99.  * LIMITED REMEDY.
  100.  *
  101.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  102.  * software or system incorporating such software without first obtaining any
  103.  * required license or other approval from the U. S. Department of Commerce or
  104.  * any other agency or department of the United States Government.  In the
  105.  * event Licensee exports any such software from the United States or
  106.  * re-exports any such software from a foreign destination, Licensee shall
  107.  * ensure that the distribution and export/re-export of the software is in
  108.  * compliance with all laws, regulations, orders, or other restrictions of the
  109.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  110.  * any of its subsidiaries will export/re-export any technical data, process,
  111.  * software, or service, directly or indirectly, to any country for which the
  112.  * United States government or any agency thereof requires an export license,
  113.  * other governmental approval, or letter of assurance, without first obtaining
  114.  * such license, approval or letter.
  115.  *
  116.  *****************************************************************************/
  117.  
  118. #define __EXSTOREN_C__
  119.  
  120. #include "acpi.h"
  121. #include "accommon.h"
  122. #include "acinterp.h"
  123. #include "amlcode.h"
  124.  
  125.  
  126. #define _COMPONENT          ACPI_EXECUTER
  127.         ACPI_MODULE_NAME    ("exstoren")
  128.  
  129.  
  130. /*******************************************************************************
  131.  *
  132.  * FUNCTION:    AcpiExResolveObject
  133.  *
  134.  * PARAMETERS:  SourceDescPtr       - Pointer to the source object
  135.  *              TargetType          - Current type of the target
  136.  *              WalkState           - Current walk state
  137.  *
  138.  * RETURN:      Status, resolved object in SourceDescPtr.
  139.  *
  140.  * DESCRIPTION: Resolve an object.  If the object is a reference, dereference
  141.  *              it and return the actual object in the SourceDescPtr.
  142.  *
  143.  ******************************************************************************/
  144.  
  145. ACPI_STATUS
  146. AcpiExResolveObject (
  147.     ACPI_OPERAND_OBJECT     **SourceDescPtr,
  148.     ACPI_OBJECT_TYPE        TargetType,
  149.     ACPI_WALK_STATE         *WalkState)
  150. {
  151.     ACPI_OPERAND_OBJECT     *SourceDesc = *SourceDescPtr;
  152.     ACPI_STATUS             Status = AE_OK;
  153.  
  154.  
  155.     ACPI_FUNCTION_TRACE (ExResolveObject);
  156.  
  157.  
  158.     /* Ensure we have a Target that can be stored to */
  159.  
  160.     switch (TargetType)
  161.     {
  162.     case ACPI_TYPE_BUFFER_FIELD:
  163.     case ACPI_TYPE_LOCAL_REGION_FIELD:
  164.     case ACPI_TYPE_LOCAL_BANK_FIELD:
  165.     case ACPI_TYPE_LOCAL_INDEX_FIELD:
  166.         /*
  167.          * These cases all require only Integers or values that
  168.          * can be converted to Integers (Strings or Buffers)
  169.          */
  170.  
  171.     case ACPI_TYPE_INTEGER:
  172.     case ACPI_TYPE_STRING:
  173.     case ACPI_TYPE_BUFFER:
  174.  
  175.         /*
  176.          * Stores into a Field/Region or into a Integer/Buffer/String
  177.          * are all essentially the same.  This case handles the
  178.          * "interchangeable" types Integer, String, and Buffer.
  179.          */
  180.         if (SourceDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
  181.         {
  182.             /* Resolve a reference object first */
  183.  
  184.             Status = AcpiExResolveToValue (SourceDescPtr, WalkState);
  185.             if (ACPI_FAILURE (Status))
  186.             {
  187.                 break;
  188.             }
  189.         }
  190.  
  191.         /* For CopyObject, no further validation necessary */
  192.  
  193.         if (WalkState->Opcode == AML_COPY_OP)
  194.         {
  195.             break;
  196.         }
  197.  
  198.         /* Must have a Integer, Buffer, or String */
  199.  
  200.         if ((SourceDesc->Common.Type != ACPI_TYPE_INTEGER)    &&
  201.             (SourceDesc->Common.Type != ACPI_TYPE_BUFFER)     &&
  202.             (SourceDesc->Common.Type != ACPI_TYPE_STRING)     &&
  203.             !((SourceDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
  204.                     (SourceDesc->Reference.Class== ACPI_REFCLASS_TABLE)))
  205.         {
  206.             /* Conversion successful but still not a valid type */
  207.  
  208.             ACPI_ERROR ((AE_INFO,
  209.                 "Cannot assign type %s to %s (must be type Int/Str/Buf)",
  210.                 AcpiUtGetObjectTypeName (SourceDesc),
  211.                 AcpiUtGetTypeName (TargetType)));
  212.             Status = AE_AML_OPERAND_TYPE;
  213.         }
  214.         break;
  215.  
  216.  
  217.     case ACPI_TYPE_LOCAL_ALIAS:
  218.     case ACPI_TYPE_LOCAL_METHOD_ALIAS:
  219.  
  220.         /*
  221.          * All aliases should have been resolved earlier, during the
  222.          * operand resolution phase.
  223.          */
  224.         ACPI_ERROR ((AE_INFO, "Store into an unresolved Alias object"));
  225.         Status = AE_AML_INTERNAL;
  226.         break;
  227.  
  228.  
  229.     case ACPI_TYPE_PACKAGE:
  230.     default:
  231.  
  232.         /*
  233.          * All other types than Alias and the various Fields come here,
  234.          * including the untyped case - ACPI_TYPE_ANY.
  235.          */
  236.         break;
  237.     }
  238.  
  239.     return_ACPI_STATUS (Status);
  240. }
  241.  
  242.  
  243. /*******************************************************************************
  244.  *
  245.  * FUNCTION:    AcpiExStoreObjectToObject
  246.  *
  247.  * PARAMETERS:  SourceDesc          - Object to store
  248.  *              DestDesc            - Object to receive a copy of the source
  249.  *              NewDesc             - New object if DestDesc is obsoleted
  250.  *              WalkState           - Current walk state
  251.  *
  252.  * RETURN:      Status
  253.  *
  254.  * DESCRIPTION: "Store" an object to another object.  This may include
  255.  *              converting the source type to the target type (implicit
  256.  *              conversion), and a copy of the value of the source to
  257.  *              the target.
  258.  *
  259.  *              The Assignment of an object to another (not named) object
  260.  *              is handled here.
  261.  *              The Source passed in will replace the current value (if any)
  262.  *              with the input value.
  263.  *
  264.  *              When storing into an object the data is converted to the
  265.  *              target object type then stored in the object.  This means
  266.  *              that the target object type (for an initialized target) will
  267.  *              not be changed by a store operation.
  268.  *
  269.  *              This module allows destination types of Number, String,
  270.  *              Buffer, and Package.
  271.  *
  272.  *              Assumes parameters are already validated.  NOTE: SourceDesc
  273.  *              resolution (from a reference object) must be performed by
  274.  *              the caller if necessary.
  275.  *
  276.  ******************************************************************************/
  277.  
  278. ACPI_STATUS
  279. AcpiExStoreObjectToObject (
  280.     ACPI_OPERAND_OBJECT     *SourceDesc,
  281.     ACPI_OPERAND_OBJECT     *DestDesc,
  282.     ACPI_OPERAND_OBJECT     **NewDesc,
  283.     ACPI_WALK_STATE         *WalkState)
  284. {
  285.     ACPI_OPERAND_OBJECT     *ActualSrcDesc;
  286.     ACPI_STATUS             Status = AE_OK;
  287.  
  288.  
  289.     ACPI_FUNCTION_TRACE_PTR (ExStoreObjectToObject, SourceDesc);
  290.  
  291.  
  292.     ActualSrcDesc = SourceDesc;
  293.     if (!DestDesc)
  294.     {
  295.         /*
  296.          * There is no destination object (An uninitialized node or
  297.          * package element), so we can simply copy the source object
  298.          * creating a new destination object
  299.          */
  300.         Status = AcpiUtCopyIobjectToIobject (ActualSrcDesc, NewDesc, WalkState);
  301.         return_ACPI_STATUS (Status);
  302.     }
  303.  
  304.     if (SourceDesc->Common.Type != DestDesc->Common.Type)
  305.     {
  306.         /*
  307.          * The source type does not match the type of the destination.
  308.          * Perform the "implicit conversion" of the source to the current type
  309.          * of the target as per the ACPI specification.
  310.          *
  311.          * If no conversion performed, ActualSrcDesc = SourceDesc.
  312.          * Otherwise, ActualSrcDesc is a temporary object to hold the
  313.          * converted object.
  314.          */
  315.         Status = AcpiExConvertToTargetType (DestDesc->Common.Type,
  316.                         SourceDesc, &ActualSrcDesc, WalkState);
  317.         if (ACPI_FAILURE (Status))
  318.         {
  319.             return_ACPI_STATUS (Status);
  320.         }
  321.  
  322.         if (SourceDesc == ActualSrcDesc)
  323.         {
  324.             /*
  325.              * No conversion was performed. Return the SourceDesc as the
  326.              * new object.
  327.              */
  328.             *NewDesc = SourceDesc;
  329.             return_ACPI_STATUS (AE_OK);
  330.         }
  331.     }
  332.  
  333.     /*
  334.      * We now have two objects of identical types, and we can perform a
  335.      * copy of the *value* of the source object.
  336.      */
  337.     switch (DestDesc->Common.Type)
  338.     {
  339.     case ACPI_TYPE_INTEGER:
  340.  
  341.         DestDesc->Integer.Value = ActualSrcDesc->Integer.Value;
  342.  
  343.         /* Truncate value if we are executing from a 32-bit ACPI table */
  344.  
  345.         AcpiExTruncateFor32bitTable (DestDesc);
  346.         break;
  347.  
  348.     case ACPI_TYPE_STRING:
  349.  
  350.         Status = AcpiExStoreStringToString (ActualSrcDesc, DestDesc);
  351.         break;
  352.  
  353.     case ACPI_TYPE_BUFFER:
  354.  
  355.         Status = AcpiExStoreBufferToBuffer (ActualSrcDesc, DestDesc);
  356.         break;
  357.  
  358.     case ACPI_TYPE_PACKAGE:
  359.  
  360.         Status = AcpiUtCopyIobjectToIobject (ActualSrcDesc, &DestDesc,
  361.                     WalkState);
  362.         break;
  363.  
  364.     default:
  365.         /*
  366.          * All other types come here.
  367.          */
  368.         ACPI_WARNING ((AE_INFO, "Store into type %s not implemented",
  369.             AcpiUtGetObjectTypeName (DestDesc)));
  370.  
  371.         Status = AE_NOT_IMPLEMENTED;
  372.         break;
  373.     }
  374.  
  375.     if (ActualSrcDesc != SourceDesc)
  376.     {
  377.         /* Delete the intermediate (temporary) source object */
  378.  
  379.         AcpiUtRemoveReference (ActualSrcDesc);
  380.     }
  381.  
  382.     *NewDesc = DestDesc;
  383.     return_ACPI_STATUS (Status);
  384. }
  385.  
  386.  
  387.