Print this page
update to acpica-unix2-20140114
update to acpica-unix2-20131218
update to acpica-unix2-20130927
acpica-unix2-20130823
PANKOVs restructure
*** 4,14 ****
* ACPI Object evaluation interfaces
*
******************************************************************************/
/*
! * Copyright (C) 2000 - 2011, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
--- 4,14 ----
* ACPI Object evaluation interfaces
*
******************************************************************************/
/*
! * Copyright (C) 2000 - 2014, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*** 42,51 ****
--- 42,52 ----
* POSSIBILITY OF SUCH DAMAGES.
*/
#define __NSXFEVAL_C__
+ #define EXPORT_ACPI_INTERFACES
#include "acpi.h"
#include "accommon.h"
#include "acnamesp.h"
#include "acinterp.h"
*** 89,99 ****
ACPI_OBJECT_LIST *ExternalParams,
ACPI_BUFFER *ReturnBuffer,
ACPI_OBJECT_TYPE ReturnType)
{
ACPI_STATUS Status;
! BOOLEAN MustFree = FALSE;
ACPI_FUNCTION_TRACE (AcpiEvaluateObjectTyped);
--- 90,100 ----
ACPI_OBJECT_LIST *ExternalParams,
ACPI_BUFFER *ReturnBuffer,
ACPI_OBJECT_TYPE ReturnType)
{
ACPI_STATUS Status;
! BOOLEAN FreeBufferOnError = FALSE;
ACPI_FUNCTION_TRACE (AcpiEvaluateObjectTyped);
*** 104,119 ****
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
if (ReturnBuffer->Length == ACPI_ALLOCATE_BUFFER)
{
! MustFree = TRUE;
}
/* Evaluate the object */
! Status = AcpiEvaluateObject (Handle, Pathname, ExternalParams, ReturnBuffer);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
--- 105,121 ----
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
if (ReturnBuffer->Length == ACPI_ALLOCATE_BUFFER)
{
! FreeBufferOnError = TRUE;
}
/* Evaluate the object */
! Status = AcpiEvaluateObject (Handle, Pathname,
! ExternalParams, ReturnBuffer);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
*** 144,157 ****
ACPI_ERROR ((AE_INFO,
"Incorrect return type [%s] requested [%s]",
AcpiUtGetTypeName (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type),
AcpiUtGetTypeName (ReturnType)));
! if (MustFree)
{
! /* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */
!
AcpiOsFree (ReturnBuffer->Pointer);
ReturnBuffer->Pointer = NULL;
}
ReturnBuffer->Length = 0;
--- 146,164 ----
ACPI_ERROR ((AE_INFO,
"Incorrect return type [%s] requested [%s]",
AcpiUtGetTypeName (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type),
AcpiUtGetTypeName (ReturnType)));
! if (FreeBufferOnError)
{
! /*
! * Free a buffer created via ACPI_ALLOCATE_BUFFER.
! * Note: We use AcpiOsFree here because AcpiOsAllocate was used
! * to allocate the buffer. This purposefully bypasses the
! * (optionally enabled) allocation tracking mechanism since we
! * only want to track internal allocations.
! */
AcpiOsFree (ReturnBuffer->Pointer);
ReturnBuffer->Pointer = NULL;
}
ReturnBuffer->Length = 0;
*** 203,214 ****
if (!Info)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
- Info->Pathname = Pathname;
-
/* Convert and validate the device handle */
Info->PrefixNode = AcpiNsValidateHandle (Handle);
if (!Info->PrefixNode)
{
--- 210,219 ----
*** 215,295 ****
Status = AE_BAD_PARAMETER;
goto Cleanup;
}
/*
! * If there are parameters to be passed to a control method, the external
! * objects must all be converted to internal objects
*/
if (ExternalParams && ExternalParams->Count)
{
/*
* Allocate a new parameter block for the internal objects
* Add 1 to count to allow for null terminated internal list
*/
Info->Parameters = ACPI_ALLOCATE_ZEROED (
! ((ACPI_SIZE) ExternalParams->Count + 1) * sizeof (void *));
if (!Info->Parameters)
{
Status = AE_NO_MEMORY;
goto Cleanup;
}
/* Convert each external object in the list to an internal object */
! for (i = 0; i < ExternalParams->Count; i++)
{
Status = AcpiUtCopyEobjectToIobject (
&ExternalParams->Pointer[i], &Info->Parameters[i]);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
}
! Info->Parameters[ExternalParams->Count] = NULL;
}
/*
! * Three major cases:
! * 1) Fully qualified pathname
! * 2) No handle, not fully qualified pathname (error)
! * 3) Valid handle
*/
! if ((Pathname) &&
! (AcpiNsValidRootPrefix (Pathname[0])))
{
! /* The path is fully qualified, just evaluate by name */
! Info->PrefixNode = NULL;
! Status = AcpiNsEvaluate (Info);
}
! else if (!Handle)
{
/*
! * A handle is optional iff a fully qualified pathname is specified.
! * Since we've already handled fully qualified names above, this is
! * an error
*/
! if (!Pathname)
{
! ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
! "Both Handle and Pathname are NULL"));
}
! else
{
! ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
! "Null Handle with relative pathname [%s]", Pathname));
}
! Status = AE_BAD_PARAMETER;
}
! else
{
! /* We have a namespace a node and a possible relative path */
Status = AcpiNsEvaluate (Info);
- }
/*
* If we are expecting a return value, and all went well above,
* copy the return value to an external object.
*/
--- 220,403 ----
Status = AE_BAD_PARAMETER;
goto Cleanup;
}
/*
! * Get the actual namespace node for the target object.
! * Handles these cases:
! *
! * 1) Null node, valid pathname from root (absolute path)
! * 2) Node and valid pathname (path relative to Node)
! * 3) Node, Null pathname
*/
+ if ((Pathname) &&
+ (ACPI_IS_ROOT_PREFIX (Pathname[0])))
+ {
+ /* The path is fully qualified, just evaluate by name */
+
+ Info->PrefixNode = NULL;
+ }
+ else if (!Handle)
+ {
+ /*
+ * A handle is optional iff a fully qualified pathname is specified.
+ * Since we've already handled fully qualified names above, this is
+ * an error.
+ */
+ if (!Pathname)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Both Handle and Pathname are NULL"));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Null Handle with relative pathname [%s]", Pathname));
+ }
+
+ Status = AE_BAD_PARAMETER;
+ goto Cleanup;
+ }
+
+ Info->RelativePathname = Pathname;
+
+ /*
+ * Convert all external objects passed as arguments to the
+ * internal version(s).
+ */
if (ExternalParams && ExternalParams->Count)
{
+ Info->ParamCount = (UINT16) ExternalParams->Count;
+
+ /* Warn on impossible argument count */
+
+ if (Info->ParamCount > ACPI_METHOD_NUM_ARGS)
+ {
+ ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS,
+ "Excess arguments (%u) - using only %u",
+ Info->ParamCount, ACPI_METHOD_NUM_ARGS));
+
+ Info->ParamCount = ACPI_METHOD_NUM_ARGS;
+ }
+
/*
* Allocate a new parameter block for the internal objects
* Add 1 to count to allow for null terminated internal list
*/
Info->Parameters = ACPI_ALLOCATE_ZEROED (
! ((ACPI_SIZE) Info->ParamCount + 1) * sizeof (void *));
if (!Info->Parameters)
{
Status = AE_NO_MEMORY;
goto Cleanup;
}
/* Convert each external object in the list to an internal object */
! for (i = 0; i < Info->ParamCount; i++)
{
Status = AcpiUtCopyEobjectToIobject (
&ExternalParams->Pointer[i], &Info->Parameters[i]);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
}
!
! Info->Parameters[Info->ParamCount] = NULL;
}
+
+ #if 0
+
/*
! * Begin incoming argument count analysis. Check for too few args
! * and too many args.
*/
!
! switch (AcpiNsGetType (Info->Node))
{
! case ACPI_TYPE_METHOD:
! /* Check incoming argument count against the method definition */
!
! if (Info->ObjDesc->Method.ParamCount > Info->ParamCount)
! {
! ACPI_ERROR ((AE_INFO,
! "Insufficient arguments (%u) - %u are required",
! Info->ParamCount,
! Info->ObjDesc->Method.ParamCount));
!
! Status = AE_MISSING_ARGUMENTS;
! goto Cleanup;
}
!
! else if (Info->ObjDesc->Method.ParamCount < Info->ParamCount)
{
+ ACPI_WARNING ((AE_INFO,
+ "Excess arguments (%u) - only %u are required",
+ Info->ParamCount,
+ Info->ObjDesc->Method.ParamCount));
+
+ /* Just pass the required number of arguments */
+
+ Info->ParamCount = Info->ObjDesc->Method.ParamCount;
+ }
+
/*
! * Any incoming external objects to be passed as arguments to the
! * method must be converted to internal objects
*/
! if (Info->ParamCount)
{
! /*
! * Allocate a new parameter block for the internal objects
! * Add 1 to count to allow for null terminated internal list
! */
! Info->Parameters = ACPI_ALLOCATE_ZEROED (
! ((ACPI_SIZE) Info->ParamCount + 1) * sizeof (void *));
! if (!Info->Parameters)
! {
! Status = AE_NO_MEMORY;
! goto Cleanup;
}
!
! /* Convert each external object in the list to an internal object */
!
! for (i = 0; i < Info->ParamCount; i++)
{
! Status = AcpiUtCopyEobjectToIobject (
! &ExternalParams->Pointer[i], &Info->Parameters[i]);
! if (ACPI_FAILURE (Status))
! {
! goto Cleanup;
}
+ }
! Info->Parameters[Info->ParamCount] = NULL;
}
! break;
!
! default:
!
! /* Warn if arguments passed to an object that is not a method */
!
! if (Info->ParamCount)
{
! ACPI_WARNING ((AE_INFO,
! "%u arguments were passed to a non-method ACPI object",
! Info->ParamCount));
! }
! break;
! }
+ #endif
+
+
+ /* Now we can evaluate the object */
+
Status = AcpiNsEvaluate (Info);
/*
* If we are expecting a return value, and all went well above,
* copy the return value to an external object.
*/
*** 447,456 ****
--- 555,565 ----
ObjDesc = Node->Object;
}
break;
default:
+
return;
}
/* Replace the existing reference object */
*** 470,482 ****
* FUNCTION: AcpiWalkNamespace
*
* PARAMETERS: Type - ACPI_OBJECT_TYPE to search for
* StartObject - Handle in namespace where search begins
* MaxDepth - Depth to which search is to reach
! * PreOrderVisit - Called during tree pre-order visit
* when an object of "Type" is found
! * PostOrderVisit - Called during tree post-order visit
* when an object of "Type" is found
* Context - Passed to user function(s) above
* ReturnValue - Location where return value of
* UserFunction is put if terminated early
*
--- 579,591 ----
* FUNCTION: AcpiWalkNamespace
*
* PARAMETERS: Type - ACPI_OBJECT_TYPE to search for
* StartObject - Handle in namespace where search begins
* MaxDepth - Depth to which search is to reach
! * DescendingCallback - Called during tree descent
* when an object of "Type" is found
! * AscendingCallback - Called during tree ascent
* when an object of "Type" is found
* Context - Passed to user function(s) above
* ReturnValue - Location where return value of
* UserFunction is put if terminated early
*
*** 501,512 ****
ACPI_STATUS
AcpiWalkNamespace (
ACPI_OBJECT_TYPE Type,
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
! ACPI_WALK_CALLBACK PreOrderVisit,
! ACPI_WALK_CALLBACK PostOrderVisit,
void *Context,
void **ReturnValue)
{
ACPI_STATUS Status;
--- 610,621 ----
ACPI_STATUS
AcpiWalkNamespace (
ACPI_OBJECT_TYPE Type,
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
! ACPI_WALK_CALLBACK DescendingCallback,
! ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue)
{
ACPI_STATUS Status;
*** 516,526 ****
/* Parameter validation */
if ((Type > ACPI_TYPE_LOCAL_MAX) ||
(!MaxDepth) ||
! (!PreOrderVisit && !PostOrderVisit))
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
/*
--- 625,635 ----
/* Parameter validation */
if ((Type > ACPI_TYPE_LOCAL_MAX) ||
(!MaxDepth) ||
! (!DescendingCallback && !AscendingCallback))
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
/*
*** 535,545 ****
* methods.)
*/
Status = AcpiUtAcquireReadLock (&AcpiGbl_NamespaceRwLock);
if (ACPI_FAILURE (Status))
{
! return (Status);
}
/*
* Lock the namespace around the walk. The namespace will be
* unlocked/locked around each call to the user function - since the user
--- 644,654 ----
* methods.)
*/
Status = AcpiUtAcquireReadLock (&AcpiGbl_NamespaceRwLock);
if (ACPI_FAILURE (Status))
{
! return_ACPI_STATUS (Status);
}
/*
* Lock the namespace around the walk. The namespace will be
* unlocked/locked around each call to the user function - since the user
*** 550,563 ****
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
! ACPI_NS_WALK_UNLOCK, PreOrderVisit,
! PostOrderVisit, Context, ReturnValue);
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
UnlockAndExit:
(void) AcpiUtReleaseReadLock (&AcpiGbl_NamespaceRwLock);
return_ACPI_STATUS (Status);
--- 659,681 ----
if (ACPI_FAILURE (Status))
{
goto UnlockAndExit;
}
+ /* Now we can validate the starting node */
+
+ if (!AcpiNsValidateHandle (StartObject))
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit2;
+ }
+
Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
! ACPI_NS_WALK_UNLOCK, DescendingCallback,
! AscendingCallback, Context, ReturnValue);
+ UnlockAndExit2:
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
UnlockAndExit:
(void) AcpiUtReleaseReadLock (&AcpiGbl_NamespaceRwLock);
return_ACPI_STATUS (Status);
*** 589,600 ****
{
ACPI_GET_DEVICES_INFO *Info = Context;
ACPI_STATUS Status;
ACPI_NAMESPACE_NODE *Node;
UINT32 Flags;
! ACPI_DEVICE_ID *Hid;
! ACPI_DEVICE_ID_LIST *Cid;
UINT32 i;
BOOLEAN Found;
int NoMatch;
--- 707,718 ----
{
ACPI_GET_DEVICES_INFO *Info = Context;
ACPI_STATUS Status;
ACPI_NAMESPACE_NODE *Node;
UINT32 Flags;
! ACPI_PNP_DEVICE_ID *Hid;
! ACPI_PNP_DEVICE_ID_LIST *Cid;
UINT32 i;
BOOLEAN Found;
int NoMatch;
*** 954,960 ****
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
return (Status);
}
ACPI_EXPORT_SYMBOL (AcpiGetData)
-
-
--- 1072,1076 ----