diff options
author | Bob Moore <robert.moore@intel.com> | 2008-06-10 00:38:10 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2008-07-16 17:27:03 -0400 |
commit | c91d924e3af08d4f98eab6ebf81f2b8ce132448f (patch) | |
tree | 8c3f7ca15ab9f8f2451a8cf87c935de2d01fb2ef | |
parent | f3454ae8104efb2dbf0d08ec42c6f5d0fe9225bc (diff) |
ACPICA: Fix for hang on GPE method invocation
Fixes problem where the new method argument count validation mechanism
will enter an infinite loop when a GPE method is dispatched.
Problem fixed be removing the obsolete code that passes GPE block
information to the notify handler via the control method parameter pointer.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
-rw-r--r-- | drivers/acpi/dispatcher/dsmethod.c | 1 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dswstate.c | 10 | ||||
-rw-r--r-- | drivers/acpi/events/evgpe.c | 4 | ||||
-rw-r--r-- | drivers/acpi/events/evregion.c | 1 | ||||
-rw-r--r-- | drivers/acpi/namespace/nsinit.c | 1 | ||||
-rw-r--r-- | drivers/acpi/namespace/nsxfeval.c | 1 | ||||
-rw-r--r-- | drivers/acpi/parser/psxface.c | 2 | ||||
-rw-r--r-- | drivers/acpi/resources/rsutils.c | 1 | ||||
-rw-r--r-- | drivers/acpi/utilities/uteval.c | 1 | ||||
-rw-r--r-- | include/acpi/acstruct.h | 7 |
10 files changed, 3 insertions, 26 deletions
diff --git a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c index 2509809a36cf..4613b9ca5792 100644 --- a/drivers/acpi/dispatcher/dsmethod.c +++ b/drivers/acpi/dispatcher/dsmethod.c | |||
@@ -377,7 +377,6 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, | |||
377 | } | 377 | } |
378 | 378 | ||
379 | info->parameters = &this_walk_state->operands[0]; | 379 | info->parameters = &this_walk_state->operands[0]; |
380 | info->parameter_type = ACPI_PARAM_ARGS; | ||
381 | 380 | ||
382 | status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node, | 381 | status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node, |
383 | obj_desc->method.aml_start, | 382 | obj_desc->method.aml_start, |
diff --git a/drivers/acpi/dispatcher/dswstate.c b/drivers/acpi/dispatcher/dswstate.c index 1386ced332ec..bda23ed60645 100644 --- a/drivers/acpi/dispatcher/dswstate.c +++ b/drivers/acpi/dispatcher/dswstate.c | |||
@@ -615,14 +615,8 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state, | |||
615 | walk_state->pass_number = pass_number; | 615 | walk_state->pass_number = pass_number; |
616 | 616 | ||
617 | if (info) { | 617 | if (info) { |
618 | if (info->parameter_type == ACPI_PARAM_GPE) { | 618 | walk_state->params = info->parameters; |
619 | walk_state->gpe_event_info = | 619 | walk_state->caller_return_desc = &info->return_object; |
620 | ACPI_CAST_PTR(struct acpi_gpe_event_info, | ||
621 | info->parameters); | ||
622 | } else { | ||
623 | walk_state->params = info->parameters; | ||
624 | walk_state->caller_return_desc = &info->return_object; | ||
625 | } | ||
626 | } | 620 | } |
627 | 621 | ||
628 | status = acpi_ps_init_scope(&walk_state->parser_state, op); | 622 | status = acpi_ps_init_scope(&walk_state->parser_state, op); |
diff --git a/drivers/acpi/events/evgpe.c b/drivers/acpi/events/evgpe.c index e0339d4139a4..ca356e5ae2c3 100644 --- a/drivers/acpi/events/evgpe.c +++ b/drivers/acpi/events/evgpe.c | |||
@@ -565,10 +565,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
565 | */ | 565 | */ |
566 | info->prefix_node = | 566 | info->prefix_node = |
567 | local_gpe_event_info.dispatch.method_node; | 567 | local_gpe_event_info.dispatch.method_node; |
568 | info->parameters = | ||
569 | ACPI_CAST_PTR(union acpi_operand_object *, | ||
570 | gpe_event_info); | ||
571 | info->parameter_type = ACPI_PARAM_GPE; | ||
572 | info->flags = ACPI_IGNORE_RETURN_VALUE; | 568 | info->flags = ACPI_IGNORE_RETURN_VALUE; |
573 | 569 | ||
574 | status = acpi_ns_evaluate(info); | 570 | status = acpi_ns_evaluate(info); |
diff --git a/drivers/acpi/events/evregion.c b/drivers/acpi/events/evregion.c index 1628f5934752..5ab4c01417df 100644 --- a/drivers/acpi/events/evregion.c +++ b/drivers/acpi/events/evregion.c | |||
@@ -219,7 +219,6 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function) | |||
219 | info->prefix_node = region_obj2->extra.method_REG; | 219 | info->prefix_node = region_obj2->extra.method_REG; |
220 | info->pathname = NULL; | 220 | info->pathname = NULL; |
221 | info->parameters = args; | 221 | info->parameters = args; |
222 | info->parameter_type = ACPI_PARAM_ARGS; | ||
223 | info->flags = ACPI_IGNORE_RETURN_VALUE; | 222 | info->flags = ACPI_IGNORE_RETURN_VALUE; |
224 | 223 | ||
225 | /* | 224 | /* |
diff --git a/drivers/acpi/namespace/nsinit.c b/drivers/acpi/namespace/nsinit.c index 6d6d930c8e18..e4c57510d798 100644 --- a/drivers/acpi/namespace/nsinit.c +++ b/drivers/acpi/namespace/nsinit.c | |||
@@ -542,7 +542,6 @@ acpi_ns_init_one_device(acpi_handle obj_handle, | |||
542 | info->prefix_node = device_node; | 542 | info->prefix_node = device_node; |
543 | info->pathname = METHOD_NAME__INI; | 543 | info->pathname = METHOD_NAME__INI; |
544 | info->parameters = NULL; | 544 | info->parameters = NULL; |
545 | info->parameter_type = ACPI_PARAM_ARGS; | ||
546 | info->flags = ACPI_IGNORE_RETURN_VALUE; | 545 | info->flags = ACPI_IGNORE_RETURN_VALUE; |
547 | 546 | ||
548 | /* | 547 | /* |
diff --git a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c index a8d549187c84..b4e135eab7c7 100644 --- a/drivers/acpi/namespace/nsxfeval.c +++ b/drivers/acpi/namespace/nsxfeval.c | |||
@@ -182,7 +182,6 @@ acpi_evaluate_object(acpi_handle handle, | |||
182 | } | 182 | } |
183 | 183 | ||
184 | info->pathname = pathname; | 184 | info->pathname = pathname; |
185 | info->parameter_type = ACPI_PARAM_ARGS; | ||
186 | 185 | ||
187 | /* Convert and validate the device handle */ | 186 | /* Convert and validate the device handle */ |
188 | 187 | ||
diff --git a/drivers/acpi/parser/psxface.c b/drivers/acpi/parser/psxface.c index 52581454c47c..5ee09e1245e3 100644 --- a/drivers/acpi/parser/psxface.c +++ b/drivers/acpi/parser/psxface.c | |||
@@ -335,7 +335,7 @@ acpi_ps_update_parameter_list(struct acpi_evaluate_info *info, u16 action) | |||
335 | { | 335 | { |
336 | acpi_native_uint i; | 336 | acpi_native_uint i; |
337 | 337 | ||
338 | if ((info->parameter_type == ACPI_PARAM_ARGS) && (info->parameters)) { | 338 | if (info->parameters) { |
339 | 339 | ||
340 | /* Update reference count for each parameter */ | 340 | /* Update reference count for each parameter */ |
341 | 341 | ||
diff --git a/drivers/acpi/resources/rsutils.c b/drivers/acpi/resources/rsutils.c index befe2302f41b..90ed83d05375 100644 --- a/drivers/acpi/resources/rsutils.c +++ b/drivers/acpi/resources/rsutils.c | |||
@@ -679,7 +679,6 @@ acpi_rs_set_srs_method_data(struct acpi_namespace_node *node, | |||
679 | info->prefix_node = node; | 679 | info->prefix_node = node; |
680 | info->pathname = METHOD_NAME__SRS; | 680 | info->pathname = METHOD_NAME__SRS; |
681 | info->parameters = args; | 681 | info->parameters = args; |
682 | info->parameter_type = ACPI_PARAM_ARGS; | ||
683 | info->flags = ACPI_IGNORE_RETURN_VALUE; | 682 | info->flags = ACPI_IGNORE_RETURN_VALUE; |
684 | 683 | ||
685 | /* | 684 | /* |
diff --git a/drivers/acpi/utilities/uteval.c b/drivers/acpi/utilities/uteval.c index 05e61be267d5..7f1f6341242d 100644 --- a/drivers/acpi/utilities/uteval.c +++ b/drivers/acpi/utilities/uteval.c | |||
@@ -217,7 +217,6 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node, | |||
217 | 217 | ||
218 | info->prefix_node = prefix_node; | 218 | info->prefix_node = prefix_node; |
219 | info->pathname = path; | 219 | info->pathname = path; |
220 | info->parameter_type = ACPI_PARAM_ARGS; | ||
221 | 220 | ||
222 | /* Evaluate the object/method */ | 221 | /* Evaluate the object/method */ |
223 | 222 | ||
diff --git a/include/acpi/acstruct.h b/include/acpi/acstruct.h index 1cc74504f1c4..818c24d7d2d1 100644 --- a/include/acpi/acstruct.h +++ b/include/acpi/acstruct.h | |||
@@ -108,7 +108,6 @@ struct acpi_walk_state { | |||
108 | union acpi_operand_object **caller_return_desc; | 108 | union acpi_operand_object **caller_return_desc; |
109 | union acpi_generic_state *control_state; /* List of control states (nested IFs) */ | 109 | union acpi_generic_state *control_state; /* List of control states (nested IFs) */ |
110 | struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */ | 110 | struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */ |
111 | struct acpi_gpe_event_info *gpe_event_info; /* Info for GPE (_Lxx/_Exx methods only */ | ||
112 | union acpi_operand_object *implicit_return_obj; | 111 | union acpi_operand_object *implicit_return_obj; |
113 | struct acpi_namespace_node *method_call_node; /* Called method Node */ | 112 | struct acpi_namespace_node *method_call_node; /* Called method Node */ |
114 | union acpi_parse_object *method_call_op; /* method_call Op if running a method */ | 113 | union acpi_parse_object *method_call_op; /* method_call Op if running a method */ |
@@ -191,16 +190,10 @@ struct acpi_evaluate_info { | |||
191 | union acpi_operand_object *return_object; | 190 | union acpi_operand_object *return_object; |
192 | u8 param_count; | 191 | u8 param_count; |
193 | u8 pass_number; | 192 | u8 pass_number; |
194 | u8 parameter_type; | ||
195 | u8 return_object_type; | 193 | u8 return_object_type; |
196 | u8 flags; | 194 | u8 flags; |
197 | }; | 195 | }; |
198 | 196 | ||
199 | /* Types for parameter_type above */ | ||
200 | |||
201 | #define ACPI_PARAM_ARGS 0 | ||
202 | #define ACPI_PARAM_GPE 1 | ||
203 | |||
204 | /* Values for Flags above */ | 197 | /* Values for Flags above */ |
205 | 198 | ||
206 | #define ACPI_IGNORE_RETURN_VALUE 1 | 199 | #define ACPI_IGNORE_RETURN_VALUE 1 |