diff options
Diffstat (limited to 'sys/contrib/dev/acpica/utcopy.c')
-rw-r--r-- | sys/contrib/dev/acpica/utcopy.c | 60 |
1 files changed, 27 insertions, 33 deletions
diff --git a/sys/contrib/dev/acpica/utcopy.c b/sys/contrib/dev/acpica/utcopy.c index 821f0ab553f6..58202a705988 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: 83 $ + * $Revision: 86 $ * *****************************************************************************/ @@ -332,7 +332,7 @@ AcpiUtCopyIelementToEelement ( case ACPI_COPY_TYPE_SIMPLE: /* - * This is a simple or null object -- get the size + * This is a simple or null object */ Status = AcpiUtCopyIsimpleToEsimple (SourceObject, TargetObject, Info->FreeSpace, &ObjectSpace); @@ -340,9 +340,9 @@ AcpiUtCopyIelementToEelement ( { return (Status); } - break; + case ACPI_COPY_TYPE_PACKAGE: /* @@ -365,14 +365,14 @@ AcpiUtCopyIelementToEelement ( TargetObject->Package.Count * sizeof (ACPI_OBJECT)); break; + default: return (AE_BAD_PARAMETER); + break; } - Info->FreeSpace += ObjectSpace; Info->Length += ObjectSpace; - return (Status); } @@ -423,12 +423,10 @@ AcpiUtCopyIpackageToEpackage ( Info.NumPackages = 1; Info.FreeSpace = Buffer + ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); - ExternalObject->Type = InternalObject->Common.Type; ExternalObject->Package.Count = InternalObject->Package.Count; ExternalObject->Package.Elements = (ACPI_OBJECT *) Info.FreeSpace; - /* * Build an array of ACPI_OBJECTS in the buffer * and move the free space past it @@ -436,16 +434,14 @@ AcpiUtCopyIpackageToEpackage ( Info.FreeSpace += ExternalObject->Package.Count * ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); - Status = AcpiUtWalkPackageTree (InternalObject, ExternalObject, AcpiUtCopyIelementToEelement, &Info); *SpaceUsed = Info.Length; - return_ACPI_STATUS (Status); - } + /******************************************************************************* * * FUNCTION: AcpiUtCopyIobjectToEobject @@ -480,7 +476,6 @@ AcpiUtCopyIobjectToEobject ( Status = AcpiUtCopyIpackageToEpackage (InternalObject, RetBuffer->Pointer, &RetBuffer->Length); } - else { /* @@ -529,7 +524,6 @@ AcpiUtCopyEsimpleToIsimple ( FUNCTION_TRACE ("UtCopyEsimpleToIsimple"); - /* * Simple types supported are: String, Buffer, Integer */ @@ -568,8 +562,8 @@ AcpiUtCopyEsimpleToIsimple ( return_ACPI_STATUS (AE_NO_MEMORY); } - MEMCPY (InternalObject->String.Pointer, - ExternalObject->String.Pointer, + MEMCPY (InternalObject->String.Pointer, + ExternalObject->String.Pointer, ExternalObject->String.Length); InternalObject->String.Length = ExternalObject->String.Length; @@ -584,8 +578,8 @@ AcpiUtCopyEsimpleToIsimple ( return_ACPI_STATUS (AE_NO_MEMORY); } - MEMCPY (InternalObject->Buffer.Pointer, - ExternalObject->Buffer.Pointer, + MEMCPY (InternalObject->Buffer.Pointer, + ExternalObject->Buffer.Pointer, ExternalObject->Buffer.Length); InternalObject->Buffer.Length = ExternalObject->Buffer.Length; @@ -598,7 +592,6 @@ AcpiUtCopyEsimpleToIsimple ( break; } - *RetInternalObject = InternalObject; return_ACPI_STATUS (AE_OK); } @@ -702,18 +695,8 @@ AcpiUtCopyEobjectToIobject ( if (ExternalObject->Type == ACPI_TYPE_PACKAGE) { /* - * Package objects contain other objects (which can be objects) - * buildpackage does it all - * - * TBD: Package conversion must be completed and tested - * NOTE: this code converts packages as input parameters to - * control methods only. This is a very, very rare case. + * Packages as external input to control methods are not supported, */ -/* - Status = AcpiUtCopyEpackageToIpackage(InternalObject, - RetBuffer->Pointer, - &RetBuffer->Length); -*/ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Packages as parameters not implemented!\n")); @@ -789,6 +772,7 @@ AcpiUtCopyIelementToIelement ( case 1: + /* * This object is a package - go down another nesting level * Create and build the package object @@ -796,8 +780,6 @@ AcpiUtCopyIelementToIelement ( TargetObject = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE); if (!TargetObject) { - /* TBD: must delete package created up to this point */ - return (AE_NO_MEMORY); } @@ -814,11 +796,12 @@ AcpiUtCopyIelementToIelement ( *ThisTargetPtr = TargetObject; break; + default: return (AE_BAD_PARAMETER); + break; } - return (Status); } @@ -858,8 +841,6 @@ AcpiUtCopyIpackageToIpackage ( */ DestObj->Package.Elements = ACPI_MEM_CALLOCATE ((SourceObj->Package.Count + 1) * sizeof (void *)); - DestObj->Package.NextElement = DestObj->Package.Elements; - if (!DestObj->Package.Elements) { REPORT_ERROR ( @@ -867,9 +848,22 @@ AcpiUtCopyIpackageToIpackage ( return_ACPI_STATUS (AE_NO_MEMORY); } + /* Init */ + DestObj->Package.NextElement = DestObj->Package.Elements; + + /* + * Copy the package element-by-element by walking the package "tree". + * This handles nested packages of arbitrary depth. + */ Status = AcpiUtWalkPackageTree (SourceObj, DestObj, AcpiUtCopyIelementToIelement, WalkState); + if (ACPI_FAILURE (Status)) + { + /* On failure, delete the destination package object */ + + AcpiUtRemoveReference (DestObj); + } return_ACPI_STATUS (Status); } |