Commit 39d7c3e1 authored by Len Brown's avatar Len Brown

Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.0

into intel.com:/home/lenb/bk/linux-acpi-test-2.6.0
parents d4536e93 3aac1e55
...@@ -280,5 +280,17 @@ config ACPI_EFI ...@@ -280,5 +280,17 @@ config ACPI_EFI
depends on IA64 depends on IA64
default y default y
config ACPI_RELAXED_AML
bool
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default n
help
If you say `Y' here, the ACPI interpreter will relax its checking
for valid AML and will ignore some AML mistakes, such as off-by-one
errors in region sizes. Some laptops may require this option. In
particular, many Toshiba laptops require this for correct operation
of the AC module.
endmenu endmenu
...@@ -105,27 +105,33 @@ acpi_ds_create_buffer_field ( ...@@ -105,27 +105,33 @@ acpi_ds_create_buffer_field (
return_ACPI_STATUS (AE_AML_NO_OPERAND); return_ACPI_STATUS (AE_AML_NO_OPERAND);
} }
/* if (walk_state->deferred_node) {
* During the load phase, we want to enter the name of the field into node = walk_state->deferred_node;
* the namespace. During the execute phase (when we evaluate the size status = AE_OK;
* operand), we want to lookup the name
*/
if (walk_state->parse_flags & ACPI_PARSE_EXECUTE) {
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE;
} }
else { else {
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND; /*
} * During the load phase, we want to enter the name of the field into
* the namespace. During the execute phase (when we evaluate the size
* operand), we want to lookup the name
*/
if (walk_state->parse_flags & ACPI_PARSE_EXECUTE) {
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE;
}
else {
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND;
}
/* /*
* Enter the name_string into the namespace * Enter the name_string into the namespace
*/ */
status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string, status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string,
ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1,
flags, walk_state, &(node)); flags, walk_state, &(node));
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
ACPI_REPORT_NSERROR (arg->common.value.string, status); ACPI_REPORT_NSERROR (arg->common.value.string, status);
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
}
} }
/* We could put the returned object (Node) on the object stack for later, but /* We could put the returned object (Node) on the object stack for later, but
......
...@@ -135,7 +135,7 @@ acpi_ds_init_one_object ( ...@@ -135,7 +135,7 @@ acpi_ds_init_one_object (
} }
/* /*
* Always parse methods to detect errors, we may delete * Always parse methods to detect errors, we will delete
* the parse tree below * the parse tree below
*/ */
status = acpi_ds_parse_method (obj_handle); status = acpi_ds_parse_method (obj_handle);
...@@ -150,7 +150,7 @@ acpi_ds_init_one_object ( ...@@ -150,7 +150,7 @@ acpi_ds_init_one_object (
} }
/* /*
* Delete the parse tree. We simple re-parse the method * Delete the parse tree. We simply re-parse the method
* for every execution since there isn't much overhead * for every execution since there isn't much overhead
*/ */
acpi_ns_delete_namespace_subtree (obj_handle); acpi_ns_delete_namespace_subtree (obj_handle);
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
* *
* RETURN: Status. * RETURN: Status.
* *
* DESCRIPTION: Late execution of region or field arguments * DESCRIPTION: Late (deferred) execution of region or field arguments
* *
****************************************************************************/ ****************************************************************************/
...@@ -111,7 +111,10 @@ acpi_ds_execute_arguments ( ...@@ -111,7 +111,10 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
/* Mark this parse as a deferred opcode */
walk_state->parse_flags = ACPI_PARSE_DEFERRED_OP; walk_state->parse_flags = ACPI_PARSE_DEFERRED_OP;
walk_state->deferred_node = node;
/* Pass1: Parse the entire declaration */ /* Pass1: Parse the entire declaration */
...@@ -128,7 +131,7 @@ acpi_ds_execute_arguments ( ...@@ -128,7 +131,7 @@ acpi_ds_execute_arguments (
arg->common.node = node; arg->common.node = node;
acpi_ps_delete_parse_tree (op); acpi_ps_delete_parse_tree (op);
/* Evaluate the address and length arguments for the Buffer Field */ /* Evaluate the deferred arguments */
op = acpi_ps_alloc_op (AML_INT_EVAL_SUBTREE_OP); op = acpi_ps_alloc_op (AML_INT_EVAL_SUBTREE_OP);
if (!op) { if (!op) {
...@@ -144,6 +147,8 @@ acpi_ds_execute_arguments ( ...@@ -144,6 +147,8 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
/* Execute the opcode and arguments */
status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start, status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start,
aml_length, NULL, NULL, 3); aml_length, NULL, NULL, 3);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
...@@ -151,6 +156,9 @@ acpi_ds_execute_arguments ( ...@@ -151,6 +156,9 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
/* Mark this execution as a deferred opcode */
walk_state->deferred_node = node;
status = acpi_ps_parse_aml (walk_state); status = acpi_ps_parse_aml (walk_state);
acpi_ps_delete_parse_tree (op); acpi_ps_delete_parse_tree (op);
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
...@@ -192,7 +200,7 @@ acpi_ds_get_buffer_field_arguments ( ...@@ -192,7 +200,7 @@ acpi_ds_get_buffer_field_arguments (
node = obj_desc->buffer_field.node; node = obj_desc->buffer_field.node;
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_BUFFER_FIELD, node, NULL)); ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_BUFFER_FIELD, node, NULL));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field JIT Init\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n",
node->name.ascii)); node->name.ascii));
/* Execute the AML code for the term_arg arguments */ /* Execute the AML code for the term_arg arguments */
...@@ -207,7 +215,7 @@ acpi_ds_get_buffer_field_arguments ( ...@@ -207,7 +215,7 @@ acpi_ds_get_buffer_field_arguments (
* *
* FUNCTION: acpi_ds_get_buffer_arguments * FUNCTION: acpi_ds_get_buffer_arguments
* *
* PARAMETERS: obj_desc - A valid Bufferobject * PARAMETERS: obj_desc - A valid Buffer object
* *
* RETURN: Status. * RETURN: Status.
* *
...@@ -240,7 +248,7 @@ acpi_ds_get_buffer_arguments ( ...@@ -240,7 +248,7 @@ acpi_ds_get_buffer_arguments (
return_ACPI_STATUS (AE_AML_INTERNAL); return_ACPI_STATUS (AE_AML_INTERNAL);
} }
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer JIT Init\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n"));
/* Execute the AML code for the term_arg arguments */ /* Execute the AML code for the term_arg arguments */
...@@ -254,7 +262,7 @@ acpi_ds_get_buffer_arguments ( ...@@ -254,7 +262,7 @@ acpi_ds_get_buffer_arguments (
* *
* FUNCTION: acpi_ds_get_package_arguments * FUNCTION: acpi_ds_get_package_arguments
* *
* PARAMETERS: obj_desc - A valid Packageobject * PARAMETERS: obj_desc - A valid Package object
* *
* RETURN: Status. * RETURN: Status.
* *
...@@ -287,7 +295,7 @@ acpi_ds_get_package_arguments ( ...@@ -287,7 +295,7 @@ acpi_ds_get_package_arguments (
return_ACPI_STATUS (AE_AML_INTERNAL); return_ACPI_STATUS (AE_AML_INTERNAL);
} }
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package JIT Init\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n"));
/* Execute the AML code for the term_arg arguments */ /* Execute the AML code for the term_arg arguments */
...@@ -335,11 +343,12 @@ acpi_ds_get_region_arguments ( ...@@ -335,11 +343,12 @@ acpi_ds_get_region_arguments (
node = obj_desc->region.node; node = obj_desc->region.node;
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL)); ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Init at AML %p\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Arg Init at AML %p\n",
node->name.ascii, extra_desc->extra.aml_start)); node->name.ascii, extra_desc->extra.aml_start));
/* Execute the argument AML */
status = acpi_ds_execute_arguments (node, acpi_ns_get_parent_node (node), status = acpi_ds_execute_arguments (node, acpi_ns_get_parent_node (node),
extra_desc->extra.aml_length, extra_desc->extra.aml_start); extra_desc->extra.aml_length, extra_desc->extra.aml_start);
...@@ -505,14 +514,16 @@ acpi_ds_init_buffer_field ( ...@@ -505,14 +514,16 @@ acpi_ds_init_buffer_field (
goto cleanup; goto cleanup;
} }
/* Entire field must fit within the current length of the buffer */ /* Entire field must fit within the current length of the buffer */
if ((bit_offset + bit_count) > if ((bit_offset + bit_count) >
(8 * (u32) buffer_desc->buffer.length)) { (8 * (u32) buffer_desc->buffer.length)) {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Field size %d exceeds Buffer size %d (bits)\n", "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n",
bit_offset + bit_count, 8 * (u32) buffer_desc->buffer.length)); ((struct acpi_namespace_node *) result_desc)->name.ascii,
bit_offset + bit_count,
buffer_desc->buffer.node->name.ascii,
8 * (u32) buffer_desc->buffer.length));
status = AE_AML_BUFFER_LIMIT; status = AE_AML_BUFFER_LIMIT;
goto cleanup; goto cleanup;
} }
......
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
#define _COMPONENT ACPI_DISPATCHER #define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME ("dsutils") ACPI_MODULE_NAME ("dsutils")
#ifndef ACPI_NO_METHOD_EXECUTION #ifndef ACPI_NO_METHOD_EXECUTION
/******************************************************************************* /*******************************************************************************
...@@ -196,7 +197,6 @@ acpi_ds_is_result_used ( ...@@ -196,7 +197,6 @@ acpi_ds_is_result_used (
acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op)); acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op));
return_VALUE (FALSE); return_VALUE (FALSE);
} }
...@@ -239,7 +239,6 @@ acpi_ds_delete_result_if_not_used ( ...@@ -239,7 +239,6 @@ acpi_ds_delete_result_if_not_used (
return_VOID; return_VOID;
} }
if (!acpi_ds_is_result_used (op, walk_state)) { if (!acpi_ds_is_result_used (op, walk_state)) {
/* /*
* Must pop the result stack (obj_desc should be equal to result_obj) * Must pop the result stack (obj_desc should be equal to result_obj)
...@@ -389,61 +388,77 @@ acpi_ds_create_operand ( ...@@ -389,61 +388,77 @@ acpi_ds_create_operand (
* in name_string * in name_string
*/ */
/* /*
* Differentiate between a namespace "create" operation * Special handling for buffer_field declarations. This is a deferred
* versus a "lookup" operation (IMODE_LOAD_PASS2 vs. * opcode that unfortunately defines the field name as the last
* IMODE_EXECUTE) in order to support the creation of * parameter instead of the first. We get here when we are performing
* namespace objects during the execution of control methods. * the deferred execution, so the actual name of the field is already
* in the namespace. We don't want to attempt to look it up again
* because we may be executing in a different scope than where the
* actual opcode exists.
*/ */
parent_op = arg->common.parent; if ((walk_state->deferred_node) &&
op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode); (walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD) &&
if ((op_info->flags & AML_NSNODE) && (arg_index != 0)) {
(parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) && obj_desc = ACPI_CAST_PTR (union acpi_operand_object, walk_state->deferred_node);
(parent_op->common.aml_opcode != AML_REGION_OP) && status = AE_OK;
(parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) {
/* Enter name into namespace if not found */
interpreter_mode = ACPI_IMODE_LOAD_PASS2;
}
else {
/* Return a failure if name not found */
interpreter_mode = ACPI_IMODE_EXECUTE;
} }
else /* All other opcodes */ {
/*
* Differentiate between a namespace "create" operation
* versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
* IMODE_EXECUTE) in order to support the creation of
* namespace objects during the execution of control methods.
*/
parent_op = arg->common.parent;
op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode);
if ((op_info->flags & AML_NSNODE) &&
(parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) &&
(parent_op->common.aml_opcode != AML_REGION_OP) &&
(parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) {
/* Enter name into namespace if not found */
interpreter_mode = ACPI_IMODE_LOAD_PASS2;
}
else {
/* Return a failure if name not found */
status = acpi_ns_lookup (walk_state->scope_info, name_string, interpreter_mode = ACPI_IMODE_EXECUTE;
ACPI_TYPE_ANY, interpreter_mode,
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
walk_state,
ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc));
/*
* The only case where we pass through (ignore) a NOT_FOUND
* error is for the cond_ref_of opcode.
*/
if (status == AE_NOT_FOUND) {
if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) {
/*
* For the Conditional Reference op, it's OK if
* the name is not found; We just need a way to
* indicate this to the interpreter, set the
* object to the root
*/
obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node);
status = AE_OK;
} }
else { status = acpi_ns_lookup (walk_state->scope_info, name_string,
/* ACPI_TYPE_ANY, interpreter_mode,
* We just plain didn't find it -- which is a ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
* very serious error at this point walk_state,
*/ ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc));
status = AE_AML_NAME_NOT_FOUND; /*
* The only case where we pass through (ignore) a NOT_FOUND
* error is for the cond_ref_of opcode.
*/
if (status == AE_NOT_FOUND) {
if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) {
/*
* For the Conditional Reference op, it's OK if
* the name is not found; We just need a way to
* indicate this to the interpreter, set the
* object to the root
*/
obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node);
status = AE_OK;
}
else {
/*
* We just plain didn't find it -- which is a
* very serious error at this point
*/
status = AE_AML_NAME_NOT_FOUND;
}
} }
}
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
ACPI_REPORT_NSERROR (name_string, status); ACPI_REPORT_NSERROR (name_string, status);
}
} }
/* Free the namestring created above */ /* Free the namestring created above */
...@@ -464,8 +479,6 @@ acpi_ds_create_operand ( ...@@ -464,8 +479,6 @@ acpi_ds_create_operand (
} }
ACPI_DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state)); ACPI_DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state));
} }
else { else {
/* Check for null name case */ /* Check for null name case */
...@@ -480,7 +493,6 @@ acpi_ds_create_operand ( ...@@ -480,7 +493,6 @@ acpi_ds_create_operand (
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Null namepath: Arg=%p\n", arg)); ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Null namepath: Arg=%p\n", arg));
} }
else { else {
opcode = arg->common.aml_opcode; opcode = arg->common.aml_opcode;
} }
......
...@@ -248,6 +248,14 @@ acpi_ds_load1_begin_op ( ...@@ -248,6 +248,14 @@ acpi_ds_load1_begin_op (
* buffer_field, or Package), the name of the object is already * buffer_field, or Package), the name of the object is already
* in the namespace. * in the namespace.
*/ */
if (walk_state->deferred_node) {
/* This name is already in the namespace, get the node */
node = walk_state->deferred_node;
status = AE_OK;
break;
}
flags = ACPI_NS_NO_UPSEARCH; flags = ACPI_NS_NO_UPSEARCH;
if ((walk_state->opcode != AML_SCOPE_OP) && if ((walk_state->opcode != AML_SCOPE_OP) &&
(!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) { (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) {
...@@ -589,7 +597,17 @@ acpi_ds_load2_begin_op ( ...@@ -589,7 +597,17 @@ acpi_ds_load2_begin_op (
* Enter the named type into the internal namespace. We enter the 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 * 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. * arguments to the opcode must be created as we go back up the parse tree later.
*
* Note: Name may already exist if we are executing a deferred opcode.
*/ */
if (walk_state->deferred_node) {
/* This name is already in the namespace, get the node */
node = walk_state->deferred_node;
status = AE_OK;
break;
}
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type,
ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, walk_state, &(node)); ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, walk_state, &(node));
break; break;
......
...@@ -121,10 +121,9 @@ acpi_ds_scope_stack_push ( ...@@ -121,10 +121,9 @@ acpi_ds_scope_stack_push (
/* Make sure object type is valid */ /* Make sure object type is valid */
if (!acpi_ut_valid_object_type (type)) { if (!acpi_ut_valid_object_type (type)) {
ACPI_REPORT_WARNING (("ds_scope_stack_push: type code out of range\n")); ACPI_REPORT_WARNING (("ds_scope_stack_push: Invalid object type: 0x%X\n", type));
} }
/* Allocate a new scope object */ /* Allocate a new scope object */
scope_info = acpi_ut_create_generic_state (); scope_info = acpi_ut_create_generic_state ();
...@@ -146,13 +145,13 @@ acpi_ds_scope_stack_push ( ...@@ -146,13 +145,13 @@ acpi_ds_scope_stack_push (
old_scope_info = walk_state->scope_info; old_scope_info = walk_state->scope_info;
if (old_scope_info) { if (old_scope_info) {
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
"[%4.4s] (%10s)", "[%4.4s] (%s)",
old_scope_info->scope.node->name.ascii, old_scope_info->scope.node->name.ascii,
acpi_ut_get_type_name (old_scope_info->common.value))); acpi_ut_get_type_name (old_scope_info->common.value)));
} }
else { else {
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
"[\\___] (%10s)", "ROOT")); "[\\___] (%s)", "ROOT"));
} }
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
...@@ -163,7 +162,6 @@ acpi_ds_scope_stack_push ( ...@@ -163,7 +162,6 @@ acpi_ds_scope_stack_push (
/* Push new scope object onto stack */ /* Push new scope object onto stack */
acpi_ut_push_generic_state (&walk_state->scope_info, scope_info); acpi_ut_push_generic_state (&walk_state->scope_info, scope_info);
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
...@@ -207,7 +205,7 @@ acpi_ds_scope_stack_pop ( ...@@ -207,7 +205,7 @@ acpi_ds_scope_stack_pop (
walk_state->scope_depth--; walk_state->scope_depth--;
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"[%.2d] Popped scope [%4.4s] (%10s), New scope -> ", "[%.2d] Popped scope [%4.4s] (%s), New scope -> ",
(u32) walk_state->scope_depth, (u32) walk_state->scope_depth,
scope_info->scope.node->name.ascii, scope_info->scope.node->name.ascii,
acpi_ut_get_type_name (scope_info->common.value))); acpi_ut_get_type_name (scope_info->common.value)));
...@@ -225,7 +223,6 @@ acpi_ds_scope_stack_pop ( ...@@ -225,7 +223,6 @@ acpi_ds_scope_stack_pop (
} }
acpi_ut_delete_generic_state (scope_info); acpi_ut_delete_generic_state (scope_info);
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
......
...@@ -56,11 +56,12 @@ ...@@ -56,11 +56,12 @@
* FUNCTION: acpi_ds_result_insert * FUNCTION: acpi_ds_result_insert
* *
* PARAMETERS: Object - Object to push * PARAMETERS: Object - Object to push
* Index - Where to insert the object
* walk_state - Current Walk state * walk_state - Current Walk state
* *
* RETURN: Status * RETURN: Status
* *
* DESCRIPTION: Push an object onto this walk's result stack * DESCRIPTION: Insert an object onto this walk's result stack
* *
******************************************************************************/ ******************************************************************************/
...@@ -114,6 +115,7 @@ acpi_ds_result_insert ( ...@@ -114,6 +115,7 @@ acpi_ds_result_insert (
* FUNCTION: acpi_ds_result_remove * FUNCTION: acpi_ds_result_remove
* *
* PARAMETERS: Object - Where to return the popped object * PARAMETERS: Object - Where to return the popped object
* Index - Where to extract the object
* walk_state - Current Walk state * walk_state - Current Walk state
* *
* RETURN: Status * RETURN: Status
...@@ -233,6 +235,7 @@ acpi_ds_result_pop ( ...@@ -233,6 +235,7 @@ acpi_ds_result_pop (
return (AE_AML_NO_RETURN_VALUE); return (AE_AML_NO_RETURN_VALUE);
} }
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ds_result_pop_from_bottom * FUNCTION: acpi_ds_result_pop_from_bottom
...@@ -295,7 +298,6 @@ acpi_ds_result_pop_from_bottom ( ...@@ -295,7 +298,6 @@ acpi_ds_result_pop_from_bottom (
*object, (*object) ? acpi_ut_get_object_type_name (*object) : "NULL", *object, (*object) ? acpi_ut_get_object_type_name (*object) : "NULL",
state, walk_state)); state, walk_state));
return (AE_OK); return (AE_OK);
} }
...@@ -358,8 +360,7 @@ acpi_ds_result_push ( ...@@ -358,8 +360,7 @@ acpi_ds_result_push (
* *
* FUNCTION: acpi_ds_result_stack_push * FUNCTION: acpi_ds_result_stack_push
* *
* PARAMETERS: Object - Object to push * PARAMETERS: walk_state - Current Walk state
* walk_state - Current Walk state
* *
* RETURN: Status * RETURN: Status
* *
...@@ -420,7 +421,6 @@ acpi_ds_result_stack_pop ( ...@@ -420,7 +421,6 @@ acpi_ds_result_stack_pop (
return (AE_AML_NO_OPERAND); return (AE_AML_NO_OPERAND);
} }
state = acpi_ut_pop_generic_state (&walk_state->results); state = acpi_ut_pop_generic_state (&walk_state->results);
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
...@@ -572,6 +572,7 @@ acpi_ds_obj_stack_pop_object ( ...@@ -572,6 +572,7 @@ acpi_ds_obj_stack_pop_object (
} }
#endif #endif
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ds_obj_stack_pop * FUNCTION: acpi_ds_obj_stack_pop
...@@ -641,6 +642,7 @@ acpi_ds_obj_stack_pop_and_delete ( ...@@ -641,6 +642,7 @@ acpi_ds_obj_stack_pop_and_delete (
u32 i; u32 i;
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
ACPI_FUNCTION_NAME ("ds_obj_stack_pop_and_delete"); ACPI_FUNCTION_NAME ("ds_obj_stack_pop_and_delete");
...@@ -883,8 +885,15 @@ acpi_ds_create_walk_state ( ...@@ -883,8 +885,15 @@ acpi_ds_create_walk_state (
* FUNCTION: acpi_ds_init_aml_walk * FUNCTION: acpi_ds_init_aml_walk
* *
* PARAMETERS: walk_state - New state to be initialized * PARAMETERS: walk_state - New state to be initialized
* Op - Current parse op
* method_node - Control method NS node, if any
* aml_start - Start of AML
* aml_length - Length of AML
* Params - Method args, if any
* return_obj_desc - Where to store a return object, if any
* pass_number - 1, 2, or 3
* *
* RETURN: None * RETURN: Status
* *
* DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk
* *
...@@ -927,9 +936,9 @@ acpi_ds_init_aml_walk ( ...@@ -927,9 +936,9 @@ acpi_ds_init_aml_walk (
if (method_node) { if (method_node) {
walk_state->parser_state.start_node = method_node; walk_state->parser_state.start_node = method_node;
walk_state->walk_type = ACPI_WALK_METHOD; walk_state->walk_type = ACPI_WALK_METHOD;
walk_state->method_node = method_node; walk_state->method_node = method_node;
walk_state->method_desc = acpi_ns_get_attached_object (method_node); walk_state->method_desc = acpi_ns_get_attached_object (method_node);
/* Push start scope on scope stack and make it current */ /* Push start scope on scope stack and make it current */
...@@ -956,6 +965,7 @@ acpi_ds_init_aml_walk ( ...@@ -956,6 +965,7 @@ acpi_ds_init_aml_walk (
while (extra_op && !extra_op->common.node) { while (extra_op && !extra_op->common.node) {
extra_op = extra_op->common.parent; extra_op = extra_op->common.parent;
} }
if (!extra_op) { if (!extra_op) {
parser_state->start_node = NULL; parser_state->start_node = NULL;
} }
...@@ -1014,7 +1024,7 @@ acpi_ds_delete_walk_state ( ...@@ -1014,7 +1024,7 @@ acpi_ds_delete_walk_state (
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", walk_state)); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", walk_state));
} }
/* Always must free any linked control states */ /* Always must free any linked control states */
while (walk_state->control_state) { while (walk_state->control_state) {
state = walk_state->control_state; state = walk_state->control_state;
......
...@@ -286,7 +286,7 @@ acpi_ex_create_region ( ...@@ -286,7 +286,7 @@ acpi_ex_create_region (
ACPI_FUNCTION_TRACE ("ex_create_region"); ACPI_FUNCTION_TRACE ("ex_create_region");
/* Get the Node from the object stack */ /* Get the Namespace Node */
node = walk_state->op->common.node; node = walk_state->op->common.node;
...@@ -311,7 +311,6 @@ acpi_ex_create_region ( ...@@ -311,7 +311,6 @@ acpi_ex_create_region (
ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (%X)\n", ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (%X)\n",
acpi_ut_get_region_name (region_space), region_space)); acpi_ut_get_region_name (region_space), region_space));
/* Create the region descriptor */ /* Create the region descriptor */
obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_REGION); obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_REGION);
...@@ -375,6 +374,7 @@ acpi_ex_create_table_region ( ...@@ -375,6 +374,7 @@ acpi_ex_create_table_region (
ACPI_FUNCTION_TRACE ("ex_create_table_region"); ACPI_FUNCTION_TRACE ("ex_create_table_region");
/* Get the Node from the object stack */ /* Get the Node from the object stack */
node = walk_state->op->common.node; node = walk_state->op->common.node;
...@@ -392,7 +392,6 @@ acpi_ex_create_table_region ( ...@@ -392,7 +392,6 @@ acpi_ex_create_table_region (
status = acpi_tb_find_table (operand[1]->string.pointer, status = acpi_tb_find_table (operand[1]->string.pointer,
operand[2]->string.pointer, operand[2]->string.pointer,
operand[3]->string.pointer, &table); operand[3]->string.pointer, &table);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
...@@ -489,7 +488,6 @@ acpi_ex_create_processor ( ...@@ -489,7 +488,6 @@ acpi_ex_create_processor (
status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0], status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0],
obj_desc, ACPI_TYPE_PROCESSOR); obj_desc, ACPI_TYPE_PROCESSOR);
/* Remove local reference to the object */ /* Remove local reference to the object */
acpi_ut_remove_reference (obj_desc); acpi_ut_remove_reference (obj_desc);
...@@ -540,7 +538,6 @@ acpi_ex_create_power_resource ( ...@@ -540,7 +538,6 @@ acpi_ex_create_power_resource (
status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0], status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0],
obj_desc, ACPI_TYPE_POWER); obj_desc, ACPI_TYPE_POWER);
/* Remove local reference to the object */ /* Remove local reference to the object */
acpi_ut_remove_reference (obj_desc); acpi_ut_remove_reference (obj_desc);
...@@ -609,7 +606,6 @@ acpi_ex_create_method ( ...@@ -609,7 +606,6 @@ acpi_ex_create_method (
obj_desc->method.concurrency = (u8) obj_desc->method.concurrency = (u8)
(((method_flags & METHOD_FLAGS_SYNCH_LEVEL) >> 4) + 1); (((method_flags & METHOD_FLAGS_SYNCH_LEVEL) >> 4) + 1);
} }
else { else {
obj_desc->method.concurrency = INFINITE_CONCURRENCY; obj_desc->method.concurrency = INFINITE_CONCURRENCY;
} }
......
...@@ -139,7 +139,41 @@ acpi_ex_setup_region ( ...@@ -139,7 +139,41 @@ acpi_ex_setup_region (
field_datum_byte_offset, obj_desc->common_field.access_byte_width, field_datum_byte_offset, obj_desc->common_field.access_byte_width,
rgn_desc->region.node->name.ascii, rgn_desc->region.length)); rgn_desc->region.node->name.ascii, rgn_desc->region.length));
return_ACPI_STATUS (AE_AML_REGION_LIMIT); #ifdef CONFIG_ACPI_RELAXED_AML
{
/*
* Allow access to the field if it is within the region size
* rounded up to a multiple of the access byte width. This
* overcomes "off-by-one" programming errors in the AML often
* found in Toshiba laptops. These errors were allowed by
* the Microsoft ASL compiler.
*/
u32 rounded_length = ACPI_ROUND_UP(rgn_desc->region.length,
obj_desc->common_field.access_byte_width);
if (rounded_length < (obj_desc->common_field.base_byte_offset
+ field_datum_byte_offset
+ obj_desc->common_field.access_byte_width)) {
return_ACPI_STATUS (AE_AML_REGION_LIMIT);
} else {
static int warn_once = 1;
if (warn_once) {
// Could also associate a flag with each field, and
// warn once for each field.
ACPI_REPORT_WARNING((
"The ACPI AML in your computer contains errors, "
"please nag the manufacturer to correct it.\n"));
ACPI_REPORT_WARNING((
"Allowing relaxed access to fields; "
"turn on CONFIG_ACPI_DEBUG for details.\n"));
warn_once = 0;
}
return_ACPI_STATUS (AE_OK);
}
}
#else
return_ACPI_STATUS (AE_AML_REGION_LIMIT);
#endif
} }
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
......
...@@ -234,7 +234,7 @@ acpi_ns_dump_one_object ( ...@@ -234,7 +234,7 @@ acpi_ns_dump_one_object (
case ACPI_TYPE_DEVICE: case ACPI_TYPE_DEVICE:
acpi_os_printf ("Notify object: %p", obj_desc); acpi_os_printf ("Notify Object: %p\n", obj_desc);
break; break;
...@@ -371,7 +371,7 @@ acpi_ns_dump_one_object ( ...@@ -371,7 +371,7 @@ acpi_ns_dump_one_object (
case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD:
case ACPI_TYPE_LOCAL_INDEX_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD:
acpi_os_printf (" Off %.2X Len %.2X Acc %.2hd\n", acpi_os_printf ("Off %.2X Len %.2X Acc %.2hd\n",
(obj_desc->common_field.base_byte_offset * 8) (obj_desc->common_field.base_byte_offset * 8)
+ obj_desc->common_field.start_field_bit_offset, + obj_desc->common_field.start_field_bit_offset,
obj_desc->common_field.bit_length, obj_desc->common_field.bit_length,
......
...@@ -96,7 +96,7 @@ acpi_ns_search_node ( ...@@ -96,7 +96,7 @@ acpi_ns_search_node (
scope_name = acpi_ns_get_external_pathname (node); scope_name = acpi_ns_get_external_pathname (node);
if (scope_name) { if (scope_name) {
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (%s)\n", ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s (%p) For [%4.4s] (%s)\n",
scope_name, node, (char *) &target_name, acpi_ut_get_type_name (type))); scope_name, node, (char *) &target_name, acpi_ut_get_type_name (type)));
ACPI_MEM_FREE (scope_name); ACPI_MEM_FREE (scope_name);
...@@ -117,9 +117,9 @@ acpi_ns_search_node ( ...@@ -117,9 +117,9 @@ acpi_ns_search_node (
* Found matching entry. * Found matching entry.
*/ */
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Name %4.4s Type [%s] found in scope [%4.4s] %p\n", "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
(char *) &target_name, acpi_ut_get_type_name (next_node->type), (char *) &target_name, acpi_ut_get_type_name (next_node->type),
next_node->name.ascii, next_node)); next_node, node->name.ascii, node));
*return_node = next_node; *return_node = next_node;
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
...@@ -143,7 +143,7 @@ acpi_ns_search_node ( ...@@ -143,7 +143,7 @@ acpi_ns_search_node (
/* Searched entire namespace level, not found */ /* Searched entire namespace level, not found */
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Name %4.4s Type [%s] not found in search in scope [%4.4s] %p first child %p\n", "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n",
(char *) &target_name, acpi_ut_get_type_name (type), (char *) &target_name, acpi_ut_get_type_name (type),
node->name.ascii, node, node->child)); node->name.ascii, node, node->child));
......
...@@ -175,6 +175,11 @@ acpi_ns_print_node_pathname ( ...@@ -175,6 +175,11 @@ acpi_ns_print_node_pathname (
acpi_status status; acpi_status status;
if (!node) {
acpi_os_printf ("[NULL NAME]");
return;
}
/* Convert handle to a full pathname and print it (with supplied message) */ /* Convert handle to a full pathname and print it (with supplied message) */
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
...@@ -470,11 +475,11 @@ acpi_ns_build_internal_name ( ...@@ -470,11 +475,11 @@ acpi_ns_build_internal_name (
*result = 0; *result = 0;
if (info->fully_qualified) { if (info->fully_qualified) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (abs) \"\\%s\"\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (abs) \"\\%s\"\n",
internal_name, internal_name)); internal_name, internal_name));
} }
else { else {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (rel) \"%s\"\n", ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (rel) \"%s\"\n",
internal_name, internal_name)); internal_name, internal_name));
} }
......
...@@ -437,7 +437,6 @@ acpi_ps_parse_loop ( ...@@ -437,7 +437,6 @@ acpi_ps_parse_loop (
return_ACPI_STATUS (AE_BAD_PARAMETER); return_ACPI_STATUS (AE_BAD_PARAMETER);
} }
parser_state = &walk_state->parser_state; parser_state = &walk_state->parser_state;
walk_state->arg_types = 0; walk_state->arg_types = 0;
...@@ -705,10 +704,9 @@ acpi_ps_parse_loop ( ...@@ -705,10 +704,9 @@ acpi_ps_parse_loop (
walk_state->arg_types = 0; walk_state->arg_types = 0;
break; break;
default: default:
/* Op is not a constant or string, append each argument */ /* Op is not a constant or string, append each argument to the Op */
while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) &&
!walk_state->arg_count) { !walk_state->arg_count) {
...@@ -727,23 +725,23 @@ acpi_ps_parse_loop ( ...@@ -727,23 +725,23 @@ acpi_ps_parse_loop (
INCREMENT_ARG_LIST (walk_state->arg_types); INCREMENT_ARG_LIST (walk_state->arg_types);
} }
/* Special processing for certain opcodes */
switch (op->common.aml_opcode) { switch (op->common.aml_opcode) {
case AML_METHOD_OP: case AML_METHOD_OP:
/* For a method, save the length and address of the body */
/* /*
* Skip parsing of control method or opregion body, * Skip parsing of control method
* because we don't have enough info in the first pass * because we don't have enough info in the first pass
* to parse them correctly. * to parse it correctly.
*
* Save the length and address of the body
*/ */
op->named.data = parser_state->aml; op->named.data = parser_state->aml;
op->named.length = (u32) (parser_state->pkg_end - parser_state->aml); op->named.length = (u32) (parser_state->pkg_end - parser_state->aml);
/*
* Skip body of method. For op_regions, we must continue /* Skip body of method */
* parsing because the opregion is not a standalone
* package (We don't know where the end is).
*/
parser_state->aml = parser_state->pkg_end; parser_state->aml = parser_state->pkg_end;
walk_state->arg_count = 0; walk_state->arg_count = 0;
break; break;
...@@ -756,15 +754,15 @@ acpi_ps_parse_loop ( ...@@ -756,15 +754,15 @@ acpi_ps_parse_loop (
(op->common.parent->common.aml_opcode == AML_NAME_OP) && (op->common.parent->common.aml_opcode == AML_NAME_OP) &&
(walk_state->descending_callback != acpi_ds_exec_begin_op)) { (walk_state->descending_callback != acpi_ds_exec_begin_op)) {
/* /*
* Skip parsing of * Skip parsing of Buffers and Packages
* because we don't have enough info in the first pass * because we don't have enough info in the first pass
* to parse them correctly. * to parse them correctly.
*/ */
op->named.data = aml_op_start; op->named.data = aml_op_start;
op->named.length = (u32) (parser_state->pkg_end - aml_op_start); op->named.length = (u32) (parser_state->pkg_end - aml_op_start);
/*
* Skip body /* Skip body */
*/
parser_state->aml = parser_state->pkg_end; parser_state->aml = parser_state->pkg_end;
walk_state->arg_count = 0; walk_state->arg_count = 0;
} }
...@@ -778,6 +776,7 @@ acpi_ps_parse_loop ( ...@@ -778,6 +776,7 @@ acpi_ps_parse_loop (
break; break;
default: default:
/* No action for all other opcodes */ /* No action for all other opcodes */
break; break;
} }
......
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
/* Version string */ /* Version string */
#define ACPI_CA_VERSION 0x20030916 #define ACPI_CA_VERSION 0x20030918
/* Maximum objects in the various object caches */ /* Maximum objects in the various object caches */
......
...@@ -152,10 +152,6 @@ void ...@@ -152,10 +152,6 @@ void
acpi_dm_decode_internal_object ( acpi_dm_decode_internal_object (
union acpi_operand_object *obj_desc); union acpi_operand_object *obj_desc);
void
acpi_dm_decode_node (
struct acpi_namespace_node *node);
u32 u32
acpi_dm_block_type ( acpi_dm_block_type (
union acpi_parse_object *op); union acpi_parse_object *op);
......
...@@ -91,11 +91,12 @@ struct acpi_walk_state ...@@ -91,11 +91,12 @@ struct acpi_walk_state
struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */ struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */
union acpi_operand_object **caller_return_desc; union acpi_operand_object **caller_return_desc;
union acpi_generic_state *control_state; /* List of control states (nested IFs) */ union acpi_generic_state *control_state; /* List of control states (nested IFs) */
struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */
struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */ struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */
struct acpi_namespace_node *method_call_node; /* Called method Node*/ struct acpi_namespace_node *method_call_node; /* Called method Node*/
union acpi_parse_object *method_call_op; /* method_call Op if running a method */ union acpi_parse_object *method_call_op; /* method_call Op if running a method */
union acpi_operand_object *method_desc; /* Method descriptor if running a method */ union acpi_operand_object *method_desc; /* Method descriptor if running a method */
struct acpi_namespace_node *method_node; /* Method Node if running a method */ struct acpi_namespace_node *method_node; /* Method node if running a method. */
union acpi_parse_object *op; /* Current parser op */ union acpi_parse_object *op; /* Current parser op */
union acpi_operand_object *operands[ACPI_OBJ_NUM_OPERANDS+1]; /* Operands passed to the interpreter (+1 for NULL terminator) */ union acpi_operand_object *operands[ACPI_OBJ_NUM_OPERANDS+1]; /* Operands passed to the interpreter (+1 for NULL terminator) */
const struct acpi_opcode_info *op_info; /* Info on current opcode */ const struct acpi_opcode_info *op_info; /* Info on current opcode */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment