mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
ACPICA: Add a mechanism to escape infinite AML While() loops
Add a loop counter to force exit from AML While loops if the count becomes too large. 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. The maximum loop count is configurable. A new exception code is returned when a loop is broken, AE_AML_INFINITE_LOOP. Bob Moore, Alexey Starikovskiy. Signed-off-by: Bob Moore <[email protected]> Signed-off-by: Lin Ming <[email protected]> Signed-off-by: Len Brown <[email protected]>
This commit is contained in:
parent
96411a6304
commit
fc37445733
4 changed files with 29 additions and 4 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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[] = {
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue