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>
This commit is contained in:
parent
f3454ae810
commit
c91d924e3a
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
||||
/*
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
/*
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue