|
@@ -480,8 +480,8 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|
|
union acpi_operand_object **operand;
|
|
|
struct acpi_namespace_node *node;
|
|
|
union acpi_parse_object *next_op;
|
|
|
- u32 table_index;
|
|
|
struct acpi_table_header *table;
|
|
|
+ u32 table_index;
|
|
|
|
|
|
ACPI_FUNCTION_TRACE_PTR(ds_eval_table_region_operands, op);
|
|
|
|
|
@@ -504,6 +504,8 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|
|
return_ACPI_STATUS(status);
|
|
|
}
|
|
|
|
|
|
+ operand = &walk_state->operands[0];
|
|
|
+
|
|
|
/*
|
|
|
* Resolve the Signature string, oem_id string,
|
|
|
* and oem_table_id string operands
|
|
@@ -511,32 +513,34 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|
|
status = acpi_ex_resolve_operands(op->common.aml_opcode,
|
|
|
ACPI_WALK_OPERANDS, walk_state);
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
- return_ACPI_STATUS(status);
|
|
|
+ goto cleanup;
|
|
|
}
|
|
|
|
|
|
- operand = &walk_state->operands[0];
|
|
|
-
|
|
|
/* Find the ACPI table */
|
|
|
|
|
|
status = acpi_tb_find_table(operand[0]->string.pointer,
|
|
|
operand[1]->string.pointer,
|
|
|
operand[2]->string.pointer, &table_index);
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
- return_ACPI_STATUS(status);
|
|
|
+ if (status == AE_NOT_FOUND) {
|
|
|
+ ACPI_ERROR((AE_INFO,
|
|
|
+ "ACPI Table [%4.4s] OEM:(%s, %s) not found in RSDT/XSDT",
|
|
|
+ operand[0]->string.pointer,
|
|
|
+ operand[1]->string.pointer,
|
|
|
+ operand[2]->string.pointer));
|
|
|
+ }
|
|
|
+ goto cleanup;
|
|
|
}
|
|
|
|
|
|
- acpi_ut_remove_reference(operand[0]);
|
|
|
- acpi_ut_remove_reference(operand[1]);
|
|
|
- acpi_ut_remove_reference(operand[2]);
|
|
|
-
|
|
|
status = acpi_get_table_by_index(table_index, &table);
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
- return_ACPI_STATUS(status);
|
|
|
+ goto cleanup;
|
|
|
}
|
|
|
|
|
|
obj_desc = acpi_ns_get_attached_object(node);
|
|
|
if (!obj_desc) {
|
|
|
- return_ACPI_STATUS(AE_NOT_EXIST);
|
|
|
+ status = AE_NOT_EXIST;
|
|
|
+ goto cleanup;
|
|
|
}
|
|
|
|
|
|
obj_desc->region.address = ACPI_PTR_TO_PHYSADDR(table);
|
|
@@ -551,6 +555,11 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|
|
|
|
|
obj_desc->region.flags |= AOPOBJ_DATA_VALID;
|
|
|
|
|
|
+cleanup:
|
|
|
+ acpi_ut_remove_reference(operand[0]);
|
|
|
+ acpi_ut_remove_reference(operand[1]);
|
|
|
+ acpi_ut_remove_reference(operand[2]);
|
|
|
+
|
|
|
return_ACPI_STATUS(status);
|
|
|
}
|
|
|
|