summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/utcopy.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/utcopy.c')
-rw-r--r--sys/contrib/dev/acpica/utcopy.c225
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);
+}
+
+
OpenPOWER on IntegriCloud