[ACPI] ACPICA 20051216
Implemented optional support to allow unresolved names within ASL Package objects. A null object is inserted in the package when a named reference cannot be located in the current namespace. Enabled via the interpreter slack flag which Linux has enabled by default (acpi=strict to disable slack). This should eliminate AE_NOT_FOUND exceptions seen on machines that contain such code. Implemented an optimization to the initialization sequence that can improve boot time. During ACPI device initialization, the _STA method is now run if and only if the _INI method exists. The _STA method is used to determine if the device is present; An _INI can only be run if _STA returns present, but it is a waste of time to run the _STA method if the _INI does not exist. (Prototype and assistance from Dong Wei) Implemented use of the C99 uintptr_t for the pointer casting macros if it is available in the current compiler. Otherwise, the default (void *) cast is used as before. Fixed some possible memory leaks found within the execution path of the Break, Continue, If, and CreateField operators. (Valery Podrezov) Fixed a problem introduced in the 20051202 release where an exception is generated during method execution if a control method attempts to declare another method. Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
@@ -333,7 +333,6 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
|
||||
|
||||
switch (callback_status) {
|
||||
case AE_CTRL_TERMINATE:
|
||||
|
||||
/*
|
||||
* A control method was terminated via a RETURN statement.
|
||||
* The walk of this method is complete.
|
||||
@@ -346,13 +345,19 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
|
||||
|
||||
parser_state->aml = walk_state->aml_last_while;
|
||||
walk_state->control_state->common.value = FALSE;
|
||||
status = AE_CTRL_BREAK;
|
||||
status = acpi_ds_result_stack_pop(walk_state);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = AE_CTRL_BREAK;
|
||||
}
|
||||
break;
|
||||
|
||||
case AE_CTRL_CONTINUE:
|
||||
|
||||
parser_state->aml = walk_state->aml_last_while;
|
||||
status = AE_CTRL_CONTINUE;
|
||||
status = acpi_ds_result_stack_pop(walk_state);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = AE_CTRL_CONTINUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case AE_CTRL_PENDING:
|
||||
@@ -369,16 +374,18 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
|
||||
#endif
|
||||
|
||||
case AE_CTRL_TRUE:
|
||||
|
||||
/*
|
||||
* Predicate of an IF was true, and we are at the matching ELSE.
|
||||
* Just close out this package
|
||||
*/
|
||||
parser_state->aml = acpi_ps_get_next_package_end(parser_state);
|
||||
status = acpi_ds_result_stack_pop(walk_state);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = AE_CTRL_PENDING;
|
||||
}
|
||||
break;
|
||||
|
||||
case AE_CTRL_FALSE:
|
||||
|
||||
/*
|
||||
* Either an IF/WHILE Predicate was false or we encountered a BREAK
|
||||
* opcode. In both cases, we do not execute the rest of the
|
||||
|
Reference in New Issue
Block a user