changeset 10681:39bfab5e595b

6885533 error in handling the return value of ACPI _MAT method Contributed by Gerry Liu <jiang.liu@intel.com>
author Michael Corcoran <Michael.Corcoran@Sun.COM>
date Mon, 28 Sep 2009 21:34:36 -0700
parents 45bda3640f27
children 4c75f60a2704
files usr/src/uts/i86pc/io/acpi/acpidev/acpidev_util.c usr/src/uts/i86pc/sys/acpidev.h
diffstat 2 files changed, 15 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/i86pc/io/acpi/acpidev/acpidev_util.c	Tue Sep 29 12:12:23 2009 +0800
+++ b/usr/src/uts/i86pc/io/acpi/acpidev/acpidev_util.c	Mon Sep 28 21:34:36 2009 -0700
@@ -232,6 +232,7 @@
 	ACPI_STATUS rc;
 	ssize_t len;
 	ACPI_BUFFER buf;
+	ACPI_OBJECT *obj;
 	ACPI_SUBTABLE_HEADER *ap;
 	ACPI_TABLE_MADT *mp = NULL;
 
@@ -252,17 +253,23 @@
 	} else if (method != NULL) {
 		/*
 		 * Otherwise, if we have an evaluate method, we get the walk
-		 * buffer from a successful invocation of AcpiEvaluateObject.
+		 * buffer from a successful invocation of
+		 * AcpiEvaluateObjectTyped().
 		 */
 		ASSERT(hdl != NULL);
-		rc = AcpiEvaluateObject(hdl, method, NULL, &buf);
-		if (ACPI_FAILURE(rc) && rc != AE_NOT_FOUND) {
-			cmn_err(CE_WARN, "!acpidev: failed to evaluate %s "
-			    "in acpidev_walk_apic().", method);
+		rc = AcpiEvaluateObjectTyped(hdl, method, NULL, &buf,
+		    ACPI_TYPE_BUFFER);
+		if (ACPI_SUCCESS(rc)) {
+			ASSERT(buf.Length >= sizeof (*obj));
+			obj = buf.Pointer;
+			ap = (ACPI_SUBTABLE_HEADER *)obj->Buffer.Pointer;
+			len = obj->Buffer.Length;
+		} else {
+			if (rc != AE_NOT_FOUND)
+				cmn_err(CE_WARN, "!acpidev: failed to evaluate "
+				    "%s in acpidev_walk_apic().", method);
 			return (rc);
 		}
-		ap = (ACPI_SUBTABLE_HEADER *)buf.Pointer;
-		len = buf.Length;
 	} else {
 		/* As a last resort, walk the MADT table. */
 		rc = AcpiGetTable(ACPI_SIG_MADT, 1, (ACPI_TABLE_HEADER **)&mp);
--- a/usr/src/uts/i86pc/sys/acpidev.h	Tue Sep 29 12:12:23 2009 +0800
+++ b/usr/src/uts/i86pc/sys/acpidev.h	Mon Sep 28 21:34:36 2009 -0700
@@ -79,7 +79,7 @@
 #define	ACPIDEV_TYPE_SCOPE		"acpiscope"
 #define	ACPIDEV_TYPE_DEVICE		"acpidevice"
 #define	ACPIDEV_TYPE_CONTAINER		"acpicontainer"
-#define	ACPIDEV_TYPE_CPU		"cpu"
+#define	ACPIDEV_TYPE_CPU		"acpicpu"
 #define	ACPIDEV_TYPE_MEMORY		"acpimemory"
 
 /* Device property names for ACPI objects. */