patch-2.4.0-test9 linux/drivers/acpi/dispatcher/dswload.c
Next file: linux/drivers/acpi/dispatcher/dswscope.c
Previous file: linux/drivers/acpi/dispatcher/dswexec.c
Back to the patch index
Back to the overall index
- Lines: 563
- Date:
Fri Sep 15 14:30:29 2000
- Orig file:
v2.4.0-test8/linux/drivers/acpi/dispatcher/dswload.c
- Orig date:
Wed Jul 5 11:23:12 2000
diff -u --recursive --new-file v2.4.0-test8/linux/drivers/acpi/dispatcher/dswload.c linux/drivers/acpi/dispatcher/dswload.c
@@ -1,7 +1,7 @@
-
/******************************************************************************
*
* Module Name: dswload - Dispatcher namespace load callbacks
+ * $Revision: 19 $
*
*****************************************************************************/
@@ -25,16 +25,16 @@
#include "acpi.h"
-#include "parser.h"
+#include "acparser.h"
#include "amlcode.h"
-#include "dispatch.h"
-#include "interp.h"
-#include "namesp.h"
-#include "events.h"
+#include "acdispat.h"
+#include "acinterp.h"
+#include "acnamesp.h"
+#include "acevents.h"
#define _COMPONENT DISPATCHER
- MODULE_NAME ("dswload");
+ MODULE_NAME ("dswload")
/*****************************************************************************
@@ -53,61 +53,75 @@
ACPI_STATUS
acpi_ds_load1_begin_op (
+ u16 opcode,
+ ACPI_PARSE_OBJECT *op,
ACPI_WALK_STATE *walk_state,
- ACPI_GENERIC_OP *op)
+ ACPI_PARSE_OBJECT **out_op)
{
- ACPI_NAMED_OBJECT *new_entry;
+ ACPI_NAMESPACE_NODE *node;
ACPI_STATUS status;
OBJECT_TYPE_INTERNAL data_type;
+ NATIVE_CHAR *path;
/* We are only interested in opcodes that have an associated name */
- if (!acpi_ps_is_named_op (op->opcode)) {
- return AE_OK;
+ if (!acpi_ps_is_named_op (opcode)) {
+ *out_op = op;
+ return (AE_OK);
}
/* Check if this object has already been installed in the namespace */
- if (op->acpi_named_object) {
- return AE_OK;
+ if (op && op->node) {
+ *out_op = op;
+ return (AE_OK);
}
+ path = acpi_ps_get_next_namestring (walk_state->parser_state);
+
/* Map the raw opcode into an internal object type */
- data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
+ data_type = acpi_ds_map_named_opcode_to_data_type (opcode);
- /* Attempt to type a NAME opcode by examining the argument */
- /* TBD: [Investigate] is this the right place to do this? */
+ /*
+ * Enter the named type into the internal namespace. We enter the name
+ * as we go downward in the parse tree. Any necessary subobjects that involve
+ * arguments to the opcode must be created as we go back up the parse tree later.
+ */
+ status = acpi_ns_lookup (walk_state->scope_info, path,
+ data_type, IMODE_LOAD_PASS1,
+ NS_NO_UPSEARCH, walk_state, &(node));
- if (op->opcode == AML_NAME_OP) {
- if (op->value.arg) {
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
- data_type = acpi_ds_map_opcode_to_data_type ((op->value.arg)->opcode,
- NULL);
+ if (!op) {
+ /* Create a new op */
+
+ op = acpi_ps_alloc_op (opcode);
+ if (!op) {
+ return (AE_NO_MEMORY);
}
}
+ /* Initialize */
+
+ ((ACPI_PARSE2_OBJECT *)op)->name = node->name;
/*
- * Enter the named type into the internal namespace. We enter the name
- * as we go downward in the parse tree. Any necessary subobjects that involve
- * arguments to the opcode must be created as we go back up the parse tree later.
+ * Put the Node in the "op" object that the parser uses, so we
+ * can get it again quickly when this scope is closed
*/
- status = acpi_ns_lookup (walk_state->scope_info,
- (char *) &((ACPI_NAMED_OP *)op)->name,
- data_type, IMODE_LOAD_PASS1,
- NS_NO_UPSEARCH, walk_state, &(new_entry));
+ op->node = node;
- if (ACPI_SUCCESS (status)) {
- /*
- * Put the NTE in the "op" object that the parser uses, so we
- * can get it again quickly when this scope is closed
- */
- op->acpi_named_object = new_entry;
- }
+
+ acpi_ps_append_arg (acpi_ps_get_parent_scope (walk_state->parser_state), op);
+
+ *out_op = op;
return (status);
}
@@ -131,7 +145,7 @@
ACPI_STATUS
acpi_ds_load1_end_op (
ACPI_WALK_STATE *walk_state,
- ACPI_GENERIC_OP *op)
+ ACPI_PARSE_OBJECT *op)
{
OBJECT_TYPE_INTERNAL data_type;
@@ -139,20 +153,26 @@
/* We are only interested in opcodes that have an associated name */
if (!acpi_ps_is_named_op (op->opcode)) {
- return AE_OK;
+ return (AE_OK);
}
- /* TBD: [Investigate] can this be removed? */
- if (op->opcode == AML_SCOPE_OP) {
- if (((ACPI_NAMED_OP *)op)->name == -1) {
- return AE_OK;
+ /* Get the type to determine if we should pop the scope */
+
+ data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
+
+ if (op->opcode == AML_NAME_OP) {
+ /* For Name opcode, check the argument */
+
+ if (op->value.arg) {
+ data_type = acpi_ds_map_opcode_to_data_type (
+ (op->value.arg)->opcode, NULL);
+ ((ACPI_NAMESPACE_NODE *)op->node)->type =
+ (u8) data_type;
}
}
- data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
-
/* Pop the scope stack */
if (acpi_ns_opens_scope (data_type)) {
@@ -160,7 +180,7 @@
acpi_ds_scope_stack_pop (walk_state);
}
- return AE_OK;
+ return (AE_OK);
}
@@ -181,60 +201,74 @@
ACPI_STATUS
acpi_ds_load2_begin_op (
+ u16 opcode,
+ ACPI_PARSE_OBJECT *op,
ACPI_WALK_STATE *walk_state,
- ACPI_GENERIC_OP *op)
+ ACPI_PARSE_OBJECT **out_op)
{
- ACPI_NAMED_OBJECT *new_entry;
+ ACPI_NAMESPACE_NODE *node;
ACPI_STATUS status;
OBJECT_TYPE_INTERNAL data_type;
- char *buffer_ptr;
+ NATIVE_CHAR *buffer_ptr;
void *original = NULL;
/* We only care about Namespace opcodes here */
- if (!acpi_ps_is_namespace_op (op->opcode) &&
- op->opcode != AML_NAMEPATH_OP)
+ if (!acpi_ps_is_namespace_op (opcode) &&
+ opcode != AML_NAMEPATH_OP)
{
- return AE_OK;
+ return (AE_OK);
}
- /*
- * Get the name we are going to enter or lookup in the namespace
- */
- if (op->opcode == AML_NAMEPATH_OP) {
- /* For Namepath op , get the path string */
+ /* Temp! same code as in psparse */
+
+ if (!acpi_ps_is_named_op (opcode)) {
+ return (AE_OK);
+ }
+
+ if (op) {
+ /*
+ * Get the name we are going to enter or lookup in the namespace
+ */
+ if (opcode == AML_NAMEPATH_OP) {
+ /* For Namepath op, get the path string */
+
+ buffer_ptr = op->value.string;
+ if (!buffer_ptr) {
+ /* No name, just exit */
+
+ return (AE_OK);
+ }
+ }
- buffer_ptr = op->value.string;
- if (!buffer_ptr) {
- /* No name, just exit */
+ else {
+ /* Get name from the op */
- return AE_OK;
+ buffer_ptr = (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)op)->name;
}
}
else {
- /* Get name from the op */
-
- buffer_ptr = (char *) &((ACPI_NAMED_OP *)op)->name;
+ buffer_ptr = acpi_ps_get_next_namestring (walk_state->parser_state);
}
/* Map the raw opcode into an internal object type */
- data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
+ data_type = acpi_ds_map_named_opcode_to_data_type (opcode);
- if (op->opcode == AML_DEF_FIELD_OP ||
- op->opcode == AML_BANK_FIELD_OP ||
- op->opcode == AML_INDEX_FIELD_OP)
+ if (opcode == AML_DEF_FIELD_OP ||
+ opcode == AML_BANK_FIELD_OP ||
+ opcode == AML_INDEX_FIELD_OP)
{
- new_entry = NULL;
+ node = NULL;
status = AE_OK;
}
- else if (op->opcode == AML_NAMEPATH_OP) {
+ else if (opcode == AML_NAMEPATH_OP) {
/*
* The Name_path is an object reference to an existing object. Don't enter the
* name into the namespace, but look it up for use later
@@ -242,16 +276,16 @@
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr,
data_type, IMODE_EXECUTE,
NS_SEARCH_PARENT, walk_state,
- &(new_entry));
+ &(node));
}
else {
- if (op->acpi_named_object) {
- original = op->acpi_named_object;
- new_entry = op->acpi_named_object;
+ if (op && op->node) {
+ original = op->node;
+ node = op->node;
if (acpi_ns_opens_scope (data_type)) {
- status = acpi_ds_scope_stack_push (new_entry->child_table,
+ status = acpi_ds_scope_stack_push (node,
data_type,
walk_state);
if (ACPI_FAILURE (status)) {
@@ -259,7 +293,7 @@
}
}
- return AE_OK;
+ return (AE_OK);
}
/*
@@ -270,15 +304,30 @@
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr,
data_type, IMODE_EXECUTE,
NS_NO_UPSEARCH, walk_state,
- &(new_entry));
+ &(node));
}
if (ACPI_SUCCESS (status)) {
+ if (!op) {
+ /* Create a new op */
+
+ op = acpi_ps_alloc_op (opcode);
+ if (!op) {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Initialize */
+
+ ((ACPI_PARSE2_OBJECT *)op)->name = node->name;
+ *out_op = op;
+ }
+
+
/*
- * Put the NTE in the "op" object that the parser uses, so we
+ * Put the Node in the "op" object that the parser uses, so we
* can get it again quickly when this scope is closed
*/
- op->acpi_named_object = new_entry;
+ op->node = node;
}
@@ -305,22 +354,22 @@
ACPI_STATUS
acpi_ds_load2_end_op (
ACPI_WALK_STATE *walk_state,
- ACPI_GENERIC_OP *op)
+ ACPI_PARSE_OBJECT *op)
{
ACPI_STATUS status = AE_OK;
OBJECT_TYPE_INTERNAL data_type;
- ACPI_NAMED_OBJECT *entry;
- ACPI_GENERIC_OP *arg;
- ACPI_NAMED_OBJECT *new_entry;
+ ACPI_NAMESPACE_NODE *node;
+ ACPI_PARSE_OBJECT *arg;
+ ACPI_NAMESPACE_NODE *new_node;
if (!acpi_ps_is_namespace_object_op (op->opcode)) {
- return AE_OK;
+ return (AE_OK);
}
if (op->opcode == AML_SCOPE_OP) {
- if (((ACPI_NAMED_OP *)op)->name == -1) {
- return AE_OK;
+ if (((ACPI_PARSE2_OBJECT *)op)->name == -1) {
+ return (AE_OK);
}
}
@@ -328,17 +377,17 @@
data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
/*
- * Get the NTE/name from the earlier lookup
+ * Get the Node/name from the earlier lookup
* (It was saved in the *op structure)
*/
- entry = op->acpi_named_object;
+ node = op->node;
/*
- * Put the NTE on the object stack (Contains the ACPI Name of
+ * Put the Node on the object stack (Contains the ACPI Name of
* this object)
*/
- walk_state->operands[0] = (void *) entry;
+ walk_state->operands[0] = (void *) node;
walk_state->num_operands = 1;
/* Pop the scope stack */
@@ -409,29 +458,38 @@
INTERNAL_TYPE_DEF_ANY,
IMODE_LOAD_PASS1,
NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
- walk_state, &(new_entry));
+ walk_state, &(new_node));
if (ACPI_SUCCESS (status)) {
- /* We could put the returned object (NTE) on the object stack for later, but
+ /* We could put the returned object (Node) on the object stack for later, but
* for now, we will put it in the "op" object that the parser uses, so we
* can get it again at the end of this scope
*/
- op->acpi_named_object = new_entry;
- }
+ op->node = new_node;
+ /*
+ * If this is NOT a control method, we need to evaluate this opcode now.
+ */
+
+ /* THIS WON"T WORK. Must execute all operands like Add(). => Must do an execute pass
+ if (!Walk_state->Method_desc) {
+ Status = Acpi_ds_exec_end_op (Walk_state, Op);
+ }
+ */
+ }
break;
case AML_METHODCALL_OP:
/*
- * Lookup the method name and save the NTE
+ * Lookup the method name and save the Node
*/
status = acpi_ns_lookup (walk_state->scope_info, arg->value.string,
ACPI_TYPE_ANY, IMODE_LOAD_PASS2,
NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE,
- walk_state, &(new_entry));
+ walk_state, &(new_node));
if (ACPI_SUCCESS (status)) {
@@ -440,11 +498,11 @@
/* TBD: [Restructure] Make sure that what we found is indeed a method! */
/* We didn't search for a method on purpose, to see if the name would resolve! */
- /* We could put the returned object (NTE) on the object stack for later, but
+ /* We could put the returned object (Node) on the object stack for later, but
* for now, we will put it in the "op" object that the parser uses, so we
* can get it again at the end of this scope
*/
- op->acpi_named_object = new_entry;
+ op->node = new_node;
}
@@ -455,7 +513,7 @@
/* Nothing to do other than enter object into namespace */
- status = acpi_aml_exec_create_processor (op, (ACPI_HANDLE) entry);
+ status = acpi_aml_exec_create_processor (op, (ACPI_HANDLE) node);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
@@ -467,7 +525,7 @@
/* Nothing to do other than enter object into namespace */
- status = acpi_aml_exec_create_power_resource (op, (ACPI_HANDLE) entry);
+ status = acpi_aml_exec_create_power_resource (op, (ACPI_HANDLE) node);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
@@ -487,7 +545,7 @@
arg = op->value.arg;
status = acpi_ds_create_field (op,
- (ACPI_HANDLE) arg->acpi_named_object,
+ arg->node,
walk_state);
break;
@@ -497,7 +555,7 @@
arg = op->value.arg;
status = acpi_ds_create_index_field (op,
- (ACPI_HANDLE) arg->acpi_named_object,
+ (ACPI_HANDLE) arg->node,
walk_state);
break;
@@ -506,7 +564,7 @@
arg = op->value.arg;
status = acpi_ds_create_bank_field (op,
- (ACPI_HANDLE) arg->acpi_named_object,
+ arg->node,
walk_state);
break;
@@ -516,10 +574,10 @@
*/
case AML_METHOD_OP:
- if (!entry->object) {
- status = acpi_aml_exec_create_method (((ACPI_DEFERRED_OP *) op)->body,
- ((ACPI_DEFERRED_OP *) op)->body_length,
- arg->value.integer, (ACPI_HANDLE) entry);
+ if (!node->object) {
+ status = acpi_aml_exec_create_method (((ACPI_PARSE2_OBJECT *) op)->data,
+ ((ACPI_PARSE2_OBJECT *) op)->length,
+ arg->value.integer, (ACPI_HANDLE) node);
}
break;
@@ -549,14 +607,18 @@
case AML_REGION_OP:
+ if (node->object) {
+ break;
+ }
+
/*
* The Op_region is not fully parsed at this time. Only valid argument is the Space_id.
* (We must save the address of the AML of the address and length operands)
*/
- status = acpi_aml_exec_create_region (((ACPI_DEFERRED_OP *) op)->body,
- ((ACPI_DEFERRED_OP *) op)->body_length,
+ status = acpi_aml_exec_create_region (((ACPI_PARSE2_OBJECT *) op)->data,
+ ((ACPI_PARSE2_OBJECT *) op)->length,
arg->value.integer, walk_state);
break;
@@ -577,7 +639,7 @@
case AML_NAME_OP:
- status = acpi_ds_create_named_object (walk_state, entry, op);
+ status = acpi_ds_create_node (walk_state, node, op);
break;
@@ -593,7 +655,9 @@
cleanup:
- /* Remove the NTE pushed at the very beginning */
+
+ /* Remove the Node pushed at the very beginning */
+
acpi_ds_obj_stack_pop (1, walk_state);
return (status);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)