Commit 27526993 authored by Bob Moore's avatar Bob Moore Committed by Len Brown

ACPICA: Add repair for bad _BIF/_BIX packages

Add a repair for the "Oem Information" field which is often
mistakenly returned as an integer. It should always be a string.
ACPICA BZ 807.

http://www.acpica.org/bugzilla/show_bug.cgi?id=807Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 648f4e3e
...@@ -77,6 +77,11 @@ acpi_ns_repair_object(struct acpi_predefined_data *data, ...@@ -77,6 +77,11 @@ acpi_ns_repair_object(struct acpi_predefined_data *data,
union acpi_operand_object *new_object; union acpi_operand_object *new_object;
acpi_size length; acpi_size length;
/*
* At this point, we know that the type of the returned object was not
* one of the expected types for this predefined name. Attempt to
* repair the object. Only a limited number of repairs are possible.
*/
switch (return_object->common.type) { switch (return_object->common.type) {
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
...@@ -111,43 +116,77 @@ acpi_ns_repair_object(struct acpi_predefined_data *data, ...@@ -111,43 +116,77 @@ acpi_ns_repair_object(struct acpi_predefined_data *data,
*/ */
ACPI_MEMCPY(new_object->string.pointer, ACPI_MEMCPY(new_object->string.pointer,
return_object->buffer.pointer, length); return_object->buffer.pointer, length);
break;
/* case ACPI_TYPE_INTEGER:
* If the original object is a package element, we need to:
* 1. Set the reference count of the new object to match the /* Does the method/object legally return a string? */
* reference count of the old object.
* 2. Decrement the reference count of the original object.
*/
if (package_index != ACPI_NOT_PACKAGE_ELEMENT) {
new_object->common.reference_count =
return_object->common.reference_count;
if (return_object->common.reference_count > 1) { if (expected_btypes & ACPI_RTYPE_STRING) {
return_object->common.reference_count--; /*
* The only supported Integer-to-String conversion is to convert
* an integer of value 0 to a NULL string. The last element of
* _BIF and _BIX packages occasionally need this fix.
*/
if (return_object->integer.value != 0) {
return (AE_AML_OPERAND_TYPE);
} }
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, /* Allocate a new NULL string object */
data->node_flags,
"Converted Buffer to expected String at index %u", new_object = acpi_ut_create_string_object(0);
package_index)); if (!new_object) {
return (AE_NO_MEMORY);
}
} else { } else {
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, return (AE_AML_OPERAND_TYPE);
data->node_flags,
"Converted Buffer to expected String"));
} }
break;
/* Delete old object, install the new return object */ default:
acpi_ut_remove_reference(return_object); /* We cannot repair this object */
*return_object_ptr = new_object;
data->flags |= ACPI_OBJECT_REPAIRED;
return (AE_OK);
default: return (AE_AML_OPERAND_TYPE);
break; }
/* Object was successfully repaired */
/*
* If the original object is a package element, we need to:
* 1. Set the reference count of the new object to match the
* reference count of the old object.
* 2. Decrement the reference count of the original object.
*/
if (package_index != ACPI_NOT_PACKAGE_ELEMENT) {
new_object->common.reference_count =
return_object->common.reference_count;
if (return_object->common.reference_count > 1) {
return_object->common.reference_count--;
}
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
"Converted %s to expected %s at index %u",
acpi_ut_get_object_type_name
(return_object),
acpi_ut_get_object_type_name(new_object),
package_index));
} else {
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
"Converted %s to expected %s",
acpi_ut_get_object_type_name
(return_object),
acpi_ut_get_object_type_name
(new_object)));
} }
return (AE_AML_OPERAND_TYPE); /* Delete old object, install the new return object */
acpi_ut_remove_reference(return_object);
*return_object_ptr = new_object;
data->flags |= ACPI_OBJECT_REPAIRED;
return (AE_OK);
} }
/******************************************************************************* /*******************************************************************************
......
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