Skip to content

Commit

Permalink
ACPICA: Fix for hang on GPE method invocation
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Bob Moore authored and Andi Kleen committed Jul 16, 2008
1 parent f3454ae commit c91d924
Show file tree
Hide file tree
Showing 10 changed files with 3 additions and 26 deletions.
1 change: 0 additions & 1 deletion drivers/acpi/dispatcher/dsmethod.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,6 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
}

info->parameters = &this_walk_state->operands[0];
info->parameter_type = ACPI_PARAM_ARGS;

status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node,
obj_desc->method.aml_start,
Expand Down
10 changes: 2 additions & 8 deletions drivers/acpi/dispatcher/dswstate.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,14 +615,8 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state,
walk_state->pass_number = pass_number;

if (info) {
if (info->parameter_type == ACPI_PARAM_GPE) {
walk_state->gpe_event_info =
ACPI_CAST_PTR(struct acpi_gpe_event_info,
info->parameters);
} else {
walk_state->params = info->parameters;
walk_state->caller_return_desc = &info->return_object;
}
walk_state->params = info->parameters;
walk_state->caller_return_desc = &info->return_object;
}

status = acpi_ps_init_scope(&walk_state->parser_state, op);
Expand Down
4 changes: 0 additions & 4 deletions drivers/acpi/events/evgpe.c
Original file line number Diff line number Diff line change
Expand Up @@ -565,10 +565,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
*/
info->prefix_node =
local_gpe_event_info.dispatch.method_node;
info->parameters =
ACPI_CAST_PTR(union acpi_operand_object *,
gpe_event_info);
info->parameter_type = ACPI_PARAM_GPE;
info->flags = ACPI_IGNORE_RETURN_VALUE;

status = acpi_ns_evaluate(info);
Expand Down
1 change: 0 additions & 1 deletion drivers/acpi/events/evregion.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
info->prefix_node = region_obj2->extra.method_REG;
info->pathname = NULL;
info->parameters = args;
info->parameter_type = ACPI_PARAM_ARGS;
info->flags = ACPI_IGNORE_RETURN_VALUE;

/*
Expand Down
1 change: 0 additions & 1 deletion drivers/acpi/namespace/nsinit.c
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,6 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
info->prefix_node = device_node;
info->pathname = METHOD_NAME__INI;
info->parameters = NULL;
info->parameter_type = ACPI_PARAM_ARGS;
info->flags = ACPI_IGNORE_RETURN_VALUE;

/*
Expand Down
1 change: 0 additions & 1 deletion drivers/acpi/namespace/nsxfeval.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,6 @@ acpi_evaluate_object(acpi_handle handle,
}

info->pathname = pathname;
info->parameter_type = ACPI_PARAM_ARGS;

/* Convert and validate the device handle */

Expand Down
2 changes: 1 addition & 1 deletion drivers/acpi/parser/psxface.c
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ acpi_ps_update_parameter_list(struct acpi_evaluate_info *info, u16 action)
{
acpi_native_uint i;

if ((info->parameter_type == ACPI_PARAM_ARGS) && (info->parameters)) {
if (info->parameters) {

/* Update reference count for each parameter */

Expand Down
1 change: 0 additions & 1 deletion drivers/acpi/resources/rsutils.c
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,6 @@ acpi_rs_set_srs_method_data(struct acpi_namespace_node *node,
info->prefix_node = node;
info->pathname = METHOD_NAME__SRS;
info->parameters = args;
info->parameter_type = ACPI_PARAM_ARGS;
info->flags = ACPI_IGNORE_RETURN_VALUE;

/*
Expand Down
1 change: 0 additions & 1 deletion drivers/acpi/utilities/uteval.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,6 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,

info->prefix_node = prefix_node;
info->pathname = path;
info->parameter_type = ACPI_PARAM_ARGS;

/* Evaluate the object/method */

Expand Down
7 changes: 0 additions & 7 deletions include/acpi/acstruct.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@ struct acpi_walk_state {
union acpi_operand_object **caller_return_desc;
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_gpe_event_info *gpe_event_info; /* Info for GPE (_Lxx/_Exx methods only */
union acpi_operand_object *implicit_return_obj;
struct acpi_namespace_node *method_call_node; /* Called method Node */
union acpi_parse_object *method_call_op; /* method_call Op if running a method */
Expand Down Expand Up @@ -191,16 +190,10 @@ struct acpi_evaluate_info {
union acpi_operand_object *return_object;
u8 param_count;
u8 pass_number;
u8 parameter_type;
u8 return_object_type;
u8 flags;
};

/* Types for parameter_type above */

#define ACPI_PARAM_ARGS 0
#define ACPI_PARAM_GPE 1

/* Values for Flags above */

#define ACPI_IGNORE_RETURN_VALUE 1
Expand Down

0 comments on commit c91d924

Please sign in to comment.