[PATCH] dmicheck: checks (Extended) Maximum Capacity for type 16

Alex Hung alex.hung at canonical.com
Wed Sep 5 01:27:37 UTC 2018


Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 src/dmi/dmicheck/dmicheck.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/src/dmi/dmicheck/dmicheck.c b/src/dmi/dmicheck/dmicheck.c
index 97305eca..cc8c2f46 100644
--- a/src/dmi/dmicheck/dmicheck.c
+++ b/src/dmi/dmicheck/dmicheck.c
@@ -52,6 +52,7 @@
 #define DMI_MGMT_CTRL_HOST_TYPE		"DMIMgmtCtrlHostType"
 #define DMI_INVALID_ENTRY_LENGTH	"DMIInvalidEntryLength"
 #define DMI_INVALID_HARDWARE_ENTRY	"DMIInvalidHardwareEntry"
+#define DMI_INVALID_MEMORY_ENTRY	"DMIInvalidMemoryEntry"
 #define DMI_RESERVED_VALUE_USED		"DMIReservedValueUsed"
 #define DMI_RESERVED_BIT_USED		"DMIReservedBitUsed"
 #define DMI_RESERVED_OFFSET_NONZERO	"DMIReservedOffsetNonZero"
@@ -846,6 +847,28 @@ static void dmi_reserved_uint8_check(fwts_framework *fw,
 	}
 }
 
+static void dmi_min_max_uint32_check(fwts_framework *fw,
+	const char *table,
+	uint32_t addr,
+	const char *field,
+	const fwts_dmi_header *hdr,
+	uint8_t offset,
+	uint32_t min,
+	uint32_t max)
+{
+	uint32_t val = GET_UINT32((hdr->data) + offset);
+	if ((val < min) || (val > max)) {
+		fwts_failed(fw, LOG_LEVEL_HIGH,
+			DMI_VALUE_OUT_OF_RANGE,
+			"Out of range value 0x%4.4" PRIx32
+			" (range allowed 0x%4.4" PRIx32 "..0x%4.4" PRIx32 ") "
+			"while accessing entry '%s' @ 0x%8.8" PRIx32
+			", field '%s', offset 0x%2.2" PRIx8,
+			val, min, max, table, addr, field, offset);
+		dmi_out_of_range_advice(fw, hdr->type, offset);
+	}
+}
+
 static void dmi_min_max_uint16_check(fwts_framework *fw,
 	const char *table,
 	uint32_t addr,
@@ -1459,6 +1482,13 @@ static void dmicheck_entry(fwts_framework *fw,
 					data[0x4], table, addr, "Location", 0x4);
 			dmi_min_max_uint8_check(fw, table, addr, "Use", hdr, 0x5, 0x1, 0x7);
 			dmi_min_max_uint8_check(fw, table, addr, "Error Corrrection Type", hdr, 0x6, 0x1, 0x7);
+			dmi_min_max_uint32_check(fw, table, addr, "Maximum Capacity", hdr, 0x7, 0, 0x80000000 - 1);
+			if (hdr->length < 0x17)
+				break;
+			if (GET_UINT64(data + 0xf) != 0 && GET_UINT32(data + 0x7) != 0x80000000)
+				fwts_failed(fw, LOG_LEVEL_HIGH, DMI_INVALID_MEMORY_ENTRY,
+					"An illegal value 0x%16.16" PRIx64 " for entry '%s' "
+					"@ 0x%8.8" PRIx32, GET_UINT64(data + 0xf), table, addr);
 			break;
 
 		case 17: /* 7.18 */
-- 
2.17.1




More information about the fwts-devel mailing list