mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 20:51:44 +00:00
Merge branch 'acpica-fixes'
* acpica-fixes: ACPICA: Tables: Mechanism to handle late stage acpi_get_table() imbalance Revert "ACPICA: Disassembler: Enhance resource descriptor detection"
This commit is contained in:
commit
9522933454
@ -416,9 +416,18 @@ acpi_tb_get_table(struct acpi_table_desc *table_desc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
table_desc->validation_count++;
|
if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) {
|
||||||
if (table_desc->validation_count == 0) {
|
table_desc->validation_count++;
|
||||||
table_desc->validation_count--;
|
|
||||||
|
/*
|
||||||
|
* Detect validation_count overflows to ensure that the warning
|
||||||
|
* message will only be printed once.
|
||||||
|
*/
|
||||||
|
if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) {
|
||||||
|
ACPI_WARNING((AE_INFO,
|
||||||
|
"Table %p, Validation count overflows\n",
|
||||||
|
table_desc));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*out_table = table_desc->pointer;
|
*out_table = table_desc->pointer;
|
||||||
@ -445,13 +454,20 @@ void acpi_tb_put_table(struct acpi_table_desc *table_desc)
|
|||||||
|
|
||||||
ACPI_FUNCTION_TRACE(acpi_tb_put_table);
|
ACPI_FUNCTION_TRACE(acpi_tb_put_table);
|
||||||
|
|
||||||
if (table_desc->validation_count == 0) {
|
if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) {
|
||||||
ACPI_WARNING((AE_INFO,
|
table_desc->validation_count--;
|
||||||
"Table %p, Validation count is zero before decrement\n",
|
|
||||||
table_desc));
|
/*
|
||||||
return_VOID;
|
* Detect validation_count underflows to ensure that the warning
|
||||||
|
* message will only be printed once.
|
||||||
|
*/
|
||||||
|
if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) {
|
||||||
|
ACPI_WARNING((AE_INFO,
|
||||||
|
"Table %p, Validation count underflows\n",
|
||||||
|
table_desc));
|
||||||
|
return_VOID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
table_desc->validation_count--;
|
|
||||||
|
|
||||||
if (table_desc->validation_count == 0) {
|
if (table_desc->validation_count == 0) {
|
||||||
|
|
||||||
|
@ -474,15 +474,6 @@ acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state,
|
|||||||
return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
|
return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The end_tag opcode must be followed by a zero byte.
|
|
||||||
* Although this byte is technically defined to be a checksum,
|
|
||||||
* in practice, all ASL compilers set this byte to zero.
|
|
||||||
*/
|
|
||||||
if (*(aml + 1) != 0) {
|
|
||||||
return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the pointer to the end_tag if requested */
|
/* Return the pointer to the end_tag if requested */
|
||||||
|
|
||||||
if (!user_function) {
|
if (!user_function) {
|
||||||
|
@ -374,6 +374,20 @@ struct acpi_table_desc {
|
|||||||
u16 validation_count;
|
u16 validation_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum value of the validation_count field in struct acpi_table_desc.
|
||||||
|
* When reached, validation_count cannot be changed any more and the table will
|
||||||
|
* be permanently regarded as validated.
|
||||||
|
*
|
||||||
|
* This is to prevent situations in which unbalanced table get/put operations
|
||||||
|
* may cause premature table unmapping in the OS to happen.
|
||||||
|
*
|
||||||
|
* The maximum validation count can be defined to any value, but should be
|
||||||
|
* greater than the maximum number of OS early stage mapping slots to avoid
|
||||||
|
* leaking early stage table mappings to the late stage.
|
||||||
|
*/
|
||||||
|
#define ACPI_MAX_TABLE_VALIDATIONS ACPI_UINT16_MAX
|
||||||
|
|
||||||
/* Masks for Flags field above */
|
/* Masks for Flags field above */
|
||||||
|
|
||||||
#define ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL (0) /* Virtual address, external maintained */
|
#define ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL (0) /* Virtual address, external maintained */
|
||||||
|
Loading…
Reference in New Issue
Block a user