ACK: [PATCH][V2] dmi: dmicheck: add a function to verify reserved bits

ivanhu ivan.hu at canonical.com
Tue May 23 07:02:15 UTC 2017



On 05/12/2017 04:27 AM, Alex Hung wrote:
> dmi_reserved_bits_check is a new helper function to verify
> reserved bits. This patch also replaces previously added
> checks in type 0, 4 and 7.
>
> Signed-off-by: Alex Hung <alex.hung at canonical.com>
> ---
>   src/dmi/dmicheck/dmicheck.c | 95 ++++++++++++++++++++++++++++-----------------
>   1 file changed, 60 insertions(+), 35 deletions(-)
>
> diff --git a/src/dmi/dmicheck/dmicheck.c b/src/dmi/dmicheck/dmicheck.c
> index 663586b..9db7bdb 100644
> --- a/src/dmi/dmicheck/dmicheck.c
> +++ b/src/dmi/dmicheck/dmicheck.c
> @@ -53,6 +53,7 @@
>   #define DMI_INVALID_ENTRY_LENGTH	"DMIInvalidEntryLength"
>   #define DMI_INVALID_HARDWARE_ENTRY	"DMIInvalidHardwareEntry"
>   #define DMI_RESERVED_VALUE_USED		"DMIReservedValueUsed"
> +#define DMI_RESERVED_BIT_USED		"DMIReservedBitUsed"
>   
>   #define GET_UINT16(x) (uint16_t)(*(const uint16_t *)(x))
>   #define GET_UINT32(x) (uint32_t)(*(const uint32_t *)(x))
> @@ -789,6 +790,58 @@ static void dmi_out_of_range_advice(fwts_framework *fw, uint8_t type, uint8_t of
>   			"problems.");
>   }
>   
> +static void dmi_reserved_bits_check(fwts_framework *fw,
> +	const char *table,
> +	uint32_t addr,
> +	const char *field,
> +	const fwts_dmi_header *hdr,
> +	size_t size,
> +	uint8_t offset,
> +	uint8_t min,
> +	uint8_t max)
> +{
> +	uint32_t mask = 0;
> +	uint32_t val;
> +	uint8_t i;
> +
> +	for (i = min; i <= max; i++) {
> +		mask |= (1 << i);
> +	}
> +
> +	switch (size) {
> +	case sizeof(uint8_t):
> +		val = hdr->data[offset];
> +		if (val & mask) {
> +			fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_RESERVED_BIT_USED,
> +				"Value 0x%2.2" PRIx8 " was used but bits %" PRIu8
> +				"..%" PRIu8 " should be reserved while accessing entry "
> +				"'%s' @ 0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
> +				(uint8_t)val, min, max, table, addr, field, offset);
> +		}
> +		break;
> +	case sizeof(uint16_t):
> +		val = GET_UINT16((hdr->data) + offset);
> +		if (val & mask) {
> +			fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_RESERVED_BIT_USED,
> +				"Value 0x%4.4" PRIx16 " was used but bits %" PRIu8
> +				"..%" PRIu8 " should be reserved while accessing entry "
> +				"'%s' @ 0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
> +				(uint16_t)val, min, max, table, addr, field, offset);
> +		}
> +		break;
> +	case sizeof(uint32_t):
> +		val = GET_UINT32((hdr->data) + offset);
> +		if (val & mask) {
> +			fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_RESERVED_BIT_USED,
> +				"Value 0x%8.8" PRIx32 " was used but bits %" PRIu8
> +				"..%" PRIu8 " should be reserved while accessing entry "
> +				"'%s' @ 0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
> +				val, min, max, table, addr, field, offset);
> +		}
> +		break;
> +	}
> +}
> +
>   static void dmi_min_max_uint8_check(fwts_framework *fw,
>   	const char *table,
>   	uint32_t addr,
> @@ -1003,23 +1056,12 @@ static void dmicheck_entry(fwts_framework *fw,
>   			dmi_str_check(fw, table, addr, "Release Date", hdr, 0x8);
>   			if (hdr->length < 0x18)
>   				break;
> -			if (hdr->data[0x13] & 0xe0)
> -				fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_RESERVED_VALUE_USED,
> -					"Reserved bits 0x%2.2" PRIx8 " was used and "
> -					"bits 5..7 sould be reserved while accessing entry '%s' @ "
> -					"0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
> -					hdr->data[0x13], table, addr,
> -					"BIOS Characteristics Extension Byte 2", 0x13);
> +			dmi_reserved_bits_check(fw, table, addr, "BIOS Characteristics Extension Byte 2", hdr, sizeof(uint8_t), 0x13, 5, 7);
> +
>   			/* new fields in spec 3.11 */
>   			if (hdr->length < 0x1a)
>   				break;
> -			if (GET_UINT16(data + 0x18) & 0x7fff)
> -				fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_RESERVED_VALUE_USED,
> -					"Reserved bits 0x%4.4" PRIx16 " was used and "
> -					"bits 14..15 sould be reserved while accessing entry '%s' @ "
> -					"0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
> -					GET_UINT16(data + 0x18), table, addr,
> -					"BIOS Characteristics Extension Byte 2", 0x18);
> +			dmi_reserved_bits_check(fw, table, addr, "Extended BIOS ROM Size", hdr, sizeof(uint16_t), 0x18, 14, 15);
>   			break;
>   
>   		case 1: /* 7.2 */
> @@ -1132,13 +1174,7 @@ static void dmicheck_entry(fwts_framework *fw,
>   			dmi_str_check(fw, table, addr, "Part Number", hdr, 0x22);
>   			if (hdr->length < 0x28)
>   				break;
> -			if (GET_UINT16(data + 0x26) & 0xff00)
> -				fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_RESERVED_VALUE_USED,
> -					"Reserved bits 0x%4.4" PRIx16 " was used"
> -					"bits 8..15 would be reserved while accessing entry '%s' @ "
> -					"0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
> -					GET_UINT16(data + 0x26),
> -					table, addr, "Processor Characteristics", 0x26);
> +			dmi_reserved_bits_check(fw, table, addr, "Processor Characteristics", hdr, sizeof(uint16_t), 0x26, 8, 15);
>   			break;
>   
>   		case 5: /* 7.6 (Type 5 is obsolete) */
> @@ -1170,20 +1206,9 @@ static void dmicheck_entry(fwts_framework *fw,
>   					"0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
>   					GET_UINT16(data + 0x05),
>   					table, addr, "Cache Location", 0x5);
> -			if (GET_UINT16(data + 0x05) >> 10)
> -				fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_RESERVED_VALUE_USED,
> -					"Reserved bits 0x%4.4" PRIx16 " was used and "
> -					"bits 10..15 should be reserved while accessing entry '%s' @ "
> -					"0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
> -					GET_UINT16(data + 0x05),
> -					table, addr, "Cache Location", 0x5);
> -			if (GET_UINT16(data + 0x0d) >> 7)
> -				fwts_failed(fw, LOG_LEVEL_MEDIUM, DMI_RESERVED_VALUE_USED,
> -					"Reserved bits 0x%4.4" PRIx16 " was used and "
> -					"bits 7..15 should be reserved while accessing entry '%s' @ "
> -					"0x%8.8" PRIx32 ", field '%s', offset 0x%2.2x",
> -					GET_UINT16(data + 0x0d),
> -					table, addr, "Current SRAM Type", 0x0d);
> +
> +			dmi_reserved_bits_check(fw, table, addr, "Cache Location", hdr, sizeof(uint16_t), 0x05, 10, 15);
> +			dmi_reserved_bits_check(fw, table, addr, "Current SRAM Type", hdr, sizeof(uint16_t), 0x0d, 7, 15);
>   			if (hdr->length < 0x13)
>   				break;
>   			dmi_min_max_uint8_check(fw, table, addr, "Error Correction Type", hdr, 0x10, 0x1, 0x6);

Acked-by: Ivan Hu <ivan.hu at canonical.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/fwts-devel/attachments/20170523/a6b81fe9/attachment-0001.html>


More information about the fwts-devel mailing list