Commit 95229334 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'acpica-fixes'

* acpica-fixes:
  ACPICA: Tables: Mechanism to handle late stage acpi_get_table() imbalance
  Revert "ACPICA: Disassembler: Enhance resource descriptor detection"
parents 32c1431e 83848fbe
...@@ -416,9 +416,18 @@ acpi_tb_get_table(struct acpi_table_desc *table_desc, ...@@ -416,9 +416,18 @@ acpi_tb_get_table(struct acpi_table_desc *table_desc,
} }
} }
if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) {
table_desc->validation_count++; table_desc->validation_count++;
if (table_desc->validation_count == 0) {
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) ...@@ -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) {
table_desc->validation_count--;
/*
* 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, ACPI_WARNING((AE_INFO,
"Table %p, Validation count is zero before decrement\n", "Table %p, Validation count underflows\n",
table_desc)); table_desc));
return_VOID; 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, ...@@ -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 { ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment