diff options
Diffstat (limited to 'usr/src/uts/intel/io/acpica/utilities/utcopy.c')
| -rw-r--r-- | usr/src/uts/intel/io/acpica/utilities/utcopy.c | 203 |
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; |
