diff options
author | Michael Corcoran <Michael.Corcoran@Sun.COM> | 2009-09-28 21:34:36 -0700 |
---|---|---|
committer | Michael Corcoran <Michael.Corcoran@Sun.COM> | 2009-09-28 21:34:36 -0700 |
commit | 3b17bf656ccff642e3bb47eab92a32f02dff5e97 (patch) | |
tree | 78c5a42f37a4cea40620307eb88c6a5d589f8a65 /usr/src | |
parent | caf05df5c10c960028f122b1b02a3f7d8f892c31 (diff) | |
download | illumos-gate-3b17bf656ccff642e3bb47eab92a32f02dff5e97.tar.gz |
6885533 error in handling the return value of ACPI _MAT method
Contributed by Gerry Liu <jiang.liu@intel.com>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/i86pc/io/acpi/acpidev/acpidev_util.c | 21 | ||||
-rw-r--r-- | usr/src/uts/i86pc/sys/acpidev.h | 2 |
2 files changed, 15 insertions, 8 deletions
diff --git a/usr/src/uts/i86pc/io/acpi/acpidev/acpidev_util.c b/usr/src/uts/i86pc/io/acpi/acpidev/acpidev_util.c index 7c4c0c7323..beac0f523b 100644 --- a/usr/src/uts/i86pc/io/acpi/acpidev/acpidev_util.c +++ b/usr/src/uts/i86pc/io/acpi/acpidev/acpidev_util.c @@ -232,6 +232,7 @@ acpidev_walk_apic(ACPI_BUFFER *bufp, ACPI_HANDLE hdl, char *method, 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 @@ acpidev_walk_apic(ACPI_BUFFER *bufp, ACPI_HANDLE hdl, char *method, } 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); diff --git a/usr/src/uts/i86pc/sys/acpidev.h b/usr/src/uts/i86pc/sys/acpidev.h index c3cac2cb4b..e0fbaa4999 100644 --- a/usr/src/uts/i86pc/sys/acpidev.h +++ b/usr/src/uts/i86pc/sys/acpidev.h @@ -79,7 +79,7 @@ extern "C" { #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. */ |