summaryrefslogtreecommitdiff
path: root/utilities/utobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'utilities/utobject.c')
-rw-r--r--utilities/utobject.c124
1 files changed, 92 insertions, 32 deletions
diff --git a/utilities/utobject.c b/utilities/utobject.c
index fe5c2c34159b..e38d2b28799e 100644
--- a/utilities/utobject.c
+++ b/utilities/utobject.c
@@ -1,7 +1,6 @@
/******************************************************************************
*
* Module Name: utobject - ACPI object create/delete/size/cache routines
- * $Revision: 1.104 $
*
*****************************************************************************/
@@ -9,7 +8,7 @@
*
* 1. Copyright Notice
*
- * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
* All rights reserved.
*
* 2. License
@@ -117,8 +116,8 @@
#define __UTOBJECT_C__
#include "acpi.h"
+#include "accommon.h"
#include "acnamesp.h"
-#include "amlcode.h"
#define _COMPONENT ACPI_UTILITIES
@@ -167,7 +166,7 @@ AcpiUtGetElementLength (
ACPI_OPERAND_OBJECT *
AcpiUtCreateInternalObjectDbg (
- char *ModuleName,
+ const char *ModuleName,
UINT32 LineNumber,
UINT32 ComponentId,
ACPI_OBJECT_TYPE Type)
@@ -192,6 +191,7 @@ AcpiUtCreateInternalObjectDbg (
{
case ACPI_TYPE_REGION:
case ACPI_TYPE_BUFFER_FIELD:
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
/* These types require a secondary object */
@@ -232,6 +232,55 @@ AcpiUtCreateInternalObjectDbg (
/*******************************************************************************
*
+ * FUNCTION: AcpiUtCreatePackageObject
+ *
+ * PARAMETERS: Count - Number of package elements
+ *
+ * RETURN: Pointer to a new Package object, null on failure
+ *
+ * DESCRIPTION: Create a fully initialized package object
+ *
+ ******************************************************************************/
+
+ACPI_OPERAND_OBJECT *
+AcpiUtCreatePackageObject (
+ UINT32 Count)
+{
+ ACPI_OPERAND_OBJECT *PackageDesc;
+ ACPI_OPERAND_OBJECT **PackageElements;
+
+
+ ACPI_FUNCTION_TRACE_U32 (UtCreatePackageObject, Count);
+
+
+ /* Create a new Package object */
+
+ PackageDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
+ if (!PackageDesc)
+ {
+ return_PTR (NULL);
+ }
+
+ /*
+ * Create the element array. Count+1 allows the array to be null
+ * terminated.
+ */
+ PackageElements = ACPI_ALLOCATE_ZEROED (
+ ((ACPI_SIZE) Count + 1) * sizeof (void *));
+ if (!PackageElements)
+ {
+ ACPI_FREE (PackageDesc);
+ return_PTR (NULL);
+ }
+
+ PackageDesc->Package.Count = Count;
+ PackageDesc->Package.Elements = PackageElements;
+ return_PTR (PackageDesc);
+}
+
+
+/*******************************************************************************
+ *
* FUNCTION: AcpiUtCreateBufferObject
*
* PARAMETERS: BufferSize - Size of buffer to be created
@@ -370,7 +419,7 @@ AcpiUtValidInternalObject (
if (!Object)
{
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Null Object Ptr\n"));
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "**** Null Object Ptr\n"));
return (FALSE);
}
@@ -385,7 +434,7 @@ AcpiUtValidInternalObject (
return (TRUE);
default:
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"%p is not not an ACPI operand obj [%s]\n",
Object, AcpiUtGetDescriptorName (Object)));
break;
@@ -412,7 +461,7 @@ AcpiUtValidInternalObject (
void *
AcpiUtAllocateObjectDescDbg (
- char *ModuleName,
+ const char *ModuleName,
UINT32 LineNumber,
UINT32 ComponentId)
{
@@ -499,32 +548,36 @@ AcpiUtGetSimpleObjectSize (
ACPI_SIZE *ObjLength)
{
ACPI_SIZE Length;
+ ACPI_SIZE Size;
ACPI_STATUS Status = AE_OK;
ACPI_FUNCTION_TRACE_PTR (UtGetSimpleObjectSize, InternalObject);
- /*
- * Handle a null object (Could be a uninitialized package
- * element -- which is legal)
- */
+ /* Start with the length of the (external) Acpi object */
+
+ Length = sizeof (ACPI_OBJECT);
+
+ /* A NULL object is allowed, can be a legal uninitialized package element */
+
if (!InternalObject)
{
- *ObjLength = 0;
+ /*
+ * Object is NULL, just return the length of ACPI_OBJECT
+ * (A NULL ACPI_OBJECT is an object of all zeroes.)
+ */
+ *ObjLength = ACPI_ROUND_UP_TO_NATIVE_WORD (Length);
return_ACPI_STATUS (AE_OK);
}
- /* Start with the length of the Acpi object */
-
- Length = sizeof (ACPI_OBJECT);
+ /* A Namespace Node should never appear here */
if (ACPI_GET_DESCRIPTOR_TYPE (InternalObject) == ACPI_DESC_TYPE_NAMED)
{
- /* Object is a named object (reference), just return the length */
+ /* A namespace node should never get here */
- *ObjLength = ACPI_ROUND_UP_TO_NATIVE_WORD (Length);
- return_ACPI_STATUS (Status);
+ return_ACPI_STATUS (AE_AML_INTERNAL);
}
/*
@@ -533,7 +586,7 @@ AcpiUtGetSimpleObjectSize (
* must be accessed bytewise or there may be alignment problems on
* certain processors
*/
- switch (ACPI_GET_OBJECT_TYPE (InternalObject))
+ switch (InternalObject->Common.Type)
{
case ACPI_TYPE_STRING:
@@ -551,24 +604,28 @@ AcpiUtGetSimpleObjectSize (
case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_POWER:
- /*
- * No extra data for these types
- */
+ /* No extra data for these types */
+
break;
case ACPI_TYPE_LOCAL_REFERENCE:
- switch (InternalObject->Reference.Opcode)
+ switch (InternalObject->Reference.Class)
{
- case AML_INT_NAMEPATH_OP:
+ case ACPI_REFCLASS_NAME:
/*
* Get the actual length of the full pathname to this object.
* The reference will be converted to the pathname to the object
*/
- Length += ACPI_ROUND_UP_TO_NATIVE_WORD (
- AcpiNsGetPathnameLength (InternalObject->Reference.Node));
+ Size = AcpiNsGetPathnameLength (InternalObject->Reference.Node);
+ if (!Size)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Length += ACPI_ROUND_UP_TO_NATIVE_WORD (Size);
break;
default:
@@ -578,9 +635,10 @@ AcpiUtGetSimpleObjectSize (
* Notably, Locals and Args are not supported, but this may be
* required eventually.
*/
- ACPI_ERROR ((AE_INFO,
- "Unsupported Reference opcode=%X in object %p",
- InternalObject->Reference.Opcode, InternalObject));
+ ACPI_ERROR ((AE_INFO, "Cannot convert to external object - "
+ "unsupported Reference Class [%s] %X in object %p",
+ AcpiUtGetReferenceName (InternalObject),
+ InternalObject->Reference.Class, InternalObject));
Status = AE_TYPE;
break;
}
@@ -589,8 +647,10 @@ AcpiUtGetSimpleObjectSize (
default:
- ACPI_ERROR ((AE_INFO, "Unsupported type=%X in object %p",
- ACPI_GET_OBJECT_TYPE (InternalObject), InternalObject));
+ ACPI_ERROR ((AE_INFO, "Cannot convert to external object - "
+ "unsupported type [%s] %X in object %p",
+ AcpiUtGetObjectTypeName (InternalObject),
+ InternalObject->Common.Type, InternalObject));
Status = AE_TYPE;
break;
}
@@ -749,7 +809,7 @@ AcpiUtGetObjectSize (
if ((ACPI_GET_DESCRIPTOR_TYPE (InternalObject) == ACPI_DESC_TYPE_OPERAND) &&
- (ACPI_GET_OBJECT_TYPE (InternalObject) == ACPI_TYPE_PACKAGE))
+ (InternalObject->Common.Type == ACPI_TYPE_PACKAGE))
{
Status = AcpiUtGetPackageObjectSize (InternalObject, ObjLength);
}