Home | History | Annotate | Line # | Download | only in executer
exstoren.c revision 1.1
      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