Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 128023
b: refs/heads/master
c: fc37445
h: refs/heads/master
i:
  128021: 309665c
  128019: 401d093
  128015: ebc3fff
v: v3
  • Loading branch information
Bob Moore authored and Len Brown committed Dec 30, 2008
1 parent 77065cd commit 17ff34b
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 96411a630412f057d365aa1e9de7d23c069d627a
refs/heads/master: fc37445733aeae4fd1a20385850620354263b1d5
24 changes: 21 additions & 3 deletions trunk/drivers/acpi/dispatcher/dsopcode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1262,13 +1262,31 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,

ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", op));

if (walk_state->control_state->common.value) {
control_state = walk_state->control_state;
if (control_state->common.value) {

/* Predicate was true, go back and evaluate it again! */
/* Predicate was true, the body of the loop was just executed */

/*
* This loop counter mechanism allows the interpreter to escape
* possibly infinite loops. This can occur in poorly written AML
* when the hardware does not respond within a while loop and the
* loop does not implement a timeout.
*/
control_state->control.loop_count++;
if (control_state->control.loop_count >
ACPI_MAX_LOOP_ITERATIONS) {
status = AE_AML_INFINITE_LOOP;
break;
}

/*
* Go back and evaluate the predicate and maybe execute the loop
* another time
*/
status = AE_CTRL_PENDING;
walk_state->aml_last_while =
walk_state->control_state->control.aml_predicate_start;
control_state->control.aml_predicate_start;
break;
}

Expand Down
4 changes: 4 additions & 0 deletions trunk/include/acpi/acconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@

#define ACPI_ROOT_TABLE_SIZE_INCREMENT 4

/* Maximum number of While() loop iterations before forced abort */

#define ACPI_MAX_LOOP_ITERATIONS 0xFFFF

/******************************************************************************
*
* ACPI Specification constants (Do not change unless the specification changes)
Expand Down
4 changes: 3 additions & 1 deletion trunk/include/acpi/acexcep.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,9 @@
#define AE_AML_CIRCULAR_REFERENCE (acpi_status) (0x001E | AE_CODE_AML)
#define AE_AML_BAD_RESOURCE_LENGTH (acpi_status) (0x001F | AE_CODE_AML)
#define AE_AML_ILLEGAL_ADDRESS (acpi_status) (0x0020 | AE_CODE_AML)
#define AE_AML_INFINITE_LOOP (acpi_status) (0x0021 | AE_CODE_AML)

#define AE_CODE_AML_MAX 0x0020
#define AE_CODE_AML_MAX 0x0021

/*
* Internal exceptions used for control
Expand Down Expand Up @@ -267,6 +268,7 @@ char const *acpi_gbl_exception_names_aml[] = {
"AE_AML_CIRCULAR_REFERENCE",
"AE_AML_BAD_RESOURCE_LENGTH",
"AE_AML_ILLEGAL_ADDRESS",
"AE_AML_INFINITE_LOOP"
};

char const *acpi_gbl_exception_names_ctrl[] = {
Expand Down
1 change: 1 addition & 0 deletions trunk/include/acpi/aclocal.h
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,7 @@ struct acpi_control_state {
union acpi_parse_object *predicate_op;
u8 *aml_predicate_start; /* Start of if/while predicate */
u8 *package_end; /* End of if/while block */
u32 loop_count; /* While() loop counter */
};

/*
Expand Down

0 comments on commit 17ff34b

Please sign in to comment.