patch-2.4.22 linux-2.4.22/drivers/acpi/dispatcher/dsmethod.c
Next file: linux-2.4.22/drivers/acpi/dispatcher/dsmthdat.c
Previous file: linux-2.4.22/drivers/acpi/dispatcher/dsinit.c
Back to the patch index
Back to the overall index
- Lines: 525
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/acpi/dispatcher/dsmethod.c
- Orig date:
2001-10-24 14:06:22.000000000 -0700
diff -urN linux-2.4.21/drivers/acpi/dispatcher/dsmethod.c linux-2.4.22/drivers/acpi/dispatcher/dsmethod.c
@@ -1,51 +1,67 @@
/******************************************************************************
*
* Module Name: dsmethod - Parser/Interpreter interface - control method parsing
- * $Revision: 69 $
*
*****************************************************************************/
/*
- * 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 "acparser.h"
-#include "amlcode.h"
-#include "acdispat.h"
-#include "acinterp.h"
-#include "acnamesp.h"
-#include "actables.h"
-#include "acdebug.h"
+#include <acpi/acpi.h>
+#include <acpi/acparser.h>
+#include <acpi/amlcode.h>
+#include <acpi/acdispat.h>
+#include <acpi/acinterp.h>
+#include <acpi/acnamesp.h>
#define _COMPONENT ACPI_DISPATCHER
- MODULE_NAME ("dsmethod")
+ ACPI_MODULE_NAME ("dsmethod")
/*******************************************************************************
*
- * FUNCTION: Acpi_ds_parse_method
+ * FUNCTION: acpi_ds_parse_method
*
- * PARAMETERS: Obj_handle - Node of the method
+ * PARAMETERS: obj_handle - Node of the method
* Level - Current nesting level
* Context - Points to a method counter
- * Return_value - Not used
+ * return_value - Not used
*
* RETURN: Status
*
@@ -58,17 +74,17 @@
acpi_status
acpi_ds_parse_method (
- acpi_handle obj_handle)
+ acpi_handle obj_handle)
{
- acpi_status status;
- acpi_operand_object *obj_desc;
- acpi_parse_object *op;
- acpi_namespace_node *node;
- acpi_owner_id owner_id;
- acpi_walk_state *walk_state;
+ acpi_status status;
+ union acpi_operand_object *obj_desc;
+ union acpi_parse_object *op;
+ struct acpi_namespace_node *node;
+ acpi_owner_id owner_id;
+ struct acpi_walk_state *walk_state;
- FUNCTION_TRACE_PTR ("Ds_parse_method", obj_handle);
+ ACPI_FUNCTION_TRACE_PTR ("ds_parse_method", obj_handle);
/* Parameter Validation */
@@ -77,14 +93,13 @@
return_ACPI_STATUS (AE_NULL_ENTRY);
}
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Parsing [%4.4s] **** Named_obj=%p\n",
- (char*)&((acpi_namespace_node *)obj_handle)->name, obj_handle));
-
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "**** Parsing [%4.4s] **** named_obj=%p\n",
+ ((struct acpi_namespace_node *) obj_handle)->name.ascii, obj_handle));
/* Extract the method object from the method Node */
- node = (acpi_namespace_node *) obj_handle;
- obj_desc = node->object;
+ node = (struct acpi_namespace_node *) obj_handle;
+ obj_desc = acpi_ns_get_attached_object (node);
if (!obj_desc) {
return_ACPI_STATUS (AE_NULL_OBJECT);
}
@@ -112,13 +127,20 @@
/* Init new op with the method name and pointer back to the Node */
- acpi_ps_set_name (op, node->name);
- op->node = node;
+ acpi_ps_set_name (op, node->name.integer);
+ op->common.node = node;
+
+ /*
+ * Get a new owner_id for objects created by this method. Namespace
+ * objects (such as Operation Regions) can be created during the
+ * first pass parse.
+ */
+ owner_id = acpi_ut_allocate_owner_id (ACPI_OWNER_TYPE_METHOD);
+ obj_desc->method.owning_id = owner_id;
/* Create and initialize a new walk state */
- walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT,
- NULL, NULL, NULL);
+ walk_state = acpi_ds_create_walk_state (owner_id, NULL, NULL, NULL);
if (!walk_state) {
return_ACPI_STATUS (AE_NO_MEMORY);
}
@@ -126,7 +148,7 @@
status = acpi_ds_init_aml_walk (walk_state, op, node, obj_desc->method.aml_start,
obj_desc->method.aml_length, NULL, NULL, 1);
if (ACPI_FAILURE (status)) {
- /* TBD: delete walk state */
+ acpi_ds_delete_walk_state (walk_state);
return_ACPI_STATUS (status);
}
@@ -145,27 +167,22 @@
return_ACPI_STATUS (status);
}
- /* Get a new Owner_id for objects created by this method */
-
- owner_id = acpi_ut_allocate_owner_id (OWNER_TYPE_METHOD);
- obj_desc->method.owning_id = owner_id;
-
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** [%4.4s] Parsed **** Named_obj=%p Op=%p\n",
- (char*)&((acpi_namespace_node *)obj_handle)->name, obj_handle, op));
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "**** [%4.4s] Parsed **** named_obj=%p Op=%p\n",
+ ((struct acpi_namespace_node *) obj_handle)->name.ascii, obj_handle, op));
acpi_ps_delete_parse_tree (op);
-
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ds_begin_method_execution
+ * FUNCTION: acpi_ds_begin_method_execution
*
- * PARAMETERS: Method_node - Node of the method
- * Obj_desc - The method object
- * Calling_method_node - Caller of this method (if non-null)
+ * PARAMETERS: method_node - Node of the method
+ * obj_desc - The method object
+ * calling_method_node - Caller of this method (if non-null)
*
* RETURN: Status
*
@@ -179,21 +196,20 @@
acpi_status
acpi_ds_begin_method_execution (
- acpi_namespace_node *method_node,
- acpi_operand_object *obj_desc,
- acpi_namespace_node *calling_method_node)
+ struct acpi_namespace_node *method_node,
+ union acpi_operand_object *obj_desc,
+ struct acpi_namespace_node *calling_method_node)
{
- acpi_status status = AE_OK;
+ acpi_status status = AE_OK;
- FUNCTION_TRACE_PTR ("Ds_begin_method_execution", method_node);
+ ACPI_FUNCTION_TRACE_PTR ("ds_begin_method_execution", method_node);
if (!method_node) {
return_ACPI_STATUS (AE_NULL_ENTRY);
}
-
/*
* If there is a concurrency limit on this method, we need to
* obtain a unit from the method semaphore.
@@ -201,7 +217,7 @@
if (obj_desc->method.semaphore) {
/*
* Allow recursive method calls, up to the reentrancy/concurrency
- * limit imposed by the SERIALIZED rule and the Sync_level method
+ * limit imposed by the SERIALIZED rule and the sync_level method
* parameter.
*
* The point of this code is to avoid permanently blocking a
@@ -218,25 +234,23 @@
* interpreter if we block
*/
status = acpi_ex_system_wait_semaphore (obj_desc->method.semaphore,
- WAIT_FOREVER);
+ ACPI_WAIT_FOREVER);
}
-
/*
* Increment the method parse tree thread count since it has been
* reentered one more time (even if it is the same thread)
*/
obj_desc->method.thread_count++;
-
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ds_call_control_method
+ * FUNCTION: acpi_ds_call_control_method
*
- * PARAMETERS: Walk_state - Current state of the walk
+ * PARAMETERS: walk_state - Current state of the walk
* Op - Current Op to be walked
*
* RETURN: Status
@@ -247,18 +261,18 @@
acpi_status
acpi_ds_call_control_method (
- acpi_walk_list *walk_list,
- acpi_walk_state *this_walk_state,
- acpi_parse_object *op) /* TBD: This operand is obsolete */
+ struct acpi_thread_state *thread,
+ struct acpi_walk_state *this_walk_state,
+ union acpi_parse_object *op)
{
- acpi_status status;
- acpi_namespace_node *method_node;
- acpi_operand_object *obj_desc;
- acpi_walk_state *next_walk_state;
- u32 i;
+ acpi_status status;
+ struct acpi_namespace_node *method_node;
+ union acpi_operand_object *obj_desc;
+ struct acpi_walk_state *next_walk_state;
+ u32 i;
- FUNCTION_TRACE_PTR ("Ds_call_control_method", this_walk_state);
+ ACPI_FUNCTION_TRACE_PTR ("ds_call_control_method", this_walk_state);
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Execute method %p, currentstate=%p\n",
this_walk_state->prev_op, this_walk_state));
@@ -276,6 +290,8 @@
return_ACPI_STATUS (AE_NULL_OBJECT);
}
+ obj_desc->method.owning_id = acpi_ut_allocate_owner_id (ACPI_OWNER_TYPE_METHOD);
+
/* Init for new method, wait on concurrency semaphore */
status = acpi_ds_begin_method_execution (method_node, obj_desc,
@@ -284,19 +300,17 @@
return_ACPI_STATUS (status);
}
-
/* 1) Parse: Create a new walk state for the preempting walk */
next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id,
op, obj_desc, NULL);
if (!next_walk_state) {
return_ACPI_STATUS (AE_NO_MEMORY);
- goto cleanup;
}
/* Create and init a Root Node */
- op = acpi_ps_alloc_op (AML_SCOPE_OP);
+ op = acpi_ps_create_scope_op ();
if (!op) {
status = AE_NO_MEMORY;
goto cleanup;
@@ -306,7 +320,7 @@
obj_desc->method.aml_start, obj_desc->method.aml_length,
NULL, NULL, 1);
if (ACPI_FAILURE (status)) {
- /* TBD: delete walk state */
+ acpi_ds_delete_walk_state (next_walk_state);
goto cleanup;
}
@@ -315,11 +329,10 @@
status = acpi_ps_parse_aml (next_walk_state);
acpi_ps_delete_parse_tree (op);
-
/* 2) Execute: Create a new state for the preempting walk */
next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id,
- NULL, obj_desc, walk_list);
+ NULL, obj_desc, thread);
if (!next_walk_state) {
status = AE_NO_MEMORY;
goto cleanup;
@@ -353,8 +366,8 @@
this_walk_state->num_operands = 0;
- ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Starting nested execution, newstate=%p\n",
- next_walk_state));
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Starting nested execution, newstate=%p\n", next_walk_state));
return_ACPI_STATUS (AE_OK);
@@ -362,7 +375,7 @@
/* On error, we must delete the new walk state */
cleanup:
- acpi_ds_terminate_control_method (next_walk_state);
+ (void) acpi_ds_terminate_control_method (next_walk_state);
acpi_ds_delete_walk_state (next_walk_state);
return_ACPI_STATUS (status);
@@ -371,9 +384,9 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ds_restart_control_method
+ * FUNCTION: acpi_ds_restart_control_method
*
- * PARAMETERS: Walk_state - State of the method when it was preempted
+ * PARAMETERS: walk_state - State of the method when it was preempted
* Op - Pointer to new current op
*
* RETURN: Status
@@ -384,13 +397,13 @@
acpi_status
acpi_ds_restart_control_method (
- acpi_walk_state *walk_state,
- acpi_operand_object *return_desc)
+ struct acpi_walk_state *walk_state,
+ union acpi_operand_object *return_desc)
{
- acpi_status status;
+ acpi_status status;
- FUNCTION_TRACE_PTR ("Ds_restart_control_method", walk_state);
+ ACPI_FUNCTION_TRACE_PTR ("ds_restart_control_method", walk_state);
if (return_desc) {
@@ -405,7 +418,6 @@
return_ACPI_STATUS (status);
}
}
-
else {
/*
* Delete the return value if it will not be used by the
@@ -413,24 +425,22 @@
*/
acpi_ut_remove_reference (return_desc);
}
-
}
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
- "Method=%p Return=%p Return_used?=%X Res_stack=%p State=%p\n",
+ "Method=%p Return=%p return_used?=%X res_stack=%p State=%p\n",
walk_state->method_call_op, return_desc, walk_state->return_used,
walk_state->results, walk_state));
-
return_ACPI_STATUS (AE_OK);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ds_terminate_control_method
+ * FUNCTION: acpi_ds_terminate_control_method
*
- * PARAMETERS: Walk_state - State of the method
+ * PARAMETERS: walk_state - State of the method
*
* RETURN: Status
*
@@ -442,16 +452,21 @@
acpi_status
acpi_ds_terminate_control_method (
- acpi_walk_state *walk_state)
+ struct acpi_walk_state *walk_state)
{
- acpi_operand_object *obj_desc;
- acpi_namespace_node *method_node;
+ union acpi_operand_object *obj_desc;
+ struct acpi_namespace_node *method_node;
+ acpi_status status;
- FUNCTION_TRACE_PTR ("Ds_terminate_control_method", walk_state);
+ ACPI_FUNCTION_TRACE_PTR ("ds_terminate_control_method", walk_state);
- /* The method object should be stored in the walk state */
+ if (!walk_state) {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* The current method object was saved in the walk state */
obj_desc = walk_state->method_desc;
if (!obj_desc) {
@@ -467,14 +482,22 @@
* If this is the last thread executing the method,
* we have additional cleanup to perform
*/
- acpi_ut_acquire_mutex (ACPI_MTX_PARSER);
-
+ status = acpi_ut_acquire_mutex (ACPI_MTX_PARSER);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
/* Signal completion of the execution of this method if necessary */
if (walk_state->method_desc->method.semaphore) {
- acpi_os_signal_semaphore (
- walk_state->method_desc->method.semaphore, 1);
+ status = acpi_os_signal_semaphore (
+ walk_state->method_desc->method.semaphore, 1);
+ if (ACPI_FAILURE (status)) {
+ ACPI_REPORT_ERROR (("Could not signal method semaphore\n"));
+ status = AE_OK;
+
+ /* Ignore error and continue cleanup */
+ }
}
/* Decrement the thread count on the method parse tree */
@@ -493,7 +516,11 @@
* Delete any namespace entries created immediately underneath
* the method
*/
- acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
+
if (method_node->child) {
acpi_ns_delete_namespace_subtree (method_node);
}
@@ -503,11 +530,14 @@
* the namespace
*/
acpi_ns_delete_namespace_by_owner (walk_state->method_desc->method.owning_id);
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
}
- acpi_ut_release_mutex (ACPI_MTX_PARSER);
- return_ACPI_STATUS (AE_OK);
+ status = acpi_ut_release_mutex (ACPI_MTX_PARSER);
+ 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)