summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Moore <Robert.Moore@intel.com>2013-02-06 10:37:37 -0800
committerRobert Moore <Robert.Moore@intel.com>2013-02-06 10:37:37 -0800
commit531315ec8280dd2fcf12aa9572b7414a62a115b1 (patch)
tree1a780964feb269a15764f0236b01a297872ea03f
parent41a78571bae8e6a83d0f865eea34e7aadc5e8285 (diff)
Return object repair: Add resource template repairs.
Fixes several possible problems with resource templates returned by _CRS/_PRS/_DMA predefined names. Lv Zheng.
-rw-r--r--source/components/namespace/nsconvert.c84
-rw-r--r--source/components/namespace/nsrepair.c12
-rw-r--r--source/include/acnamesp.h5
3 files changed, 101 insertions, 0 deletions
diff --git a/source/components/namespace/nsconvert.c b/source/components/namespace/nsconvert.c
index d1ac4ac2e..fa6c36cc5 100644
--- a/source/components/namespace/nsconvert.c
+++ b/source/components/namespace/nsconvert.c
@@ -467,3 +467,87 @@ AcpiNsConvertToUnicode (
*ReturnObject = NewObject;
return (AE_OK);
}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsConvertToResource
+ *
+ * PARAMETERS: OriginalObject - Object to be converted
+ * ReturnObject - Where the new converted object is returned
+ *
+ * RETURN: Status. AE_OK if conversion was successful
+ *
+ * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate
+ * Buffer.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsConvertToResource (
+ ACPI_OPERAND_OBJECT *OriginalObject,
+ ACPI_OPERAND_OBJECT **ReturnObject)
+{
+ ACPI_OPERAND_OBJECT *NewObject;
+ UINT8 *Buffer;
+
+
+ /*
+ * We can fix the following cases for an expected resource template:
+ * 1. No return value (interpreter slack mode is disabled)
+ * 2. A "Return (Zero)" statement
+ * 3. A "Return empty buffer" statement
+ *
+ * We will return a buffer containing a single EndTag
+ * resource descriptor.
+ */
+ if (OriginalObject)
+ {
+ switch (OriginalObject->Common.Type)
+ {
+ case ACPI_TYPE_INTEGER:
+
+ /* We can only repair an Integer==0 */
+
+ if (OriginalObject->Integer.Value)
+ {
+ return (AE_AML_OPERAND_TYPE);
+ }
+ break;
+
+ case ACPI_TYPE_BUFFER:
+
+ if (OriginalObject->Buffer.Length)
+ {
+ /* Additional checks can be added in the future */
+
+ *ReturnObject = NULL;
+ return (AE_OK);
+ }
+ break;
+
+ case ACPI_TYPE_STRING:
+ default:
+
+ return (AE_AML_OPERAND_TYPE);
+ }
+ }
+
+ /* Create the new buffer object for the resource descriptor */
+
+ NewObject = AcpiUtCreateBufferObject (2);
+ if (!NewObject)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer);
+
+ /* Initialize the Buffer with a single EndTag descriptor */
+
+ Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE);
+ Buffer[1] = 0x00;
+
+ *ReturnObject = NewObject;
+ return (AE_OK);
+}
diff --git a/source/components/namespace/nsrepair.c b/source/components/namespace/nsrepair.c
index 8412be556..a4b0cbea1 100644
--- a/source/components/namespace/nsrepair.c
+++ b/source/components/namespace/nsrepair.c
@@ -176,6 +176,18 @@ AcpiNsMatchSimpleRepair (
*/
static const ACPI_SIMPLE_REPAIR_INFO AcpiObjectRepairInfo[] =
{
+ /* Resource descriptor conversions */
+
+ { "_CRS", ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER | ACPI_RTYPE_NONE,
+ ACPI_NOT_PACKAGE_ELEMENT,
+ AcpiNsConvertToResource },
+ { "_DMA", ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER | ACPI_RTYPE_NONE,
+ ACPI_NOT_PACKAGE_ELEMENT,
+ AcpiNsConvertToResource },
+ { "_PRS", ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER | ACPI_RTYPE_NONE,
+ ACPI_NOT_PACKAGE_ELEMENT,
+ AcpiNsConvertToResource },
+
/* Unicode conversions */
{ "_MLS", ACPI_RTYPE_STRING, 1,
diff --git a/source/include/acnamesp.h b/source/include/acnamesp.h
index 48170d8f7..f49c65fa4 100644
--- a/source/include/acnamesp.h
+++ b/source/include/acnamesp.h
@@ -298,6 +298,11 @@ AcpiNsConvertToUnicode (
ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject);
+ACPI_STATUS
+AcpiNsConvertToResource (
+ ACPI_OPERAND_OBJECT *OriginalObject,
+ ACPI_OPERAND_OBJECT **ReturnObject);
+
/*
* nsdump - Namespace dump/print utilities