diff options
Diffstat (limited to 'sys/contrib/dev/acpica/utcopy.c')
-rw-r--r-- | sys/contrib/dev/acpica/utcopy.c | 225 |
1 files changed, 174 insertions, 51 deletions
diff --git a/sys/contrib/dev/acpica/utcopy.c b/sys/contrib/dev/acpica/utcopy.c index 58202a7..4587b10 100644 --- a/sys/contrib/dev/acpica/utcopy.c +++ b/sys/contrib/dev/acpica/utcopy.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utcopy - Internal to external object translation utilities - * $Revision: 86 $ + * $Revision: 94 $ * *****************************************************************************/ @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2002, Intel Corp. * All rights reserved. * * 2. License @@ -123,7 +123,7 @@ #define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("utcopy") + ACPI_MODULE_NAME ("utcopy") /******************************************************************************* @@ -148,14 +148,16 @@ AcpiUtCopyIsimpleToEsimple ( ACPI_OPERAND_OBJECT *InternalObject, ACPI_OBJECT *ExternalObject, UINT8 *DataSpace, - UINT32 *BufferSpaceUsed) + ACPI_SIZE *BufferSpaceUsed) { - UINT32 Length = 0; + ACPI_BUFFER Buffer; ACPI_STATUS Status = AE_OK; - FUNCTION_TRACE ("UtCopyIsimpleToEsimple"); + ACPI_FUNCTION_TRACE ("UtCopyIsimpleToEsimple"); + + *BufferSpaceUsed = 0; /* * Check for NULL object case (could be an uninitialized @@ -163,13 +165,12 @@ AcpiUtCopyIsimpleToEsimple ( */ if (!InternalObject) { - *BufferSpaceUsed = 0; return_ACPI_STATUS (AE_OK); } /* Always clear the external object */ - MEMSET (ExternalObject, 0, sizeof (ACPI_OBJECT)); + ACPI_MEMSET (ExternalObject, 0, sizeof (ACPI_OBJECT)); /* * In general, the external object will be the same type as @@ -181,28 +182,31 @@ AcpiUtCopyIsimpleToEsimple ( switch (InternalObject->Common.Type) { - case ACPI_TYPE_STRING: - Length = InternalObject->String.Length + 1; - ExternalObject->String.Length = InternalObject->String.Length; ExternalObject->String.Pointer = (NATIVE_CHAR *) DataSpace; - MEMCPY ((void *) DataSpace, (void *) InternalObject->String.Pointer, Length); + ExternalObject->String.Length = InternalObject->String.Length; + *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD (InternalObject->String.Length + 1); + + ACPI_MEMCPY ((void *) DataSpace, (void *) InternalObject->String.Pointer, + InternalObject->String.Length + 1); break; case ACPI_TYPE_BUFFER: - Length = InternalObject->Buffer.Length; - ExternalObject->Buffer.Length = InternalObject->Buffer.Length; ExternalObject->Buffer.Pointer = DataSpace; - MEMCPY ((void *) DataSpace, (void *) InternalObject->Buffer.Pointer, Length); + ExternalObject->Buffer.Length = InternalObject->Buffer.Length; + *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD (InternalObject->String.Length); + + ACPI_MEMCPY ((void *) DataSpace, (void *) InternalObject->Buffer.Pointer, + InternalObject->Buffer.Length); break; case ACPI_TYPE_INTEGER: - ExternalObject->Integer.Value= InternalObject->Integer.Value; + ExternalObject->Integer.Value = InternalObject->Integer.Value; break; @@ -238,15 +242,19 @@ AcpiUtCopyIsimpleToEsimple ( * This is a named reference, get the string. We already know that * we have room for it, use max length */ - Length = MAX_STRING_LENGTH; ExternalObject->Type = ACPI_TYPE_STRING; ExternalObject->String.Pointer = (NATIVE_CHAR *) DataSpace; + + Buffer.Length = MAX_STRING_LENGTH; + Buffer.Pointer = DataSpace; + Status = AcpiNsHandleToPathname ((ACPI_HANDLE *) InternalObject->Reference.Node, - &Length, (char *) DataSpace); + &Buffer); /* Converted (external) string length is returned from above */ - ExternalObject->String.Length = Length; + ExternalObject->String.Length = Buffer.Length; + *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD (Buffer.Length); break; default: @@ -284,12 +292,8 @@ AcpiUtCopyIsimpleToEsimple ( * There is no corresponding external object type */ return_ACPI_STATUS (AE_SUPPORT); - break; } - - *BufferSpaceUsed = (UINT32) ROUND_UP_TO_NATIVE_WORD (Length); - return_ACPI_STATUS (Status); } @@ -315,12 +319,12 @@ AcpiUtCopyIelementToEelement ( { ACPI_STATUS Status = AE_OK; ACPI_PKG_INFO *Info = (ACPI_PKG_INFO *) Context; - UINT32 ObjectSpace; + ACPI_SIZE ObjectSpace; UINT32 ThisIndex; ACPI_OBJECT *TargetObject; - FUNCTION_ENTRY (); + ACPI_FUNCTION_ENTRY (); ThisIndex = State->Pkg.Index; @@ -361,14 +365,13 @@ AcpiUtCopyIelementToEelement ( * Save space for the array of objects (Package elements) * update the buffer length counter */ - ObjectSpace = (UINT32) ROUND_UP_TO_NATIVE_WORD ( + ObjectSpace = ACPI_ROUND_UP_TO_NATIVE_WORD ( TargetObject->Package.Count * sizeof (ACPI_OBJECT)); break; default: return (AE_BAD_PARAMETER); - break; } Info->FreeSpace += ObjectSpace; @@ -400,14 +403,14 @@ static ACPI_STATUS AcpiUtCopyIpackageToEpackage ( ACPI_OPERAND_OBJECT *InternalObject, UINT8 *Buffer, - UINT32 *SpaceUsed) + ACPI_SIZE *SpaceUsed) { ACPI_OBJECT *ExternalObject; ACPI_STATUS Status; ACPI_PKG_INFO Info; - FUNCTION_TRACE ("UtCopyIpackageToEpackage"); + ACPI_FUNCTION_TRACE ("UtCopyIpackageToEpackage"); /* @@ -421,7 +424,7 @@ AcpiUtCopyIpackageToEpackage ( Info.Length = 0; Info.ObjectSpace = 0; Info.NumPackages = 1; - Info.FreeSpace = Buffer + ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); + Info.FreeSpace = Buffer + ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); ExternalObject->Type = InternalObject->Common.Type; ExternalObject->Package.Count = InternalObject->Package.Count; @@ -432,7 +435,7 @@ AcpiUtCopyIpackageToEpackage ( * and move the free space past it */ Info.FreeSpace += ExternalObject->Package.Count * - ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); + ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); Status = AcpiUtWalkPackageTree (InternalObject, ExternalObject, AcpiUtCopyIelementToEelement, &Info); @@ -464,10 +467,10 @@ AcpiUtCopyIobjectToEobject ( ACPI_STATUS Status; - FUNCTION_TRACE ("UtCopyIobjectToEobject"); + ACPI_FUNCTION_TRACE ("UtCopyIobjectToEobject"); - if (IS_THIS_OBJECT_TYPE (InternalObject, ACPI_TYPE_PACKAGE)) + if (InternalObject->Common.Type == ACPI_TYPE_PACKAGE) { /* * Package object: Copy all subobjects (including @@ -484,7 +487,7 @@ AcpiUtCopyIobjectToEobject ( Status = AcpiUtCopyIsimpleToEsimple (InternalObject, (ACPI_OBJECT *) RetBuffer->Pointer, ((UINT8 *) RetBuffer->Pointer + - ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT))), + ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT))), &RetBuffer->Length); /* * build simple does not include the object size in the length @@ -521,7 +524,7 @@ AcpiUtCopyEsimpleToIsimple ( ACPI_OPERAND_OBJECT *InternalObject; - FUNCTION_TRACE ("UtCopyEsimpleToIsimple"); + ACPI_FUNCTION_TRACE ("UtCopyEsimpleToIsimple"); /* @@ -545,7 +548,6 @@ AcpiUtCopyEsimpleToIsimple ( * Whatever other type -- it is not supported */ return_ACPI_STATUS (AE_SUPPORT); - break; } @@ -562,9 +564,9 @@ AcpiUtCopyEsimpleToIsimple ( return_ACPI_STATUS (AE_NO_MEMORY); } - MEMCPY (InternalObject->String.Pointer, - ExternalObject->String.Pointer, - ExternalObject->String.Length); + ACPI_MEMCPY (InternalObject->String.Pointer, + ExternalObject->String.Pointer, + ExternalObject->String.Length); InternalObject->String.Length = ExternalObject->String.Length; break; @@ -578,9 +580,9 @@ AcpiUtCopyEsimpleToIsimple ( return_ACPI_STATUS (AE_NO_MEMORY); } - MEMCPY (InternalObject->Buffer.Pointer, - ExternalObject->Buffer.Pointer, - ExternalObject->Buffer.Length); + ACPI_MEMCPY (InternalObject->Buffer.Pointer, + ExternalObject->Buffer.Pointer, + ExternalObject->Buffer.Length); InternalObject->Buffer.Length = ExternalObject->Buffer.Length; break; @@ -635,7 +637,7 @@ AcpiUtCopyEpackageToIpackage ( ACPI_OBJECT *ThisExternalObj; - FUNCTION_TRACE ("UtCopyEpackageToIpackage"); + ACPI_FUNCTION_TRACE ("UtCopyEpackageToIpackage"); /* @@ -689,7 +691,7 @@ AcpiUtCopyEobjectToIobject ( ACPI_STATUS Status; - FUNCTION_TRACE ("UtCopyEobjectToIobject"); + ACPI_FUNCTION_TRACE ("UtCopyEobjectToIobject"); if (ExternalObject->Type == ACPI_TYPE_PACKAGE) @@ -717,11 +719,83 @@ AcpiUtCopyEobjectToIobject ( /******************************************************************************* * + * FUNCTION: AcpiUtCopySimpleObject + * + * PARAMETERS: SourceDesc - The internal object to be copied + * DestDesc - New target object + * + * RETURN: Status + * + * DESCRIPTION: Simple copy of one internal object to another. Reference count + * of the destination object is preserved. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiUtCopySimpleObject ( + ACPI_OPERAND_OBJECT *SourceDesc, + ACPI_OPERAND_OBJECT *DestDesc) +{ + UINT16 ReferenceCount; + ACPI_OPERAND_OBJECT *NextObject; + + + /* Save fields from destination that we don't want to overwrite */ + + ReferenceCount = DestDesc->Common.ReferenceCount; + NextObject = DestDesc->Common.NextObject; + + /* Copy the entire source object over the destination object*/ + + ACPI_MEMCPY ((char *) DestDesc, (char *) SourceDesc, sizeof (ACPI_OPERAND_OBJECT)); + + /* Restore the saved fields */ + + DestDesc->Common.ReferenceCount = ReferenceCount; + DestDesc->Common.NextObject = NextObject; + + /* Handle the objects with extra data */ + + switch (DestDesc->Common.Type) + { + case ACPI_TYPE_BUFFER: + + DestDesc->Buffer.Node = NULL; + + case ACPI_TYPE_STRING: + + /* + * Allocate and copy the actual string if and only if: + * 1) There is a valid string (length > 0) + * 2) The string is not static (not in an ACPI table) (in this case, + * the actual pointer was already copied above) + */ + if ((SourceDesc->String.Length) && + (!(SourceDesc->Common.Flags & AOPOBJ_STATIC_POINTER))) + { + DestDesc->String.Pointer = ACPI_MEM_ALLOCATE (SourceDesc->String.Length); + if (!DestDesc->String.Pointer) + { + return (AE_NO_MEMORY); + } + + ACPI_MEMCPY (DestDesc->String.Pointer, SourceDesc->String.Pointer, + SourceDesc->String.Length); + } + break; + } + + return (AE_OK); +} + + +/******************************************************************************* + * * FUNCTION: AcpiUtCopyIelementToIelement * * PARAMETERS: ACPI_PKG_CALLBACK * - * RETURN: Status - the status of the call + * RETURN: Status * * DESCRIPTION: Copy one package element to another package element * @@ -740,7 +814,7 @@ AcpiUtCopyIelementToIelement ( ACPI_OPERAND_OBJECT *TargetObject; - FUNCTION_ENTRY (); + ACPI_FUNCTION_ENTRY (); ThisIndex = State->Pkg.Index; @@ -760,8 +834,7 @@ AcpiUtCopyIelementToIelement ( return (AE_NO_MEMORY); } - Status = AcpiExStoreObjectToObject (SourceObject, TargetObject, - (ACPI_WALK_STATE *) Context); + Status = AcpiUtCopySimpleObject (SourceObject, TargetObject); if (ACPI_FAILURE (Status)) { return (Status); @@ -799,7 +872,6 @@ AcpiUtCopyIelementToIelement ( default: return (AE_BAD_PARAMETER); - break; } return (Status); @@ -829,7 +901,7 @@ AcpiUtCopyIpackageToIpackage ( ACPI_STATUS Status = AE_OK; - FUNCTION_TRACE ("UtCopyIpackageToIpackage"); + ACPI_FUNCTION_TRACE ("UtCopyIpackageToIpackage"); DestObj->Common.Type = SourceObj->Common.Type; @@ -843,7 +915,7 @@ AcpiUtCopyIpackageToIpackage ( sizeof (void *)); if (!DestObj->Package.Elements) { - REPORT_ERROR ( + ACPI_REPORT_ERROR ( ("AmlBuildCopyInternalPackageObject: Package allocation failure\n")); return_ACPI_STATUS (AE_NO_MEMORY); } @@ -868,3 +940,54 @@ AcpiUtCopyIpackageToIpackage ( return_ACPI_STATUS (Status); } + +/******************************************************************************* + * + * FUNCTION: AcpiUtCopyIobjectToIobject + * + * PARAMETERS: WalkState - Current walk state + * SourceDesc - The internal object to be copied + * DestDesc - Where the copied object is returned + * + * RETURN: Status + * + * DESCRIPTION: Copy an internal object to a new internal object + * + ******************************************************************************/ + +ACPI_STATUS +AcpiUtCopyIobjectToIobject ( + ACPI_OPERAND_OBJECT *SourceDesc, + ACPI_OPERAND_OBJECT **DestDesc, + ACPI_WALK_STATE *WalkState) +{ + ACPI_STATUS Status = AE_OK; + + + ACPI_FUNCTION_TRACE ("UtCopyIobjectToIobject"); + + + /* Create the top level object */ + + *DestDesc = AcpiUtCreateInternalObject (SourceDesc->Common.Type); + if (!*DestDesc) + { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + /* Copy the object and possible subobjects */ + + if (SourceDesc->Common.Type == ACPI_TYPE_PACKAGE) + { + Status = AcpiUtCopyIpackageToIpackage (SourceDesc, *DestDesc, + WalkState); + } + else + { + Status = AcpiUtCopySimpleObject (SourceDesc, *DestDesc); + } + + return_ACPI_STATUS (Status); +} + + |