From 6eecb76ca54c58538fae0d7f97336fd2b12edc53 Mon Sep 17 00:00:00 2001 From: Erwan Velu Date: Tue, 17 Sep 2019 17:35:46 +0200 Subject: [PATCH 1/2] dmidecode: Adding bios-revision in -s mode Some hardware vendors like HPe use the Version field to store the bios generation like (U30, U32, A40, ...). If you want to get the "release" version of this bios generation, the bios revision field must be considered. A typical output of this kind of server looks like : BIOS Information Vendor: HPE Version: A40 Release Date: 07/20/2019 [...] BIOS Revision: 2.0 Firmware Revision: 1.45 This patch add a "bios-revision" option and rework the way this field is reported. Signed-off-by: Erwan Velu --- dmidecode.c | 16 +++++++++++++--- dmiopt.c | 1 + man/dmidecode.8 | 1 + 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/dmidecode.c b/dmidecode.c index cff7d3f1941d..7cdcce93df4e 100644 --- a/dmidecode.c +++ b/dmidecode.c @@ -311,6 +311,15 @@ static void dmi_bios_runtime_size(u32 code) printf(" %u kB", code >> 10); } +static void dmi_bios_revision(u8 major, u8 minor) +{ + if (major != 0xFF && minor != 0xFF) { + if (!(opt.flags & FLAG_QUIET)) + printf("\tBIOS Revision: "); + printf("%u.%u\n", major, minor); + } +} + static void dmi_bios_rom_size(u8 code1, u16 code2) { static const char *unit[4] = { @@ -3878,9 +3887,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver) if (h->length < 0x14) break; dmi_bios_characteristics_x2(data[0x13], "\t\t"); if (h->length < 0x18) break; - if (data[0x14] != 0xFF && data[0x15] != 0xFF) - printf("\tBIOS Revision: %u.%u\n", - data[0x14], data[0x15]); + dmi_bios_revision(data[0x14], data[0x15]); if (data[0x16] != 0xFF && data[0x17] != 0xFF) printf("\tFirmware Revision: %u.%u\n", data[0x16], data[0x17]); @@ -5082,6 +5089,9 @@ static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver key = (opt.string->type << 8) | offset; switch (key) { + case 0x14: + dmi_bios_revision(data[offset], data[offset+1]); + break; case 0x108: dmi_system_uuid(data + offset, ver); printf("\n"); diff --git a/dmiopt.c b/dmiopt.c index 2f285f34a96b..cefe27d4554a 100644 --- a/dmiopt.c +++ b/dmiopt.c @@ -151,6 +151,7 @@ static const struct string_keyword opt_string_keyword[] = { { "bios-vendor", 0, 0x04 }, { "bios-version", 0, 0x05 }, { "bios-release-date", 0, 0x08 }, + { "bios-revision", 0, 0x14 }, { "system-manufacturer", 1, 0x04 }, { "system-product-name", 1, 0x05 }, { "system-version", 1, 0x06 }, diff --git a/man/dmidecode.8 b/man/dmidecode.8 index 1f6529d99e91..c3f87132d14c 100644 --- a/man/dmidecode.8 +++ b/man/dmidecode.8 @@ -74,6 +74,7 @@ displayed. Meta-data and handle references are hidden. Only display the value of the \s-1DMI\s0 string identified by \fBKEYWORD\fR. \fBKEYWORD\fR must be a keyword from the following list: \fBbios-vendor\fR, \fBbios-version\fR, \fBbios-release-date\fR, +\fBbios-revision\fR, \fBsystem-manufacturer\fR, \fBsystem-product-name\fR, \fBsystem-version\fR, \fBsystem-serial-number\fR, \fBsystem-uuid\fR, \fBsystem-family\fR, -- 2.21.0