1*a159c266SJung-uk Kim /****************************************************************************** 2*a159c266SJung-uk Kim * 3*a159c266SJung-uk Kim * Module Name: utcopy - Internal to external object translation utilities 4*a159c266SJung-uk Kim * 5*a159c266SJung-uk Kim *****************************************************************************/ 6*a159c266SJung-uk Kim 7*a159c266SJung-uk Kim /* 8*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9*a159c266SJung-uk Kim * All rights reserved. 10*a159c266SJung-uk Kim * 11*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13*a159c266SJung-uk Kim * are met: 14*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*a159c266SJung-uk Kim * without modification. 17*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*a159c266SJung-uk Kim * binary redistribution. 22*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*a159c266SJung-uk Kim * from this software without specific prior written permission. 25*a159c266SJung-uk Kim * 26*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*a159c266SJung-uk Kim * Software Foundation. 29*a159c266SJung-uk Kim * 30*a159c266SJung-uk Kim * NO WARRANTY 31*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*a159c266SJung-uk Kim */ 43*a159c266SJung-uk Kim 44*a159c266SJung-uk Kim #define __UTCOPY_C__ 45*a159c266SJung-uk Kim 46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 49*a159c266SJung-uk Kim 50*a159c266SJung-uk Kim 51*a159c266SJung-uk Kim #define _COMPONENT ACPI_UTILITIES 52*a159c266SJung-uk Kim ACPI_MODULE_NAME ("utcopy") 53*a159c266SJung-uk Kim 54*a159c266SJung-uk Kim /* Local prototypes */ 55*a159c266SJung-uk Kim 56*a159c266SJung-uk Kim static ACPI_STATUS 57*a159c266SJung-uk Kim AcpiUtCopyIsimpleToEsimple ( 58*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *InternalObject, 59*a159c266SJung-uk Kim ACPI_OBJECT *ExternalObject, 60*a159c266SJung-uk Kim UINT8 *DataSpace, 61*a159c266SJung-uk Kim ACPI_SIZE *BufferSpaceUsed); 62*a159c266SJung-uk Kim 63*a159c266SJung-uk Kim static ACPI_STATUS 64*a159c266SJung-uk Kim AcpiUtCopyIelementToIelement ( 65*a159c266SJung-uk Kim UINT8 ObjectType, 66*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceObject, 67*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State, 68*a159c266SJung-uk Kim void *Context); 69*a159c266SJung-uk Kim 70*a159c266SJung-uk Kim static ACPI_STATUS 71*a159c266SJung-uk Kim AcpiUtCopyIpackageToEpackage ( 72*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *InternalObject, 73*a159c266SJung-uk Kim UINT8 *Buffer, 74*a159c266SJung-uk Kim ACPI_SIZE *SpaceUsed); 75*a159c266SJung-uk Kim 76*a159c266SJung-uk Kim static ACPI_STATUS 77*a159c266SJung-uk Kim AcpiUtCopyEsimpleToIsimple( 78*a159c266SJung-uk Kim ACPI_OBJECT *UserObj, 79*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObj); 80*a159c266SJung-uk Kim 81*a159c266SJung-uk Kim static ACPI_STATUS 82*a159c266SJung-uk Kim AcpiUtCopyEpackageToIpackage ( 83*a159c266SJung-uk Kim ACPI_OBJECT *ExternalObject, 84*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **InternalObject); 85*a159c266SJung-uk Kim 86*a159c266SJung-uk Kim static ACPI_STATUS 87*a159c266SJung-uk Kim AcpiUtCopySimpleObject ( 88*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceDesc, 89*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *DestDesc); 90*a159c266SJung-uk Kim 91*a159c266SJung-uk Kim static ACPI_STATUS 92*a159c266SJung-uk Kim AcpiUtCopyIelementToEelement ( 93*a159c266SJung-uk Kim UINT8 ObjectType, 94*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceObject, 95*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State, 96*a159c266SJung-uk Kim void *Context); 97*a159c266SJung-uk Kim 98*a159c266SJung-uk Kim static ACPI_STATUS 99*a159c266SJung-uk Kim AcpiUtCopyIpackageToIpackage ( 100*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceObj, 101*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *DestObj, 102*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState); 103*a159c266SJung-uk Kim 104*a159c266SJung-uk Kim 105*a159c266SJung-uk Kim /******************************************************************************* 106*a159c266SJung-uk Kim * 107*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyIsimpleToEsimple 108*a159c266SJung-uk Kim * 109*a159c266SJung-uk Kim * PARAMETERS: InternalObject - Source object to be copied 110*a159c266SJung-uk Kim * ExternalObject - Where to return the copied object 111*a159c266SJung-uk Kim * DataSpace - Where object data is returned (such as 112*a159c266SJung-uk Kim * buffer and string data) 113*a159c266SJung-uk Kim * BufferSpaceUsed - Length of DataSpace that was used 114*a159c266SJung-uk Kim * 115*a159c266SJung-uk Kim * RETURN: Status 116*a159c266SJung-uk Kim * 117*a159c266SJung-uk Kim * DESCRIPTION: This function is called to copy a simple internal object to 118*a159c266SJung-uk Kim * an external object. 119*a159c266SJung-uk Kim * 120*a159c266SJung-uk Kim * The DataSpace buffer is assumed to have sufficient space for 121*a159c266SJung-uk Kim * the object. 122*a159c266SJung-uk Kim * 123*a159c266SJung-uk Kim ******************************************************************************/ 124*a159c266SJung-uk Kim 125*a159c266SJung-uk Kim static ACPI_STATUS 126*a159c266SJung-uk Kim AcpiUtCopyIsimpleToEsimple ( 127*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *InternalObject, 128*a159c266SJung-uk Kim ACPI_OBJECT *ExternalObject, 129*a159c266SJung-uk Kim UINT8 *DataSpace, 130*a159c266SJung-uk Kim ACPI_SIZE *BufferSpaceUsed) 131*a159c266SJung-uk Kim { 132*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 133*a159c266SJung-uk Kim 134*a159c266SJung-uk Kim 135*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCopyIsimpleToEsimple); 136*a159c266SJung-uk Kim 137*a159c266SJung-uk Kim 138*a159c266SJung-uk Kim *BufferSpaceUsed = 0; 139*a159c266SJung-uk Kim 140*a159c266SJung-uk Kim /* 141*a159c266SJung-uk Kim * Check for NULL object case (could be an uninitialized 142*a159c266SJung-uk Kim * package element) 143*a159c266SJung-uk Kim */ 144*a159c266SJung-uk Kim if (!InternalObject) 145*a159c266SJung-uk Kim { 146*a159c266SJung-uk Kim return_ACPI_STATUS (AE_OK); 147*a159c266SJung-uk Kim } 148*a159c266SJung-uk Kim 149*a159c266SJung-uk Kim /* Always clear the external object */ 150*a159c266SJung-uk Kim 151*a159c266SJung-uk Kim ACPI_MEMSET (ExternalObject, 0, sizeof (ACPI_OBJECT)); 152*a159c266SJung-uk Kim 153*a159c266SJung-uk Kim /* 154*a159c266SJung-uk Kim * In general, the external object will be the same type as 155*a159c266SJung-uk Kim * the internal object 156*a159c266SJung-uk Kim */ 157*a159c266SJung-uk Kim ExternalObject->Type = InternalObject->Common.Type; 158*a159c266SJung-uk Kim 159*a159c266SJung-uk Kim /* However, only a limited number of external types are supported */ 160*a159c266SJung-uk Kim 161*a159c266SJung-uk Kim switch (InternalObject->Common.Type) 162*a159c266SJung-uk Kim { 163*a159c266SJung-uk Kim case ACPI_TYPE_STRING: 164*a159c266SJung-uk Kim 165*a159c266SJung-uk Kim ExternalObject->String.Pointer = (char *) DataSpace; 166*a159c266SJung-uk Kim ExternalObject->String.Length = InternalObject->String.Length; 167*a159c266SJung-uk Kim *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD ( 168*a159c266SJung-uk Kim (ACPI_SIZE) InternalObject->String.Length + 1); 169*a159c266SJung-uk Kim 170*a159c266SJung-uk Kim ACPI_MEMCPY ((void *) DataSpace, 171*a159c266SJung-uk Kim (void *) InternalObject->String.Pointer, 172*a159c266SJung-uk Kim (ACPI_SIZE) InternalObject->String.Length + 1); 173*a159c266SJung-uk Kim break; 174*a159c266SJung-uk Kim 175*a159c266SJung-uk Kim 176*a159c266SJung-uk Kim case ACPI_TYPE_BUFFER: 177*a159c266SJung-uk Kim 178*a159c266SJung-uk Kim ExternalObject->Buffer.Pointer = DataSpace; 179*a159c266SJung-uk Kim ExternalObject->Buffer.Length = InternalObject->Buffer.Length; 180*a159c266SJung-uk Kim *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD ( 181*a159c266SJung-uk Kim InternalObject->String.Length); 182*a159c266SJung-uk Kim 183*a159c266SJung-uk Kim ACPI_MEMCPY ((void *) DataSpace, 184*a159c266SJung-uk Kim (void *) InternalObject->Buffer.Pointer, 185*a159c266SJung-uk Kim InternalObject->Buffer.Length); 186*a159c266SJung-uk Kim break; 187*a159c266SJung-uk Kim 188*a159c266SJung-uk Kim 189*a159c266SJung-uk Kim case ACPI_TYPE_INTEGER: 190*a159c266SJung-uk Kim 191*a159c266SJung-uk Kim ExternalObject->Integer.Value = InternalObject->Integer.Value; 192*a159c266SJung-uk Kim break; 193*a159c266SJung-uk Kim 194*a159c266SJung-uk Kim 195*a159c266SJung-uk Kim case ACPI_TYPE_LOCAL_REFERENCE: 196*a159c266SJung-uk Kim 197*a159c266SJung-uk Kim /* This is an object reference. */ 198*a159c266SJung-uk Kim 199*a159c266SJung-uk Kim switch (InternalObject->Reference.Class) 200*a159c266SJung-uk Kim { 201*a159c266SJung-uk Kim case ACPI_REFCLASS_NAME: 202*a159c266SJung-uk Kim 203*a159c266SJung-uk Kim /* 204*a159c266SJung-uk Kim * For namepath, return the object handle ("reference") 205*a159c266SJung-uk Kim * We are referring to the namespace node 206*a159c266SJung-uk Kim */ 207*a159c266SJung-uk Kim ExternalObject->Reference.Handle = 208*a159c266SJung-uk Kim InternalObject->Reference.Node; 209*a159c266SJung-uk Kim ExternalObject->Reference.ActualType = 210*a159c266SJung-uk Kim AcpiNsGetType (InternalObject->Reference.Node); 211*a159c266SJung-uk Kim break; 212*a159c266SJung-uk Kim 213*a159c266SJung-uk Kim default: 214*a159c266SJung-uk Kim 215*a159c266SJung-uk Kim /* All other reference types are unsupported */ 216*a159c266SJung-uk Kim 217*a159c266SJung-uk Kim return_ACPI_STATUS (AE_TYPE); 218*a159c266SJung-uk Kim } 219*a159c266SJung-uk Kim break; 220*a159c266SJung-uk Kim 221*a159c266SJung-uk Kim 222*a159c266SJung-uk Kim case ACPI_TYPE_PROCESSOR: 223*a159c266SJung-uk Kim 224*a159c266SJung-uk Kim ExternalObject->Processor.ProcId = 225*a159c266SJung-uk Kim InternalObject->Processor.ProcId; 226*a159c266SJung-uk Kim ExternalObject->Processor.PblkAddress = 227*a159c266SJung-uk Kim InternalObject->Processor.Address; 228*a159c266SJung-uk Kim ExternalObject->Processor.PblkLength = 229*a159c266SJung-uk Kim InternalObject->Processor.Length; 230*a159c266SJung-uk Kim break; 231*a159c266SJung-uk Kim 232*a159c266SJung-uk Kim 233*a159c266SJung-uk Kim case ACPI_TYPE_POWER: 234*a159c266SJung-uk Kim 235*a159c266SJung-uk Kim ExternalObject->PowerResource.SystemLevel = 236*a159c266SJung-uk Kim InternalObject->PowerResource.SystemLevel; 237*a159c266SJung-uk Kim 238*a159c266SJung-uk Kim ExternalObject->PowerResource.ResourceOrder = 239*a159c266SJung-uk Kim InternalObject->PowerResource.ResourceOrder; 240*a159c266SJung-uk Kim break; 241*a159c266SJung-uk Kim 242*a159c266SJung-uk Kim 243*a159c266SJung-uk Kim default: 244*a159c266SJung-uk Kim /* 245*a159c266SJung-uk Kim * There is no corresponding external object type 246*a159c266SJung-uk Kim */ 247*a159c266SJung-uk Kim ACPI_ERROR ((AE_INFO, 248*a159c266SJung-uk Kim "Unsupported object type, cannot convert to external object: %s", 249*a159c266SJung-uk Kim AcpiUtGetTypeName (InternalObject->Common.Type))); 250*a159c266SJung-uk Kim 251*a159c266SJung-uk Kim return_ACPI_STATUS (AE_SUPPORT); 252*a159c266SJung-uk Kim } 253*a159c266SJung-uk Kim 254*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 255*a159c266SJung-uk Kim } 256*a159c266SJung-uk Kim 257*a159c266SJung-uk Kim 258*a159c266SJung-uk Kim /******************************************************************************* 259*a159c266SJung-uk Kim * 260*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyIelementToEelement 261*a159c266SJung-uk Kim * 262*a159c266SJung-uk Kim * PARAMETERS: ACPI_PKG_CALLBACK 263*a159c266SJung-uk Kim * 264*a159c266SJung-uk Kim * RETURN: Status 265*a159c266SJung-uk Kim * 266*a159c266SJung-uk Kim * DESCRIPTION: Copy one package element to another package element 267*a159c266SJung-uk Kim * 268*a159c266SJung-uk Kim ******************************************************************************/ 269*a159c266SJung-uk Kim 270*a159c266SJung-uk Kim static ACPI_STATUS 271*a159c266SJung-uk Kim AcpiUtCopyIelementToEelement ( 272*a159c266SJung-uk Kim UINT8 ObjectType, 273*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceObject, 274*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State, 275*a159c266SJung-uk Kim void *Context) 276*a159c266SJung-uk Kim { 277*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 278*a159c266SJung-uk Kim ACPI_PKG_INFO *Info = (ACPI_PKG_INFO *) Context; 279*a159c266SJung-uk Kim ACPI_SIZE ObjectSpace; 280*a159c266SJung-uk Kim UINT32 ThisIndex; 281*a159c266SJung-uk Kim ACPI_OBJECT *TargetObject; 282*a159c266SJung-uk Kim 283*a159c266SJung-uk Kim 284*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 285*a159c266SJung-uk Kim 286*a159c266SJung-uk Kim 287*a159c266SJung-uk Kim ThisIndex = State->Pkg.Index; 288*a159c266SJung-uk Kim TargetObject = (ACPI_OBJECT *) 289*a159c266SJung-uk Kim &((ACPI_OBJECT *)(State->Pkg.DestObject))->Package.Elements[ThisIndex]; 290*a159c266SJung-uk Kim 291*a159c266SJung-uk Kim switch (ObjectType) 292*a159c266SJung-uk Kim { 293*a159c266SJung-uk Kim case ACPI_COPY_TYPE_SIMPLE: 294*a159c266SJung-uk Kim 295*a159c266SJung-uk Kim /* 296*a159c266SJung-uk Kim * This is a simple or null object 297*a159c266SJung-uk Kim */ 298*a159c266SJung-uk Kim Status = AcpiUtCopyIsimpleToEsimple (SourceObject, 299*a159c266SJung-uk Kim TargetObject, Info->FreeSpace, &ObjectSpace); 300*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 301*a159c266SJung-uk Kim { 302*a159c266SJung-uk Kim return (Status); 303*a159c266SJung-uk Kim } 304*a159c266SJung-uk Kim break; 305*a159c266SJung-uk Kim 306*a159c266SJung-uk Kim 307*a159c266SJung-uk Kim case ACPI_COPY_TYPE_PACKAGE: 308*a159c266SJung-uk Kim 309*a159c266SJung-uk Kim /* 310*a159c266SJung-uk Kim * Build the package object 311*a159c266SJung-uk Kim */ 312*a159c266SJung-uk Kim TargetObject->Type = ACPI_TYPE_PACKAGE; 313*a159c266SJung-uk Kim TargetObject->Package.Count = SourceObject->Package.Count; 314*a159c266SJung-uk Kim TargetObject->Package.Elements = 315*a159c266SJung-uk Kim ACPI_CAST_PTR (ACPI_OBJECT, Info->FreeSpace); 316*a159c266SJung-uk Kim 317*a159c266SJung-uk Kim /* 318*a159c266SJung-uk Kim * Pass the new package object back to the package walk routine 319*a159c266SJung-uk Kim */ 320*a159c266SJung-uk Kim State->Pkg.ThisTargetObj = TargetObject; 321*a159c266SJung-uk Kim 322*a159c266SJung-uk Kim /* 323*a159c266SJung-uk Kim * Save space for the array of objects (Package elements) 324*a159c266SJung-uk Kim * update the buffer length counter 325*a159c266SJung-uk Kim */ 326*a159c266SJung-uk Kim ObjectSpace = ACPI_ROUND_UP_TO_NATIVE_WORD ( 327*a159c266SJung-uk Kim (ACPI_SIZE) TargetObject->Package.Count * 328*a159c266SJung-uk Kim sizeof (ACPI_OBJECT)); 329*a159c266SJung-uk Kim break; 330*a159c266SJung-uk Kim 331*a159c266SJung-uk Kim 332*a159c266SJung-uk Kim default: 333*a159c266SJung-uk Kim return (AE_BAD_PARAMETER); 334*a159c266SJung-uk Kim } 335*a159c266SJung-uk Kim 336*a159c266SJung-uk Kim Info->FreeSpace += ObjectSpace; 337*a159c266SJung-uk Kim Info->Length += ObjectSpace; 338*a159c266SJung-uk Kim return (Status); 339*a159c266SJung-uk Kim } 340*a159c266SJung-uk Kim 341*a159c266SJung-uk Kim 342*a159c266SJung-uk Kim /******************************************************************************* 343*a159c266SJung-uk Kim * 344*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyIpackageToEpackage 345*a159c266SJung-uk Kim * 346*a159c266SJung-uk Kim * PARAMETERS: InternalObject - Pointer to the object we are returning 347*a159c266SJung-uk Kim * Buffer - Where the object is returned 348*a159c266SJung-uk Kim * SpaceUsed - Where the object length is returned 349*a159c266SJung-uk Kim * 350*a159c266SJung-uk Kim * RETURN: Status 351*a159c266SJung-uk Kim * 352*a159c266SJung-uk Kim * DESCRIPTION: This function is called to place a package object in a user 353*a159c266SJung-uk Kim * buffer. A package object by definition contains other objects. 354*a159c266SJung-uk Kim * 355*a159c266SJung-uk Kim * The buffer is assumed to have sufficient space for the object. 356*a159c266SJung-uk Kim * The caller must have verified the buffer length needed using 357*a159c266SJung-uk Kim * the AcpiUtGetObjectSize function before calling this function. 358*a159c266SJung-uk Kim * 359*a159c266SJung-uk Kim ******************************************************************************/ 360*a159c266SJung-uk Kim 361*a159c266SJung-uk Kim static ACPI_STATUS 362*a159c266SJung-uk Kim AcpiUtCopyIpackageToEpackage ( 363*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *InternalObject, 364*a159c266SJung-uk Kim UINT8 *Buffer, 365*a159c266SJung-uk Kim ACPI_SIZE *SpaceUsed) 366*a159c266SJung-uk Kim { 367*a159c266SJung-uk Kim ACPI_OBJECT *ExternalObject; 368*a159c266SJung-uk Kim ACPI_STATUS Status; 369*a159c266SJung-uk Kim ACPI_PKG_INFO Info; 370*a159c266SJung-uk Kim 371*a159c266SJung-uk Kim 372*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCopyIpackageToEpackage); 373*a159c266SJung-uk Kim 374*a159c266SJung-uk Kim 375*a159c266SJung-uk Kim /* 376*a159c266SJung-uk Kim * First package at head of the buffer 377*a159c266SJung-uk Kim */ 378*a159c266SJung-uk Kim ExternalObject = ACPI_CAST_PTR (ACPI_OBJECT, Buffer); 379*a159c266SJung-uk Kim 380*a159c266SJung-uk Kim /* 381*a159c266SJung-uk Kim * Free space begins right after the first package 382*a159c266SJung-uk Kim */ 383*a159c266SJung-uk Kim Info.Length = ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); 384*a159c266SJung-uk Kim Info.FreeSpace = Buffer + ACPI_ROUND_UP_TO_NATIVE_WORD ( 385*a159c266SJung-uk Kim sizeof (ACPI_OBJECT)); 386*a159c266SJung-uk Kim Info.ObjectSpace = 0; 387*a159c266SJung-uk Kim Info.NumPackages = 1; 388*a159c266SJung-uk Kim 389*a159c266SJung-uk Kim ExternalObject->Type = InternalObject->Common.Type; 390*a159c266SJung-uk Kim ExternalObject->Package.Count = InternalObject->Package.Count; 391*a159c266SJung-uk Kim ExternalObject->Package.Elements = ACPI_CAST_PTR (ACPI_OBJECT, 392*a159c266SJung-uk Kim Info.FreeSpace); 393*a159c266SJung-uk Kim 394*a159c266SJung-uk Kim /* 395*a159c266SJung-uk Kim * Leave room for an array of ACPI_OBJECTS in the buffer 396*a159c266SJung-uk Kim * and move the free space past it 397*a159c266SJung-uk Kim */ 398*a159c266SJung-uk Kim Info.Length += (ACPI_SIZE) ExternalObject->Package.Count * 399*a159c266SJung-uk Kim ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); 400*a159c266SJung-uk Kim Info.FreeSpace += ExternalObject->Package.Count * 401*a159c266SJung-uk Kim ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); 402*a159c266SJung-uk Kim 403*a159c266SJung-uk Kim Status = AcpiUtWalkPackageTree (InternalObject, ExternalObject, 404*a159c266SJung-uk Kim AcpiUtCopyIelementToEelement, &Info); 405*a159c266SJung-uk Kim 406*a159c266SJung-uk Kim *SpaceUsed = Info.Length; 407*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 408*a159c266SJung-uk Kim } 409*a159c266SJung-uk Kim 410*a159c266SJung-uk Kim 411*a159c266SJung-uk Kim /******************************************************************************* 412*a159c266SJung-uk Kim * 413*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyIobjectToEobject 414*a159c266SJung-uk Kim * 415*a159c266SJung-uk Kim * PARAMETERS: InternalObject - The internal object to be converted 416*a159c266SJung-uk Kim * RetBuffer - Where the object is returned 417*a159c266SJung-uk Kim * 418*a159c266SJung-uk Kim * RETURN: Status 419*a159c266SJung-uk Kim * 420*a159c266SJung-uk Kim * DESCRIPTION: This function is called to build an API object to be returned 421*a159c266SJung-uk Kim * to the caller. 422*a159c266SJung-uk Kim * 423*a159c266SJung-uk Kim ******************************************************************************/ 424*a159c266SJung-uk Kim 425*a159c266SJung-uk Kim ACPI_STATUS 426*a159c266SJung-uk Kim AcpiUtCopyIobjectToEobject ( 427*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *InternalObject, 428*a159c266SJung-uk Kim ACPI_BUFFER *RetBuffer) 429*a159c266SJung-uk Kim { 430*a159c266SJung-uk Kim ACPI_STATUS Status; 431*a159c266SJung-uk Kim 432*a159c266SJung-uk Kim 433*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCopyIobjectToEobject); 434*a159c266SJung-uk Kim 435*a159c266SJung-uk Kim 436*a159c266SJung-uk Kim if (InternalObject->Common.Type == ACPI_TYPE_PACKAGE) 437*a159c266SJung-uk Kim { 438*a159c266SJung-uk Kim /* 439*a159c266SJung-uk Kim * Package object: Copy all subobjects (including 440*a159c266SJung-uk Kim * nested packages) 441*a159c266SJung-uk Kim */ 442*a159c266SJung-uk Kim Status = AcpiUtCopyIpackageToEpackage (InternalObject, 443*a159c266SJung-uk Kim RetBuffer->Pointer, &RetBuffer->Length); 444*a159c266SJung-uk Kim } 445*a159c266SJung-uk Kim else 446*a159c266SJung-uk Kim { 447*a159c266SJung-uk Kim /* 448*a159c266SJung-uk Kim * Build a simple object (no nested objects) 449*a159c266SJung-uk Kim */ 450*a159c266SJung-uk Kim Status = AcpiUtCopyIsimpleToEsimple (InternalObject, 451*a159c266SJung-uk Kim ACPI_CAST_PTR (ACPI_OBJECT, RetBuffer->Pointer), 452*a159c266SJung-uk Kim ACPI_ADD_PTR (UINT8, RetBuffer->Pointer, 453*a159c266SJung-uk Kim ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT))), 454*a159c266SJung-uk Kim &RetBuffer->Length); 455*a159c266SJung-uk Kim /* 456*a159c266SJung-uk Kim * build simple does not include the object size in the length 457*a159c266SJung-uk Kim * so we add it in here 458*a159c266SJung-uk Kim */ 459*a159c266SJung-uk Kim RetBuffer->Length += sizeof (ACPI_OBJECT); 460*a159c266SJung-uk Kim } 461*a159c266SJung-uk Kim 462*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 463*a159c266SJung-uk Kim } 464*a159c266SJung-uk Kim 465*a159c266SJung-uk Kim 466*a159c266SJung-uk Kim /******************************************************************************* 467*a159c266SJung-uk Kim * 468*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyEsimpleToIsimple 469*a159c266SJung-uk Kim * 470*a159c266SJung-uk Kim * PARAMETERS: ExternalObject - The external object to be converted 471*a159c266SJung-uk Kim * RetInternalObject - Where the internal object is returned 472*a159c266SJung-uk Kim * 473*a159c266SJung-uk Kim * RETURN: Status 474*a159c266SJung-uk Kim * 475*a159c266SJung-uk Kim * DESCRIPTION: This function copies an external object to an internal one. 476*a159c266SJung-uk Kim * NOTE: Pointers can be copied, we don't need to copy data. 477*a159c266SJung-uk Kim * (The pointers have to be valid in our address space no matter 478*a159c266SJung-uk Kim * what we do with them!) 479*a159c266SJung-uk Kim * 480*a159c266SJung-uk Kim ******************************************************************************/ 481*a159c266SJung-uk Kim 482*a159c266SJung-uk Kim static ACPI_STATUS 483*a159c266SJung-uk Kim AcpiUtCopyEsimpleToIsimple ( 484*a159c266SJung-uk Kim ACPI_OBJECT *ExternalObject, 485*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **RetInternalObject) 486*a159c266SJung-uk Kim { 487*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *InternalObject; 488*a159c266SJung-uk Kim 489*a159c266SJung-uk Kim 490*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCopyEsimpleToIsimple); 491*a159c266SJung-uk Kim 492*a159c266SJung-uk Kim 493*a159c266SJung-uk Kim /* 494*a159c266SJung-uk Kim * Simple types supported are: String, Buffer, Integer 495*a159c266SJung-uk Kim */ 496*a159c266SJung-uk Kim switch (ExternalObject->Type) 497*a159c266SJung-uk Kim { 498*a159c266SJung-uk Kim case ACPI_TYPE_STRING: 499*a159c266SJung-uk Kim case ACPI_TYPE_BUFFER: 500*a159c266SJung-uk Kim case ACPI_TYPE_INTEGER: 501*a159c266SJung-uk Kim case ACPI_TYPE_LOCAL_REFERENCE: 502*a159c266SJung-uk Kim 503*a159c266SJung-uk Kim InternalObject = AcpiUtCreateInternalObject ( 504*a159c266SJung-uk Kim (UINT8) ExternalObject->Type); 505*a159c266SJung-uk Kim if (!InternalObject) 506*a159c266SJung-uk Kim { 507*a159c266SJung-uk Kim return_ACPI_STATUS (AE_NO_MEMORY); 508*a159c266SJung-uk Kim } 509*a159c266SJung-uk Kim break; 510*a159c266SJung-uk Kim 511*a159c266SJung-uk Kim case ACPI_TYPE_ANY: /* This is the case for a NULL object */ 512*a159c266SJung-uk Kim 513*a159c266SJung-uk Kim *RetInternalObject = NULL; 514*a159c266SJung-uk Kim return_ACPI_STATUS (AE_OK); 515*a159c266SJung-uk Kim 516*a159c266SJung-uk Kim default: 517*a159c266SJung-uk Kim /* All other types are not supported */ 518*a159c266SJung-uk Kim 519*a159c266SJung-uk Kim ACPI_ERROR ((AE_INFO, 520*a159c266SJung-uk Kim "Unsupported object type, cannot convert to internal object: %s", 521*a159c266SJung-uk Kim AcpiUtGetTypeName (ExternalObject->Type))); 522*a159c266SJung-uk Kim 523*a159c266SJung-uk Kim return_ACPI_STATUS (AE_SUPPORT); 524*a159c266SJung-uk Kim } 525*a159c266SJung-uk Kim 526*a159c266SJung-uk Kim 527*a159c266SJung-uk Kim /* Must COPY string and buffer contents */ 528*a159c266SJung-uk Kim 529*a159c266SJung-uk Kim switch (ExternalObject->Type) 530*a159c266SJung-uk Kim { 531*a159c266SJung-uk Kim case ACPI_TYPE_STRING: 532*a159c266SJung-uk Kim 533*a159c266SJung-uk Kim InternalObject->String.Pointer = 534*a159c266SJung-uk Kim ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) 535*a159c266SJung-uk Kim ExternalObject->String.Length + 1); 536*a159c266SJung-uk Kim 537*a159c266SJung-uk Kim if (!InternalObject->String.Pointer) 538*a159c266SJung-uk Kim { 539*a159c266SJung-uk Kim goto ErrorExit; 540*a159c266SJung-uk Kim } 541*a159c266SJung-uk Kim 542*a159c266SJung-uk Kim ACPI_MEMCPY (InternalObject->String.Pointer, 543*a159c266SJung-uk Kim ExternalObject->String.Pointer, 544*a159c266SJung-uk Kim ExternalObject->String.Length); 545*a159c266SJung-uk Kim 546*a159c266SJung-uk Kim InternalObject->String.Length = ExternalObject->String.Length; 547*a159c266SJung-uk Kim break; 548*a159c266SJung-uk Kim 549*a159c266SJung-uk Kim 550*a159c266SJung-uk Kim case ACPI_TYPE_BUFFER: 551*a159c266SJung-uk Kim 552*a159c266SJung-uk Kim InternalObject->Buffer.Pointer = 553*a159c266SJung-uk Kim ACPI_ALLOCATE_ZEROED (ExternalObject->Buffer.Length); 554*a159c266SJung-uk Kim if (!InternalObject->Buffer.Pointer) 555*a159c266SJung-uk Kim { 556*a159c266SJung-uk Kim goto ErrorExit; 557*a159c266SJung-uk Kim } 558*a159c266SJung-uk Kim 559*a159c266SJung-uk Kim ACPI_MEMCPY (InternalObject->Buffer.Pointer, 560*a159c266SJung-uk Kim ExternalObject->Buffer.Pointer, 561*a159c266SJung-uk Kim ExternalObject->Buffer.Length); 562*a159c266SJung-uk Kim 563*a159c266SJung-uk Kim InternalObject->Buffer.Length = ExternalObject->Buffer.Length; 564*a159c266SJung-uk Kim 565*a159c266SJung-uk Kim /* Mark buffer data valid */ 566*a159c266SJung-uk Kim 567*a159c266SJung-uk Kim InternalObject->Buffer.Flags |= AOPOBJ_DATA_VALID; 568*a159c266SJung-uk Kim break; 569*a159c266SJung-uk Kim 570*a159c266SJung-uk Kim 571*a159c266SJung-uk Kim case ACPI_TYPE_INTEGER: 572*a159c266SJung-uk Kim 573*a159c266SJung-uk Kim InternalObject->Integer.Value = ExternalObject->Integer.Value; 574*a159c266SJung-uk Kim break; 575*a159c266SJung-uk Kim 576*a159c266SJung-uk Kim case ACPI_TYPE_LOCAL_REFERENCE: 577*a159c266SJung-uk Kim 578*a159c266SJung-uk Kim /* TBD: should validate incoming handle */ 579*a159c266SJung-uk Kim 580*a159c266SJung-uk Kim InternalObject->Reference.Class = ACPI_REFCLASS_NAME; 581*a159c266SJung-uk Kim InternalObject->Reference.Node = ExternalObject->Reference.Handle; 582*a159c266SJung-uk Kim break; 583*a159c266SJung-uk Kim 584*a159c266SJung-uk Kim default: 585*a159c266SJung-uk Kim /* Other types can't get here */ 586*a159c266SJung-uk Kim break; 587*a159c266SJung-uk Kim } 588*a159c266SJung-uk Kim 589*a159c266SJung-uk Kim *RetInternalObject = InternalObject; 590*a159c266SJung-uk Kim return_ACPI_STATUS (AE_OK); 591*a159c266SJung-uk Kim 592*a159c266SJung-uk Kim 593*a159c266SJung-uk Kim ErrorExit: 594*a159c266SJung-uk Kim AcpiUtRemoveReference (InternalObject); 595*a159c266SJung-uk Kim return_ACPI_STATUS (AE_NO_MEMORY); 596*a159c266SJung-uk Kim } 597*a159c266SJung-uk Kim 598*a159c266SJung-uk Kim 599*a159c266SJung-uk Kim /******************************************************************************* 600*a159c266SJung-uk Kim * 601*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyEpackageToIpackage 602*a159c266SJung-uk Kim * 603*a159c266SJung-uk Kim * PARAMETERS: ExternalObject - The external object to be converted 604*a159c266SJung-uk Kim * InternalObject - Where the internal object is returned 605*a159c266SJung-uk Kim * 606*a159c266SJung-uk Kim * RETURN: Status 607*a159c266SJung-uk Kim * 608*a159c266SJung-uk Kim * DESCRIPTION: Copy an external package object to an internal package. 609*a159c266SJung-uk Kim * Handles nested packages. 610*a159c266SJung-uk Kim * 611*a159c266SJung-uk Kim ******************************************************************************/ 612*a159c266SJung-uk Kim 613*a159c266SJung-uk Kim static ACPI_STATUS 614*a159c266SJung-uk Kim AcpiUtCopyEpackageToIpackage ( 615*a159c266SJung-uk Kim ACPI_OBJECT *ExternalObject, 616*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **InternalObject) 617*a159c266SJung-uk Kim { 618*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 619*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *PackageObject; 620*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **PackageElements; 621*a159c266SJung-uk Kim UINT32 i; 622*a159c266SJung-uk Kim 623*a159c266SJung-uk Kim 624*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCopyEpackageToIpackage); 625*a159c266SJung-uk Kim 626*a159c266SJung-uk Kim 627*a159c266SJung-uk Kim /* Create the package object */ 628*a159c266SJung-uk Kim 629*a159c266SJung-uk Kim PackageObject = AcpiUtCreatePackageObject (ExternalObject->Package.Count); 630*a159c266SJung-uk Kim if (!PackageObject) 631*a159c266SJung-uk Kim { 632*a159c266SJung-uk Kim return_ACPI_STATUS (AE_NO_MEMORY); 633*a159c266SJung-uk Kim } 634*a159c266SJung-uk Kim 635*a159c266SJung-uk Kim PackageElements = PackageObject->Package.Elements; 636*a159c266SJung-uk Kim 637*a159c266SJung-uk Kim /* 638*a159c266SJung-uk Kim * Recursive implementation. Probably ok, since nested external packages 639*a159c266SJung-uk Kim * as parameters should be very rare. 640*a159c266SJung-uk Kim */ 641*a159c266SJung-uk Kim for (i = 0; i < ExternalObject->Package.Count; i++) 642*a159c266SJung-uk Kim { 643*a159c266SJung-uk Kim Status = AcpiUtCopyEobjectToIobject ( 644*a159c266SJung-uk Kim &ExternalObject->Package.Elements[i], 645*a159c266SJung-uk Kim &PackageElements[i]); 646*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 647*a159c266SJung-uk Kim { 648*a159c266SJung-uk Kim /* Truncate package and delete it */ 649*a159c266SJung-uk Kim 650*a159c266SJung-uk Kim PackageObject->Package.Count = i; 651*a159c266SJung-uk Kim PackageElements[i] = NULL; 652*a159c266SJung-uk Kim AcpiUtRemoveReference (PackageObject); 653*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 654*a159c266SJung-uk Kim } 655*a159c266SJung-uk Kim } 656*a159c266SJung-uk Kim 657*a159c266SJung-uk Kim /* Mark package data valid */ 658*a159c266SJung-uk Kim 659*a159c266SJung-uk Kim PackageObject->Package.Flags |= AOPOBJ_DATA_VALID; 660*a159c266SJung-uk Kim 661*a159c266SJung-uk Kim *InternalObject = PackageObject; 662*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 663*a159c266SJung-uk Kim } 664*a159c266SJung-uk Kim 665*a159c266SJung-uk Kim 666*a159c266SJung-uk Kim /******************************************************************************* 667*a159c266SJung-uk Kim * 668*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyEobjectToIobject 669*a159c266SJung-uk Kim * 670*a159c266SJung-uk Kim * PARAMETERS: ExternalObject - The external object to be converted 671*a159c266SJung-uk Kim * InternalObject - Where the internal object is returned 672*a159c266SJung-uk Kim * 673*a159c266SJung-uk Kim * RETURN: Status 674*a159c266SJung-uk Kim * 675*a159c266SJung-uk Kim * DESCRIPTION: Converts an external object to an internal object. 676*a159c266SJung-uk Kim * 677*a159c266SJung-uk Kim ******************************************************************************/ 678*a159c266SJung-uk Kim 679*a159c266SJung-uk Kim ACPI_STATUS 680*a159c266SJung-uk Kim AcpiUtCopyEobjectToIobject ( 681*a159c266SJung-uk Kim ACPI_OBJECT *ExternalObject, 682*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **InternalObject) 683*a159c266SJung-uk Kim { 684*a159c266SJung-uk Kim ACPI_STATUS Status; 685*a159c266SJung-uk Kim 686*a159c266SJung-uk Kim 687*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCopyEobjectToIobject); 688*a159c266SJung-uk Kim 689*a159c266SJung-uk Kim 690*a159c266SJung-uk Kim if (ExternalObject->Type == ACPI_TYPE_PACKAGE) 691*a159c266SJung-uk Kim { 692*a159c266SJung-uk Kim Status = AcpiUtCopyEpackageToIpackage (ExternalObject, InternalObject); 693*a159c266SJung-uk Kim } 694*a159c266SJung-uk Kim else 695*a159c266SJung-uk Kim { 696*a159c266SJung-uk Kim /* 697*a159c266SJung-uk Kim * Build a simple object (no nested objects) 698*a159c266SJung-uk Kim */ 699*a159c266SJung-uk Kim Status = AcpiUtCopyEsimpleToIsimple (ExternalObject, InternalObject); 700*a159c266SJung-uk Kim } 701*a159c266SJung-uk Kim 702*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 703*a159c266SJung-uk Kim } 704*a159c266SJung-uk Kim 705*a159c266SJung-uk Kim 706*a159c266SJung-uk Kim /******************************************************************************* 707*a159c266SJung-uk Kim * 708*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopySimpleObject 709*a159c266SJung-uk Kim * 710*a159c266SJung-uk Kim * PARAMETERS: SourceDesc - The internal object to be copied 711*a159c266SJung-uk Kim * DestDesc - New target object 712*a159c266SJung-uk Kim * 713*a159c266SJung-uk Kim * RETURN: Status 714*a159c266SJung-uk Kim * 715*a159c266SJung-uk Kim * DESCRIPTION: Simple copy of one internal object to another. Reference count 716*a159c266SJung-uk Kim * of the destination object is preserved. 717*a159c266SJung-uk Kim * 718*a159c266SJung-uk Kim ******************************************************************************/ 719*a159c266SJung-uk Kim 720*a159c266SJung-uk Kim static ACPI_STATUS 721*a159c266SJung-uk Kim AcpiUtCopySimpleObject ( 722*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceDesc, 723*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *DestDesc) 724*a159c266SJung-uk Kim { 725*a159c266SJung-uk Kim UINT16 ReferenceCount; 726*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *NextObject; 727*a159c266SJung-uk Kim ACPI_STATUS Status; 728*a159c266SJung-uk Kim ACPI_SIZE CopySize; 729*a159c266SJung-uk Kim 730*a159c266SJung-uk Kim 731*a159c266SJung-uk Kim /* Save fields from destination that we don't want to overwrite */ 732*a159c266SJung-uk Kim 733*a159c266SJung-uk Kim ReferenceCount = DestDesc->Common.ReferenceCount; 734*a159c266SJung-uk Kim NextObject = DestDesc->Common.NextObject; 735*a159c266SJung-uk Kim 736*a159c266SJung-uk Kim /* 737*a159c266SJung-uk Kim * Copy the entire source object over the destination object. 738*a159c266SJung-uk Kim * Note: Source can be either an operand object or namespace node. 739*a159c266SJung-uk Kim */ 740*a159c266SJung-uk Kim CopySize = sizeof (ACPI_OPERAND_OBJECT); 741*a159c266SJung-uk Kim if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED) 742*a159c266SJung-uk Kim { 743*a159c266SJung-uk Kim CopySize = sizeof (ACPI_NAMESPACE_NODE); 744*a159c266SJung-uk Kim } 745*a159c266SJung-uk Kim 746*a159c266SJung-uk Kim ACPI_MEMCPY (ACPI_CAST_PTR (char, DestDesc), 747*a159c266SJung-uk Kim ACPI_CAST_PTR (char, SourceDesc), CopySize); 748*a159c266SJung-uk Kim 749*a159c266SJung-uk Kim /* Restore the saved fields */ 750*a159c266SJung-uk Kim 751*a159c266SJung-uk Kim DestDesc->Common.ReferenceCount = ReferenceCount; 752*a159c266SJung-uk Kim DestDesc->Common.NextObject = NextObject; 753*a159c266SJung-uk Kim 754*a159c266SJung-uk Kim /* New object is not static, regardless of source */ 755*a159c266SJung-uk Kim 756*a159c266SJung-uk Kim DestDesc->Common.Flags &= ~AOPOBJ_STATIC_POINTER; 757*a159c266SJung-uk Kim 758*a159c266SJung-uk Kim /* Handle the objects with extra data */ 759*a159c266SJung-uk Kim 760*a159c266SJung-uk Kim switch (DestDesc->Common.Type) 761*a159c266SJung-uk Kim { 762*a159c266SJung-uk Kim case ACPI_TYPE_BUFFER: 763*a159c266SJung-uk Kim /* 764*a159c266SJung-uk Kim * Allocate and copy the actual buffer if and only if: 765*a159c266SJung-uk Kim * 1) There is a valid buffer pointer 766*a159c266SJung-uk Kim * 2) The buffer has a length > 0 767*a159c266SJung-uk Kim */ 768*a159c266SJung-uk Kim if ((SourceDesc->Buffer.Pointer) && 769*a159c266SJung-uk Kim (SourceDesc->Buffer.Length)) 770*a159c266SJung-uk Kim { 771*a159c266SJung-uk Kim DestDesc->Buffer.Pointer = 772*a159c266SJung-uk Kim ACPI_ALLOCATE (SourceDesc->Buffer.Length); 773*a159c266SJung-uk Kim if (!DestDesc->Buffer.Pointer) 774*a159c266SJung-uk Kim { 775*a159c266SJung-uk Kim return (AE_NO_MEMORY); 776*a159c266SJung-uk Kim } 777*a159c266SJung-uk Kim 778*a159c266SJung-uk Kim /* Copy the actual buffer data */ 779*a159c266SJung-uk Kim 780*a159c266SJung-uk Kim ACPI_MEMCPY (DestDesc->Buffer.Pointer, 781*a159c266SJung-uk Kim SourceDesc->Buffer.Pointer, SourceDesc->Buffer.Length); 782*a159c266SJung-uk Kim } 783*a159c266SJung-uk Kim break; 784*a159c266SJung-uk Kim 785*a159c266SJung-uk Kim case ACPI_TYPE_STRING: 786*a159c266SJung-uk Kim /* 787*a159c266SJung-uk Kim * Allocate and copy the actual string if and only if: 788*a159c266SJung-uk Kim * 1) There is a valid string pointer 789*a159c266SJung-uk Kim * (Pointer to a NULL string is allowed) 790*a159c266SJung-uk Kim */ 791*a159c266SJung-uk Kim if (SourceDesc->String.Pointer) 792*a159c266SJung-uk Kim { 793*a159c266SJung-uk Kim DestDesc->String.Pointer = 794*a159c266SJung-uk Kim ACPI_ALLOCATE ((ACPI_SIZE) SourceDesc->String.Length + 1); 795*a159c266SJung-uk Kim if (!DestDesc->String.Pointer) 796*a159c266SJung-uk Kim { 797*a159c266SJung-uk Kim return (AE_NO_MEMORY); 798*a159c266SJung-uk Kim } 799*a159c266SJung-uk Kim 800*a159c266SJung-uk Kim /* Copy the actual string data */ 801*a159c266SJung-uk Kim 802*a159c266SJung-uk Kim ACPI_MEMCPY (DestDesc->String.Pointer, SourceDesc->String.Pointer, 803*a159c266SJung-uk Kim (ACPI_SIZE) SourceDesc->String.Length + 1); 804*a159c266SJung-uk Kim } 805*a159c266SJung-uk Kim break; 806*a159c266SJung-uk Kim 807*a159c266SJung-uk Kim case ACPI_TYPE_LOCAL_REFERENCE: 808*a159c266SJung-uk Kim /* 809*a159c266SJung-uk Kim * We copied the reference object, so we now must add a reference 810*a159c266SJung-uk Kim * to the object pointed to by the reference 811*a159c266SJung-uk Kim * 812*a159c266SJung-uk Kim * DDBHandle reference (from Load/LoadTable) is a special reference, 813*a159c266SJung-uk Kim * it does not have a Reference.Object, so does not need to 814*a159c266SJung-uk Kim * increase the reference count 815*a159c266SJung-uk Kim */ 816*a159c266SJung-uk Kim if (SourceDesc->Reference.Class == ACPI_REFCLASS_TABLE) 817*a159c266SJung-uk Kim { 818*a159c266SJung-uk Kim break; 819*a159c266SJung-uk Kim } 820*a159c266SJung-uk Kim 821*a159c266SJung-uk Kim AcpiUtAddReference (SourceDesc->Reference.Object); 822*a159c266SJung-uk Kim break; 823*a159c266SJung-uk Kim 824*a159c266SJung-uk Kim case ACPI_TYPE_REGION: 825*a159c266SJung-uk Kim /* 826*a159c266SJung-uk Kim * We copied the Region Handler, so we now must add a reference 827*a159c266SJung-uk Kim */ 828*a159c266SJung-uk Kim if (DestDesc->Region.Handler) 829*a159c266SJung-uk Kim { 830*a159c266SJung-uk Kim AcpiUtAddReference (DestDesc->Region.Handler); 831*a159c266SJung-uk Kim } 832*a159c266SJung-uk Kim break; 833*a159c266SJung-uk Kim 834*a159c266SJung-uk Kim /* 835*a159c266SJung-uk Kim * For Mutex and Event objects, we cannot simply copy the underlying 836*a159c266SJung-uk Kim * OS object. We must create a new one. 837*a159c266SJung-uk Kim */ 838*a159c266SJung-uk Kim case ACPI_TYPE_MUTEX: 839*a159c266SJung-uk Kim 840*a159c266SJung-uk Kim Status = AcpiOsCreateMutex (&DestDesc->Mutex.OsMutex); 841*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 842*a159c266SJung-uk Kim { 843*a159c266SJung-uk Kim return (Status); 844*a159c266SJung-uk Kim } 845*a159c266SJung-uk Kim break; 846*a159c266SJung-uk Kim 847*a159c266SJung-uk Kim case ACPI_TYPE_EVENT: 848*a159c266SJung-uk Kim 849*a159c266SJung-uk Kim Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0, 850*a159c266SJung-uk Kim &DestDesc->Event.OsSemaphore); 851*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 852*a159c266SJung-uk Kim { 853*a159c266SJung-uk Kim return (Status); 854*a159c266SJung-uk Kim } 855*a159c266SJung-uk Kim break; 856*a159c266SJung-uk Kim 857*a159c266SJung-uk Kim default: 858*a159c266SJung-uk Kim /* Nothing to do for other simple objects */ 859*a159c266SJung-uk Kim break; 860*a159c266SJung-uk Kim } 861*a159c266SJung-uk Kim 862*a159c266SJung-uk Kim return (AE_OK); 863*a159c266SJung-uk Kim } 864*a159c266SJung-uk Kim 865*a159c266SJung-uk Kim 866*a159c266SJung-uk Kim /******************************************************************************* 867*a159c266SJung-uk Kim * 868*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyIelementToIelement 869*a159c266SJung-uk Kim * 870*a159c266SJung-uk Kim * PARAMETERS: ACPI_PKG_CALLBACK 871*a159c266SJung-uk Kim * 872*a159c266SJung-uk Kim * RETURN: Status 873*a159c266SJung-uk Kim * 874*a159c266SJung-uk Kim * DESCRIPTION: Copy one package element to another package element 875*a159c266SJung-uk Kim * 876*a159c266SJung-uk Kim ******************************************************************************/ 877*a159c266SJung-uk Kim 878*a159c266SJung-uk Kim static ACPI_STATUS 879*a159c266SJung-uk Kim AcpiUtCopyIelementToIelement ( 880*a159c266SJung-uk Kim UINT8 ObjectType, 881*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceObject, 882*a159c266SJung-uk Kim ACPI_GENERIC_STATE *State, 883*a159c266SJung-uk Kim void *Context) 884*a159c266SJung-uk Kim { 885*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 886*a159c266SJung-uk Kim UINT32 ThisIndex; 887*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **ThisTargetPtr; 888*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *TargetObject; 889*a159c266SJung-uk Kim 890*a159c266SJung-uk Kim 891*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 892*a159c266SJung-uk Kim 893*a159c266SJung-uk Kim 894*a159c266SJung-uk Kim ThisIndex = State->Pkg.Index; 895*a159c266SJung-uk Kim ThisTargetPtr = (ACPI_OPERAND_OBJECT **) 896*a159c266SJung-uk Kim &State->Pkg.DestObject->Package.Elements[ThisIndex]; 897*a159c266SJung-uk Kim 898*a159c266SJung-uk Kim switch (ObjectType) 899*a159c266SJung-uk Kim { 900*a159c266SJung-uk Kim case ACPI_COPY_TYPE_SIMPLE: 901*a159c266SJung-uk Kim 902*a159c266SJung-uk Kim /* A null source object indicates a (legal) null package element */ 903*a159c266SJung-uk Kim 904*a159c266SJung-uk Kim if (SourceObject) 905*a159c266SJung-uk Kim { 906*a159c266SJung-uk Kim /* 907*a159c266SJung-uk Kim * This is a simple object, just copy it 908*a159c266SJung-uk Kim */ 909*a159c266SJung-uk Kim TargetObject = AcpiUtCreateInternalObject ( 910*a159c266SJung-uk Kim SourceObject->Common.Type); 911*a159c266SJung-uk Kim if (!TargetObject) 912*a159c266SJung-uk Kim { 913*a159c266SJung-uk Kim return (AE_NO_MEMORY); 914*a159c266SJung-uk Kim } 915*a159c266SJung-uk Kim 916*a159c266SJung-uk Kim Status = AcpiUtCopySimpleObject (SourceObject, TargetObject); 917*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 918*a159c266SJung-uk Kim { 919*a159c266SJung-uk Kim goto ErrorExit; 920*a159c266SJung-uk Kim } 921*a159c266SJung-uk Kim 922*a159c266SJung-uk Kim *ThisTargetPtr = TargetObject; 923*a159c266SJung-uk Kim } 924*a159c266SJung-uk Kim else 925*a159c266SJung-uk Kim { 926*a159c266SJung-uk Kim /* Pass through a null element */ 927*a159c266SJung-uk Kim 928*a159c266SJung-uk Kim *ThisTargetPtr = NULL; 929*a159c266SJung-uk Kim } 930*a159c266SJung-uk Kim break; 931*a159c266SJung-uk Kim 932*a159c266SJung-uk Kim 933*a159c266SJung-uk Kim case ACPI_COPY_TYPE_PACKAGE: 934*a159c266SJung-uk Kim 935*a159c266SJung-uk Kim /* 936*a159c266SJung-uk Kim * This object is a package - go down another nesting level 937*a159c266SJung-uk Kim * Create and build the package object 938*a159c266SJung-uk Kim */ 939*a159c266SJung-uk Kim TargetObject = AcpiUtCreatePackageObject (SourceObject->Package.Count); 940*a159c266SJung-uk Kim if (!TargetObject) 941*a159c266SJung-uk Kim { 942*a159c266SJung-uk Kim return (AE_NO_MEMORY); 943*a159c266SJung-uk Kim } 944*a159c266SJung-uk Kim 945*a159c266SJung-uk Kim TargetObject->Common.Flags = SourceObject->Common.Flags; 946*a159c266SJung-uk Kim 947*a159c266SJung-uk Kim /* Pass the new package object back to the package walk routine */ 948*a159c266SJung-uk Kim 949*a159c266SJung-uk Kim State->Pkg.ThisTargetObj = TargetObject; 950*a159c266SJung-uk Kim 951*a159c266SJung-uk Kim /* Store the object pointer in the parent package object */ 952*a159c266SJung-uk Kim 953*a159c266SJung-uk Kim *ThisTargetPtr = TargetObject; 954*a159c266SJung-uk Kim break; 955*a159c266SJung-uk Kim 956*a159c266SJung-uk Kim 957*a159c266SJung-uk Kim default: 958*a159c266SJung-uk Kim return (AE_BAD_PARAMETER); 959*a159c266SJung-uk Kim } 960*a159c266SJung-uk Kim 961*a159c266SJung-uk Kim return (Status); 962*a159c266SJung-uk Kim 963*a159c266SJung-uk Kim ErrorExit: 964*a159c266SJung-uk Kim AcpiUtRemoveReference (TargetObject); 965*a159c266SJung-uk Kim return (Status); 966*a159c266SJung-uk Kim } 967*a159c266SJung-uk Kim 968*a159c266SJung-uk Kim 969*a159c266SJung-uk Kim /******************************************************************************* 970*a159c266SJung-uk Kim * 971*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyIpackageToIpackage 972*a159c266SJung-uk Kim * 973*a159c266SJung-uk Kim * PARAMETERS: SourceObj - Pointer to the source package object 974*a159c266SJung-uk Kim * DestObj - Where the internal object is returned 975*a159c266SJung-uk Kim * WalkState - Current Walk state descriptor 976*a159c266SJung-uk Kim * 977*a159c266SJung-uk Kim * RETURN: Status 978*a159c266SJung-uk Kim * 979*a159c266SJung-uk Kim * DESCRIPTION: This function is called to copy an internal package object 980*a159c266SJung-uk Kim * into another internal package object. 981*a159c266SJung-uk Kim * 982*a159c266SJung-uk Kim ******************************************************************************/ 983*a159c266SJung-uk Kim 984*a159c266SJung-uk Kim static ACPI_STATUS 985*a159c266SJung-uk Kim AcpiUtCopyIpackageToIpackage ( 986*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceObj, 987*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *DestObj, 988*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState) 989*a159c266SJung-uk Kim { 990*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 991*a159c266SJung-uk Kim 992*a159c266SJung-uk Kim 993*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCopyIpackageToIpackage); 994*a159c266SJung-uk Kim 995*a159c266SJung-uk Kim 996*a159c266SJung-uk Kim DestObj->Common.Type = SourceObj->Common.Type; 997*a159c266SJung-uk Kim DestObj->Common.Flags = SourceObj->Common.Flags; 998*a159c266SJung-uk Kim DestObj->Package.Count = SourceObj->Package.Count; 999*a159c266SJung-uk Kim 1000*a159c266SJung-uk Kim /* 1001*a159c266SJung-uk Kim * Create the object array and walk the source package tree 1002*a159c266SJung-uk Kim */ 1003*a159c266SJung-uk Kim DestObj->Package.Elements = ACPI_ALLOCATE_ZEROED ( 1004*a159c266SJung-uk Kim ((ACPI_SIZE) SourceObj->Package.Count + 1) * 1005*a159c266SJung-uk Kim sizeof (void *)); 1006*a159c266SJung-uk Kim if (!DestObj->Package.Elements) 1007*a159c266SJung-uk Kim { 1008*a159c266SJung-uk Kim ACPI_ERROR ((AE_INFO, "Package allocation failure")); 1009*a159c266SJung-uk Kim return_ACPI_STATUS (AE_NO_MEMORY); 1010*a159c266SJung-uk Kim } 1011*a159c266SJung-uk Kim 1012*a159c266SJung-uk Kim /* 1013*a159c266SJung-uk Kim * Copy the package element-by-element by walking the package "tree". 1014*a159c266SJung-uk Kim * This handles nested packages of arbitrary depth. 1015*a159c266SJung-uk Kim */ 1016*a159c266SJung-uk Kim Status = AcpiUtWalkPackageTree (SourceObj, DestObj, 1017*a159c266SJung-uk Kim AcpiUtCopyIelementToIelement, WalkState); 1018*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1019*a159c266SJung-uk Kim { 1020*a159c266SJung-uk Kim /* On failure, delete the destination package object */ 1021*a159c266SJung-uk Kim 1022*a159c266SJung-uk Kim AcpiUtRemoveReference (DestObj); 1023*a159c266SJung-uk Kim } 1024*a159c266SJung-uk Kim 1025*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 1026*a159c266SJung-uk Kim } 1027*a159c266SJung-uk Kim 1028*a159c266SJung-uk Kim 1029*a159c266SJung-uk Kim /******************************************************************************* 1030*a159c266SJung-uk Kim * 1031*a159c266SJung-uk Kim * FUNCTION: AcpiUtCopyIobjectToIobject 1032*a159c266SJung-uk Kim * 1033*a159c266SJung-uk Kim * PARAMETERS: SourceDesc - The internal object to be copied 1034*a159c266SJung-uk Kim * DestDesc - Where the copied object is returned 1035*a159c266SJung-uk Kim * WalkState - Current walk state 1036*a159c266SJung-uk Kim * 1037*a159c266SJung-uk Kim * RETURN: Status 1038*a159c266SJung-uk Kim * 1039*a159c266SJung-uk Kim * DESCRIPTION: Copy an internal object to a new internal object 1040*a159c266SJung-uk Kim * 1041*a159c266SJung-uk Kim ******************************************************************************/ 1042*a159c266SJung-uk Kim 1043*a159c266SJung-uk Kim ACPI_STATUS 1044*a159c266SJung-uk Kim AcpiUtCopyIobjectToIobject ( 1045*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *SourceDesc, 1046*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT **DestDesc, 1047*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState) 1048*a159c266SJung-uk Kim { 1049*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 1050*a159c266SJung-uk Kim 1051*a159c266SJung-uk Kim 1052*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (UtCopyIobjectToIobject); 1053*a159c266SJung-uk Kim 1054*a159c266SJung-uk Kim 1055*a159c266SJung-uk Kim /* Create the top level object */ 1056*a159c266SJung-uk Kim 1057*a159c266SJung-uk Kim *DestDesc = AcpiUtCreateInternalObject (SourceDesc->Common.Type); 1058*a159c266SJung-uk Kim if (!*DestDesc) 1059*a159c266SJung-uk Kim { 1060*a159c266SJung-uk Kim return_ACPI_STATUS (AE_NO_MEMORY); 1061*a159c266SJung-uk Kim } 1062*a159c266SJung-uk Kim 1063*a159c266SJung-uk Kim /* Copy the object and possible subobjects */ 1064*a159c266SJung-uk Kim 1065*a159c266SJung-uk Kim if (SourceDesc->Common.Type == ACPI_TYPE_PACKAGE) 1066*a159c266SJung-uk Kim { 1067*a159c266SJung-uk Kim Status = AcpiUtCopyIpackageToIpackage (SourceDesc, *DestDesc, 1068*a159c266SJung-uk Kim WalkState); 1069*a159c266SJung-uk Kim } 1070*a159c266SJung-uk Kim else 1071*a159c266SJung-uk Kim { 1072*a159c266SJung-uk Kim Status = AcpiUtCopySimpleObject (SourceDesc, *DestDesc); 1073*a159c266SJung-uk Kim } 1074*a159c266SJung-uk Kim 1075*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 1076*a159c266SJung-uk Kim } 1077*a159c266SJung-uk Kim 1078*a159c266SJung-uk Kim 1079