summaryrefslogtreecommitdiff
path: root/usr/src/uts/intel/io/acpica/utilities/utcopy.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/intel/io/acpica/utilities/utcopy.c')
-rw-r--r--usr/src/uts/intel/io/acpica/utilities/utcopy.c203
1 files changed, 113 insertions, 90 deletions
diff --git a/usr/src/uts/intel/io/acpica/utilities/utcopy.c b/usr/src/uts/intel/io/acpica/utilities/utcopy.c
index 111af3085f..40115e798a 100644
--- a/usr/src/uts/intel/io/acpica/utilities/utcopy.c
+++ b/usr/src/uts/intel/io/acpica/utilities/utcopy.c
@@ -1,7 +1,7 @@
/******************************************************************************
*
* Module Name: utcopy - Internal to external object translation utilities
- * $Revision: 1.129 $
+ * $Revision: 1.137 $
*
*****************************************************************************/
@@ -9,7 +9,7 @@
*
* 1. Copyright Notice
*
- * Some or all of this work - Copyright (c) 1999 - 2006, Intel Corp.
+ * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
* All rights reserved.
*
* 2. License
@@ -117,7 +117,7 @@
#define __UTCOPY_C__
#include "acpi.h"
-#include "amlcode.h"
+#include "acnamesp.h"
#define _COMPONENT ACPI_UTILITIES
@@ -151,6 +151,11 @@ AcpiUtCopyEsimpleToIsimple(
ACPI_OPERAND_OBJECT **ReturnObj);
static ACPI_STATUS
+AcpiUtCopyEpackageToIpackage (
+ ACPI_OBJECT *ExternalObject,
+ ACPI_OPERAND_OBJECT **InternalObject);
+
+static ACPI_STATUS
AcpiUtCopySimpleObject (
ACPI_OPERAND_OBJECT *SourceDesc,
ACPI_OPERAND_OBJECT *DestDesc);
@@ -261,42 +266,49 @@ AcpiUtCopyIsimpleToEsimple (
case ACPI_TYPE_LOCAL_REFERENCE:
- /*
- * This is an object reference. Attempt to dereference it.
- */
- switch (InternalObject->Reference.Opcode)
- {
- case AML_INT_NAMEPATH_OP:
+ /* This is an object reference. */
- /* For namepath, return the object handle ("reference") */
+ switch (InternalObject->Reference.Class)
+ {
+ case ACPI_REFCLASS_NAME:
- default:
/*
- * Use the object type of "Any" to indicate a reference
- * to object containing a handle to an ACPI named object.
+ * For namepath, return the object handle ("reference")
+ * We are referring to the namespace node
*/
- ExternalObject->Type = ACPI_TYPE_ANY;
- ExternalObject->Reference.Handle = InternalObject->Reference.Node;
+ ExternalObject->Reference.Handle =
+ InternalObject->Reference.Node;
+ ExternalObject->Reference.ActualType =
+ AcpiNsGetType (InternalObject->Reference.Node);
break;
+
+ default:
+
+ /* All other reference types are unsupported */
+
+ return_ACPI_STATUS (AE_TYPE);
}
break;
case ACPI_TYPE_PROCESSOR:
- ExternalObject->Processor.ProcId = InternalObject->Processor.ProcId;
- ExternalObject->Processor.PblkAddress = InternalObject->Processor.Address;
- ExternalObject->Processor.PblkLength = InternalObject->Processor.Length;
+ ExternalObject->Processor.ProcId =
+ InternalObject->Processor.ProcId;
+ ExternalObject->Processor.PblkAddress =
+ InternalObject->Processor.Address;
+ ExternalObject->Processor.PblkLength =
+ InternalObject->Processor.Length;
break;
case ACPI_TYPE_POWER:
ExternalObject->PowerResource.SystemLevel =
- InternalObject->PowerResource.SystemLevel;
+ InternalObject->PowerResource.SystemLevel;
ExternalObject->PowerResource.ResourceOrder =
- InternalObject->PowerResource.ResourceOrder;
+ InternalObject->PowerResource.ResourceOrder;
break;
@@ -304,6 +316,10 @@ AcpiUtCopyIsimpleToEsimple (
/*
* There is no corresponding external object type
*/
+ ACPI_ERROR ((AE_INFO,
+ "Unsupported object type, cannot convert to external object: %s",
+ AcpiUtGetTypeName (ACPI_GET_OBJECT_TYPE (InternalObject))));
+
return_ACPI_STATUS (AE_SUPPORT);
}
@@ -554,6 +570,7 @@ AcpiUtCopyEsimpleToIsimple (
case ACPI_TYPE_STRING:
case ACPI_TYPE_BUFFER:
case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_LOCAL_REFERENCE:
InternalObject = AcpiUtCreateInternalObject (
(UINT8) ExternalObject->Type);
@@ -563,9 +580,17 @@ AcpiUtCopyEsimpleToIsimple (
}
break;
+ case ACPI_TYPE_ANY: /* This is the case for a NULL object */
+
+ *RetInternalObject = NULL;
+ return_ACPI_STATUS (AE_OK);
+
default:
/* All other types are not supported */
+ ACPI_ERROR ((AE_INFO, "Unsupported object type, cannot convert to internal object: %s",
+ AcpiUtGetTypeName (ExternalObject->Type)));
+
return_ACPI_STATUS (AE_SUPPORT);
}
@@ -605,6 +630,10 @@ AcpiUtCopyEsimpleToIsimple (
ExternalObject->Buffer.Length);
InternalObject->Buffer.Length = ExternalObject->Buffer.Length;
+
+ /* Mark buffer data valid */
+
+ InternalObject->Buffer.Flags |= AOPOBJ_DATA_VALID;
break;
@@ -613,6 +642,14 @@ AcpiUtCopyEsimpleToIsimple (
InternalObject->Integer.Value = ExternalObject->Integer.Value;
break;
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ /* TBD: should validate incoming handle */
+
+ InternalObject->Reference.Class = ACPI_REFCLASS_NAME;
+ InternalObject->Reference.Node = ExternalObject->Reference.Handle;
+ break;
+
default:
/* Other types can't get here */
break;
@@ -628,83 +665,81 @@ ErrorExit:
}
-#ifdef ACPI_FUTURE_IMPLEMENTATION
-/* Code to convert packages that are parameters to control methods */
-
/*******************************************************************************
*
* FUNCTION: AcpiUtCopyEpackageToIpackage
*
- * PARAMETERS: *InternalObject - Pointer to the object we are returning
- * *Buffer - Where the object is returned
- * *SpaceUsed - Where the length of the object is returned
+ * PARAMETERS: ExternalObject - The external object to be converted
+ * InternalObject - Where the internal object is returned
*
* RETURN: Status
*
- * DESCRIPTION: This function is called to place a package object in a user
- * buffer. A package object by definition contains other objects.
- *
- * The buffer is assumed to have sufficient space for the object.
- * The caller must have verified the buffer length needed using the
- * AcpiUtGetObjectSize function before calling this function.
+ * DESCRIPTION: Copy an external package object to an internal package.
+ * Handles nested packages.
*
******************************************************************************/
static ACPI_STATUS
AcpiUtCopyEpackageToIpackage (
- ACPI_OPERAND_OBJECT *InternalObject,
- UINT8 *Buffer,
- UINT32 *SpaceUsed)
+ ACPI_OBJECT *ExternalObject,
+ ACPI_OPERAND_OBJECT **InternalObject)
{
- UINT8 *FreeSpace;
- ACPI_OBJECT *ExternalObject;
- UINT32 Length = 0;
- UINT32 ThisIndex;
- UINT32 ObjectSpace = 0;
- ACPI_OPERAND_OBJECT *ThisInternalObj;
- ACPI_OBJECT *ThisExternalObj;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *PackageObject;
+ ACPI_OPERAND_OBJECT **PackageElements;
+ UINT32 i;
ACPI_FUNCTION_TRACE (UtCopyEpackageToIpackage);
- /*
- * First package at head of the buffer
- */
- ExternalObject = (ACPI_OBJECT *)Buffer;
-
- /*
- * Free space begins right after the first package
- */
- FreeSpace = Buffer + sizeof(ACPI_OBJECT);
+ /* Create the package object */
+ PackageObject = AcpiUtCreatePackageObject (ExternalObject->Package.Count);
+ if (!PackageObject)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
- ExternalObject->Type = ACPI_GET_OBJECT_TYPE (InternalObject);
- ExternalObject->Package.Count = InternalObject->Package.Count;
- ExternalObject->Package.Elements = (ACPI_OBJECT *)FreeSpace;
+ PackageElements = PackageObject->Package.Elements;
/*
- * Build an array of ACPI_OBJECTS in the buffer
- * and move the free space past it
+ * Recursive implementation. Probably ok, since nested external packages
+ * as parameters should be very rare.
*/
- FreeSpace += ExternalObject->Package.Count * sizeof(ACPI_OBJECT);
+ for (i = 0; i < ExternalObject->Package.Count; i++)
+ {
+ Status = AcpiUtCopyEobjectToIobject (
+ &ExternalObject->Package.Elements[i],
+ &PackageElements[i]);
+ if (ACPI_FAILURE (Status))
+ {
+ /* Truncate package and delete it */
+
+ PackageObject->Package.Count = i;
+ PackageElements[i] = NULL;
+ AcpiUtRemoveReference (PackageObject);
+ return_ACPI_STATUS (Status);
+ }
+ }
+ /* Mark package data valid */
- /* Call WalkPackage */
+ PackageObject->Package.Flags |= AOPOBJ_DATA_VALID;
+ *InternalObject = PackageObject;
+ return_ACPI_STATUS (Status);
}
-#endif /* Future implementation */
-
/*******************************************************************************
*
* FUNCTION: AcpiUtCopyEobjectToIobject
*
- * PARAMETERS: *InternalObject - The external object to be converted
- * *BufferPtr - Where the internal object is returned
+ * PARAMETERS: ExternalObject - The external object to be converted
+ * InternalObject - Where the internal object is returned
*
- * RETURN: Status - the status of the call
+ * RETURN: Status - the status of the call
*
* DESCRIPTION: Converts an external object to an internal object.
*
@@ -723,15 +758,8 @@ AcpiUtCopyEobjectToIobject (
if (ExternalObject->Type == ACPI_TYPE_PACKAGE)
{
- /*
- * Packages as external input to control methods are not supported,
- */
- ACPI_ERROR ((AE_INFO,
- "Packages as parameters not implemented!"));
-
- return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
+ Status = AcpiUtCopyEpackageToIpackage (ExternalObject, InternalObject);
}
-
else
{
/*
@@ -840,7 +868,16 @@ AcpiUtCopySimpleObject (
/*
* We copied the reference object, so we now must add a reference
* to the object pointed to by the reference
+ *
+ * DDBHandle reference (from Load/LoadTable) is a special reference,
+ * it does not have a Reference.Object, so does not need to
+ * increase the reference count
*/
+ if (SourceDesc->Reference.Class == ACPI_REFCLASS_TABLE)
+ {
+ break;
+ }
+
AcpiUtAddReference (SourceDesc->Reference.Object);
break;
@@ -936,34 +973,20 @@ AcpiUtCopyIelementToIelement (
* This object is a package - go down another nesting level
* Create and build the package object
*/
- TargetObject = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
+ TargetObject = AcpiUtCreatePackageObject (SourceObject->Package.Count);
if (!TargetObject)
{
return (AE_NO_MEMORY);
}
- TargetObject->Package.Count = SourceObject->Package.Count;
- TargetObject->Common.Flags = SourceObject->Common.Flags;
+ TargetObject->Common.Flags = SourceObject->Common.Flags;
- /*
- * Create the object array
- */
- TargetObject->Package.Elements = ACPI_ALLOCATE_ZEROED (
- ((ACPI_SIZE) SourceObject->Package.Count + 1) * sizeof (void *));
- if (!TargetObject->Package.Elements)
- {
- Status = AE_NO_MEMORY;
- goto ErrorExit;
- }
+ /* Pass the new package object back to the package walk routine */
- /*
- * Pass the new package object back to the package walk routine
- */
State->Pkg.ThisTargetObj = TargetObject;
- /*
- * Store the object pointer in the parent package object
- */
+ /* Store the object pointer in the parent package object */
+
*ThisTargetPtr = TargetObject;
break;