patch-2.4.22 linux-2.4.22/drivers/acpi/namespace/nseval.c
Next file: linux-2.4.22/drivers/acpi/namespace/nsinit.c
Previous file: linux-2.4.22/drivers/acpi/namespace/nsdumpdv.c
Back to the patch index
Back to the overall index
- Lines: 615
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/acpi/namespace/nseval.c
- Orig date:
2001-10-24 14:06:22.000000000 -0700
diff -urN linux-2.4.21/drivers/acpi/namespace/nseval.c linux-2.4.22/drivers/acpi/namespace/nseval.c
@@ -2,51 +2,68 @@
*
* Module Name: nseval - Object evaluation interfaces -- includes control
* method lookup and execution.
- * $Revision: 102 $
*
******************************************************************************/
/*
- * Copyright (C) 2000, 2001 R. Byron Moore
+ * Copyright (C) 2000 - 2003, R. Byron Moore
+ * All rights reserved.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ * substantially similar to the "NO WARRANTY" disclaimer below
+ * ("Disclaimer") and any redistribution must be conditioned upon
+ * including a substantially similar Disclaimer requirement for further
+ * binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ * of any contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
*/
-#include "acpi.h"
-#include "amlcode.h"
-#include "acparser.h"
-#include "acinterp.h"
-#include "acnamesp.h"
+#include <acpi/acpi.h>
+#include <acpi/acparser.h>
+#include <acpi/acinterp.h>
+#include <acpi/acnamesp.h>
#define _COMPONENT ACPI_NAMESPACE
- MODULE_NAME ("nseval")
+ ACPI_MODULE_NAME ("nseval")
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_evaluate_relative
+ * FUNCTION: acpi_ns_evaluate_relative
*
* PARAMETERS: Handle - The relative containing object
- * *Pathname - Name of method to execute, If NULL, the
+ * Pathname - Name of method to execute, If NULL, the
* handle is the object to execute
- * **Params - List of parameters to pass to the method,
+ * Params - List of parameters to pass to the method,
* terminated by NULL. Params itself may be
* NULL if no parameters are being passed.
- * *Return_object - Where to put method's return value (if
+ * return_object - Where to put method's return value (if
* any). If NULL, no value is returned.
*
* RETURN: Status
@@ -60,19 +77,19 @@
acpi_status
acpi_ns_evaluate_relative (
- acpi_namespace_node *handle,
- NATIVE_CHAR *pathname,
- acpi_operand_object **params,
- acpi_operand_object **return_object)
+ struct acpi_namespace_node *handle,
+ char *pathname,
+ union acpi_operand_object **params,
+ union acpi_operand_object **return_object)
{
- acpi_namespace_node *prefix_node;
- acpi_status status;
- acpi_namespace_node *node = NULL;
- NATIVE_CHAR *internal_path = NULL;
- acpi_generic_state scope_info;
+ struct acpi_namespace_node *prefix_node;
+ acpi_status status;
+ struct acpi_namespace_node *node = NULL;
+ char *internal_path = NULL;
+ union acpi_generic_state scope_info;
- FUNCTION_TRACE ("Ns_evaluate_relative");
+ ACPI_FUNCTION_TRACE ("ns_evaluate_relative");
/*
@@ -91,11 +108,14 @@
/* Get the prefix handle and Node */
- acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
prefix_node = acpi_ns_map_handle_to_node (handle);
if (!prefix_node) {
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
status = AE_BAD_PARAMETER;
goto cleanup;
}
@@ -104,13 +124,13 @@
scope_info.scope.node = prefix_node;
status = acpi_ns_lookup (&scope_info, internal_path, ACPI_TYPE_ANY,
- IMODE_EXECUTE, NS_NO_UPSEARCH, NULL,
+ ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, NULL,
&node);
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Object [%s] not found [%s]\n",
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Object [%s] not found [%s]\n",
pathname, acpi_format_exception (status)));
goto cleanup;
}
@@ -119,12 +139,12 @@
* Now that we have a handle to the object, we can attempt
* to evaluate it.
*/
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s [%p] Value %p\n",
- pathname, node, node->object));
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n",
+ pathname, node, acpi_ns_get_attached_object (node)));
status = acpi_ns_evaluate_by_handle (node, params, return_object);
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "*** Completed eval of object %s ***\n",
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "*** Completed eval of object %s ***\n",
pathname));
cleanup:
@@ -136,12 +156,12 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_evaluate_by_name
+ * FUNCTION: acpi_ns_evaluate_by_name
*
* PARAMETERS: Pathname - Fully qualified pathname to the object
- * *Return_object - Where to put method's return value (if
+ * return_object - Where to put method's return value (if
* any). If NULL, no value is returned.
- * **Params - List of parameters to pass to the method,
+ * Params - List of parameters to pass to the method,
* terminated by NULL. Params itself may be
* NULL if no parameters are being passed.
*
@@ -156,16 +176,16 @@
acpi_status
acpi_ns_evaluate_by_name (
- NATIVE_CHAR *pathname,
- acpi_operand_object **params,
- acpi_operand_object **return_object)
+ char *pathname,
+ union acpi_operand_object **params,
+ union acpi_operand_object **return_object)
{
- acpi_status status;
- acpi_namespace_node *node = NULL;
- NATIVE_CHAR *internal_path = NULL;
+ acpi_status status;
+ struct acpi_namespace_node *node = NULL;
+ char *internal_path = NULL;
- FUNCTION_TRACE ("Ns_evaluate_by_name");
+ ACPI_FUNCTION_TRACE ("ns_evaluate_by_name");
/* Build an internal name string for the method */
@@ -175,18 +195,21 @@
return_ACPI_STATUS (status);
}
- acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
/* Lookup the name in the namespace */
status = acpi_ns_lookup (NULL, internal_path, ACPI_TYPE_ANY,
- IMODE_EXECUTE, NS_NO_UPSEARCH, NULL,
+ ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, NULL,
&node);
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Object at [%s] was not found, status=%.4X\n",
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Object at [%s] was not found, status=%.4X\n",
pathname, status));
goto cleanup;
}
@@ -195,12 +218,12 @@
* Now that we have a handle to the object, we can attempt
* to evaluate it.
*/
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s [%p] Value %p\n",
- pathname, node, node->object));
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n",
+ pathname, node, acpi_ns_get_attached_object (node)));
status = acpi_ns_evaluate_by_handle (node, params, return_object);
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "*** Completed eval of object %s ***\n",
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "*** Completed eval of object %s ***\n",
pathname));
@@ -218,13 +241,13 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_evaluate_by_handle
+ * FUNCTION: acpi_ns_evaluate_by_handle
*
* PARAMETERS: Handle - Method Node to execute
- * **Params - List of parameters to pass to the method,
+ * Params - List of parameters to pass to the method,
* terminated by NULL. Params itself may be
* NULL if no parameters are being passed.
- * *Return_object - Where to put method's return value (if
+ * return_object - Where to put method's return value (if
* any). If NULL, no value is returned.
*
* RETURN: Status
@@ -237,16 +260,16 @@
acpi_status
acpi_ns_evaluate_by_handle (
- acpi_namespace_node *handle,
- acpi_operand_object **params,
- acpi_operand_object **return_object)
+ struct acpi_namespace_node *handle,
+ union acpi_operand_object **params,
+ union acpi_operand_object **return_object)
{
- acpi_namespace_node *node;
- acpi_status status;
- acpi_operand_object *local_return_object;
+ struct acpi_namespace_node *node;
+ acpi_status status;
+ union acpi_operand_object *local_return_object;
- FUNCTION_TRACE ("Ns_evaluate_by_handle");
+ ACPI_FUNCTION_TRACE ("ns_evaluate_by_handle");
/* Check if namespace has been initialized */
@@ -269,15 +292,17 @@
/* Get the prefix handle and Node */
- acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
node = acpi_ns_map_handle_to_node (handle);
if (!node) {
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
-
/*
* Two major cases here:
* 1) The object is an actual control method -- execute it.
@@ -285,7 +310,7 @@
* value
*
* In both cases, the namespace is unlocked by the
- * Acpi_ns* procedure
+ * acpi_ns* procedure
*/
if (acpi_ns_get_type (node) == ACPI_TYPE_METHOD) {
/*
@@ -294,7 +319,6 @@
status = acpi_ns_execute_control_method (node, params,
&local_return_object);
}
-
else {
/*
* Case 2) Object is NOT a method, just return its
@@ -303,7 +327,6 @@
status = acpi_ns_get_object_value (node, &local_return_object);
}
-
/*
* Check if there is a return value on the stack that must
* be dealt with
@@ -323,16 +346,13 @@
*return_object = local_return_object;
}
+ /* Map AE_CTRL_RETURN_VALUE to AE_OK, we are done with it */
- /* Map AE_RETURN_VALUE to AE_OK, we are done with it */
-
- if (status == AE_CTRL_RETURN_VALUE) {
- status = AE_OK;
- }
+ status = AE_OK;
}
/*
- * Namespace was unlocked by the handling Acpi_ns* function,
+ * Namespace was unlocked by the handling acpi_ns* function,
* so we just return
*/
return_ACPI_STATUS (status);
@@ -341,13 +361,13 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_execute_control_method
+ * FUNCTION: acpi_ns_execute_control_method
*
- * PARAMETERS: Method_node - The object/method
- * **Params - List of parameters to pass to the method,
+ * PARAMETERS: method_node - The method to execute
+ * Params - List of parameters to pass to the method,
* terminated by NULL. Params itself may be
* NULL if no parameters are being passed.
- * **Return_obj_desc - List of result objects to be returned
+ * return_obj_desc - List of result objects to be returned
* from the method.
*
* RETURN: Status
@@ -360,15 +380,15 @@
acpi_status
acpi_ns_execute_control_method (
- acpi_namespace_node *method_node,
- acpi_operand_object **params,
- acpi_operand_object **return_obj_desc)
+ struct acpi_namespace_node *method_node,
+ union acpi_operand_object **params,
+ union acpi_operand_object **return_obj_desc)
{
- acpi_status status;
- acpi_operand_object *obj_desc;
+ acpi_status status;
+ union acpi_operand_object *obj_desc;
- FUNCTION_TRACE ("Ns_execute_control_method");
+ ACPI_FUNCTION_TRACE ("ns_execute_control_method");
/* Verify that there is a method associated with this object */
@@ -377,21 +397,16 @@
if (!obj_desc) {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No attached method object\n"));
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (AE_NULL_OBJECT);
}
+ ACPI_DUMP_PATHNAME (method_node, "Execute Method:",
+ ACPI_LV_INFO, _COMPONENT);
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Control method at Offset %p Length %x]\n",
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Method at AML address %p Length %X\n",
obj_desc->method.aml_start + 1, obj_desc->method.aml_length - 1));
- DUMP_PATHNAME (method_node, "Ns_execute_control_method: Executing",
- ACPI_LV_NAMES, _COMPONENT);
-
- ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "At offset %p\n",
- obj_desc->method.aml_start + 1));
-
-
/*
* Unlock the namespace before execution. This allows namespace access
* via the external Acpi* interfaces while a method is being executed.
@@ -399,7 +414,10 @@
* interpreter locks to ensure that no thread is using the portion of the
* namespace that is being deleted.
*/
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
/*
* Execute the method via the interpreter. The interpreter is locked
@@ -419,129 +437,79 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ns_get_object_value
+ * FUNCTION: acpi_ns_get_object_value
*
- * PARAMETERS: Node - The object
+ * PARAMETERS: Node - The object
+ * return_obj_desc - Where the objects value is returned
*
* RETURN: Status
*
* DESCRIPTION: Return the current value of the object
*
- * MUTEX: Assumes namespace is locked
+ * MUTEX: Assumes namespace is locked, leaves namespace unlocked
*
******************************************************************************/
acpi_status
acpi_ns_get_object_value (
- acpi_namespace_node *node,
- acpi_operand_object **return_obj_desc)
+ struct acpi_namespace_node *node,
+ union acpi_operand_object **return_obj_desc)
{
- acpi_status status = AE_OK;
- acpi_operand_object *obj_desc;
- acpi_operand_object *source_desc;
+ acpi_status status = AE_OK;
+ struct acpi_namespace_node *resolved_node = node;
- FUNCTION_TRACE ("Ns_get_object_value");
+ ACPI_FUNCTION_TRACE ("ns_get_object_value");
/*
- * We take the value from certain objects directly
+ * Objects require additional resolution steps (e.g., the
+ * Node may be a field that must be read, etc.) -- we can't just grab
+ * the object out of the node.
*/
- if ((node->type == ACPI_TYPE_PROCESSOR) ||
- (node->type == ACPI_TYPE_POWER)) {
- /*
- * Create a Reference object to contain the object
- */
- obj_desc = acpi_ut_create_internal_object (node->type);
- if (!obj_desc) {
- status = AE_NO_MEMORY;
- goto unlock_and_exit;
- }
-
- /*
- * Get the attached object
- */
- source_desc = acpi_ns_get_attached_object (node);
- if (!source_desc) {
- status = AE_NULL_OBJECT;
- goto unlock_and_exit;
- }
-
- /*
- * Just copy from the original to the return object
- *
- * TBD: [Future] - need a low-level object copy that handles
- * the reference count automatically. (Don't want to copy it)
- */
- MEMCPY (obj_desc, source_desc, sizeof (acpi_operand_object));
- obj_desc->common.reference_count = 1;
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
- }
-
/*
- * Other objects require a reference object wrapper which we
- * then attempt to resolve.
+ * Use resolve_node_to_value() to get the associated value. This call
+ * always deletes obj_desc (allocated above).
+ *
+ * NOTE: we can get away with passing in NULL for a walk state
+ * because obj_desc is guaranteed to not be a reference to either
+ * a method local or a method argument (because this interface can only be
+ * called from the acpi_evaluate external interface, never called from
+ * a running control method.)
+ *
+ * Even though we do not directly invoke the interpreter
+ * for this, we must enter it because we could access an opregion.
+ * The opregion access code assumes that the interpreter
+ * is locked.
+ *
+ * We must release the namespace lock before entering the
+ * intepreter.
*/
- else {
- /* Create an Reference object to contain the object */
-
- obj_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE);
- if (!obj_desc) {
- status = AE_NO_MEMORY;
- goto unlock_and_exit;
- }
-
- /* Construct a descriptor pointing to the name */
-
- obj_desc->reference.opcode = (u8) AML_NAME_OP;
- obj_desc->reference.object = (void *) node;
+ status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
+ status = acpi_ex_enter_interpreter ();
+ if (ACPI_SUCCESS (status)) {
+ status = acpi_ex_resolve_node_to_value (&resolved_node, NULL);
/*
- * Use Resolve_to_value() to get the associated value. This call
- * always deletes Obj_desc (allocated above).
- *
- * NOTE: we can get away with passing in NULL for a walk state
- * because Obj_desc is guaranteed to not be a reference to either
- * a method local or a method argument
- *
- * Even though we do not directly invoke the interpreter
- * for this, we must enter it because we could access an opregion.
- * The opregion access code assumes that the interpreter
- * is locked.
- *
- * We must release the namespace lock before entering the
- * intepreter.
+ * If acpi_ex_resolve_node_to_value() succeeded, the return value was
+ * placed in resolved_node.
*/
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
- status = acpi_ex_enter_interpreter ();
- if (ACPI_SUCCESS (status)) {
- status = acpi_ex_resolve_to_value (&obj_desc, NULL);
+ acpi_ex_exit_interpreter ();
- acpi_ex_exit_interpreter ();
+ if (ACPI_SUCCESS (status)) {
+ status = AE_CTRL_RETURN_VALUE;
+ *return_obj_desc = ACPI_CAST_PTR (union acpi_operand_object, resolved_node);
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Returning object %p [%s]\n",
+ *return_obj_desc, acpi_ut_get_object_type_name (*return_obj_desc)));
}
}
- /*
- * If Acpi_ex_resolve_to_value() succeeded, the return value was
- * placed in Obj_desc.
- */
- if (ACPI_SUCCESS (status)) {
- status = AE_CTRL_RETURN_VALUE;
-
- *return_obj_desc = obj_desc;
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Returning obj %p\n", *return_obj_desc));
- }
-
/* Namespace is unlocked */
return_ACPI_STATUS (status);
-
-
-unlock_and_exit:
-
- /* Unlock the namespace */
-
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
- return_ACPI_STATUS (status);
}
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)