[PATCH 2/3] acpi: fadt: use new I/O port helpers to avoid segfaults

Colin King colin.king at canonical.com
Tue Jan 15 12:25:34 UTC 2013


From: Colin Ian King <colin.king at canonical.com>

Use he new I/O port helper functions to avoid any segfaults. We
also add some extra error checking on the ioperm() calls.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/acpi/fadt/fadt.c | 43 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/src/acpi/fadt/fadt.c b/src/acpi/fadt/fadt.c
index d7ee0aa..d18ca4e 100644
--- a/src/acpi/fadt/fadt.c
+++ b/src/acpi/fadt/fadt.c
@@ -54,7 +54,8 @@ static int fadt_init(fwts_framework *fw)
 
 static int fadt_test1(fwts_framework *fw)
 {
-	uint32_t port, width, value;
+	uint32_t port, width, val32;
+	int ret = FWTS_OK;
 
 	/*  Not having a FADT is not a failure */
 	if (fadt_size == 0) {
@@ -94,19 +95,34 @@ static int fadt_test1(fwts_framework *fw)
 
 	switch (width) {
 	case 8:
-		ioperm(port, width/8, 1);
-		value = inb(fadt->pm1a_cnt_blk);
-		ioperm(port, width/8, 0);
+		if (ioperm(port, width/8, 1) < 0)
+			ret = FWTS_ERROR;
+		else {
+			uint8_t val8;
+
+			ret = fwts_inb(port, &val8);
+			val32 = val8;
+			ioperm(port, width/8, 0);
+		}
 		break;
 	case 16:
-		ioperm(port, width/8, 1);
-		value = inw(fadt->pm1a_cnt_blk);
-		ioperm(port, width/8, 0);
+		if (ioperm(port, width/8, 1) < 0)
+			ret = FWTS_ERROR;
+		else {
+			uint16_t val16;
+
+			ret = fwts_inw(port, &val16);
+			val32 = val16;
+			ioperm(port, width/8, 0);
+		}
 		break;
 	case 32:
-		ioperm(port, width/8, 1);
-		value = inl(fadt->pm1a_cnt_blk);
-		ioperm(port, width/8, 0);
+		if (ioperm(port, width/8, 1) < 0)
+			ret = FWTS_ERROR;
+		else {
+			ret = fwts_inl(port, &val32);
+			ioperm(port, width/8, 0);
+		}
 		break;
 	default:
 		fwts_failed(fw, LOG_LEVEL_HIGH, "FADTPM1AInvalidWidth",
@@ -116,7 +132,12 @@ static int fadt_test1(fwts_framework *fw)
 		return FWTS_OK;
 	}
 
-	if (value & 0x01)
+	if (ret != FWTS_OK) {
+		fwts_log_error(fw, "Cannot read FADT PM1A_CNT_BLK port 0x%" PRIx32 ".", port);
+		return FWTS_ERROR;
+	}
+
+	if (val32 & 0x01)
 		fwts_passed(fw, "SCI_EN bit in PM1a Control Register Block is enabled.");
 	else {
 		fwts_failed(fw, LOG_LEVEL_HIGH, "SCI_ENNotEnabled",
-- 
1.8.0




More information about the fwts-devel mailing list