xref: /onnv-gate/usr/src/uts/intel/io/acpica/utilities/utcopy.c (revision 7851:e828bbb1689c)
13446Smrj /******************************************************************************
23446Smrj  *
33446Smrj  * Module Name: utcopy - Internal to external object translation utilities
4*7851SDana.Myers@Sun.COM  *              $Revision: 1.137 $
53446Smrj  *
63446Smrj  *****************************************************************************/
73446Smrj 
83446Smrj /******************************************************************************
93446Smrj  *
103446Smrj  * 1. Copyright Notice
113446Smrj  *
12*7851SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
133446Smrj  * All rights reserved.
143446Smrj  *
153446Smrj  * 2. License
163446Smrj  *
173446Smrj  * 2.1. This is your license from Intel Corp. under its intellectual property
183446Smrj  * rights.  You may have additional license terms from the party that provided
193446Smrj  * you this software, covering your right to use that party's intellectual
203446Smrj  * property rights.
213446Smrj  *
223446Smrj  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
233446Smrj  * copy of the source code appearing in this file ("Covered Code") an
243446Smrj  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
253446Smrj  * base code distributed originally by Intel ("Original Intel Code") to copy,
263446Smrj  * make derivatives, distribute, use and display any portion of the Covered
273446Smrj  * Code in any form, with the right to sublicense such rights; and
283446Smrj  *
293446Smrj  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
303446Smrj  * license (with the right to sublicense), under only those claims of Intel
313446Smrj  * patents that are infringed by the Original Intel Code, to make, use, sell,
323446Smrj  * offer to sell, and import the Covered Code and derivative works thereof
333446Smrj  * solely to the minimum extent necessary to exercise the above copyright
343446Smrj  * license, and in no event shall the patent license extend to any additions
353446Smrj  * to or modifications of the Original Intel Code.  No other license or right
363446Smrj  * is granted directly or by implication, estoppel or otherwise;
373446Smrj  *
383446Smrj  * The above copyright and patent license is granted only if the following
393446Smrj  * conditions are met:
403446Smrj  *
413446Smrj  * 3. Conditions
423446Smrj  *
433446Smrj  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
443446Smrj  * Redistribution of source code of any substantial portion of the Covered
453446Smrj  * Code or modification with rights to further distribute source must include
463446Smrj  * the above Copyright Notice, the above License, this list of Conditions,
473446Smrj  * and the following Disclaimer and Export Compliance provision.  In addition,
483446Smrj  * Licensee must cause all Covered Code to which Licensee contributes to
493446Smrj  * contain a file documenting the changes Licensee made to create that Covered
503446Smrj  * Code and the date of any change.  Licensee must include in that file the
513446Smrj  * documentation of any changes made by any predecessor Licensee.  Licensee
523446Smrj  * must include a prominent statement that the modification is derived,
533446Smrj  * directly or indirectly, from Original Intel Code.
543446Smrj  *
553446Smrj  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
563446Smrj  * Redistribution of source code of any substantial portion of the Covered
573446Smrj  * Code or modification without rights to further distribute source must
583446Smrj  * include the following Disclaimer and Export Compliance provision in the
593446Smrj  * documentation and/or other materials provided with distribution.  In
603446Smrj  * addition, Licensee may not authorize further sublicense of source of any
613446Smrj  * portion of the Covered Code, and must include terms to the effect that the
623446Smrj  * license from Licensee to its licensee is limited to the intellectual
633446Smrj  * property embodied in the software Licensee provides to its licensee, and
643446Smrj  * not to intellectual property embodied in modifications its licensee may
653446Smrj  * make.
663446Smrj  *
673446Smrj  * 3.3. Redistribution of Executable. Redistribution in executable form of any
683446Smrj  * substantial portion of the Covered Code or modification must reproduce the
693446Smrj  * above Copyright Notice, and the following Disclaimer and Export Compliance
703446Smrj  * provision in the documentation and/or other materials provided with the
713446Smrj  * distribution.
723446Smrj  *
733446Smrj  * 3.4. Intel retains all right, title, and interest in and to the Original
743446Smrj  * Intel Code.
753446Smrj  *
763446Smrj  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
773446Smrj  * Intel shall be used in advertising or otherwise to promote the sale, use or
783446Smrj  * other dealings in products derived from or relating to the Covered Code
793446Smrj  * without prior written authorization from Intel.
803446Smrj  *
813446Smrj  * 4. Disclaimer and Export Compliance
823446Smrj  *
833446Smrj  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
843446Smrj  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
853446Smrj  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
863446Smrj  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
873446Smrj  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
883446Smrj  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
893446Smrj  * PARTICULAR PURPOSE.
903446Smrj  *
913446Smrj  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
923446Smrj  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
933446Smrj  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
943446Smrj  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
953446Smrj  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
963446Smrj  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
973446Smrj  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
983446Smrj  * LIMITED REMEDY.
993446Smrj  *
1003446Smrj  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1013446Smrj  * software or system incorporating such software without first obtaining any
1023446Smrj  * required license or other approval from the U. S. Department of Commerce or
1033446Smrj  * any other agency or department of the United States Government.  In the
1043446Smrj  * event Licensee exports any such software from the United States or
1053446Smrj  * re-exports any such software from a foreign destination, Licensee shall
1063446Smrj  * ensure that the distribution and export/re-export of the software is in
1073446Smrj  * compliance with all laws, regulations, orders, or other restrictions of the
1083446Smrj  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1093446Smrj  * any of its subsidiaries will export/re-export any technical data, process,
1103446Smrj  * software, or service, directly or indirectly, to any country for which the
1113446Smrj  * United States government or any agency thereof requires an export license,
1123446Smrj  * other governmental approval, or letter of assurance, without first obtaining
1133446Smrj  * such license, approval or letter.
1143446Smrj  *
1153446Smrj  *****************************************************************************/
1163446Smrj 
1173446Smrj #define __UTCOPY_C__
1183446Smrj 
1193446Smrj #include "acpi.h"
120*7851SDana.Myers@Sun.COM #include "acnamesp.h"
1213446Smrj 
1223446Smrj 
1233446Smrj #define _COMPONENT          ACPI_UTILITIES
1243446Smrj         ACPI_MODULE_NAME    ("utcopy")
1253446Smrj 
1263446Smrj /* Local prototypes */
1273446Smrj 
1283446Smrj static ACPI_STATUS
1293446Smrj AcpiUtCopyIsimpleToEsimple (
1303446Smrj     ACPI_OPERAND_OBJECT     *InternalObject,
1313446Smrj     ACPI_OBJECT             *ExternalObject,
1323446Smrj     UINT8                   *DataSpace,
1333446Smrj     ACPI_SIZE               *BufferSpaceUsed);
1343446Smrj 
1353446Smrj static ACPI_STATUS
1363446Smrj AcpiUtCopyIelementToIelement (
1373446Smrj     UINT8                   ObjectType,
1383446Smrj     ACPI_OPERAND_OBJECT     *SourceObject,
1393446Smrj     ACPI_GENERIC_STATE      *State,
1403446Smrj     void                    *Context);
1413446Smrj 
1423446Smrj static ACPI_STATUS
1433446Smrj AcpiUtCopyIpackageToEpackage (
1443446Smrj     ACPI_OPERAND_OBJECT     *InternalObject,
1453446Smrj     UINT8                   *Buffer,
1463446Smrj     ACPI_SIZE               *SpaceUsed);
1473446Smrj 
1483446Smrj static ACPI_STATUS
1493446Smrj AcpiUtCopyEsimpleToIsimple(
1503446Smrj     ACPI_OBJECT             *UserObj,
1513446Smrj     ACPI_OPERAND_OBJECT     **ReturnObj);
1523446Smrj 
1533446Smrj static ACPI_STATUS
154*7851SDana.Myers@Sun.COM AcpiUtCopyEpackageToIpackage (
155*7851SDana.Myers@Sun.COM     ACPI_OBJECT             *ExternalObject,
156*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **InternalObject);
157*7851SDana.Myers@Sun.COM 
158*7851SDana.Myers@Sun.COM static ACPI_STATUS
1593446Smrj AcpiUtCopySimpleObject (
1603446Smrj     ACPI_OPERAND_OBJECT     *SourceDesc,
1613446Smrj     ACPI_OPERAND_OBJECT     *DestDesc);
1623446Smrj 
1633446Smrj static ACPI_STATUS
1643446Smrj AcpiUtCopyIelementToEelement (
1653446Smrj     UINT8                   ObjectType,
1663446Smrj     ACPI_OPERAND_OBJECT     *SourceObject,
1673446Smrj     ACPI_GENERIC_STATE      *State,
1683446Smrj     void                    *Context);
1693446Smrj 
1703446Smrj static ACPI_STATUS
1713446Smrj AcpiUtCopyIpackageToIpackage (
1723446Smrj     ACPI_OPERAND_OBJECT     *SourceObj,
1733446Smrj     ACPI_OPERAND_OBJECT     *DestObj,
1743446Smrj     ACPI_WALK_STATE         *WalkState);
1753446Smrj 
1763446Smrj 
1773446Smrj /*******************************************************************************
1783446Smrj  *
1793446Smrj  * FUNCTION:    AcpiUtCopyIsimpleToEsimple
1803446Smrj  *
1813446Smrj  * PARAMETERS:  InternalObject      - Source object to be copied
1823446Smrj  *              ExternalObject      - Where to return the copied object
1833446Smrj  *              DataSpace           - Where object data is returned (such as
1843446Smrj  *                                    buffer and string data)
1853446Smrj  *              BufferSpaceUsed     - Length of DataSpace that was used
1863446Smrj  *
1873446Smrj  * RETURN:      Status
1883446Smrj  *
1893446Smrj  * DESCRIPTION: This function is called to copy a simple internal object to
1903446Smrj  *              an external object.
1913446Smrj  *
1923446Smrj  *              The DataSpace buffer is assumed to have sufficient space for
1933446Smrj  *              the object.
1943446Smrj  *
1953446Smrj  ******************************************************************************/
1963446Smrj 
1973446Smrj static ACPI_STATUS
1983446Smrj AcpiUtCopyIsimpleToEsimple (
1993446Smrj     ACPI_OPERAND_OBJECT     *InternalObject,
2003446Smrj     ACPI_OBJECT             *ExternalObject,
2013446Smrj     UINT8                   *DataSpace,
2023446Smrj     ACPI_SIZE               *BufferSpaceUsed)
2033446Smrj {
2043446Smrj     ACPI_STATUS             Status = AE_OK;
2053446Smrj 
2063446Smrj 
2073446Smrj     ACPI_FUNCTION_TRACE (UtCopyIsimpleToEsimple);
2083446Smrj 
2093446Smrj 
2103446Smrj     *BufferSpaceUsed = 0;
2113446Smrj 
2123446Smrj     /*
2133446Smrj      * Check for NULL object case (could be an uninitialized
2143446Smrj      * package element)
2153446Smrj      */
2163446Smrj     if (!InternalObject)
2173446Smrj     {
2183446Smrj         return_ACPI_STATUS (AE_OK);
2193446Smrj     }
2203446Smrj 
2213446Smrj     /* Always clear the external object */
2223446Smrj 
2233446Smrj     ACPI_MEMSET (ExternalObject, 0, sizeof (ACPI_OBJECT));
2243446Smrj 
2253446Smrj     /*
2263446Smrj      * In general, the external object will be the same type as
2273446Smrj      * the internal object
2283446Smrj      */
2293446Smrj     ExternalObject->Type = ACPI_GET_OBJECT_TYPE (InternalObject);
2303446Smrj 
2313446Smrj     /* However, only a limited number of external types are supported */
2323446Smrj 
2333446Smrj     switch (ACPI_GET_OBJECT_TYPE (InternalObject))
2343446Smrj     {
2353446Smrj     case ACPI_TYPE_STRING:
2363446Smrj 
2373446Smrj         ExternalObject->String.Pointer = (char *) DataSpace;
2383446Smrj         ExternalObject->String.Length  = InternalObject->String.Length;
2393446Smrj         *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD (
2403446Smrj                             (ACPI_SIZE) InternalObject->String.Length + 1);
2413446Smrj 
2423446Smrj         ACPI_MEMCPY ((void *) DataSpace,
2433446Smrj             (void *) InternalObject->String.Pointer,
2443446Smrj             (ACPI_SIZE) InternalObject->String.Length + 1);
2453446Smrj         break;
2463446Smrj 
2473446Smrj 
2483446Smrj     case ACPI_TYPE_BUFFER:
2493446Smrj 
2503446Smrj         ExternalObject->Buffer.Pointer = DataSpace;
2513446Smrj         ExternalObject->Buffer.Length  = InternalObject->Buffer.Length;
2523446Smrj         *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD (
2533446Smrj                             InternalObject->String.Length);
2543446Smrj 
2553446Smrj         ACPI_MEMCPY ((void *) DataSpace,
2563446Smrj             (void *) InternalObject->Buffer.Pointer,
2573446Smrj             InternalObject->Buffer.Length);
2583446Smrj         break;
2593446Smrj 
2603446Smrj 
2613446Smrj     case ACPI_TYPE_INTEGER:
2623446Smrj 
2633446Smrj         ExternalObject->Integer.Value = InternalObject->Integer.Value;
2643446Smrj         break;
2653446Smrj 
2663446Smrj 
2673446Smrj     case ACPI_TYPE_LOCAL_REFERENCE:
2683446Smrj 
269*7851SDana.Myers@Sun.COM         /* This is an object reference. */
270*7851SDana.Myers@Sun.COM 
271*7851SDana.Myers@Sun.COM         switch (InternalObject->Reference.Class)
2723446Smrj         {
273*7851SDana.Myers@Sun.COM         case ACPI_REFCLASS_NAME:
2743446Smrj 
275*7851SDana.Myers@Sun.COM             /*
276*7851SDana.Myers@Sun.COM              * For namepath, return the object handle ("reference")
277*7851SDana.Myers@Sun.COM              * We are referring to the namespace node
278*7851SDana.Myers@Sun.COM              */
279*7851SDana.Myers@Sun.COM             ExternalObject->Reference.Handle =
280*7851SDana.Myers@Sun.COM                 InternalObject->Reference.Node;
281*7851SDana.Myers@Sun.COM             ExternalObject->Reference.ActualType =
282*7851SDana.Myers@Sun.COM                 AcpiNsGetType (InternalObject->Reference.Node);
283*7851SDana.Myers@Sun.COM             break;
2843446Smrj 
2853446Smrj         default:
286*7851SDana.Myers@Sun.COM 
287*7851SDana.Myers@Sun.COM             /* All other reference types are unsupported */
288*7851SDana.Myers@Sun.COM 
289*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_TYPE);
2903446Smrj         }
2913446Smrj         break;
2923446Smrj 
2933446Smrj 
2943446Smrj     case ACPI_TYPE_PROCESSOR:
2953446Smrj 
296*7851SDana.Myers@Sun.COM         ExternalObject->Processor.ProcId =
297*7851SDana.Myers@Sun.COM             InternalObject->Processor.ProcId;
298*7851SDana.Myers@Sun.COM         ExternalObject->Processor.PblkAddress =
299*7851SDana.Myers@Sun.COM             InternalObject->Processor.Address;
300*7851SDana.Myers@Sun.COM         ExternalObject->Processor.PblkLength =
301*7851SDana.Myers@Sun.COM             InternalObject->Processor.Length;
3023446Smrj         break;
3033446Smrj 
3043446Smrj 
3053446Smrj     case ACPI_TYPE_POWER:
3063446Smrj 
3073446Smrj         ExternalObject->PowerResource.SystemLevel =
308*7851SDana.Myers@Sun.COM             InternalObject->PowerResource.SystemLevel;
3093446Smrj 
3103446Smrj         ExternalObject->PowerResource.ResourceOrder =
311*7851SDana.Myers@Sun.COM             InternalObject->PowerResource.ResourceOrder;
3123446Smrj         break;
3133446Smrj 
3143446Smrj 
3153446Smrj     default:
3163446Smrj         /*
3173446Smrj          * There is no corresponding external object type
3183446Smrj          */
319*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
320*7851SDana.Myers@Sun.COM             "Unsupported object type, cannot convert to external object: %s",
321*7851SDana.Myers@Sun.COM             AcpiUtGetTypeName (ACPI_GET_OBJECT_TYPE (InternalObject))));
322*7851SDana.Myers@Sun.COM 
3233446Smrj         return_ACPI_STATUS (AE_SUPPORT);
3243446Smrj     }
3253446Smrj 
3263446Smrj     return_ACPI_STATUS (Status);
3273446Smrj }
3283446Smrj 
3293446Smrj 
3303446Smrj /*******************************************************************************
3313446Smrj  *
3323446Smrj  * FUNCTION:    AcpiUtCopyIelementToEelement
3333446Smrj  *
3343446Smrj  * PARAMETERS:  ACPI_PKG_CALLBACK
3353446Smrj  *
3363446Smrj  * RETURN:      Status
3373446Smrj  *
3383446Smrj  * DESCRIPTION: Copy one package element to another package element
3393446Smrj  *
3403446Smrj  ******************************************************************************/
3413446Smrj 
3423446Smrj static ACPI_STATUS
3433446Smrj AcpiUtCopyIelementToEelement (
3443446Smrj     UINT8                   ObjectType,
3453446Smrj     ACPI_OPERAND_OBJECT     *SourceObject,
3463446Smrj     ACPI_GENERIC_STATE      *State,
3473446Smrj     void                    *Context)
3483446Smrj {
3493446Smrj     ACPI_STATUS             Status = AE_OK;
3503446Smrj     ACPI_PKG_INFO           *Info = (ACPI_PKG_INFO *) Context;
3513446Smrj     ACPI_SIZE               ObjectSpace;
3523446Smrj     UINT32                  ThisIndex;
3533446Smrj     ACPI_OBJECT             *TargetObject;
3543446Smrj 
3553446Smrj 
3563446Smrj     ACPI_FUNCTION_ENTRY ();
3573446Smrj 
3583446Smrj 
3593446Smrj     ThisIndex    = State->Pkg.Index;
3603446Smrj     TargetObject = (ACPI_OBJECT *)
3613446Smrj         &((ACPI_OBJECT *)(State->Pkg.DestObject))->Package.Elements[ThisIndex];
3623446Smrj 
3633446Smrj     switch (ObjectType)
3643446Smrj     {
3653446Smrj     case ACPI_COPY_TYPE_SIMPLE:
3663446Smrj 
3673446Smrj         /*
3683446Smrj          * This is a simple or null object
3693446Smrj          */
3703446Smrj         Status = AcpiUtCopyIsimpleToEsimple (SourceObject,
3713446Smrj                         TargetObject, Info->FreeSpace, &ObjectSpace);
3723446Smrj         if (ACPI_FAILURE (Status))
3733446Smrj         {
3743446Smrj             return (Status);
3753446Smrj         }
3763446Smrj         break;
3773446Smrj 
3783446Smrj 
3793446Smrj     case ACPI_COPY_TYPE_PACKAGE:
3803446Smrj 
3813446Smrj         /*
3823446Smrj          * Build the package object
3833446Smrj          */
3843446Smrj         TargetObject->Type              = ACPI_TYPE_PACKAGE;
3853446Smrj         TargetObject->Package.Count     = SourceObject->Package.Count;
3863446Smrj         TargetObject->Package.Elements  =
3873446Smrj             ACPI_CAST_PTR (ACPI_OBJECT, Info->FreeSpace);
3883446Smrj 
3893446Smrj         /*
3903446Smrj          * Pass the new package object back to the package walk routine
3913446Smrj          */
3923446Smrj         State->Pkg.ThisTargetObj = TargetObject;
3933446Smrj 
3943446Smrj         /*
3953446Smrj          * Save space for the array of objects (Package elements)
3963446Smrj          * update the buffer length counter
3973446Smrj          */
3983446Smrj         ObjectSpace = ACPI_ROUND_UP_TO_NATIVE_WORD (
3993446Smrj                             (ACPI_SIZE) TargetObject->Package.Count *
4003446Smrj                             sizeof (ACPI_OBJECT));
4013446Smrj         break;
4023446Smrj 
4033446Smrj 
4043446Smrj     default:
4053446Smrj         return (AE_BAD_PARAMETER);
4063446Smrj     }
4073446Smrj 
4083446Smrj     Info->FreeSpace   += ObjectSpace;
4093446Smrj     Info->Length      += ObjectSpace;
4103446Smrj     return (Status);
4113446Smrj }
4123446Smrj 
4133446Smrj 
4143446Smrj /*******************************************************************************
4153446Smrj  *
4163446Smrj  * FUNCTION:    AcpiUtCopyIpackageToEpackage
4173446Smrj  *
4183446Smrj  * PARAMETERS:  InternalObject      - Pointer to the object we are returning
4193446Smrj  *              Buffer              - Where the object is returned
4203446Smrj  *              SpaceUsed           - Where the object length is returned
4213446Smrj  *
4223446Smrj  * RETURN:      Status
4233446Smrj  *
4243446Smrj  * DESCRIPTION: This function is called to place a package object in a user
4253446Smrj  *              buffer.  A package object by definition contains other objects.
4263446Smrj  *
4273446Smrj  *              The buffer is assumed to have sufficient space for the object.
4283446Smrj  *              The caller must have verified the buffer length needed using the
4293446Smrj  *              AcpiUtGetObjectSize function before calling this function.
4303446Smrj  *
4313446Smrj  ******************************************************************************/
4323446Smrj 
4333446Smrj static ACPI_STATUS
4343446Smrj AcpiUtCopyIpackageToEpackage (
4353446Smrj     ACPI_OPERAND_OBJECT     *InternalObject,
4363446Smrj     UINT8                   *Buffer,
4373446Smrj     ACPI_SIZE               *SpaceUsed)
4383446Smrj {
4393446Smrj     ACPI_OBJECT             *ExternalObject;
4403446Smrj     ACPI_STATUS             Status;
4413446Smrj     ACPI_PKG_INFO           Info;
4423446Smrj 
4433446Smrj 
4443446Smrj     ACPI_FUNCTION_TRACE (UtCopyIpackageToEpackage);
4453446Smrj 
4463446Smrj 
4473446Smrj     /*
4483446Smrj      * First package at head of the buffer
4493446Smrj      */
4503446Smrj     ExternalObject = ACPI_CAST_PTR (ACPI_OBJECT, Buffer);
4513446Smrj 
4523446Smrj     /*
4533446Smrj      * Free space begins right after the first package
4543446Smrj      */
4553446Smrj     Info.Length      = ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));
4563446Smrj     Info.FreeSpace   = Buffer + ACPI_ROUND_UP_TO_NATIVE_WORD (
4573446Smrj                                     sizeof (ACPI_OBJECT));
4583446Smrj     Info.ObjectSpace = 0;
4593446Smrj     Info.NumPackages = 1;
4603446Smrj 
4613446Smrj     ExternalObject->Type             = ACPI_GET_OBJECT_TYPE (InternalObject);
4623446Smrj     ExternalObject->Package.Count    = InternalObject->Package.Count;
4633446Smrj     ExternalObject->Package.Elements = ACPI_CAST_PTR (ACPI_OBJECT,
4643446Smrj                                             Info.FreeSpace);
4653446Smrj 
4663446Smrj     /*
4673446Smrj      * Leave room for an array of ACPI_OBJECTS in the buffer
4683446Smrj      * and move the free space past it
4693446Smrj      */
4703446Smrj     Info.Length    += (ACPI_SIZE) ExternalObject->Package.Count *
4713446Smrj                             ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));
4723446Smrj     Info.FreeSpace += ExternalObject->Package.Count *
4733446Smrj                             ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));
4743446Smrj 
4753446Smrj     Status = AcpiUtWalkPackageTree (InternalObject, ExternalObject,
4763446Smrj                 AcpiUtCopyIelementToEelement, &Info);
4773446Smrj 
4783446Smrj     *SpaceUsed = Info.Length;
4793446Smrj     return_ACPI_STATUS (Status);
4803446Smrj }
4813446Smrj 
4823446Smrj 
4833446Smrj /*******************************************************************************
4843446Smrj  *
4853446Smrj  * FUNCTION:    AcpiUtCopyIobjectToEobject
4863446Smrj  *
4873446Smrj  * PARAMETERS:  InternalObject      - The internal object to be converted
4883446Smrj  *              BufferPtr           - Where the object is returned
4893446Smrj  *
4903446Smrj  * RETURN:      Status
4913446Smrj  *
4923446Smrj  * DESCRIPTION: This function is called to build an API object to be returned to
4933446Smrj  *              the caller.
4943446Smrj  *
4953446Smrj  ******************************************************************************/
4963446Smrj 
4973446Smrj ACPI_STATUS
4983446Smrj AcpiUtCopyIobjectToEobject (
4993446Smrj     ACPI_OPERAND_OBJECT     *InternalObject,
5003446Smrj     ACPI_BUFFER             *RetBuffer)
5013446Smrj {
5023446Smrj     ACPI_STATUS             Status;
5033446Smrj 
5043446Smrj 
5053446Smrj     ACPI_FUNCTION_TRACE (UtCopyIobjectToEobject);
5063446Smrj 
5073446Smrj 
5083446Smrj     if (ACPI_GET_OBJECT_TYPE (InternalObject) == ACPI_TYPE_PACKAGE)
5093446Smrj     {
5103446Smrj         /*
5113446Smrj          * Package object:  Copy all subobjects (including
5123446Smrj          * nested packages)
5133446Smrj          */
5143446Smrj         Status = AcpiUtCopyIpackageToEpackage (InternalObject,
5153446Smrj                         RetBuffer->Pointer, &RetBuffer->Length);
5163446Smrj     }
5173446Smrj     else
5183446Smrj     {
5193446Smrj         /*
5203446Smrj          * Build a simple object (no nested objects)
5213446Smrj          */
5223446Smrj         Status = AcpiUtCopyIsimpleToEsimple (InternalObject,
5233446Smrj                     ACPI_CAST_PTR (ACPI_OBJECT, RetBuffer->Pointer),
5243446Smrj                     ACPI_ADD_PTR (UINT8, RetBuffer->Pointer,
5253446Smrj                         ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT))),
5263446Smrj                     &RetBuffer->Length);
5273446Smrj         /*
5283446Smrj          * build simple does not include the object size in the length
5293446Smrj          * so we add it in here
5303446Smrj          */
5313446Smrj         RetBuffer->Length += sizeof (ACPI_OBJECT);
5323446Smrj     }
5333446Smrj 
5343446Smrj     return_ACPI_STATUS (Status);
5353446Smrj }
5363446Smrj 
5373446Smrj 
5383446Smrj /*******************************************************************************
5393446Smrj  *
5403446Smrj  * FUNCTION:    AcpiUtCopyEsimpleToIsimple
5413446Smrj  *
5423446Smrj  * PARAMETERS:  ExternalObject      - The external object to be converted
5433446Smrj  *              RetInternalObject   - Where the internal object is returned
5443446Smrj  *
5453446Smrj  * RETURN:      Status
5463446Smrj  *
5473446Smrj  * DESCRIPTION: This function copies an external object to an internal one.
5483446Smrj  *              NOTE: Pointers can be copied, we don't need to copy data.
5493446Smrj  *              (The pointers have to be valid in our address space no matter
5503446Smrj  *              what we do with them!)
5513446Smrj  *
5523446Smrj  ******************************************************************************/
5533446Smrj 
5543446Smrj static ACPI_STATUS
5553446Smrj AcpiUtCopyEsimpleToIsimple (
5563446Smrj     ACPI_OBJECT             *ExternalObject,
5573446Smrj     ACPI_OPERAND_OBJECT     **RetInternalObject)
5583446Smrj {
5593446Smrj     ACPI_OPERAND_OBJECT     *InternalObject;
5603446Smrj 
5613446Smrj 
5623446Smrj     ACPI_FUNCTION_TRACE (UtCopyEsimpleToIsimple);
5633446Smrj 
5643446Smrj 
5653446Smrj     /*
5663446Smrj      * Simple types supported are: String, Buffer, Integer
5673446Smrj      */
5683446Smrj     switch (ExternalObject->Type)
5693446Smrj     {
5703446Smrj     case ACPI_TYPE_STRING:
5713446Smrj     case ACPI_TYPE_BUFFER:
5723446Smrj     case ACPI_TYPE_INTEGER:
573*7851SDana.Myers@Sun.COM     case ACPI_TYPE_LOCAL_REFERENCE:
5743446Smrj 
5753446Smrj         InternalObject = AcpiUtCreateInternalObject (
5763446Smrj                             (UINT8) ExternalObject->Type);
5773446Smrj         if (!InternalObject)
5783446Smrj         {
5793446Smrj             return_ACPI_STATUS (AE_NO_MEMORY);
5803446Smrj         }
5813446Smrj         break;
5823446Smrj 
583*7851SDana.Myers@Sun.COM     case ACPI_TYPE_ANY: /* This is the case for a NULL object */
584*7851SDana.Myers@Sun.COM 
585*7851SDana.Myers@Sun.COM         *RetInternalObject = NULL;
586*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
587*7851SDana.Myers@Sun.COM 
5883446Smrj     default:
5893446Smrj         /* All other types are not supported */
5903446Smrj 
591*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Unsupported object type, cannot convert to internal object: %s",
592*7851SDana.Myers@Sun.COM             AcpiUtGetTypeName (ExternalObject->Type)));
593*7851SDana.Myers@Sun.COM 
5943446Smrj         return_ACPI_STATUS (AE_SUPPORT);
5953446Smrj     }
5963446Smrj 
5973446Smrj 
5983446Smrj     /* Must COPY string and buffer contents */
5993446Smrj 
6003446Smrj     switch (ExternalObject->Type)
6013446Smrj     {
6023446Smrj     case ACPI_TYPE_STRING:
6033446Smrj 
6043446Smrj         InternalObject->String.Pointer =
6053446Smrj             ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) ExternalObject->String.Length + 1);
6063446Smrj         if (!InternalObject->String.Pointer)
6073446Smrj         {
6083446Smrj             goto ErrorExit;
6093446Smrj         }
6103446Smrj 
6113446Smrj         ACPI_MEMCPY (InternalObject->String.Pointer,
6123446Smrj                      ExternalObject->String.Pointer,
6133446Smrj                      ExternalObject->String.Length);
6143446Smrj 
6153446Smrj         InternalObject->String.Length  = ExternalObject->String.Length;
6163446Smrj         break;
6173446Smrj 
6183446Smrj 
6193446Smrj     case ACPI_TYPE_BUFFER:
6203446Smrj 
6213446Smrj         InternalObject->Buffer.Pointer =
6223446Smrj             ACPI_ALLOCATE_ZEROED (ExternalObject->Buffer.Length);
6233446Smrj         if (!InternalObject->Buffer.Pointer)
6243446Smrj         {
6253446Smrj             goto ErrorExit;
6263446Smrj         }
6273446Smrj 
6283446Smrj         ACPI_MEMCPY (InternalObject->Buffer.Pointer,
6293446Smrj                      ExternalObject->Buffer.Pointer,
6303446Smrj                      ExternalObject->Buffer.Length);
6313446Smrj 
6323446Smrj         InternalObject->Buffer.Length  = ExternalObject->Buffer.Length;
633*7851SDana.Myers@Sun.COM 
634*7851SDana.Myers@Sun.COM         /* Mark buffer data valid */
635*7851SDana.Myers@Sun.COM 
636*7851SDana.Myers@Sun.COM         InternalObject->Buffer.Flags |= AOPOBJ_DATA_VALID;
6373446Smrj         break;
6383446Smrj 
6393446Smrj 
6403446Smrj     case ACPI_TYPE_INTEGER:
6413446Smrj 
6423446Smrj         InternalObject->Integer.Value   = ExternalObject->Integer.Value;
6433446Smrj         break;
6443446Smrj 
645*7851SDana.Myers@Sun.COM     case ACPI_TYPE_LOCAL_REFERENCE:
646*7851SDana.Myers@Sun.COM 
647*7851SDana.Myers@Sun.COM         /* TBD: should validate incoming handle */
648*7851SDana.Myers@Sun.COM 
649*7851SDana.Myers@Sun.COM         InternalObject->Reference.Class = ACPI_REFCLASS_NAME;
650*7851SDana.Myers@Sun.COM         InternalObject->Reference.Node = ExternalObject->Reference.Handle;
651*7851SDana.Myers@Sun.COM         break;
652*7851SDana.Myers@Sun.COM 
6533446Smrj     default:
6543446Smrj         /* Other types can't get here */
6553446Smrj         break;
6563446Smrj     }
6573446Smrj 
6583446Smrj     *RetInternalObject = InternalObject;
6593446Smrj     return_ACPI_STATUS (AE_OK);
6603446Smrj 
6613446Smrj 
6623446Smrj ErrorExit:
6633446Smrj     AcpiUtRemoveReference (InternalObject);
6643446Smrj     return_ACPI_STATUS (AE_NO_MEMORY);
6653446Smrj }
6663446Smrj 
6673446Smrj 
6683446Smrj /*******************************************************************************
6693446Smrj  *
6703446Smrj  * FUNCTION:    AcpiUtCopyEpackageToIpackage
6713446Smrj  *
672*7851SDana.Myers@Sun.COM  * PARAMETERS:  ExternalObject      - The external object to be converted
673*7851SDana.Myers@Sun.COM  *              InternalObject      - Where the internal object is returned
6743446Smrj  *
6753446Smrj  * RETURN:      Status
6763446Smrj  *
677*7851SDana.Myers@Sun.COM  * DESCRIPTION: Copy an external package object to an internal package.
678*7851SDana.Myers@Sun.COM  *              Handles nested packages.
6793446Smrj  *
6803446Smrj  ******************************************************************************/
6813446Smrj 
6823446Smrj static ACPI_STATUS
6833446Smrj AcpiUtCopyEpackageToIpackage (
684*7851SDana.Myers@Sun.COM     ACPI_OBJECT             *ExternalObject,
685*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **InternalObject)
6863446Smrj {
687*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
688*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *PackageObject;
689*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **PackageElements;
690*7851SDana.Myers@Sun.COM     UINT32                  i;
6913446Smrj 
6923446Smrj 
6933446Smrj     ACPI_FUNCTION_TRACE (UtCopyEpackageToIpackage);
6943446Smrj 
6953446Smrj 
696*7851SDana.Myers@Sun.COM     /* Create the package object */
697*7851SDana.Myers@Sun.COM 
698*7851SDana.Myers@Sun.COM     PackageObject = AcpiUtCreatePackageObject (ExternalObject->Package.Count);
699*7851SDana.Myers@Sun.COM     if (!PackageObject)
700*7851SDana.Myers@Sun.COM     {
701*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NO_MEMORY);
702*7851SDana.Myers@Sun.COM     }
703*7851SDana.Myers@Sun.COM 
704*7851SDana.Myers@Sun.COM     PackageElements = PackageObject->Package.Elements;
7053446Smrj 
7063446Smrj     /*
707*7851SDana.Myers@Sun.COM      * Recursive implementation. Probably ok, since nested external packages
708*7851SDana.Myers@Sun.COM      * as parameters should be very rare.
7093446Smrj      */
710*7851SDana.Myers@Sun.COM     for (i = 0; i < ExternalObject->Package.Count; i++)
711*7851SDana.Myers@Sun.COM     {
712*7851SDana.Myers@Sun.COM         Status = AcpiUtCopyEobjectToIobject (
713*7851SDana.Myers@Sun.COM                     &ExternalObject->Package.Elements[i],
714*7851SDana.Myers@Sun.COM                     &PackageElements[i]);
715*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
716*7851SDana.Myers@Sun.COM         {
717*7851SDana.Myers@Sun.COM             /* Truncate package and delete it */
7183446Smrj 
719*7851SDana.Myers@Sun.COM             PackageObject->Package.Count = i;
720*7851SDana.Myers@Sun.COM             PackageElements[i] = NULL;
721*7851SDana.Myers@Sun.COM             AcpiUtRemoveReference (PackageObject);
722*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (Status);
723*7851SDana.Myers@Sun.COM         }
724*7851SDana.Myers@Sun.COM     }
7253446Smrj 
726*7851SDana.Myers@Sun.COM     /* Mark package data valid */
7273446Smrj 
728*7851SDana.Myers@Sun.COM     PackageObject->Package.Flags |= AOPOBJ_DATA_VALID;
7293446Smrj 
730*7851SDana.Myers@Sun.COM     *InternalObject = PackageObject;
731*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
7323446Smrj }
7333446Smrj 
7343446Smrj 
7353446Smrj /*******************************************************************************
7363446Smrj  *
7373446Smrj  * FUNCTION:    AcpiUtCopyEobjectToIobject
7383446Smrj  *
739*7851SDana.Myers@Sun.COM  * PARAMETERS:  ExternalObject      - The external object to be converted
740*7851SDana.Myers@Sun.COM  *              InternalObject      - Where the internal object is returned
7413446Smrj  *
742*7851SDana.Myers@Sun.COM  * RETURN:      Status              - the status of the call
7433446Smrj  *
7443446Smrj  * DESCRIPTION: Converts an external object to an internal object.
7453446Smrj  *
7463446Smrj  ******************************************************************************/
7473446Smrj 
7483446Smrj ACPI_STATUS
7493446Smrj AcpiUtCopyEobjectToIobject (
7503446Smrj     ACPI_OBJECT             *ExternalObject,
7513446Smrj     ACPI_OPERAND_OBJECT     **InternalObject)
7523446Smrj {
7533446Smrj     ACPI_STATUS             Status;
7543446Smrj 
7553446Smrj 
7563446Smrj     ACPI_FUNCTION_TRACE (UtCopyEobjectToIobject);
7573446Smrj 
7583446Smrj 
7593446Smrj     if (ExternalObject->Type == ACPI_TYPE_PACKAGE)
7603446Smrj     {
761*7851SDana.Myers@Sun.COM         Status = AcpiUtCopyEpackageToIpackage (ExternalObject, InternalObject);
7623446Smrj     }
7633446Smrj     else
7643446Smrj     {
7653446Smrj         /*
7663446Smrj          * Build a simple object (no nested objects)
7673446Smrj          */
7683446Smrj         Status = AcpiUtCopyEsimpleToIsimple (ExternalObject, InternalObject);
7693446Smrj     }
7703446Smrj 
7713446Smrj     return_ACPI_STATUS (Status);
7723446Smrj }
7733446Smrj 
7743446Smrj 
7753446Smrj /*******************************************************************************
7763446Smrj  *
7773446Smrj  * FUNCTION:    AcpiUtCopySimpleObject
7783446Smrj  *
7793446Smrj  * PARAMETERS:  SourceDesc          - The internal object to be copied
7803446Smrj  *              DestDesc            - New target object
7813446Smrj  *
7823446Smrj  * RETURN:      Status
7833446Smrj  *
7843446Smrj  * DESCRIPTION: Simple copy of one internal object to another.  Reference count
7853446Smrj  *              of the destination object is preserved.
7863446Smrj  *
7873446Smrj  ******************************************************************************/
7883446Smrj 
7893446Smrj static ACPI_STATUS
7903446Smrj AcpiUtCopySimpleObject (
7913446Smrj     ACPI_OPERAND_OBJECT     *SourceDesc,
7923446Smrj     ACPI_OPERAND_OBJECT     *DestDesc)
7933446Smrj {
7943446Smrj     UINT16                  ReferenceCount;
7953446Smrj     ACPI_OPERAND_OBJECT     *NextObject;
7963446Smrj 
7973446Smrj 
7983446Smrj     /* Save fields from destination that we don't want to overwrite */
7993446Smrj 
8003446Smrj     ReferenceCount = DestDesc->Common.ReferenceCount;
8013446Smrj     NextObject = DestDesc->Common.NextObject;
8023446Smrj 
8033446Smrj     /* Copy the entire source object over the destination object*/
8043446Smrj 
8053446Smrj     ACPI_MEMCPY ((char *) DestDesc, (char *) SourceDesc,
8063446Smrj                     sizeof (ACPI_OPERAND_OBJECT));
8073446Smrj 
8083446Smrj     /* Restore the saved fields */
8093446Smrj 
8103446Smrj     DestDesc->Common.ReferenceCount = ReferenceCount;
8113446Smrj     DestDesc->Common.NextObject = NextObject;
8123446Smrj 
8133446Smrj     /* New object is not static, regardless of source */
8143446Smrj 
8153446Smrj     DestDesc->Common.Flags &= ~AOPOBJ_STATIC_POINTER;
8163446Smrj 
8173446Smrj     /* Handle the objects with extra data */
8183446Smrj 
8193446Smrj     switch (ACPI_GET_OBJECT_TYPE (DestDesc))
8203446Smrj     {
8213446Smrj     case ACPI_TYPE_BUFFER:
8223446Smrj         /*
8233446Smrj          * Allocate and copy the actual buffer if and only if:
8243446Smrj          * 1) There is a valid buffer pointer
8253446Smrj          * 2) The buffer has a length > 0
8263446Smrj          */
8273446Smrj         if ((SourceDesc->Buffer.Pointer) &&
8283446Smrj             (SourceDesc->Buffer.Length))
8293446Smrj         {
8303446Smrj             DestDesc->Buffer.Pointer =
8313446Smrj                 ACPI_ALLOCATE (SourceDesc->Buffer.Length);
8323446Smrj             if (!DestDesc->Buffer.Pointer)
8333446Smrj             {
8343446Smrj                 return (AE_NO_MEMORY);
8353446Smrj             }
8363446Smrj 
8373446Smrj             /* Copy the actual buffer data */
8383446Smrj 
8393446Smrj             ACPI_MEMCPY (DestDesc->Buffer.Pointer,
8403446Smrj                     SourceDesc->Buffer.Pointer,
8413446Smrj                     SourceDesc->Buffer.Length);
8423446Smrj         }
8433446Smrj         break;
8443446Smrj 
8453446Smrj     case ACPI_TYPE_STRING:
8463446Smrj         /*
8473446Smrj          * Allocate and copy the actual string if and only if:
8483446Smrj          * 1) There is a valid string pointer
8493446Smrj          * (Pointer to a NULL string is allowed)
8503446Smrj          */
8513446Smrj         if (SourceDesc->String.Pointer)
8523446Smrj         {
8533446Smrj             DestDesc->String.Pointer =
8543446Smrj                 ACPI_ALLOCATE ((ACPI_SIZE) SourceDesc->String.Length + 1);
8553446Smrj             if (!DestDesc->String.Pointer)
8563446Smrj             {
8573446Smrj                 return (AE_NO_MEMORY);
8583446Smrj             }
8593446Smrj 
8603446Smrj             /* Copy the actual string data */
8613446Smrj 
8623446Smrj             ACPI_MEMCPY (DestDesc->String.Pointer, SourceDesc->String.Pointer,
8633446Smrj                          (ACPI_SIZE) SourceDesc->String.Length + 1);
8643446Smrj         }
8653446Smrj         break;
8663446Smrj 
8673446Smrj     case ACPI_TYPE_LOCAL_REFERENCE:
8683446Smrj         /*
8693446Smrj          * We copied the reference object, so we now must add a reference
8703446Smrj          * to the object pointed to by the reference
871*7851SDana.Myers@Sun.COM          *
872*7851SDana.Myers@Sun.COM          * DDBHandle reference (from Load/LoadTable) is a special reference,
873*7851SDana.Myers@Sun.COM          * it does not have a Reference.Object, so does not need to
874*7851SDana.Myers@Sun.COM          * increase the reference count
8753446Smrj          */
876*7851SDana.Myers@Sun.COM         if (SourceDesc->Reference.Class == ACPI_REFCLASS_TABLE)
877*7851SDana.Myers@Sun.COM         {
878*7851SDana.Myers@Sun.COM             break;
879*7851SDana.Myers@Sun.COM         }
880*7851SDana.Myers@Sun.COM 
8813446Smrj         AcpiUtAddReference (SourceDesc->Reference.Object);
8823446Smrj         break;
8833446Smrj 
8843446Smrj     case ACPI_TYPE_REGION:
8853446Smrj         /*
8863446Smrj          * We copied the Region Handler, so we now must add a reference
8873446Smrj          */
8883446Smrj         if (DestDesc->Region.Handler)
8893446Smrj         {
8903446Smrj             AcpiUtAddReference (DestDesc->Region.Handler);
8913446Smrj         }
8923446Smrj         break;
8933446Smrj 
8943446Smrj     default:
8953446Smrj         /* Nothing to do for other simple objects */
8963446Smrj         break;
8973446Smrj     }
8983446Smrj 
8993446Smrj     return (AE_OK);
9003446Smrj }
9013446Smrj 
9023446Smrj 
9033446Smrj /*******************************************************************************
9043446Smrj  *
9053446Smrj  * FUNCTION:    AcpiUtCopyIelementToIelement
9063446Smrj  *
9073446Smrj  * PARAMETERS:  ACPI_PKG_CALLBACK
9083446Smrj  *
9093446Smrj  * RETURN:      Status
9103446Smrj  *
9113446Smrj  * DESCRIPTION: Copy one package element to another package element
9123446Smrj  *
9133446Smrj  ******************************************************************************/
9143446Smrj 
9153446Smrj static ACPI_STATUS
9163446Smrj AcpiUtCopyIelementToIelement (
9173446Smrj     UINT8                   ObjectType,
9183446Smrj     ACPI_OPERAND_OBJECT     *SourceObject,
9193446Smrj     ACPI_GENERIC_STATE      *State,
9203446Smrj     void                    *Context)
9213446Smrj {
9223446Smrj     ACPI_STATUS             Status = AE_OK;
9233446Smrj     UINT32                  ThisIndex;
9243446Smrj     ACPI_OPERAND_OBJECT     **ThisTargetPtr;
9253446Smrj     ACPI_OPERAND_OBJECT     *TargetObject;
9263446Smrj 
9273446Smrj 
9283446Smrj     ACPI_FUNCTION_ENTRY ();
9293446Smrj 
9303446Smrj 
9313446Smrj     ThisIndex     = State->Pkg.Index;
9323446Smrj     ThisTargetPtr = (ACPI_OPERAND_OBJECT **)
9333446Smrj                         &State->Pkg.DestObject->Package.Elements[ThisIndex];
9343446Smrj 
9353446Smrj     switch (ObjectType)
9363446Smrj     {
9373446Smrj     case ACPI_COPY_TYPE_SIMPLE:
9383446Smrj 
9393446Smrj         /* A null source object indicates a (legal) null package element */
9403446Smrj 
9413446Smrj         if (SourceObject)
9423446Smrj         {
9433446Smrj             /*
9443446Smrj              * This is a simple object, just copy it
9453446Smrj              */
9463446Smrj             TargetObject = AcpiUtCreateInternalObject (
9473446Smrj                                 ACPI_GET_OBJECT_TYPE (SourceObject));
9483446Smrj             if (!TargetObject)
9493446Smrj             {
9503446Smrj                 return (AE_NO_MEMORY);
9513446Smrj             }
9523446Smrj 
9533446Smrj             Status = AcpiUtCopySimpleObject (SourceObject, TargetObject);
9543446Smrj             if (ACPI_FAILURE (Status))
9553446Smrj             {
9563446Smrj                 goto ErrorExit;
9573446Smrj             }
9583446Smrj 
9593446Smrj             *ThisTargetPtr = TargetObject;
9603446Smrj         }
9613446Smrj         else
9623446Smrj         {
9633446Smrj             /* Pass through a null element */
9643446Smrj 
9653446Smrj             *ThisTargetPtr = NULL;
9663446Smrj         }
9673446Smrj         break;
9683446Smrj 
9693446Smrj 
9703446Smrj     case ACPI_COPY_TYPE_PACKAGE:
9713446Smrj 
9723446Smrj         /*
9733446Smrj          * This object is a package - go down another nesting level
9743446Smrj          * Create and build the package object
9753446Smrj          */
976*7851SDana.Myers@Sun.COM         TargetObject = AcpiUtCreatePackageObject (SourceObject->Package.Count);
9773446Smrj         if (!TargetObject)
9783446Smrj         {
9793446Smrj             return (AE_NO_MEMORY);
9803446Smrj         }
9813446Smrj 
982*7851SDana.Myers@Sun.COM         TargetObject->Common.Flags = SourceObject->Common.Flags;
9833446Smrj 
984*7851SDana.Myers@Sun.COM         /* Pass the new package object back to the package walk routine */
9853446Smrj 
9863446Smrj         State->Pkg.ThisTargetObj = TargetObject;
9873446Smrj 
988*7851SDana.Myers@Sun.COM         /* Store the object pointer in the parent package object */
989*7851SDana.Myers@Sun.COM 
9903446Smrj         *ThisTargetPtr = TargetObject;
9913446Smrj         break;
9923446Smrj 
9933446Smrj 
9943446Smrj     default:
9953446Smrj         return (AE_BAD_PARAMETER);
9963446Smrj     }
9973446Smrj 
9983446Smrj     return (Status);
9993446Smrj 
10003446Smrj ErrorExit:
10013446Smrj     AcpiUtRemoveReference (TargetObject);
10023446Smrj     return (Status);
10033446Smrj }
10043446Smrj 
10053446Smrj 
10063446Smrj /*******************************************************************************
10073446Smrj  *
10083446Smrj  * FUNCTION:    AcpiUtCopyIpackageToIpackage
10093446Smrj  *
10103446Smrj  * PARAMETERS:  *SourceObj      - Pointer to the source package object
10113446Smrj  *              *DestObj        - Where the internal object is returned
10123446Smrj  *
10133446Smrj  * RETURN:      Status          - the status of the call
10143446Smrj  *
10153446Smrj  * DESCRIPTION: This function is called to copy an internal package object
10163446Smrj  *              into another internal package object.
10173446Smrj  *
10183446Smrj  ******************************************************************************/
10193446Smrj 
10203446Smrj static ACPI_STATUS
10213446Smrj AcpiUtCopyIpackageToIpackage (
10223446Smrj     ACPI_OPERAND_OBJECT     *SourceObj,
10233446Smrj     ACPI_OPERAND_OBJECT     *DestObj,
10243446Smrj     ACPI_WALK_STATE         *WalkState)
10253446Smrj {
10263446Smrj     ACPI_STATUS             Status = AE_OK;
10273446Smrj 
10283446Smrj 
10293446Smrj     ACPI_FUNCTION_TRACE (UtCopyIpackageToIpackage);
10303446Smrj 
10313446Smrj 
10323446Smrj     DestObj->Common.Type    = ACPI_GET_OBJECT_TYPE (SourceObj);
10333446Smrj     DestObj->Common.Flags   = SourceObj->Common.Flags;
10343446Smrj     DestObj->Package.Count  = SourceObj->Package.Count;
10353446Smrj 
10363446Smrj     /*
10373446Smrj      * Create the object array and walk the source package tree
10383446Smrj      */
10393446Smrj     DestObj->Package.Elements = ACPI_ALLOCATE_ZEROED (
10403446Smrj                                     ((ACPI_SIZE) SourceObj->Package.Count + 1) *
10413446Smrj                                     sizeof (void *));
10423446Smrj     if (!DestObj->Package.Elements)
10433446Smrj     {
10443446Smrj         ACPI_ERROR ((AE_INFO, "Package allocation failure"));
10453446Smrj         return_ACPI_STATUS (AE_NO_MEMORY);
10463446Smrj     }
10473446Smrj 
10483446Smrj     /*
10493446Smrj      * Copy the package element-by-element by walking the package "tree".
10503446Smrj      * This handles nested packages of arbitrary depth.
10513446Smrj      */
10523446Smrj     Status = AcpiUtWalkPackageTree (SourceObj, DestObj,
10533446Smrj                 AcpiUtCopyIelementToIelement, WalkState);
10543446Smrj     if (ACPI_FAILURE (Status))
10553446Smrj     {
10563446Smrj         /* On failure, delete the destination package object */
10573446Smrj 
10583446Smrj         AcpiUtRemoveReference (DestObj);
10593446Smrj     }
10603446Smrj 
10613446Smrj     return_ACPI_STATUS (Status);
10623446Smrj }
10633446Smrj 
10643446Smrj 
10653446Smrj /*******************************************************************************
10663446Smrj  *
10673446Smrj  * FUNCTION:    AcpiUtCopyIobjectToIobject
10683446Smrj  *
10693446Smrj  * PARAMETERS:  WalkState           - Current walk state
10703446Smrj  *              SourceDesc          - The internal object to be copied
10713446Smrj  *              DestDesc            - Where the copied object is returned
10723446Smrj  *
10733446Smrj  * RETURN:      Status
10743446Smrj  *
10753446Smrj  * DESCRIPTION: Copy an internal object to a new internal object
10763446Smrj  *
10773446Smrj  ******************************************************************************/
10783446Smrj 
10793446Smrj ACPI_STATUS
10803446Smrj AcpiUtCopyIobjectToIobject (
10813446Smrj     ACPI_OPERAND_OBJECT     *SourceDesc,
10823446Smrj     ACPI_OPERAND_OBJECT     **DestDesc,
10833446Smrj     ACPI_WALK_STATE         *WalkState)
10843446Smrj {
10853446Smrj     ACPI_STATUS             Status = AE_OK;
10863446Smrj 
10873446Smrj 
10883446Smrj     ACPI_FUNCTION_TRACE (UtCopyIobjectToIobject);
10893446Smrj 
10903446Smrj 
10913446Smrj     /* Create the top level object */
10923446Smrj 
10933446Smrj     *DestDesc = AcpiUtCreateInternalObject (ACPI_GET_OBJECT_TYPE (SourceDesc));
10943446Smrj     if (!*DestDesc)
10953446Smrj     {
10963446Smrj         return_ACPI_STATUS (AE_NO_MEMORY);
10973446Smrj     }
10983446Smrj 
10993446Smrj     /* Copy the object and possible subobjects */
11003446Smrj 
11013446Smrj     if (ACPI_GET_OBJECT_TYPE (SourceDesc) == ACPI_TYPE_PACKAGE)
11023446Smrj     {
11033446Smrj         Status = AcpiUtCopyIpackageToIpackage (SourceDesc, *DestDesc,
11043446Smrj                         WalkState);
11053446Smrj     }
11063446Smrj     else
11073446Smrj     {
11083446Smrj         Status = AcpiUtCopySimpleObject (SourceDesc, *DestDesc);
11093446Smrj     }
11103446Smrj 
11113446Smrj     return_ACPI_STATUS (Status);
11123446Smrj }
11133446Smrj 
11143446Smrj 
1115