import dmidecode-3.3-4.el8

This commit is contained in:
CentOS Sources 2022-05-10 03:16:53 -04:00 committed by Stepan Oksanichenko
parent 1ca4e9c552
commit 807cdbf23c
50 changed files with 155 additions and 7239 deletions

View File

@ -1 +1 @@
acf4b5c6e757066453fd06aa9060fceb257849bf SOURCES/dmidecode-3.2.tar.xz
99b8a9deaf0a003083a5a5fadcb8c016e4ebdaa4 SOURCES/dmidecode-3.3.tar.xz

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/dmidecode-3.2.tar.xz
SOURCES/dmidecode-3.3.tar.xz

View File

@ -1,137 +0,0 @@
From 3fa833fd78ff5eb74f9459e061e26e063ed648d5 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 23 Oct 2019 12:44:13 +0200
Subject: [PATCH 1/2] dmidecode: Add enumerated values from SMBIOS 3.3.0
Add all the enumerated values from the SMBIOS 3.3.0 specification
update that was released last month.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Reviewed-by: Jerry Hoemann <jerry.hoemann@hpe.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
dmidecode.c | 44 +++++++++++++++++++++++++++++++++++---------
1 file changed, 35 insertions(+), 9 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index bdf1185dabe9..8e535356de71 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -936,6 +936,10 @@ static const char *dmi_processor_family(const struct dmi_header *h, u16 ver)
{ 0x140, "WinChip" },
{ 0x15E, "DSP" },
{ 0x1F4, "Video Processor" },
+
+ { 0x200, "RV32" },
+ { 0x201, "RV64" },
+ { 0x202, "RV128" },
};
/*
* Note to developers: when adding entries to this list, check if
@@ -1821,6 +1825,9 @@ static const char *dmi_slot_type(u8 code)
"PCI Express Mini 52-pin without bottom-side keep-outs",
"PCI Express Mini 76-pin" /* 0x23 */
};
+ static const char *type_0x30[] = {
+ "CXL FLexbus 1.0" /* 0x30 */
+ };
static const char *type_0xA0[] = {
"PC-98/C20", /* 0xA0 */
"PC-98/C24",
@@ -1844,7 +1851,14 @@ static const char *dmi_slot_type(u8 code)
"PCI Express 3 x2",
"PCI Express 3 x4",
"PCI Express 3 x8",
- "PCI Express 3 x16" /* 0xB6 */
+ "PCI Express 3 x16",
+ out_of_spec, /* 0xB7 */
+ "PCI Express 4",
+ "PCI Express 4 x1",
+ "PCI Express 4 x2",
+ "PCI Express 4 x4",
+ "PCI Express 4 x8",
+ "PCI Express 4 x16" /* 0xBD */
};
/*
* Note to developers: when adding entries to these lists, check if
@@ -1853,7 +1867,9 @@ static const char *dmi_slot_type(u8 code)
if (code >= 0x01 && code <= 0x23)
return type[code - 0x01];
- if (code >= 0xA0 && code <= 0xB6)
+ if (code == 0x30)
+ return type_0x30[code - 0x30];
+ if (code >= 0xA0 && code <= 0xBD)
return type_0xA0[code - 0xA0];
return out_of_spec;
}
@@ -1957,6 +1973,12 @@ static void dmi_slot_id(u8 code1, u8 code2, u8 type, const char *prefix)
case 0xB4: /* PCI Express 3 */
case 0xB5: /* PCI Express 3 */
case 0xB6: /* PCI Express 3 */
+ case 0xB8: /* PCI Express 4 */
+ case 0xB9: /* PCI Express 4 */
+ case 0xBA: /* PCI Express 4 */
+ case 0xBB: /* PCI Express 4 */
+ case 0xBC: /* PCI Express 4 */
+ case 0xBD: /* PCI Express 4 */
printf("%sID: %u\n", prefix, code1);
break;
case 0x07: /* PCMCIA */
@@ -2298,12 +2320,13 @@ static const char *dmi_memory_array_location(u8 code)
"PC-98/C20 Add-on Card", /* 0xA0 */
"PC-98/C24 Add-on Card",
"PC-98/E Add-on Card",
- "PC-98/Local Bus Add-on Card" /* 0xA3 */
+ "PC-98/Local Bus Add-on Card",
+ "CXL Flexbus 1.0" /* 0xA4 */
};
if (code >= 0x01 && code <= 0x0A)
return location[code - 0x01];
- if (code >= 0xA0 && code <= 0xA3)
+ if (code >= 0xA0 && code <= 0xA4)
return location_0xA0[code - 0xA0];
return out_of_spec;
}
@@ -2426,10 +2449,11 @@ static const char *dmi_memory_device_form_factor(u8 code)
"RIMM",
"SODIMM",
"SRIMM",
- "FB-DIMM" /* 0x0F */
+ "FB-DIMM",
+ "Die" /* 0x10 */
};
- if (code >= 0x01 && code <= 0x0F)
+ if (code >= 0x01 && code <= 0x10)
return form_factor[code - 0x01];
return out_of_spec;
}
@@ -2478,10 +2502,12 @@ static const char *dmi_memory_device_type(u8 code)
"LPDDR2",
"LPDDR3",
"LPDDR4",
- "Logical non-volatile device" /* 0x1F */
+ "Logical non-volatile device",
+ "HBM",
+ "HBM2" /* 0x21 */
};
- if (code >= 0x01 && code <= 0x1F)
+ if (code >= 0x01 && code <= 0x21)
return type[code - 0x01];
return out_of_spec;
}
@@ -2537,7 +2563,7 @@ static void dmi_memory_technology(u8 code)
"NVDIMM-N",
"NVDIMM-F",
"NVDIMM-P",
- "Intel persistent memory" /* 0x07 */
+ "Intel Optane DC persistent memory" /* 0x07 */
};
if (code >= 0x01 && code <= 0x07)
printf(" %s", technology[code - 0x01]);
--
2.17.1

View File

@ -1,32 +0,0 @@
From fde47bb227b8fa817c88d7e10a8eb771c46de1df Mon Sep 17 00:00:00 2001
From: Charles Rose <Charles.Rose@dell.com>
Date: Mon, 22 Oct 2018 09:48:02 +0200
Subject: [PATCH 1/5] dmidecode: Fix Redfish Hostname print length
Redfish Hostname prints beyond hlen characters. Fix it.
Signed-off-by: Charles Rose <charles.rose@dell.com>
Fixes: 78539b06117c ("dmidecode: Parse Modern Management Controller blocks")
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
dmidecode.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dmidecode.c b/dmidecode.c
index a3e9d6c16bc2..7ac6438a23db 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -3609,7 +3609,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
hname = out_of_spec;
hlen = strlen(out_of_spec);
}
- printf("%s\t\tRedfish Service Hostname: %*s\n", prefix, hlen, hname);
+ printf("%s\t\tRedfish Service Hostname: %.*s\n", prefix, hlen, hname);
}
/*
--
2.17.1

View File

@ -1,30 +0,0 @@
From 65438a7ec0f4cddccf810136da6f280bd148af71 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 23 Mar 2020 16:47:20 +0100
Subject: [PATCH 01/23] dmidecode: Print type 33 name unconditionally
Even if a type 33 structure is too short, we can still display its
type name as we do for all other structure types.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dmidecode.c b/dmidecode.c
index 8ebd8626d6ea..71c166f0595d 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -4807,8 +4807,8 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 33: /* 7.34 64-bit Memory Error Information */
- if (h->length < 0x1F) break;
printf("64-bit Memory Error Information\n");
+ if (h->length < 0x1F) break;
printf("\tType: %s\n",
dmi_memory_error_type(data[0x04]));
printf("\tGranularity: %s\n",
--
2.17.1

View File

@ -1,42 +0,0 @@
From 91d6ce2d1d2fa6fcedf8e5685bafdb0515317605 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Tue, 29 Jan 2019 14:11:38 +0100
Subject: [PATCH 01/11] dmidecode: Reformat the FILES section of the manual
page
List one file per line and use regular font for comments. This makes
the FILES section a lot more readable.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
man/dmidecode.8 | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/man/dmidecode.8 b/man/dmidecode.8
index df861e18bb43..33f7d33bd5ef 100644
--- a/man/dmidecode.8
+++ b/man/dmidecode.8
@@ -1,4 +1,4 @@
-.TH DMIDECODE 8 "March 2012" "dmidecode"
+.TH DMIDECODE 8 "January 2019" "dmidecode"
.SH NAME
dmidecode \- \s-1DMI\s0 table decoder
.SH SYNOPSIS
@@ -258,8 +258,12 @@ The DMI table is located at offset 0x20.
.SH FILES
.I /dev/mem
-.I /sys/firmware/dmi/tables/smbios_entry_point (Linux only)
-.I /sys/firmware/dmi/tables/DMI (Linux only)
+.br
+.I /sys/firmware/dmi/tables/smbios_entry_point
+(Linux only)
+.br
+.I /sys/firmware/dmi/tables/DMI
+(Linux only)
.SH BUGS
More often than not, information contained in the \s-1DMI\s0 tables is inaccurate,
incomplete or simply wrong.
--
2.17.1

View File

@ -0,0 +1,40 @@
From b289de9deb325eeef7919a1f4e3ac1f93b099c16 Mon Sep 17 00:00:00 2001
From: Prabhakar pujeri <prabhakar.pujeri@gmail.com>
Date: Fri, 23 Oct 2020 17:45:16 +0200
Subject: [PATCH] Add new processor characteristics bits from SMBIOS spec 3.4.0
* The bit to indicate 128-bit capable processor
* The bit to indicate processor supports returning ARM64 SoC ID
Signed-off-by: Coiby Xu <coxu@redhat.com>
---
dmidecode.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 31a49e4..67f6048 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1388,7 +1388,9 @@ static void dmi_processor_characteristics(const char *attr, u16 code)
"Hardware Thread",
"Execute Protection",
"Enhanced Virtualization",
- "Power/Performance Control" /* 7 */
+ "Power/Performance Control",
+ "128-bit Capable"
+ "Arm64 SoC ID" /* 9 */
};
if ((code & 0x00FC) == 0)
@@ -1398,7 +1400,7 @@ static void dmi_processor_characteristics(const char *attr, u16 code)
int i;
pr_list_start(attr, NULL);
- for (i = 2; i <= 7; i++)
+ for (i = 2; i <= 9; i++)
if (code & (1 << i))
pr_list_item("%s", characteristics[i - 2]);
pr_list_end();
--
2.31.1

View File

@ -1,51 +0,0 @@
From 62bce59fed14c1cf57ce6cb7b208a9fccda3f4a5 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 23 Oct 2019 12:44:20 +0200
Subject: [PATCH 2/2] dmidecode: Decode system slot base bus width and peers
SMBIOS version 3.2.0 added extra fields are the end of structure type
9. Decode these extra fields (base data bus width and peers) when
present.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
dmidecode.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/dmidecode.c b/dmidecode.c
index 8e535356de71..8ebd8626d6ea 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -2033,6 +2033,16 @@ static void dmi_slot_segment_bus_func(u16 code1, u8 code2, u8 code3, const char
prefix, code1, code2, code3 >> 3, code3 & 0x7);
}
+static void dmi_slot_peers(u8 n, const u8 *data, const char *prefix)
+{
+ int i;
+
+ for (i = 1; i <= n; i++, data += 5)
+ printf("%sPeer Device %d: %04x:%02x:%02x.%x (Width %u)\n",
+ prefix, i, WORD(data), data[2], data[3] >> 3,
+ data[3] & 0x07, data[4]);
+}
+
/*
* 7.11 On Board Devices Information (Type 10)
*/
@@ -4213,6 +4223,11 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
dmi_slot_characteristics(data[0x0B], data[0x0C], "\t\t");
if (h->length < 0x11) break;
dmi_slot_segment_bus_func(WORD(data + 0x0D), data[0x0F], data[0x10], "\t");
+ if (h->length < 0x13) break;
+ printf("\tData Bus Width: %u\n", data[0x11]);
+ printf("\tPeer Devices: %u\n", data[0x12]);
+ if (h->length - 0x13 >= data[0x12] * 5)
+ dmi_slot_peers(data[0x12], data + 0x13, "\t");
break;
case 10: /* 7.11 On Board Devices Information */
--
2.17.1

View File

@ -1,45 +0,0 @@
From 72fa3909cfabe8822e2b8709e5d324008f55022a Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Tue, 29 Jan 2019 14:11:42 +0100
Subject: [PATCH 02/11] dmidecode: Document how the UUID fields are interpreted
There has always been a lot of confusion about the byte order of UUID
fields. While dmidecode is doing "the right thing", documenting it
can't hurt.
This should address bug #55510:
https://savannah.nongnu.org/bugs/index.php?55510
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
man/dmidecode.8 | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/man/dmidecode.8 b/man/dmidecode.8
index 33f7d33bd5ef..52100a82435e 100644
--- a/man/dmidecode.8
+++ b/man/dmidecode.8
@@ -256,6 +256,20 @@ It is crafted to hard-code the table address at offset 0x20.
.IP \(bu "\w'\(bu'u+1n"
The DMI table is located at offset 0x20.
+.SH UUID FORMAT
+There is some ambiguity about how to interpret the UUID fields prior to SMBIOS
+specification version 2.6. There was no mention of byte swapping, and RFC 4122
+says that no byte swapping should be applied by default. However, SMBIOS
+specification version 2.6 (and later) explicitly states that the first 3 fields
+of the UUID should be read as little-endian numbers (byte-swapped).
+Furthermore, it implies that the same was already true for older versions of
+the specification, even though it was not mentioned. In practice, many hardware
+vendors were not byte-swapping the UUID. So, in order to preserve
+compatibility, it was decided to interpret the UUID fields according to RFC
+4122 (no byte swapping) when the SMBIOS version is older than 2.6, and to
+interpret the first 3 fields as little-endian (byte-swapped) when the SMBIOS
+version is 2.6 or later. The Linux kernel follows the same logic.
+
.SH FILES
.I /dev/mem
.br
--
2.17.1

View File

@ -1,37 +0,0 @@
From 5bb7eb173b72256f70c6b3f3916d7a444be93340 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 23 Mar 2020 16:47:23 +0100
Subject: [PATCH 02/23] dmidecode: Don't choke on invalid processor voltage
If the processor voltage encoding has some of the reserved bits set
and none of the proper bits set, print it as "Unknown" instead of an
empty field.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 71c166f0595d..ef9bbd54b7f8 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1190,13 +1190,13 @@ static void dmi_processor_voltage(u8 code)
if (code & 0x80)
printf(" %.1f V", (float)(code & 0x7f) / 10);
+ else if ((code & 0x07) == 0x00)
+ printf(" Unknown");
else
{
for (i = 0; i <= 2; i++)
if (code & (1 << i))
printf(" %s", voltage[i]);
- if (code == 0x00)
- printf(" Unknown");
}
}
--
2.17.1

View File

@ -1,73 +0,0 @@
From 82497fa02d60757c2cfa645cf89a79abb1435273 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Fri, 16 Nov 2018 11:18:25 +0100
Subject: [PATCH 2/5] dmidecode: Don't use memcpy on /dev/mem on arm64
On arm64, calling memcpy on /dev/mem will cause a bus error if the
start and the end of the buffer are not aligned on a 64-bit boundary.
Using option --no-sysfs triggers this.
Use a slow manual byte-by-byte copy in that case, to prevent the bus
error. This is only a fallback path (at least on Linux) and not
performance-critical anyway, as it is a one-time operation and DMI
tables are usually not too large.
This fixes bug #55026:
https://savannah.nongnu.org/bugs/index.php?55026
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
config.h | 5 +++++
util.c | 14 +++++++++++++-
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/config.h b/config.h
index e39091fde502..423735537fa8 100644
--- a/config.h
+++ b/config.h
@@ -26,4 +26,9 @@
#define ALIGNMENT_WORKAROUND
#endif
+/* Avoid unaligned memcpy on /dev/mem */
+#ifdef __aarch64__
+#define USE_SLOW_MEMCPY
+#endif
+
#endif
diff --git a/util.c b/util.c
index eeffdae8e536..04aaadd5b913 100644
--- a/util.c
+++ b/util.c
@@ -155,6 +155,18 @@ void *read_file(off_t base, size_t *max_len, const char *filename)
return p;
}
+static void safe_memcpy(void *dest, const void *src, size_t n)
+{
+#ifdef USE_SLOW_MEMCPY
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ *((u8 *)dest + i) = *((const u8 *)src + i);
+#else
+ memcpy(dest, src, n);
+#endif
+}
+
/*
* Copy a physical memory chunk into a memory buffer.
* This function allocates memory.
@@ -214,7 +226,7 @@ void *mem_chunk(off_t base, size_t len, const char *devmem)
if (mmp == MAP_FAILED)
goto try_read;
- memcpy(p, (u8 *)mmp + mmoffset, len);
+ safe_memcpy(p, (u8 *)mmp + mmoffset, len);
if (munmap(mmp, mmoffset + len) == -1)
{
--
2.17.1

View File

@ -1,246 +0,0 @@
From ae28cbb12fc80f62230ad06cb44ad0aaaa9e2048 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Tue, 29 Jan 2019 14:11:46 +0100
Subject: [PATCH 03/11] Use comments to separate sections in manual pages
Blank lines are interpreted as actual blank lines in manual pages.
Use comments instead to visually separate sections. Otherwise an
extra blank like is inserted before every section.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
man/biosdecode.8 | 11 ++++++++---
man/dmidecode.8 | 18 +++++++++++-------
man/ownership.8 | 10 +++++++---
man/vpddecode.8 | 12 +++++++-----
4 files changed, 33 insertions(+), 18 deletions(-)
diff --git a/man/biosdecode.8 b/man/biosdecode.8
index a96eb681c136..cf7d4db01249 100644
--- a/man/biosdecode.8
+++ b/man/biosdecode.8
@@ -1,10 +1,12 @@
.TH BIOSDECODE 8 "February 2007" "dmidecode"
+.\"
.SH NAME
biosdecode \- \s-1BIOS\s0 information decoder
+.\"
.SH SYNOPSIS
.B biosdecode
.RB [ OPTIONS ]
-
+.\"
.SH DESCRIPTION
.B biosdecode
parses the \s-1BIOS\s0 memory and prints information about all structures (or
@@ -54,7 +56,7 @@ started its life as a part of
.B dmidecode
but as more entry point types were added, it was moved to a different
program.
-
+.\"
.SH OPTIONS
.TP
.BR "-d" ", " "--dev-mem FILE"
@@ -68,17 +70,20 @@ Display usage information and exit
.TP
.BR "-V" ", " "--version"
Display the version and exit
-
+.\"
.SH FILES
.I /dev/mem
+.\"
.SH BUGS
Most of the time,
.B biosdecode
prints too much information (you don't really care about addresses)
or not enough (because it doesn't follow pointers and has no lookup
tables).
+.\"
.SH AUTHORS
Alan Cox, Jean Delvare
+.\"
.SH "SEE ALSO"
.BR dmidecode (8),
.BR mem (4),
diff --git a/man/dmidecode.8 b/man/dmidecode.8
index 52100a82435e..1f6529d99e91 100644
--- a/man/dmidecode.8
+++ b/man/dmidecode.8
@@ -1,10 +1,12 @@
.TH DMIDECODE 8 "January 2019" "dmidecode"
+.\"
.SH NAME
dmidecode \- \s-1DMI\s0 table decoder
+.\"
.SH SYNOPSIS
.B dmidecode
.RB [ OPTIONS ]
-
+.\"
.SH DESCRIPTION
.B dmidecode
is a tool for dumping a computer's \s-1DMI\s0 (some say \s-1SMBIOS\s0) table
@@ -58,7 +60,7 @@ displayed value.
Decoded values. The information presented of course depends on the type
of record. Here, we learn about the board's manufacturer, model, version
and serial number.
-
+.\"
.SH OPTIONS
.TP
.BR "-d" ", " "--dev-mem FILE"
@@ -158,10 +160,9 @@ is run on a system with BIOS that boasts new SMBIOS specification, which
is not supported by the tool yet, it will print out relevant message in
addition to requested data on the very top of the output. Thus informs the
output data is not reliable.
-
+.\"
.SH "DMI TYPES"
The \s-1SMBIOS\s0 specification defines the following \s-1DMI\s0 types:
-
.TS
r l
__
@@ -246,7 +247,7 @@ dmidecode --type 0,13
dmidecode --type bios
.IP \(bu
dmidecode --type BIOS
-
+.\"
.SH BINARY DUMP FILE FORMAT
The binary dump files generated by --dump-bin and read using --from-dump
are formatted as follows:
@@ -255,7 +256,7 @@ The SMBIOS or DMI entry point is located at offset 0x00.
It is crafted to hard-code the table address at offset 0x20.
.IP \(bu "\w'\(bu'u+1n"
The DMI table is located at offset 0x20.
-
+.\"
.SH UUID FORMAT
There is some ambiguity about how to interpret the UUID fields prior to SMBIOS
specification version 2.6. There was no mention of byte swapping, and RFC 4122
@@ -269,7 +270,7 @@ compatibility, it was decided to interpret the UUID fields according to RFC
4122 (no byte swapping) when the SMBIOS version is older than 2.6, and to
interpret the first 3 fields as little-endian (byte-swapped) when the SMBIOS
version is 2.6 or later. The Linux kernel follows the same logic.
-
+.\"
.SH FILES
.I /dev/mem
.br
@@ -278,11 +279,14 @@ version is 2.6 or later. The Linux kernel follows the same logic.
.br
.I /sys/firmware/dmi/tables/DMI
(Linux only)
+.\"
.SH BUGS
More often than not, information contained in the \s-1DMI\s0 tables is inaccurate,
incomplete or simply wrong.
+.\"
.SH AUTHORS
Alan Cox, Jean Delvare
+.\"
.SH "SEE ALSO"
.BR biosdecode (8),
.BR mem (4),
diff --git a/man/ownership.8 b/man/ownership.8
index f24ef9437e21..71ed78844081 100644
--- a/man/ownership.8
+++ b/man/ownership.8
@@ -1,10 +1,12 @@
.TH OWNERSHIP 8 "February 2005" "dmidecode"
+.\"
.SH NAME
ownership \- Compaq ownership tag retriever
+.\"
.SH SYNOPSIS
.B ownership
.RB [ OPTIONS ]
-
+.\"
.SH DESCRIPTION
.B ownership
retrieves and prints the "ownership tag" that can be set on Compaq
@@ -14,7 +16,7 @@ package,
.B ownership
doesn't print any version information, nor labels, but only the raw
ownership tag. This should help its integration in scripts.
-
+.\"
.SH OPTIONS
.TP
.BR "-d" ", " "--dev-mem FILE"
@@ -25,11 +27,13 @@ Display usage information and exit
.TP
.BR "-V" ", " "--version"
Display the version and exit
-
+.\"
.SH FILES
.I /dev/mem
+.\"
.SH AUTHOR
Jean Delvare
+.\"
.SH "SEE ALSO"
.BR biosdecode (8),
.BR dmidecode (8),
diff --git a/man/vpddecode.8 b/man/vpddecode.8
index c9e4acfd2fb9..1cc2b76ce552 100644
--- a/man/vpddecode.8
+++ b/man/vpddecode.8
@@ -1,10 +1,12 @@
.TH VPDDECODE 8 "February 2007" "dmidecode"
+.\"
.SH NAME
vpddecode \- \s-1VPD\s0 structure decoder
+.\"
.SH SYNOPSIS
.B vpddecode
.RB [ OPTIONS ]
-
+.\"
.SH DESCRIPTION
.B vpddecode
prints the "vital product data" information that can be found in almost
@@ -17,19 +19,17 @@ Box Serial Number
Motherboard Serial Number
.IP \(bu
Machine Type/Model
-
.PP
Some systems have these additional items:
.IP \(bu "\w'\(bu'u+1n"
BIOS Release Date
.IP \(bu
Default Flash Image File Name
-
.PP
Note that these additional items are not documented by IBM, so this is
guess work, and as such should not be blindly trusted. Feedback about
the accuracy of these labels is welcome.
-
+.\"
.SH OPTIONS
.TP
.BR "-d" ", " "--dev-mem FILE"
@@ -62,11 +62,13 @@ Display usage information and exit
.TP
.BR "-V" ", " "--version"
Display the version and exit
-
+.\"
.SH FILES
.I /dev/mem
+.\"
.SH AUTHOR
Jean Delvare
+.\"
.SH "SEE ALSO"
.BR biosdecode (8),
.BR dmidecode (8),
--
2.17.1

View File

@ -1,21 +1,36 @@
From f0ccbbe338b8f400596001372f1c0d7c70094204 Mon Sep 17 00:00:00 2001
From ac6a64496fc99a5cc05ebe4dd7d1b88f60041009 Mon Sep 17 00:00:00 2001
From: Lianbo Jiang <lijiang@redhat.com>
Date: Wed, 9 Dec 2020 21:53:54 +0800
Date: Thu, 10 Dec 2020 11:21:21 +0100
Subject: [PATCH] Missing comma in the dmi_slot_type()
In the initialization of "type", a suspicious concatenated string
"PCI Express Mini 76-pinPCI Express 4 SFF-8639 (U.2)" is produced
due to a missing comma between lines.
[JD: Fixed a similar bug in dmi_processor_characteristics.]
Fixes: b289de9deb32 ("Add new processor characteristics bits from SMBIOS spec 3.4.0")
Fixes: c54348130a2a ("dmidecode: Add new system slot types from SMBIOS spec 3.4.0")
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Coiby Xu <coxu@redhat.com>
---
dmidecode.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
dmidecode.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index ac96395d42c3..f7bd48203409 100644
index ac96395..4c98553 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1389,7 +1389,7 @@ static void dmi_processor_characteristics(const char *attr, u16 code)
"Execute Protection",
"Enhanced Virtualization",
"Power/Performance Control",
- "128-bit Capable"
+ "128-bit Capable",
"Arm64 SoC ID" /* 9 */
};
@@ -1939,7 +1939,7 @@ static const char *dmi_slot_type(u8 code)
"PCI Express 3 SFF-8639 (U.2)",
"PCI Express Mini 52-pin with bottom-side keep-outs",
@ -26,5 +41,5 @@ index ac96395d42c3..f7bd48203409 100644
"PCI Express 5 SFF-8639 (U.2)",
"OCP NIC 3.0 Small Form Factor (SFF)",
--
2.17.1
2.31.1

View File

@ -1,58 +0,0 @@
From 1347ccca96db6e157af39fcc565466fa98b9220b Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 23 Mar 2020 16:47:27 +0100
Subject: [PATCH 03/23] dmidecode: Simplify the formatting of memory error
status
Make the logic more simple so that we always report the status on a
single line.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index ef9bbd54b7f8..5a0631e926c7 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1515,18 +1515,19 @@ static void dmi_memory_module_size(u8 code)
printf(" (Single-bank Connection)");
}
-static void dmi_memory_module_error(u8 code, const char *prefix)
+static void dmi_memory_module_error(u8 code)
{
+ static const char *status[] = {
+ "OK", /* 0x00 */
+ "Uncorrectable Errors",
+ "Correctable Errors",
+ "Correctable and Uncorrectable Errors" /* 0x03 */
+ };
+
if (code & (1 << 2))
printf(" See Event Log\n");
else
- { if ((code & 0x03) == 0)
- printf(" OK\n");
- if (code & (1 << 0))
- printf("%sUncorrectable Errors\n", prefix);
- if (code & (1 << 1))
- printf("%sCorrectable Errors\n", prefix);
- }
+ printf(" %s\n", status[code & 0x03]);
}
/*
@@ -4142,7 +4143,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
dmi_memory_module_size(data[0x0A]);
printf("\n");
printf("\tError Status:");
- dmi_memory_module_error(data[0x0B], "\t\t");
+ dmi_memory_module_error(data[0x0B]);
break;
case 7: /* 7.8 Cache Information */
--
2.17.1

View File

@ -1,54 +0,0 @@
From c43afb47fcbadabe2655fe7863a1e2ea9af1446c Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Tue, 15 Jan 2019 12:59:00 +0100
Subject: [PATCH 3/5] dmidecode: Use the most appropriate unit for cache size
As newer CPUs have larger and larger cache, using kB to represent the
cache size is getting less convenient. Reuse the same function we have
for system memory size so that large units will be used as
appropriate. For example, a cache size reported as "20 MB" looks nicer
than as "20480 kB".
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
dmidecode.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 7ac6438a23db..162e0c50ba26 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1560,17 +1560,22 @@ static void dmi_cache_size(u16 code)
static void dmi_cache_size_2(u32 code)
{
+ u64 size;
+
if (code & 0x80000000)
{
code &= 0x7FFFFFFFLU;
- /* Use a more convenient unit for large cache size */
- if (code >= 0x8000)
- printf(" %u MB", code >> 4);
- else
- printf(" %u kB", code << 6);
+ size.l = code << 6;
+ size.h = code >> 26;
}
else
- printf(" %u kB", code);
+ {
+ size.l = code;
+ size.h = 0;
+ }
+
+ /* Use a more convenient unit for large cache size */
+ dmi_print_memory_size(size, 1);
}
static void dmi_cache_types(u16 code, const char *sep)
--
2.17.1

View File

@ -1,28 +0,0 @@
From 2d7fbeac6c6a9f097dc930e808a4f017f11f3c58 Mon Sep 17 00:00:00 2001
From: Claudio Fontana <claudio.fontana@gliwa.com>
Date: Fri, 19 Apr 2019 10:01:22 +0200
Subject: [PATCH 04/11] dmidecode: Add missing standard include
AF_INET requires sys/socket.h, fixes build on QNX 7.0.
Signed-off-by: Claudio Fontana <claudio.fontana@gliwa.com>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dmidecode.c b/dmidecode.c
index 91c6f622e3d0..21bfd65274c4 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -66,6 +66,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
+#include <sys/socket.h>
#ifdef __FreeBSD__
#include <errno.h>
--
2.17.1

View File

@ -1,28 +0,0 @@
From 557c3c373a9992d45d4358a6a2ccf53b03276f39 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 23 Mar 2020 16:47:30 +0100
Subject: [PATCH 04/23] dmidecode: Fix the alignment of type 25 name
No tabulation needed before DMI structure names.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dmidecode.c b/dmidecode.c
index 5a0631e926c7..b459ed0ff84e 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -4651,7 +4651,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 25: /* 7.26 System Power Controls */
- printf("\tSystem Power Controls\n");
+ printf("System Power Controls\n");
if (h->length < 0x09) break;
printf("\tNext Scheduled Power-on:");
dmi_power_controls_power_on(data + 0x04);
--
2.17.1

View File

@ -1,50 +0,0 @@
From 941591e24564e4c6d6584dbaa868976f9e80e925 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Tue, 15 Jan 2019 12:59:08 +0100
Subject: [PATCH 4/5] dmidecode: Use dmi_cache_size_2 in dmi_cache_size
Redirect dmi_cache_size() to dmi_cache_size_2() so that the cache
size is always reported using the most appropriate unit, even if the
BIOS does not populate the 32-bit cache size fields.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
dmidecode.c | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 162e0c50ba26..903ef356ea9e 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1550,14 +1550,6 @@ static const char *dmi_cache_location(u8 code)
return location[code];
}
-static void dmi_cache_size(u16 code)
-{
- if (code & 0x8000)
- printf(" %u kB", (code & 0x7FFF) << 6);
- else
- printf(" %u kB", code);
-}
-
static void dmi_cache_size_2(u32 code)
{
u64 size;
@@ -1578,6 +1570,11 @@ static void dmi_cache_size_2(u32 code)
dmi_print_memory_size(size, 1);
}
+static void dmi_cache_size(u16 code)
+{
+ dmi_cache_size_2((((u32)code & 0x8000LU) << 16) | (code & 0x7FFFLU));
+}
+
static void dmi_cache_types(u16 code, const char *sep)
{
/* 7.8.2 */
--
2.17.1

View File

@ -1,39 +0,0 @@
From 74dfb854b8199ddb0a27e89296fa565f4706cb9d Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 16 Jan 2019 09:04:55 +0100
Subject: [PATCH 5/5] dmidecode: Add "Logical non-volatile device" to the
memory device types
When adding support for non-volative memory, we forgot to add
"Logical non-volatile device" to the list of memory types. This
causes NVDIMM modules to show up as <OUT OF SPEC>. Fix the problem
by adding the missing enumerated value.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Reviewed-by: Jerry Hoemann <jerry.hoemann@hpe.com>
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
---
dmidecode.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 903ef356ea9e..91c6f622e3d0 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -2471,10 +2471,11 @@ static const char *dmi_memory_device_type(u8 code)
"LPDDR",
"LPDDR2",
"LPDDR3",
- "LPDDR4" /* 0x1E */
+ "LPDDR4",
+ "Logical non-volatile device" /* 0x1F */
};
- if (code >= 0x01 && code <= 0x1E)
+ if (code >= 0x01 && code <= 0x1F)
return type[code - 0x01];
return out_of_spec;
}
--
2.17.1

View File

@ -0,0 +1,34 @@
From b3b4c29f38b29a6ac3779ff97363d42fd3061c4a Mon Sep 17 00:00:00 2001
From: Prabhakar pujeri <prabhakar.pujeri@gmail.com>
Date: Mon, 19 Oct 2020 14:38:04 +0200
Subject: [PATCH] Add new processor upgrades from SMBIOS spec 3.4.0
Added 2 more new values (0x3D and 0x3E).
Signed-off-by: Coiby Xu <coxu@redhat.com>
---
dmidecode.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 97ba941..eb5a5af 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1355,10 +1355,12 @@ static const char *dmi_processor_upgrade(u8 code)
"Socket LGA2066",
"Socket BGA1392",
"Socket BGA1510",
- "Socket BGA1528" /* 0x3C */
+ "Socket BGA1528",
+ "Socket LGA4189",
+ "Socket LGA1200" /* 0x3E */
};
- if (code >= 0x01 && code <= 0x3C)
+ if (code >= 0x01 && code <= 0x3E)
return upgrade[code - 0x01];
return out_of_spec;
}
--
2.31.1

View File

@ -1,35 +0,0 @@
From 37a856266e4fb2f85bd8f2f269db8bcfb1962eb0 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 23 Mar 2020 16:47:33 +0100
Subject: [PATCH 05/23] dmidecode: Code indentation fixes
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index b459ed0ff84e..0d95cf9d8f7b 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -3588,7 +3588,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
printf("%s\t\tHost IP Assignment Type: %s\n", prefix,
dmi_protocol_assignment_type(assign_val));
- /* DSP0270: 8.6: Redfish Over IP Host Address format */
+ /* DSP0270: 8.6: Redfish Over IP Host Address format */
addrtype = rdata[17];
addrstr = dmi_address_type(addrtype);
printf("%s\t\tHost IP Address Format: %s\n", prefix,
@@ -4856,7 +4856,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
WORD(data + 0x07));
if (WORD(data + 0x09) != 0xFFFF)
printf("\tThreshold Handle: 0x%04X\n",
- WORD(data + 0x09));
+ WORD(data + 0x09));
}
break;
--
2.17.1

View File

@ -1,66 +0,0 @@
From e12ec26e19e02281d3e7258c3aabb88a5cf5ec1d Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 26 Aug 2019 14:20:15 +0200
Subject: [PATCH 05/11] dmidecode: Only scan /dev/mem for entry point on x86
x86 is the only architecture which can have a DMI entry point scanned
from /dev/mem. Do not attempt it on other architectures, because not
only it can't work, but it can even cause the system to reboot.
This fixes support request #109697:
https://savannah.nongnu.org/support/?109697
---
dmidecode.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 21bfd65274c4..9c1e9c4b0498 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -2,7 +2,7 @@
* DMI Decode
*
* Copyright (C) 2000-2002 Alan Cox <alan@redhat.com>
- * Copyright (C) 2002-2018 Jean Delvare <jdelvare@suse.de>
+ * Copyright (C) 2002-2019 Jean Delvare <jdelvare@suse.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -5538,7 +5538,7 @@ int main(int argc, char * const argv[])
off_t fp;
size_t size;
int efi;
- u8 *buf;
+ u8 *buf = NULL;
/*
* We don't want stdout and stderr to be mixed up if both are
@@ -5642,7 +5642,7 @@ int main(int argc, char * const argv[])
printf("Failed to get SMBIOS data from sysfs.\n");
}
- /* Next try EFI (ia64, Intel-based Mac) */
+ /* Next try EFI (ia64, Intel-based Mac, arm64) */
efi = address_from_efi(&fp);
switch (efi)
{
@@ -5675,6 +5675,7 @@ int main(int argc, char * const argv[])
goto done;
memory_scan:
+#if defined __i386__ || defined __x86_64__
if (!(opt.flags & FLAG_QUIET))
printf("Scanning %s for entry point.\n", opt.devmem);
/* Fallback to memory scan (x86, x86_64) */
@@ -5717,6 +5718,7 @@ int main(int argc, char * const argv[])
}
}
}
+#endif
done:
if (!found && !(opt.flags & FLAG_QUIET))
--
2.17.1

View File

@ -1,48 +0,0 @@
From b381d53c1199895aecccad543210ae1d40534493 Mon Sep 17 00:00:00 2001
From: Deomid rojer Ryabkov <rojer9@fb.com>
Date: Mon, 26 Aug 2019 14:20:15 +0200
Subject: [PATCH 06/11] Use larger units for memory device and BIOS size
So, 8 MB instead of 8192 kB, 8 GB instead of 8192 MB.
Same principle as in c43afb47fcba ("dmidecode: Use the most
appropriate unit for cache size") applied to more fields.
---
dmidecode.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 9c1e9c4b0498..5372c38879b3 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -318,7 +318,10 @@ static void dmi_bios_rom_size(u8 code1, u16 code2)
};
if (code1 != 0xFF)
- printf(" %u kB", (code1 + 1) << 6);
+ {
+ u64 s = { .l = (code1 + 1) << 6 };
+ dmi_print_memory_size(s, 1);
+ }
else
printf(" %u %s", code2 & 0x3FFF, unit[code2 >> 14]);
}
@@ -2372,10 +2375,10 @@ static void dmi_memory_device_size(u16 code)
printf(" Unknown");
else
{
- if (code & 0x8000)
- printf(" %u kB", code & 0x7FFF);
- else
- printf(" %u MB", code);
+ u64 s = { .l = code & 0x7FFF };
+ if (!(code & 0x8000))
+ s.l <<= 10;
+ dmi_print_memory_size(s, 1);
}
}
--
2.17.1

View File

@ -0,0 +1,34 @@
From 7e25483a392e292c58cea67ba4d052856c2f35d0 Mon Sep 17 00:00:00 2001
From: Prabhakar pujeri <prabhakar.pujeri@gmail.com>
Date: Mon, 19 Oct 2020 14:38:04 +0200
Subject: [PATCH] Add new memory device types from SMBIOS spec 3.4.0
Added 2 more new values (0x22 and 0x23).
Signed-off-by: Coiby Xu <coxu@redhat.com>
---
dmidecode.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 8b6f5af..97ba941 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -2639,10 +2639,12 @@ static const char *dmi_memory_device_type(u8 code)
"LPDDR4",
"Logical non-volatile device",
"HBM",
- "HBM2" /* 0x21 */
+ "HBM2",
+ "DDR5",
+ "LPDDR5" /* 0x23 */
};
- if (code >= 0x01 && code <= 0x21)
+ if (code >= 0x01 && code <= 0x23)
return type[code - 0x01];
return out_of_spec;
}
--
2.31.1

View File

@ -1,161 +0,0 @@
From 61f3f163b98b271c6613b9744128b99f33e6e19e Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 23 Mar 2020 16:47:37 +0100
Subject: [PATCH 06/23] dmidecode: Reduce the indentation of type 42 structures
There is no reason to indent the device information that much in type
42 structures. Remove the extra level of indentation for consistency
and readability.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 40 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 0d95cf9d8f7b..fc140e7e36a9 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -3545,7 +3545,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
/* DSP0270: 8.5: Protocol Record Data */
rdata = &rec[0x2];
- printf("%s\tProtocol ID: %02x (%s)\n", prefix, rid,
+ printf("%sProtocol ID: %02x (%s)\n", prefix, rid,
dmi_protocol_record_type(rid));
/*
@@ -3575,7 +3575,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
* endianess of the field is always little after version 2.6.0
* we can just pick a sufficiently recent version here.
*/
- printf("%s\t\tService UUID: ", prefix);
+ printf("%s\tService UUID: ", prefix);
dmi_system_uuid(&rdata[0], 0x311);
printf("\n");
@@ -3585,13 +3585,13 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
* uses decimal, so as to make it more comparable
*/
assign_val = rdata[16];
- printf("%s\t\tHost IP Assignment Type: %s\n", prefix,
+ printf("%s\tHost IP Assignment Type: %s\n", prefix,
dmi_protocol_assignment_type(assign_val));
/* DSP0270: 8.6: Redfish Over IP Host Address format */
addrtype = rdata[17];
addrstr = dmi_address_type(addrtype);
- printf("%s\t\tHost IP Address Format: %s\n", prefix,
+ printf("%s\tHost IP Address Format: %s\n", prefix,
addrstr);
/* DSP0270: 8.6 IP Assignment types */
@@ -3599,24 +3599,24 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
if (assign_val == 0x1 || assign_val == 0x3)
{
/* DSP0270: 8.6: the Host IPv[4|6] Address */
- printf("%s\t\t%s Address: %s\n", prefix, addrstr,
+ printf("%s\t%s Address: %s\n", prefix, addrstr,
dmi_address_decode(&rdata[18], buf, addrtype));
/* DSP0270: 8.6: Prints the Host IPv[4|6] Mask */
- printf("%s\t\t%s Mask: %s\n", prefix, addrstr,
+ printf("%s\t%s Mask: %s\n", prefix, addrstr,
dmi_address_decode(&rdata[34], buf, addrtype));
}
/* DSP0270: 8.6: Get the Redfish Service IP Discovery Type */
assign_val = rdata[50];
/* Redfish Service IP Discovery type mirrors Host IP Assignment type */
- printf("%s\t\tRedfish Service IP Discovery Type: %s\n", prefix,
+ printf("%s\tRedfish Service IP Discovery Type: %s\n", prefix,
dmi_protocol_assignment_type(assign_val));
/* DSP0270: 8.6: Get the Redfish Service IP Address Format */
addrtype = rdata[51];
addrstr = dmi_address_type(addrtype);
- printf("%s\t\tRedfish Service IP Address Format: %s\n", prefix,
+ printf("%s\tRedfish Service IP Address Format: %s\n", prefix,
addrstr);
if (assign_val == 0x1 || assign_val == 0x3)
@@ -3625,20 +3625,20 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
u32 vlan;
/* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Address */
- printf("%s\t\t%s Redfish Service Address: %s\n", prefix,
+ printf("%s\t%s Redfish Service Address: %s\n", prefix,
addrstr, dmi_address_decode(&rdata[52], buf,
addrtype));
/* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Mask */
- printf("%s\t\t%s Redfish Service Mask: %s\n", prefix,
+ printf("%s\t%s Redfish Service Mask: %s\n", prefix,
addrstr, dmi_address_decode(&rdata[68], buf,
addrtype));
/* DSP0270: 8.6: Redfish vlan and port info */
port = WORD(&rdata[84]);
vlan = DWORD(&rdata[86]);
- printf("%s\t\tRedfish Service Port: %hu\n", prefix, port);
- printf("%s\t\tRedfish Service Vlan: %u\n", prefix, vlan);
+ printf("%s\tRedfish Service Port: %hu\n", prefix, port);
+ printf("%s\tRedfish Service Vlan: %u\n", prefix, vlan);
}
/* DSP0270: 8.6: Redfish host length and name */
@@ -3655,7 +3655,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
hname = out_of_spec;
hlen = strlen(out_of_spec);
}
- printf("%s\t\tRedfish Service Hostname: %.*s\n", prefix, hlen, hname);
+ printf("%s\tRedfish Service Hostname: %.*s\n", prefix, hlen, hname);
}
/*
@@ -3728,10 +3728,10 @@ static void dmi_parse_controller_structure(const struct dmi_header *h,
/* USB Device Type - need at least 6 bytes */
u8 *usbdata = &data[0x7];
/* USB Device Descriptor: idVendor */
- printf("%s\tidVendor: 0x%04x\n", prefix,
+ printf("%sidVendor: 0x%04x\n", prefix,
WORD(&usbdata[0x0]));
/* USB Device Descriptor: idProduct */
- printf("%s\tidProduct: 0x%04x\n", prefix,
+ printf("%sidProduct: 0x%04x\n", prefix,
WORD(&usbdata[0x2]));
/*
* USB Serial number is here, but its useless, don't
@@ -3743,16 +3743,16 @@ static void dmi_parse_controller_structure(const struct dmi_header *h,
/* PCI Device Type - Need at least 8 bytes */
u8 *pcidata = &data[0x7];
/* PCI Device Descriptor: VendorID */
- printf("%s\tVendorID: 0x%04x\n", prefix,
+ printf("%sVendorID: 0x%04x\n", prefix,
WORD(&pcidata[0x0]));
/* PCI Device Descriptor: DeviceID */
- printf("%s\tDeviceID: 0x%04x\n", prefix,
+ printf("%sDeviceID: 0x%04x\n", prefix,
WORD(&pcidata[0x2]));
/* PCI Device Descriptor: PCI SubvendorID */
- printf("%s\tSubVendorID: 0x%04x\n", prefix,
+ printf("%sSubVendorID: 0x%04x\n", prefix,
WORD(&pcidata[0x4]));
/* PCI Device Descriptor: PCI SubdeviceID */
- printf("%s\tSubDeviceID: 0x%04x\n", prefix,
+ printf("%sSubDeviceID: 0x%04x\n", prefix,
WORD(&pcidata[0x6]));
}
else if (type == 0x4 && len >= 5)
@@ -3760,7 +3760,7 @@ static void dmi_parse_controller_structure(const struct dmi_header *h,
/* OEM Device Type - Need at least 4 bytes */
u8 *oemdata = &data[0x7];
/* OEM Device Descriptor: IANA */
- printf("%s\tVendor ID: 0x%02x:0x%02x:0x%02x:0x%02x\n",
+ printf("%sVendor ID: 0x%02x:0x%02x:0x%02x:0x%02x\n",
prefix, oemdata[0x0], oemdata[0x1],
oemdata[0x2], oemdata[0x3]);
}
--
2.17.1

View File

@ -1,37 +0,0 @@
From 1d0db85949a5bdd96375f6131d393a11204302a6 Mon Sep 17 00:00:00 2001
From: Deomid rojer Ryabkov <rojer9@fb.com>
Date: Mon, 26 Aug 2019 14:20:15 +0200
Subject: [PATCH 07/11] Fix formatting of TPM table output
Added missing newlines.
Fixes: 48a8132058a0 ("dmidecode: Add support for structure type 43 (TPM Device)")
---
dmidecode.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 5372c38879b3..cff7d3f1941d 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -4997,7 +4997,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
printf("\tVendor ID:");
dmi_tpm_vendor_id(data + 0x04);
printf("\n");
- printf("\tSpecification Version: %d.%d", data[0x08], data[0x09]);
+ printf("\tSpecification Version: %d.%d\n", data[0x08], data[0x09]);
switch (data[0x08])
{
case 0x01:
@@ -5020,7 +5020,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
*/
break;
}
- printf("\tDescription: %s", dmi_string(h, data[0x12]));
+ printf("\tDescription: %s\n", dmi_string(h, data[0x12]));
printf("\tCharacteristics:\n");
dmi_tpm_characteristics(QWORD(data + 0x13), "\t\t");
if (h->length < 0x1F) break;
--
2.17.1

View File

@ -1,47 +0,0 @@
From 30121a064378b2c0174659cd52449c70aa2c271f Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 23 Mar 2020 16:47:40 +0100
Subject: [PATCH 07/23] dmidecode: Move type 42 warning messages to stderr
Write warning messages about invalid type 42 structures to stderr as
we do for all other warning messages.
Also include the handle and record numbers in these warning messages
to make the problem easier to analyze.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index fc140e7e36a9..50fd0bffa26d 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -3780,8 +3780,9 @@ static void dmi_parse_controller_structure(const struct dmi_header *h,
total_read++;
if (total_read > h->length)
{
- printf("%s\tWARN: Total read length %d exceeds total structure length %d\n",
- prefix, total_read, h->length);
+ fprintf(stderr,
+ "Total read length %d exceeds total structure length %d (handle 0x%04hx)\n",
+ total_read, h->length, h->handle);
return;
}
@@ -3801,8 +3802,9 @@ static void dmi_parse_controller_structure(const struct dmi_header *h,
total_read += rec[1] + 2;
if (total_read > h->length)
{
- printf("%s\tWARN: Total read length %d exceeds total structure length %d\n",
- prefix, total_read, h->length);
+ fprintf(stderr,
+ "Total read length %d exceeds total structure length %d (handle 0x%04hx, record %d)\n",
+ total_read, h->length, h->handle, i + 1);
return;
}
--
2.17.1

View File

@ -1,77 +0,0 @@
From 9bce894b7730013120d4c71f964d4cf8402cb956 Mon Sep 17 00:00:00 2001
From: Erwan Velu <e.velu@criteo.com>
Date: Mon, 7 Oct 2019 15:36:47 +0200
Subject: [PATCH 08/11] dmidecode: Adding bios-revision to -s option
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
Add a "bios-revision" entry into the '-s' option.
A typical usage of this feature looks like :
[root@host] dmidecode -s bios-revision
2.0
Signed-off-by: Erwan Velu <e.velu@criteo.com>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 4 ++++
dmiopt.c | 1 +
man/dmidecode.8 | 1 +
3 files changed, 6 insertions(+)
diff --git a/dmidecode.c b/dmidecode.c
index cff7d3f1941d..e4cd6d8b8b20 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -5082,6 +5082,10 @@ static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver
key = (opt.string->type << 8) | offset;
switch (key)
{
+ case 0x015: /* -s bios-revision */
+ if (data[key - 1] != 0xFF && data[key] != 0xFF)
+ printf("%u.%u\n", data[key - 1], data[key]);
+ break;
case 0x108:
dmi_system_uuid(data + offset, ver);
printf("\n");
diff --git a/dmiopt.c b/dmiopt.c
index 2f285f34a96b..9ceb35a104bd 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, 0x15 }, /* 0x14 and 0x15 */
{ "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.17.1

View File

@ -1,122 +0,0 @@
From 26a66d708c6caef09912245c93371ec96c1e0cbd Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Mon, 23 Mar 2020 16:47:44 +0100
Subject: [PATCH 08/23] dmidecode: Refactor ASCII filtering of DMI strings
Split dmi_string into 3 functions to make it more modular. ASCII
filtering is an explicit option now to give the caller more control.
Use the new functions in dmi_dump to avoid reimplementing the ASCII
filtering and printing characters one by one.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 60 ++++++++++++++++++++++++++++-------------------------
1 file changed, 32 insertions(+), 28 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 50fd0bffa26d..8ec1d6b9597a 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -109,13 +109,19 @@ int is_printable(const u8 *data, int len)
return 1;
}
-const char *dmi_string(const struct dmi_header *dm, u8 s)
+/* Replace non-ASCII characters with dots */
+static void ascii_filter(char *bp, size_t len)
{
- char *bp = (char *)dm->data;
- size_t i, len;
+ size_t i;
- if (s == 0)
- return "Not Specified";
+ for (i = 0; i < len; i++)
+ if (bp[i] < 32 || bp[i] == 127)
+ bp[i] = '.';
+}
+
+static char *_dmi_string(const struct dmi_header *dm, u8 s, int filter)
+{
+ char *bp = (char *)dm->data;
bp += dm->length;
while (s > 1 && *bp)
@@ -126,16 +132,24 @@ const char *dmi_string(const struct dmi_header *dm, u8 s)
}
if (!*bp)
- return bad_index;
+ return NULL;
- if (!(opt.flags & FLAG_DUMP))
- {
- /* ASCII filtering */
- len = strlen(bp);
- for (i = 0; i < len; i++)
- if (bp[i] < 32 || bp[i] == 127)
- bp[i] = '.';
- }
+ if (filter)
+ ascii_filter(bp, strlen(bp));
+
+ return bp;
+}
+
+const char *dmi_string(const struct dmi_header *dm, u8 s)
+{
+ char *bp;
+
+ if (s == 0)
+ return "Not Specified";
+
+ bp = _dmi_string(dm, s, 1);
+ if (bp == NULL)
+ return bad_index;
return bp;
}
@@ -208,7 +222,7 @@ static int dmi_bcd_range(u8 value, u8 low, u8 high)
static void dmi_dump(const struct dmi_header *h, const char *prefix)
{
int row, i;
- const char *s;
+ char *s;
printf("%sHeader and Data:\n", prefix);
for (row = 0; row < ((h->length - 1) >> 4) + 1; row++)
@@ -224,7 +238,7 @@ static void dmi_dump(const struct dmi_header *h, const char *prefix)
{
printf("%sStrings:\n", prefix);
i = 1;
- while ((s = dmi_string(h, i++)) != bad_index)
+ while ((s = _dmi_string(h, i++, !(opt.flags & FLAG_DUMP))))
{
if (opt.flags & FLAG_DUMP)
{
@@ -238,19 +252,9 @@ static void dmi_dump(const struct dmi_header *h, const char *prefix)
printf("\n");
}
/* String isn't filtered yet so do it now */
- printf("%s\t\"", prefix);
- while (*s)
- {
- if (*s < 32 || *s == 127)
- fputc('.', stdout);
- else
- fputc(*s, stdout);
- s++;
- }
- printf("\"\n");
+ ascii_filter(s, l - 1);
}
- else
- printf("%s\t%s\n", prefix, s);
+ printf("%s\t%s\n", prefix, s);
}
}
}
--
2.17.1

View File

@ -1,214 +0,0 @@
From 2241f1dd232fe8e1d57fdb2482ad417ebe23279e Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 09:51:46 +0200
Subject: [PATCH 09/23] dmidecode: Add helper function pr_comment
Print all comments through a helper function pr_comment.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
Makefile | 7 +++++--
dmidecode.c | 33 +++++++++++++++++----------------
dmioutput.c | 35 +++++++++++++++++++++++++++++++++++
dmioutput.h | 22 ++++++++++++++++++++++
4 files changed, 79 insertions(+), 18 deletions(-)
create mode 100644 dmioutput.c
create mode 100644 dmioutput.h
diff --git a/Makefile b/Makefile
index 77c931091b0f..5d58266ef2de 100644
--- a/Makefile
+++ b/Makefile
@@ -61,8 +61,8 @@ all : $(PROGRAMS)
# Programs
#
-dmidecode : dmidecode.o dmiopt.o dmioem.o util.o
- $(CC) $(LDFLAGS) dmidecode.o dmiopt.o dmioem.o util.o -o $@
+dmidecode : dmidecode.o dmiopt.o dmioem.o dmioutput.o util.o
+ $(CC) $(LDFLAGS) dmidecode.o dmiopt.o dmioem.o dmioutput.o util.o -o $@
biosdecode : biosdecode.o util.o
$(CC) $(LDFLAGS) biosdecode.o util.o -o $@
@@ -87,6 +87,9 @@ dmiopt.o : dmiopt.c config.h types.h util.h dmidecode.h dmiopt.h
dmioem.o : dmioem.c types.h dmidecode.h dmioem.h
$(CC) $(CFLAGS) -c $< -o $@
+dmioutput.o : dmioutput.c types.h dmioutput.h
+ $(CC) $(CFLAGS) -c $< -o $@
+
biosdecode.o : biosdecode.c version.h types.h util.h config.h
$(CC) $(CFLAGS) -c $< -o $@
diff --git a/dmidecode.c b/dmidecode.c
index 8ec1d6b9597a..2939b2d307fc 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -80,6 +80,7 @@
#include "dmidecode.h"
#include "dmiopt.h"
#include "dmioem.h"
+#include "dmioutput.h"
#define out_of_spec "<OUT OF SPEC>"
static const char *bad_index = "<BAD INDEX>";
@@ -5162,7 +5163,7 @@ static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver
static void dmi_table_dump(const u8 *buf, u32 len)
{
if (!(opt.flags & FLAG_QUIET))
- printf("# Writing %d bytes to %s.\n", len, opt.dumpfile);
+ pr_comment("Writing %d bytes to %s.", len, opt.dumpfile);
write_dump(32, len, buf, opt.dumpfile, 0);
}
@@ -5283,11 +5284,11 @@ static void dmi_table(off_t base, u32 len, u16 num, u32 ver, const char *devmem,
if (ver > SUPPORTED_SMBIOS_VER && !(opt.flags & FLAG_QUIET))
{
- printf("# SMBIOS implementations newer than version %u.%u.%u are not\n"
- "# fully supported by this version of dmidecode.\n",
- SUPPORTED_SMBIOS_VER >> 16,
- (SUPPORTED_SMBIOS_VER >> 8) & 0xFF,
- SUPPORTED_SMBIOS_VER & 0xFF);
+ pr_comment("SMBIOS implementations newer than version %u.%u.%u are not",
+ SUPPORTED_SMBIOS_VER >> 16,
+ (SUPPORTED_SMBIOS_VER >> 8) & 0xFF,
+ SUPPORTED_SMBIOS_VER & 0xFF);
+ pr_comment("fully supported by this version of dmidecode.");
}
if (!(opt.flags & FLAG_QUIET))
@@ -5417,8 +5418,8 @@ static int smbios3_decode(u8 *buf, const char *devmem, u32 flags)
overwrite_smbios3_address(crafted);
if (!(opt.flags & FLAG_QUIET))
- printf("# Writing %d bytes to %s.\n", crafted[0x06],
- opt.dumpfile);
+ pr_comment("Writing %d bytes to %s.", crafted[0x06],
+ opt.dumpfile);
write_dump(0, crafted[0x06], crafted, opt.dumpfile, 1);
}
@@ -5478,8 +5479,8 @@ static int smbios_decode(u8 *buf, const char *devmem, u32 flags)
overwrite_dmi_address(crafted + 0x10);
if (!(opt.flags & FLAG_QUIET))
- printf("# Writing %d bytes to %s.\n", crafted[0x05],
- opt.dumpfile);
+ pr_comment("Writing %d bytes to %s.", crafted[0x05],
+ opt.dumpfile);
write_dump(0, crafted[0x05], crafted, opt.dumpfile, 1);
}
@@ -5507,8 +5508,8 @@ static int legacy_decode(u8 *buf, const char *devmem, u32 flags)
overwrite_dmi_address(crafted);
if (!(opt.flags & FLAG_QUIET))
- printf("# Writing %d bytes to %s.\n", 0x0F,
- opt.dumpfile);
+ pr_comment("Writing %d bytes to %s.", 0x0F,
+ opt.dumpfile);
write_dump(0, 0x0F, crafted, opt.dumpfile, 1);
}
@@ -5586,8 +5587,8 @@ static int address_from_efi(off_t *address)
#endif
if (ret == 0 && !(opt.flags & FLAG_QUIET))
- printf("# %s entry point at 0x%08llx\n",
- eptype, (unsigned long long)*address);
+ pr_comment("%s entry point at 0x%08llx",
+ eptype, (unsigned long long)*address);
return ret;
}
@@ -5638,7 +5639,7 @@ int main(int argc, char * const argv[])
}
if (!(opt.flags & FLAG_QUIET))
- printf("# dmidecode %s\n", VERSION);
+ pr_comment("dmidecode %s", VERSION);
/* Read from dump if so instructed */
if (opt.flags & FLAG_FROM_DUMP)
@@ -5783,7 +5784,7 @@ int main(int argc, char * const argv[])
done:
if (!found && !(opt.flags & FLAG_QUIET))
- printf("# No SMBIOS nor DMI entry point found, sorry.\n");
+ pr_comment("No SMBIOS nor DMI entry point found, sorry.");
free(buf);
exit_free:
diff --git a/dmioutput.c b/dmioutput.c
new file mode 100644
index 000000000000..e762a035f39d
--- /dev/null
+++ b/dmioutput.c
@@ -0,0 +1,35 @@
+/*
+ * Generic output functions
+ * This file is part of the dmidecode project.
+ *
+ * Copyright (C) 2020 Jean Delvare <jdelvare@suse.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include "dmioutput.h"
+
+void pr_comment(const char *format, ...)
+{
+ va_list args;
+
+ printf("# ");
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+ printf("\n");
+}
diff --git a/dmioutput.h b/dmioutput.h
new file mode 100644
index 000000000000..b6cf5ee8b60e
--- /dev/null
+++ b/dmioutput.h
@@ -0,0 +1,22 @@
+/*
+ * Generic output functions
+ * This file is part of the dmidecode project.
+ *
+ * Copyright (C) 2020 Jean Delvare <jdelvare@suse.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+void pr_comment(const char *format, ...);
--
2.17.1

View File

@ -1,66 +0,0 @@
From 3a455213068eb3a3572908c77fafae35e5360998 Mon Sep 17 00:00:00 2001
From: Erwan Velu <e.velu@criteo.com>
Date: Mon, 7 Oct 2019 15:36:47 +0200
Subject: [PATCH 09/11] dmidecode: Adding firmware-revision support to -s
option
Most of servers like HPe, QCT, report the BMC version via the
Firmware Revision field. Add an option to the -s to export this
information directly.
A typical usage of this feature looks like:
[root@host ~]$ dmidecode -s firmware-revision
3.93
Signed-off-by: Erwan Velu <e.velu@criteo.com>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 4 ++++
dmiopt.c | 1 +
man/dmidecode.8 | 2 +-
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/dmidecode.c b/dmidecode.c
index e4cd6d8b8b20..aef18f8fe998 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -5086,6 +5086,10 @@ static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver
if (data[key - 1] != 0xFF && data[key] != 0xFF)
printf("%u.%u\n", data[key - 1], data[key]);
break;
+ case 0x017: /* -s firmware-revision */
+ if (data[key - 1] != 0xFF && data[key] != 0xFF)
+ printf("%u.%u\n", data[key - 1], data[key]);
+ break;
case 0x108:
dmi_system_uuid(data + offset, ver);
printf("\n");
diff --git a/dmiopt.c b/dmiopt.c
index 9ceb35a104bd..1c3b7607df2f 100644
--- a/dmiopt.c
+++ b/dmiopt.c
@@ -152,6 +152,7 @@ static const struct string_keyword opt_string_keyword[] = {
{ "bios-version", 0, 0x05 },
{ "bios-release-date", 0, 0x08 },
{ "bios-revision", 0, 0x15 }, /* 0x14 and 0x15 */
+ { "firmware-revision", 0, 0x17 }, /* 0x16 and 0x17 */
{ "system-manufacturer", 1, 0x04 },
{ "system-product-name", 1, 0x05 },
{ "system-version", 1, 0x06 },
diff --git a/man/dmidecode.8 b/man/dmidecode.8
index c3f87132d14c..4602088115d2 100644
--- a/man/dmidecode.8
+++ b/man/dmidecode.8
@@ -74,7 +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,
+\fBbios-revision\fR, \fBfirmware-revision\fR,
\fBsystem-manufacturer\fR, \fBsystem-product-name\fR,
\fBsystem-version\fR, \fBsystem-serial-number\fR,
\fBsystem-uuid\fR, \fBsystem-family\fR,
--
2.17.1

View File

@ -1,142 +0,0 @@
From dd593d2f0c7272658070208d0a6957d77fc7e6f2 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 09:51:51 +0200
Subject: [PATCH 10/23] dmidecode: Add helper function pr_info
Print all info messages through a helper function pr_info.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 30 +++++++++++++++---------------
dmioutput.c | 10 ++++++++++
dmioutput.h | 1 +
3 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 2939b2d307fc..e3f6e300efc2 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -5296,11 +5296,11 @@ static void dmi_table(off_t base, u32 len, u16 num, u32 ver, const char *devmem,
if (opt.type == NULL)
{
if (num)
- printf("%u structures occupying %u bytes.\n",
- num, len);
+ pr_info("%u structures occupying %u bytes.",
+ num, len);
if (!(opt.flags & FLAG_FROM_DUMP))
- printf("Table at 0x%08llX.\n",
- (unsigned long long)base);
+ pr_info("Table at 0x%08llX.",
+ (unsigned long long)base);
}
printf("\n");
}
@@ -5397,8 +5397,8 @@ static int smbios3_decode(u8 *buf, const char *devmem, u32 flags)
ver = (buf[0x07] << 16) + (buf[0x08] << 8) + buf[0x09];
if (!(opt.flags & FLAG_QUIET))
- printf("SMBIOS %u.%u.%u present.\n",
- buf[0x07], buf[0x08], buf[0x09]);
+ pr_info("SMBIOS %u.%u.%u present.",
+ buf[0x07], buf[0x08], buf[0x09]);
offset = QWORD(buf + 0x10);
if (!(flags & FLAG_NO_FILE_OFFSET) && offset.h && sizeof(off_t) < 8)
@@ -5465,7 +5465,7 @@ static int smbios_decode(u8 *buf, const char *devmem, u32 flags)
break;
}
if (!(opt.flags & FLAG_QUIET))
- printf("SMBIOS %u.%u present.\n",
+ pr_info("SMBIOS %u.%u present.",
ver >> 8, ver & 0xFF);
dmi_table(DWORD(buf + 0x18), WORD(buf + 0x16), WORD(buf + 0x1C),
@@ -5493,7 +5493,7 @@ static int legacy_decode(u8 *buf, const char *devmem, u32 flags)
return 0;
if (!(opt.flags & FLAG_QUIET))
- printf("Legacy DMI %u.%u present.\n",
+ pr_info("Legacy DMI %u.%u present.",
buf[0x0E] >> 4, buf[0x0E] & 0x0F);
dmi_table(DWORD(buf + 0x08), WORD(buf + 0x06), WORD(buf + 0x0C),
@@ -5645,8 +5645,8 @@ int main(int argc, char * const argv[])
if (opt.flags & FLAG_FROM_DUMP)
{
if (!(opt.flags & FLAG_QUIET))
- printf("Reading SMBIOS/DMI data from file %s.\n",
- opt.dumpfile);
+ pr_info("Reading SMBIOS/DMI data from file %s.",
+ opt.dumpfile);
if ((buf = mem_chunk(0, 0x20, opt.dumpfile)) == NULL)
{
ret = 1;
@@ -5681,7 +5681,7 @@ int main(int argc, char * const argv[])
&& (buf = read_file(0, &size, SYS_ENTRY_FILE)) != NULL)
{
if (!(opt.flags & FLAG_QUIET))
- printf("Getting SMBIOS data from sysfs.\n");
+ pr_info("Getting SMBIOS data from sysfs.");
if (size >= 24 && memcmp(buf, "_SM3_", 5) == 0)
{
if (smbios3_decode(buf, SYS_TABLE_FILE, FLAG_NO_FILE_OFFSET))
@@ -5701,7 +5701,7 @@ int main(int argc, char * const argv[])
if (found)
goto done;
if (!(opt.flags & FLAG_QUIET))
- printf("Failed to get SMBIOS data from sysfs.\n");
+ pr_info("Failed to get SMBIOS data from sysfs.");
}
/* Next try EFI (ia64, Intel-based Mac, arm64) */
@@ -5716,8 +5716,8 @@ int main(int argc, char * const argv[])
}
if (!(opt.flags & FLAG_QUIET))
- printf("Found SMBIOS entry point in EFI, reading table from %s.\n",
- opt.devmem);
+ pr_info("Found SMBIOS entry point in EFI, reading table from %s.",
+ opt.devmem);
if ((buf = mem_chunk(fp, 0x20, opt.devmem)) == NULL)
{
ret = 1;
@@ -5739,7 +5739,7 @@ int main(int argc, char * const argv[])
memory_scan:
#if defined __i386__ || defined __x86_64__
if (!(opt.flags & FLAG_QUIET))
- printf("Scanning %s for entry point.\n", opt.devmem);
+ pr_info("Scanning %s for entry point.", opt.devmem);
/* Fallback to memory scan (x86, x86_64) */
if ((buf = mem_chunk(0xF0000, 0x10000, opt.devmem)) == NULL)
{
diff --git a/dmioutput.c b/dmioutput.c
index e762a035f39d..e702f114bb4a 100644
--- a/dmioutput.c
+++ b/dmioutput.c
@@ -33,3 +33,13 @@ void pr_comment(const char *format, ...)
va_end(args);
printf("\n");
}
+
+void pr_info(const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+ printf("\n");
+}
diff --git a/dmioutput.h b/dmioutput.h
index b6cf5ee8b60e..0dd8f0811934 100644
--- a/dmioutput.h
+++ b/dmioutput.h
@@ -20,3 +20,4 @@
*/
void pr_comment(const char *format, ...);
+void pr_info(const char *format, ...);
--
2.17.1

View File

@ -1,36 +0,0 @@
From fd08479625b5845e4d725ab628628f7ebfccc407 Mon Sep 17 00:00:00 2001
From: Prabhakar pujeri <Prabhakar.Pujeri@dell.com>
Date: Tue, 15 Oct 2019 14:24:46 +0200
Subject: [PATCH 10/11] dmidecode: Fix System Slot Information for PCIe SSD
Output for type 9 show <out of spec> for PCIe SSD. SMBIOS spec table
48 describes 2.5" and 3.5" PCIe SSD formats.
Signed-off-by: Prabhakar pujeri <prabhakar.pujeri@dell.com>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index aef18f8fe998..68bfa457c9bd 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1906,10 +1906,12 @@ static const char *dmi_slot_length(u8 code)
"Other", /* 0x01 */
"Unknown",
"Short",
- "Long" /* 0x04 */
+ "Long",
+ "2.5\" drive form factor",
+ "3.5\" drive form factor" /* 0x06 */
};
- if (code >= 0x01 && code <= 0x04)
+ if (code >= 0x01 && code <= 0x06)
return length[code - 0x01];
return out_of_spec;
}
--
2.17.1

View File

@ -1,25 +0,0 @@
From a808e6ef4ebc96b8f66ad13bd3caab32aa05505d Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 16 Oct 2019 15:35:42 +0200
Subject: [PATCH 11/11] Typo
---
dmidecode.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dmidecode.c b/dmidecode.c
index 68bfa457c9bd..bdf1185dabe9 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -1901,7 +1901,7 @@ static const char *dmi_slot_current_usage(u8 code)
static const char *dmi_slot_length(u8 code)
{
- /* 7.1O.4 */
+ /* 7.10.4 */
static const char *length[] = {
"Other", /* 0x01 */
"Unknown",
--
2.17.1

View File

@ -1,36 +0,0 @@
From 0c6f1819b5421166f55369bb33f538bf64805ff6 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 09:51:54 +0200
Subject: [PATCH 11/23] dmidecode: Protect dmidecode.h against double inclusion
We'll soon need to include dmidecode.h from another header file, so
protect it against double inclusion.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/dmidecode.h b/dmidecode.h
index 20e7e96efc0f..9ecc1791702d 100644
--- a/dmidecode.h
+++ b/dmidecode.h
@@ -18,6 +18,9 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#ifndef DMIDECODE_H
+#define DMIDECODE_H
+
#include "types.h"
struct dmi_header
@@ -30,3 +33,5 @@ struct dmi_header
int is_printable(const u8 *data, int len);
const char *dmi_string(const struct dmi_header *dm, u8 s);
+
+#endif
--
2.17.1

View File

@ -1,58 +0,0 @@
From d37eed24b07da16719ce969f119b4c636e0e2d96 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 09:51:57 +0200
Subject: [PATCH 12/23] dmidecode: Add helper function pr_handle
Print the handle information through a helper function pr_handle.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 3 +--
dmioutput.c | 6 ++++++
dmioutput.h | 3 +++
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index e3f6e300efc2..8ba8d078614e 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -5212,8 +5212,7 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags)
if (display
&& (!(opt.flags & FLAG_QUIET) || (opt.flags & FLAG_DUMP)))
- printf("Handle 0x%04X, DMI type %d, %d bytes\n",
- h.handle, h.type, h.length);
+ pr_handle(&h);
/* Look for the next handle */
next = data + h.length;
diff --git a/dmioutput.c b/dmioutput.c
index e702f114bb4a..ad3b0398c446 100644
--- a/dmioutput.c
+++ b/dmioutput.c
@@ -43,3 +43,9 @@ void pr_info(const char *format, ...)
va_end(args);
printf("\n");
}
+
+void pr_handle(const struct dmi_header *h)
+{
+ printf("Handle 0x%04X, DMI type %d, %d bytes\n",
+ h->handle, h->type, h->length);
+}
diff --git a/dmioutput.h b/dmioutput.h
index 0dd8f0811934..6ef60f0ee3cd 100644
--- a/dmioutput.h
+++ b/dmioutput.h
@@ -19,5 +19,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include "dmidecode.h"
+
void pr_comment(const char *format, ...);
void pr_info(const char *format, ...);
+void pr_handle(const struct dmi_header *h);
--
2.17.1

View File

@ -1,569 +0,0 @@
From ebbe1dbe9a4413232949d97a506db6a7c00865fa Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 09:52:00 +0200
Subject: [PATCH 13/23] dmidecode: Add helper function pr_handle_name
Print the name of each handle type through a helper function
pr_handle_name.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 99 ++++++++++++++++++++++++++---------------------------
dmioem.c | 25 +++++++-------
dmioutput.c | 10 ++++++
dmioutput.h | 1 +
4 files changed, 73 insertions(+), 62 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 8ba8d078614e..c226bad06638 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -2083,11 +2083,10 @@ static void dmi_on_board_devices(const struct dmi_header *h, const char *prefix)
for (i = 0; i < count; i++)
{
if (count == 1)
- printf("%sOn Board Device Information\n",
- prefix);
+ pr_handle_name("On Board Device Information");
else
- printf("%sOn Board Device %d Information\n",
- prefix, i + 1);
+ pr_handle_name("On Board Device %d Information",
+ i + 1);
printf("%s\tType: %s\n",
prefix, dmi_on_board_devices_type(p[2 * i] & 0x7F));
printf("%s\tStatus: %s\n",
@@ -3397,7 +3396,7 @@ static void dmi_additional_info(const struct dmi_header *h, const char *prefix)
for (i = 0; i < count; i++)
{
- printf("%sAdditional Information %d\n", prefix, i + 1);
+ pr_handle_name("Additional Information %d", i + 1);
/* Check for short entries */
if (h->length < offset + 1) break;
@@ -3893,7 +3892,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
switch (h->type)
{
case 0: /* 7.1 BIOS Information */
- printf("BIOS Information\n");
+ pr_handle_name("BIOS Information");
if (h->length < 0x12) break;
printf("\tVendor: %s\n",
dmi_string(h, data[0x04]));
@@ -3933,7 +3932,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 1: /* 7.2 System Information */
- printf("System Information\n");
+ pr_handle_name("System Information");
if (h->length < 0x08) break;
printf("\tManufacturer: %s\n",
dmi_string(h, data[0x04]));
@@ -3957,7 +3956,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 2: /* 7.3 Base Board Information */
- printf("Base Board Information\n");
+ pr_handle_name("Base Board Information");
if (h->length < 0x08) break;
printf("\tManufacturer: %s\n",
dmi_string(h, data[0x04]));
@@ -3988,7 +3987,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 3: /* 7.4 Chassis Information */
- printf("Chassis Information\n");
+ pr_handle_name("Chassis Information");
if (h->length < 0x09) break;
printf("\tManufacturer: %s\n",
dmi_string(h, data[0x04]));
@@ -4030,7 +4029,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 4: /* 7.5 Processor Information */
- printf("Processor Information\n");
+ pr_handle_name("Processor Information");
if (h->length < 0x1A) break;
printf("\tSocket Designation: %s\n",
dmi_string(h, data[0x04]));
@@ -4100,7 +4099,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 5: /* 7.6 Memory Controller Information */
- printf("Memory Controller Information\n");
+ pr_handle_name("Memory Controller Information");
if (h->length < 0x0F) break;
printf("\tError Detecting Method: %s\n",
dmi_memory_controller_ed_method(data[0x04]));
@@ -4130,7 +4129,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 6: /* 7.7 Memory Module Information */
- printf("Memory Module Information\n");
+ pr_handle_name("Memory Module Information");
if (h->length < 0x0C) break;
printf("\tSocket Designation: %s\n",
dmi_string(h, data[0x04]));
@@ -4154,7 +4153,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 7: /* 7.8 Cache Information */
- printf("Cache Information\n");
+ pr_handle_name("Cache Information");
if (h->length < 0x0F) break;
printf("\tSocket Designation: %s\n",
dmi_string(h, data[0x04]));
@@ -4197,7 +4196,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 8: /* 7.9 Port Connector Information */
- printf("Port Connector Information\n");
+ pr_handle_name("Port Connector Information");
if (h->length < 0x09) break;
printf("\tInternal Reference Designator: %s\n",
dmi_string(h, data[0x04]));
@@ -4212,7 +4211,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 9: /* 7.10 System Slots */
- printf("System Slot Information\n");
+ pr_handle_name("System Slot Information");
if (h->length < 0x0C) break;
printf("\tDesignation: %s\n",
dmi_string(h, data[0x04]));
@@ -4243,19 +4242,19 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 11: /* 7.12 OEM Strings */
- printf("OEM Strings\n");
+ pr_handle_name("OEM Strings");
if (h->length < 0x05) break;
dmi_oem_strings(h, "\t");
break;
case 12: /* 7.13 System Configuration Options */
- printf("System Configuration Options\n");
+ pr_handle_name("System Configuration Options");
if (h->length < 0x05) break;
dmi_system_configuration_options(h, "\t");
break;
case 13: /* 7.14 BIOS Language Information */
- printf("BIOS Language Information\n");
+ pr_handle_name("BIOS Language Information");
if (h->length < 0x16) break;
if (ver >= 0x0201)
{
@@ -4269,7 +4268,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 14: /* 7.15 Group Associations */
- printf("Group Associations\n");
+ pr_handle_name("Group Associations");
if (h->length < 0x05) break;
printf("\tName: %s\n",
dmi_string(h, data[0x04]));
@@ -4279,7 +4278,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 15: /* 7.16 System Event Log */
- printf("System Event Log\n");
+ pr_handle_name("System Event Log");
if (h->length < 0x14) break;
printf("\tArea Length: %u bytes\n",
WORD(data + 0x04));
@@ -4311,7 +4310,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 16: /* 7.17 Physical Memory Array */
- printf("Physical Memory Array\n");
+ pr_handle_name("Physical Memory Array");
if (h->length < 0x0F) break;
printf("\tLocation: %s\n",
dmi_memory_array_location(data[0x04]));
@@ -4347,7 +4346,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 17: /* 7.18 Memory Device */
- printf("Memory Device\n");
+ pr_handle_name("Memory Device");
if (h->length < 0x15) break;
if (!(opt.flags & FLAG_QUIET))
{
@@ -4457,7 +4456,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 18: /* 7.19 32-bit Memory Error Information */
- printf("32-bit Memory Error Information\n");
+ pr_handle_name("32-bit Memory Error Information");
if (h->length < 0x17) break;
printf("\tType: %s\n",
dmi_memory_error_type(data[0x04]));
@@ -4480,7 +4479,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 19: /* 7.20 Memory Array Mapped Address */
- printf("Memory Array Mapped Address\n");
+ pr_handle_name("Memory Array Mapped Address");
if (h->length < 0x0F) break;
if (h->length >= 0x1F && DWORD(data + 0x04) == 0xFFFFFFFF)
{
@@ -4516,7 +4515,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 20: /* 7.21 Memory Device Mapped Address */
- printf("Memory Device Mapped Address\n");
+ pr_handle_name("Memory Device Mapped Address");
if (h->length < 0x13) break;
if (h->length >= 0x23 && DWORD(data + 0x04) == 0xFFFFFFFF)
{
@@ -4559,7 +4558,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 21: /* 7.22 Built-in Pointing Device */
- printf("Built-in Pointing Device\n");
+ pr_handle_name("Built-in Pointing Device");
if (h->length < 0x07) break;
printf("\tType: %s\n",
dmi_pointing_device_type(data[0x04]));
@@ -4570,7 +4569,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 22: /* 7.23 Portable Battery */
- printf("Portable Battery\n");
+ pr_handle_name("Portable Battery");
if (h->length < 0x10) break;
printf("\tLocation: %s\n",
dmi_string(h, data[0x04]));
@@ -4618,7 +4617,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 23: /* 7.24 System Reset */
- printf("System Reset\n");
+ pr_handle_name("System Reset");
if (h->length < 0x0D) break;
printf("\tStatus: %s\n",
data[0x04] & (1 << 0) ? "Enabled" : "Disabled");
@@ -4645,7 +4644,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 24: /* 7.25 Hardware Security */
- printf("Hardware Security\n");
+ pr_handle_name("Hardware Security");
if (h->length < 0x05) break;
printf("\tPower-On Password Status: %s\n",
dmi_hardware_security_status(data[0x04] >> 6));
@@ -4658,7 +4657,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 25: /* 7.26 System Power Controls */
- printf("System Power Controls\n");
+ pr_handle_name("System Power Controls");
if (h->length < 0x09) break;
printf("\tNext Scheduled Power-on:");
dmi_power_controls_power_on(data + 0x04);
@@ -4666,7 +4665,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 26: /* 7.27 Voltage Probe */
- printf("Voltage Probe\n");
+ pr_handle_name("Voltage Probe");
if (h->length < 0x14) break;
printf("\tDescription: %s\n",
dmi_string(h, data[0x04]));
@@ -4698,7 +4697,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 27: /* 7.28 Cooling Device */
- printf("Cooling Device\n");
+ pr_handle_name("Cooling Device");
if (h->length < 0x0C) break;
if (!(opt.flags & FLAG_QUIET) && WORD(data + 0x04) != 0xFFFF)
printf("\tTemperature Probe Handle: 0x%04X\n",
@@ -4721,7 +4720,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 28: /* 7.29 Temperature Probe */
- printf("Temperature Probe\n");
+ pr_handle_name("Temperature Probe");
if (h->length < 0x14) break;
printf("\tDescription: %s\n",
dmi_string(h, data[0x04]));
@@ -4753,7 +4752,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 29: /* 7.30 Electrical Current Probe */
- printf("Electrical Current Probe\n");
+ pr_handle_name("Electrical Current Probe");
if (h->length < 0x14) break;
printf("\tDescription: %s\n",
dmi_string(h, data[0x04]));
@@ -4785,7 +4784,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 30: /* 7.31 Out-of-band Remote Access */
- printf("Out-of-band Remote Access\n");
+ pr_handle_name("Out-of-band Remote Access");
if (h->length < 0x06) break;
printf("\tManufacturer Name: %s\n",
dmi_string(h, data[0x04]));
@@ -4796,7 +4795,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 31: /* 7.32 Boot Integrity Services Entry Point */
- printf("Boot Integrity Services Entry Point\n");
+ pr_handle_name("Boot Integrity Services Entry Point");
if (h->length < 0x1C) break;
printf("\tChecksum: %s\n",
checksum(data, h->length) ? "OK" : "Invalid");
@@ -4808,14 +4807,14 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 32: /* 7.33 System Boot Information */
- printf("System Boot Information\n");
+ pr_handle_name("System Boot Information");
if (h->length < 0x0B) break;
printf("\tStatus: %s\n",
dmi_system_boot_status(data[0x0A]));
break;
case 33: /* 7.34 64-bit Memory Error Information */
- printf("64-bit Memory Error Information\n");
+ pr_handle_name("64-bit Memory Error Information");
if (h->length < 0x1F) break;
printf("\tType: %s\n",
dmi_memory_error_type(data[0x04]));
@@ -4838,7 +4837,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 34: /* 7.35 Management Device */
- printf("Management Device\n");
+ pr_handle_name("Management Device");
if (h->length < 0x0B) break;
printf("\tDescription: %s\n",
dmi_string(h, data[0x04]));
@@ -4851,7 +4850,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 35: /* 7.36 Management Device Component */
- printf("Management Device Component\n");
+ pr_handle_name("Management Device Component");
if (h->length < 0x0B) break;
printf("\tDescription: %s\n",
dmi_string(h, data[0x04]));
@@ -4868,7 +4867,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 36: /* 7.37 Management Device Threshold Data */
- printf("Management Device Threshold Data\n");
+ pr_handle_name("Management Device Threshold Data");
if (h->length < 0x10) break;
if (WORD(data + 0x04) != 0x8000)
printf("\tLower Non-critical Threshold: %d\n",
@@ -4891,7 +4890,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 37: /* 7.38 Memory Channel */
- printf("Memory Channel\n");
+ pr_handle_name("Memory Channel");
if (h->length < 0x07) break;
printf("\tType: %s\n",
dmi_memory_channel_type(data[0x04]));
@@ -4908,7 +4907,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
* We use the word "Version" instead of "Revision", conforming to
* the IPMI specification.
*/
- printf("IPMI Device Information\n");
+ pr_handle_name("IPMI Device Information");
if (h->length < 0x10) break;
printf("\tInterface Type: %s\n",
dmi_ipmi_interface_type(data[0x04]));
@@ -4946,7 +4945,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 39: /* 7.40 System Power Supply */
- printf("System Power Supply\n");
+ pr_handle_name("System Power Supply");
if (h->length < 0x10) break;
if (data[0x04] != 0x00)
printf("\tPower Unit Group: %u\n",
@@ -5006,7 +5005,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 41: /* 7.42 Onboard Device Extended Information */
- printf("Onboard Device\n");
+ pr_handle_name("Onboard Device");
if (h->length < 0x0B) break;
printf("\tReference Designation: %s\n", dmi_string(h, data[0x04]));
printf("\tType: %s\n",
@@ -5018,7 +5017,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 42: /* 7.43 Management Controller Host Interface */
- printf("Management Controller Host Interface\n");
+ pr_handle_name("Management Controller Host Interface");
if (ver < 0x0302)
{
if (h->length < 0x05) break;
@@ -5043,7 +5042,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 43: /* 7.44 TPM Device */
- printf("TPM Device\n");
+ pr_handle_name("TPM Device");
if (h->length < 0x1B) break;
printf("\tVendor ID:");
dmi_tpm_vendor_id(data + 0x04);
@@ -5080,11 +5079,11 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
case 126: /* 7.44 Inactive */
- printf("Inactive\n");
+ pr_handle_name("Inactive");
break;
case 127: /* 7.45 End Of Table */
- printf("End Of Table\n");
+ pr_handle_name("End Of Table");
break;
default:
@@ -5092,7 +5091,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
if (opt.flags & FLAG_QUIET)
return;
- printf("%s Type\n",
+ pr_handle_name("%s Type",
h->type >= 128 ? "OEM-specific" : "Unknown");
dmi_dump(h, "\t");
}
diff --git a/dmioem.c b/dmioem.c
index 1a9bd8264fcb..c999c08c4475 100644
--- a/dmioem.c
+++ b/dmioem.c
@@ -25,6 +25,7 @@
#include "types.h"
#include "dmidecode.h"
#include "dmioem.h"
+#include "dmioutput.h"
/*
* Globals for vendor-specific decodes
@@ -92,7 +93,7 @@ static int dmi_decode_acer(const struct dmi_header *h)
* brands, including Fujitsu-Siemens, Medion, Lenovo,
* and eMachines.
*/
- printf("Acer Hotkey Function\n");
+ pr_handle_name("Acer Hotkey Function");
if (h->length < 0x0F) break;
cap = WORD(data + 0x04);
printf("\tFunction bitmap for Communication Button: 0x%04hx\n", cap);
@@ -157,7 +158,7 @@ static int dmi_decode_hp(const struct dmi_header *h)
/*
* Vendor Specific: HPE ProLiant System/Rack Locator
*/
- printf("%s ProLiant System/Rack Locator\n", company);
+ pr_handle_name("%s ProLiant System/Rack Locator", company);
if (h->length < 0x0B) break;
printf("\tRack Name: %s\n", dmi_string(h, data[0x04]));
printf("\tEnclosure Name: %s\n", dmi_string(h, data[0x05]));
@@ -189,10 +190,9 @@ static int dmi_decode_hp(const struct dmi_header *h)
*
* Type 221: is deprecated in the latest docs
*/
- printf("%s %s\n", company,
- h->type == 221 ?
- "BIOS iSCSI NIC PCI and MAC Information" :
- "BIOS PXE NIC PCI and MAC Information");
+ pr_handle_name("%s %s", company, h->type == 221 ?
+ "BIOS iSCSI NIC PCI and MAC Information" :
+ "BIOS PXE NIC PCI and MAC Information");
nic = 1;
ptr = 4;
while (h->length >= ptr + 8)
@@ -224,7 +224,8 @@ static int dmi_decode_hp(const struct dmi_header *h)
* 0x08 | MAC | 32B | MAC addr padded w/ 0s
* 0x28 | Port No| BYTE | Each NIC maps to a Port
*/
- printf("%s BIOS PXE NIC PCI and MAC Information\n", company);
+ pr_handle_name("%s BIOS PXE NIC PCI and MAC Information",
+ company);
if (h->length < 0x0E) break;
/* If the record isn't long enough, we don't have an ID
* use 0xFF to use the internal counter.
@@ -240,7 +241,7 @@ static int dmi_decode_hp(const struct dmi_header *h)
*
* Source: hpwdt kernel driver
*/
- printf("%s 64-bit CRU Information\n", company);
+ pr_handle_name("%s 64-bit CRU Information", company);
if (h->length < 0x18) break;
printf("\tSignature: 0x%08x", DWORD(data + 0x04));
if (is_printable(data + 0x04, 4))
@@ -265,7 +266,7 @@ static int dmi_decode_hp(const struct dmi_header *h)
*
* Source: hpwdt kernel driver
*/
- printf("%s ProLiant Information\n", company);
+ pr_handle_name("%s ProLiant Information", company);
if (h->length < 0x08) break;
printf("\tPower Features: 0x%08x\n", DWORD(data + 0x04));
if (h->length < 0x0C) break;
@@ -318,7 +319,7 @@ static int dmi_decode_ibm_lenovo(const struct dmi_header *h)
|| strcmp(dmi_string(h, 1), "TVT-Enablement") != 0)
return 0;
- printf("ThinkVantage Technologies\n");
+ pr_handle_name("ThinkVantage Technologies");
printf("\tVersion: %u\n", data[0x04]);
printf("\tDiagnostics: %s\n",
data[0x14] & 0x80 ? "Available" : "No");
@@ -357,7 +358,7 @@ static int dmi_decode_ibm_lenovo(const struct dmi_header *h)
if (data[0x06] != 0x07 || data[0x07] != 0x03 || data[0x08] != 0x01)
return 0;
- printf("ThinkPad Device Presence Detection\n");
+ pr_handle_name("ThinkPad Device Presence Detection");
printf("\tFingerprint Reader: %s\n",
data[0x09] & 0x01 ? "Present" : "No");
break;
@@ -390,7 +391,7 @@ static int dmi_decode_ibm_lenovo(const struct dmi_header *h)
if (data[0x0A] != 0x0B || data[0x0B] != 0x07 || data[0x0C] != 0x01)
return 0;
- printf("ThinkPad Embedded Controller Program\n");
+ pr_handle_name("ThinkPad Embedded Controller Program");
printf("\tVersion ID: %s\n", dmi_string(h, 1));
printf("\tRelease Date: %s\n", dmi_string(h, 2));
break;
diff --git a/dmioutput.c b/dmioutput.c
index ad3b0398c446..ca7edab5cc69 100644
--- a/dmioutput.c
+++ b/dmioutput.c
@@ -49,3 +49,13 @@ void pr_handle(const struct dmi_header *h)
printf("Handle 0x%04X, DMI type %d, %d bytes\n",
h->handle, h->type, h->length);
}
+
+void pr_handle_name(const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+ printf("\n");
+}
diff --git a/dmioutput.h b/dmioutput.h
index 6ef60f0ee3cd..0acdce7658c9 100644
--- a/dmioutput.h
+++ b/dmioutput.h
@@ -24,3 +24,4 @@
void pr_comment(const char *format, ...);
void pr_info(const char *format, ...);
void pr_handle(const struct dmi_header *h);
+void pr_handle_name(const char *format, ...);
--
2.17.1

File diff suppressed because it is too large Load Diff

View File

@ -1,727 +0,0 @@
From 5893721859b73354a935135b4aee297bd41a5b1a Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 09:57:56 +0200
Subject: [PATCH 15/23] dmidecode: Add helper functions pr_list_start/item/end
Print lists through helper functions. pr_list_start() starts the
list, with an optional value. pr_list_item() prints a single item.
pr_list_end() is a no-op for plain text output, but is in place in
anticipation of supporting other output formats such as HTML.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 260 +++++++++++++++++++++++++++++-----------------------
dmioutput.c | 35 +++++++
dmioutput.h | 3 +
3 files changed, 184 insertions(+), 114 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 7ab058b61ef0..5a5299ed13ba 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -340,7 +340,7 @@ static void dmi_bios_rom_size(u8 code1, u16 code2)
pr_attr("ROM Size", "%u %s", code2 & 0x3FFF, unit[code2 >> 14]);
}
-static void dmi_bios_characteristics(u64 code, const char *prefix)
+static void dmi_bios_characteristics(u64 code)
{
/* 7.1.1 */
static const char *characteristics[] = {
@@ -381,18 +381,16 @@ static void dmi_bios_characteristics(u64 code, const char *prefix)
*/
if (code.l & (1 << 3))
{
- printf("%s%s\n",
- prefix, characteristics[0]);
+ pr_list_item("%s", characteristics[0]);
return;
}
for (i = 4; i <= 31; i++)
if (code.l & (1 << i))
- printf("%s%s\n",
- prefix, characteristics[i - 3]);
+ pr_list_item("%s", characteristics[i - 3]);
}
-static void dmi_bios_characteristics_x1(u8 code, const char *prefix)
+static void dmi_bios_characteristics_x1(u8 code)
{
/* 7.1.2.1 */
static const char *characteristics[] = {
@@ -409,11 +407,10 @@ static void dmi_bios_characteristics_x1(u8 code, const char *prefix)
for (i = 0; i <= 7; i++)
if (code & (1 << i))
- printf("%s%s\n",
- prefix, characteristics[i]);
+ pr_list_item("%s", characteristics[i]);
}
-static void dmi_bios_characteristics_x2(u8 code, const char *prefix)
+static void dmi_bios_characteristics_x2(u8 code)
{
/* 37.1.2.2 */
static const char *characteristics[] = {
@@ -427,8 +424,7 @@ static void dmi_bios_characteristics_x2(u8 code, const char *prefix)
for (i = 0; i <= 4; i++)
if (code & (1 << i))
- printf("%s%s\n",
- prefix, characteristics[i]);
+ pr_list_item("%s", characteristics[i]);
}
/*
@@ -521,7 +517,7 @@ static const char *dmi_system_wake_up_type(u8 code)
* 7.3 Base Board Information (Type 2)
*/
-static void dmi_base_board_features(u8 code, const char *prefix)
+static void dmi_base_board_features(u8 code)
{
/* 7.3.1 */
static const char *features[] = {
@@ -533,17 +529,17 @@ static void dmi_base_board_features(u8 code, const char *prefix)
};
if ((code & 0x1F) == 0)
- printf(" None\n");
+ pr_list_start("Features", "%s", "None");
else
{
int i;
- printf("\n");
+ pr_list_start("Features", NULL);
for (i = 0; i <= 4; i++)
if (code & (1 << i))
- printf("%s%s\n",
- prefix, features[i]);
+ pr_list_item("%s", features[i]);
}
+ pr_list_end();
}
static const char *dmi_base_board_type(u8 code)
@@ -570,15 +566,14 @@ static const char *dmi_base_board_type(u8 code)
return out_of_spec;
}
-static void dmi_base_board_handles(u8 count, const u8 *p, const char *prefix)
+static void dmi_base_board_handles(u8 count, const u8 *p)
{
int i;
- printf("%sContained Object Handles: %u\n",
- prefix, count);
+ pr_list_start("Contained Object Handles", "%u", count);
for (i = 0; i < count; i++)
- printf("%s\t0x%04X\n",
- prefix, WORD(p + sizeof(u16) * i));
+ pr_list_item("0x%04X", WORD(p + sizeof(u16) * i));
+ pr_list_end();
}
/*
@@ -693,27 +688,29 @@ static void dmi_chassis_power_cords(u8 code)
pr_attr("Number Of Power Cords", "%u", code);
}
-static void dmi_chassis_elements(u8 count, u8 len, const u8 *p, const char *prefix)
+static void dmi_chassis_elements(u8 count, u8 len, const u8 *p)
{
int i;
- printf("%sContained Elements: %u\n",
- prefix, count);
+ pr_list_start("Contained Elements", "%u", count);
for (i = 0; i < count; i++)
{
if (len >= 0x03)
{
- printf("%s\t%s (",
- prefix, p[i * len] & 0x80 ?
+ const char *type;
+
+ type = (p[i * len] & 0x80) ?
dmi_smbios_structure_type(p[i * len] & 0x7F) :
- dmi_base_board_type(p[i * len] & 0x7F));
+ dmi_base_board_type(p[i * len] & 0x7F);
+
if (p[1 + i * len] == p[2 + i * len])
- printf("%u", p[1 + i * len]);
+ pr_list_item("%s (%u)", type, p[1 + i * len]);
else
- printf("%u-%u", p[1 + i * len], p[2 + i * len]);
- printf(")\n");
+ pr_list_item("%s (%u-%u)", type, p[1 + i * len],
+ p[2 + i * len]);
}
}
+ pr_list_end();
}
/*
@@ -1033,7 +1030,7 @@ static const char *dmi_processor_family(const struct dmi_header *h, u16 ver)
}
}
-static void dmi_processor_id(const struct dmi_header *h, const char *prefix)
+static void dmi_processor_id(const struct dmi_header *h)
{
/* Intel AP-485 revision 36, table 2-4 */
static const char *flags[32] = {
@@ -1203,18 +1200,18 @@ static void dmi_processor_id(const struct dmi_header *h, const char *prefix)
}
edx = DWORD(p + 4);
- printf("%sFlags:", prefix);
if ((edx & 0xBFEFFBFF) == 0)
- printf(" None\n");
+ pr_list_start("Flags", "None");
else
{
int i;
- printf("\n");
+ pr_list_start("Flags", NULL);
for (i = 0; i <= 31; i++)
if (flags[i] != NULL && edx & (1 << i))
- printf("%s\t%s\n", prefix, flags[i]);
+ pr_list_item("%s", flags[i]);
}
+ pr_list_end();
}
static void dmi_processor_voltage(const char *attr, u8 code)
@@ -1373,7 +1370,7 @@ static void dmi_processor_cache(const char *attr, u16 code, const char *level,
pr_attr(attr, "0x%04X", code);
}
-static void dmi_processor_characteristics(u16 code, const char *prefix)
+static void dmi_processor_characteristics(const char *attr, u16 code)
{
/* 7.5.9 */
static const char *characteristics[] = {
@@ -1386,15 +1383,16 @@ static void dmi_processor_characteristics(u16 code, const char *prefix)
};
if ((code & 0x00FC) == 0)
- printf(" None\n");
+ pr_attr(attr, "None");
else
{
int i;
- printf("\n");
+ pr_list_start(attr, NULL);
for (i = 2; i <= 7; i++)
if (code & (1 << i))
- printf("%s%s\n", prefix, characteristics[i - 2]);
+ pr_list_item("%s", characteristics[i - 2]);
+ pr_list_end();
}
}
@@ -1421,7 +1419,7 @@ static const char *dmi_memory_controller_ed_method(u8 code)
return out_of_spec;
}
-static void dmi_memory_controller_ec_capabilities(u8 code, const char *prefix)
+static void dmi_memory_controller_ec_capabilities(const char *attr, u8 code)
{
/* 7.6.2 */
static const char *capabilities[] = {
@@ -1434,15 +1432,16 @@ static void dmi_memory_controller_ec_capabilities(u8 code, const char *prefix)
};
if ((code & 0x3F) == 0)
- printf(" None\n");
+ pr_attr(attr, "None");
else
{
int i;
- printf("\n");
+ pr_list_start(attr, NULL);
for (i = 0; i <= 5; i++)
if (code & (1 << i))
- printf("%s%s\n", prefix, capabilities[i]);
+ pr_list_item("%s", capabilities[i]);
+ pr_list_end();
}
}
@@ -1464,7 +1463,7 @@ static const char *dmi_memory_controller_interleave(u8 code)
return out_of_spec;
}
-static void dmi_memory_controller_speeds(u16 code, const char *prefix)
+static void dmi_memory_controller_speeds(const char *attr, u16 code)
{
/* 7.6.4 */
const char *speeds[] = {
@@ -1476,34 +1475,34 @@ static void dmi_memory_controller_speeds(u16 code, const char *prefix)
};
if ((code & 0x001F) == 0)
- printf(" None\n");
+ pr_attr(attr, "None");
else
{
int i;
- printf("\n");
+ pr_list_start(attr, NULL);
for (i = 0; i <= 4; i++)
if (code & (1 << i))
- printf("%s%s\n", prefix, speeds[i]);
+ pr_list_item("%s", speeds[i]);
+ pr_list_end();
}
}
-static void dmi_memory_controller_slots(u8 count, const u8 *p, const char *prefix)
+static void dmi_memory_controller_slots(u8 count, const u8 *p)
{
int i;
- printf("%sAssociated Memory Slots: %u\n",
- prefix, count);
+ pr_list_start("Associated Memory Slots", "%u", count);
for (i = 0; i < count; i++)
- printf("%s\t0x%04X\n",
- prefix, WORD(p + sizeof(u16) * i));
+ pr_list_item("0x%04X", WORD(p + sizeof(u16) * i));
+ pr_list_end();
}
/*
* 7.7 Memory Module Information (Type 6)
*/
-static void dmi_memory_module_types(u16 code, const char *sep)
+static void dmi_memory_module_types(const char *attr, u16 code, int flat)
{
/* 7.7.1 */
static const char *types[] = {
@@ -1521,14 +1520,34 @@ static void dmi_memory_module_types(u16 code, const char *sep)
};
if ((code & 0x07FF) == 0)
- printf(" None");
+ pr_attr(attr, "None");
+ else if (flat)
+ {
+ char type_str[68];
+ int i, off = 0;
+
+ for (i = 0; i <= 10; i++)
+ {
+ if (code & (1 << i))
+ {
+ /* Insert space if not the first value */
+ off += sprintf(type_str + off,
+ off ? " %s" :"%s",
+ types[i]);
+ }
+ }
+ if (off)
+ pr_attr(attr, type_str);
+ }
else
{
int i;
+ pr_list_start(attr, NULL);
for (i = 0; i <= 10; i++)
if (code & (1 << i))
- printf("%s%s", sep, types[i]);
+ pr_list_item("%s", types[i]);
+ pr_list_end();
}
}
@@ -1649,7 +1668,7 @@ static void dmi_cache_size(const char *attr, u16 code)
(((u32)code & 0x8000LU) << 16) | (code & 0x7FFFLU));
}
-static void dmi_cache_types(u16 code, const char *sep)
+static void dmi_cache_types(const char *attr, u16 code, int flat)
{
/* 7.8.2 */
static const char *types[] = {
@@ -1663,14 +1682,34 @@ static void dmi_cache_types(u16 code, const char *sep)
};
if ((code & 0x007F) == 0)
- printf(" None");
+ pr_attr(attr, "None");
+ else if (flat)
+ {
+ char type_str[70];
+ int i, off = 0;
+
+ for (i = 0; i <= 6; i++)
+ {
+ if (code & (1 << i))
+ {
+ /* Insert space if not the first value */
+ off += sprintf(type_str + off,
+ off ? " %s" :"%s",
+ types[i]);
+ }
+ }
+ if (off)
+ pr_attr(attr, type_str);
+ }
else
{
int i;
+ pr_list_start(attr, NULL);
for (i = 0; i <= 6; i++)
if (code & (1 << i))
- printf("%s%s", sep, types[i]);
+ pr_list_item("%s", types[i]);
+ pr_list_end();
}
}
@@ -2053,7 +2092,7 @@ static void dmi_slot_id(u8 code1, u8 code2, u8 type)
}
}
-static void dmi_slot_characteristics(u8 code1, u8 code2, const char *prefix)
+static void dmi_slot_characteristics(const char *attr, u8 code1, u8 code2)
{
/* 7.10.6 */
static const char *characteristics1[] = {
@@ -2074,20 +2113,21 @@ static void dmi_slot_characteristics(u8 code1, u8 code2, const char *prefix)
};
if (code1 & (1 << 0))
- printf(" Unknown\n");
+ pr_attr(attr, "Unknown");
else if ((code1 & 0xFE) == 0 && (code2 & 0x07) == 0)
- printf(" None\n");
+ pr_attr(attr, "None");
else
{
int i;
- printf("\n");
+ pr_list_start(attr, NULL);
for (i = 1; i <= 7; i++)
if (code1 & (1 << i))
- printf("%s%s\n", prefix, characteristics1[i - 1]);
+ pr_list_item("%s", characteristics1[i - 1]);
for (i = 0; i <= 3; i++)
if (code2 & (1 << i))
- printf("%s%s\n", prefix, characteristics2[i]);
+ pr_list_item("%s", characteristics2[i]);
+ pr_list_end();
}
}
@@ -2199,15 +2239,14 @@ static void dmi_system_configuration_options(const struct dmi_header *h)
* 7.14 BIOS Language Information (Type 13)
*/
-static void dmi_bios_languages(const struct dmi_header *h, const char *prefix)
+static void dmi_bios_languages(const struct dmi_header *h)
{
u8 *p = h->data + 4;
u8 count = p[0x00];
int i;
for (i = 1; i <= count; i++)
- printf("%s%s\n",
- prefix, dmi_string(h, i));
+ pr_list_item("%s", dmi_string(h, i));
}
static const char *dmi_bios_language_format(u8 code)
@@ -2222,14 +2261,14 @@ static const char *dmi_bios_language_format(u8 code)
* 7.15 Group Associations (Type 14)
*/
-static void dmi_group_associations_items(u8 count, const u8 *p, const char *prefix)
+static void dmi_group_associations_items(u8 count, const u8 *p)
{
int i;
for (i = 0; i < count; i++)
{
- printf("%s0x%04X (%s)\n",
- prefix, WORD(p + 3 * i + 1),
+ pr_list_item("0x%04X (%s)",
+ WORD(p + 3 * i + 1),
dmi_smbios_structure_type(p[3 * i]));
}
}
@@ -3936,7 +3975,7 @@ static void dmi_tpm_vendor_id(const u8 *p)
pr_attr("Vendor ID", "%s", vendor_id);
}
-static void dmi_tpm_characteristics(u64 code, const char *prefix)
+static void dmi_tpm_characteristics(u64 code)
{
/* 7.1.1 */
static const char *characteristics[] = {
@@ -3952,15 +3991,13 @@ static void dmi_tpm_characteristics(u64 code, const char *prefix)
*/
if (code.l & (1 << 2))
{
- printf("%s%s\n",
- prefix, characteristics[0]);
+ pr_list_item("%s", characteristics[0]);
return;
}
for (i = 3; i <= 5; i++)
if (code.l & (1 << i))
- printf("%s%s\n",
- prefix, characteristics[i - 2]);
+ pr_list_item("%s", characteristics[i - 2]);
}
/*
@@ -3997,12 +4034,13 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
dmi_bios_runtime_size((0x10000 - WORD(data + 0x06)) << 4);
}
dmi_bios_rom_size(data[0x09], h->length < 0x1A ? 16 : WORD(data + 0x18));
- printf("\tCharacteristics:\n");
- dmi_bios_characteristics(QWORD(data + 0x0A), "\t\t");
+ pr_list_start("Characteristics", NULL);
+ dmi_bios_characteristics(QWORD(data + 0x0A));
+ pr_list_end();
if (h->length < 0x13) break;
- dmi_bios_characteristics_x1(data[0x12], "\t\t");
+ dmi_bios_characteristics_x1(data[0x12]);
if (h->length < 0x14) break;
- dmi_bios_characteristics_x2(data[0x13], "\t\t");
+ dmi_bios_characteristics_x2(data[0x13]);
if (h->length < 0x18) break;
if (data[0x14] != 0xFF && data[0x15] != 0xFF)
pr_attr("BIOS Revision", "%u.%u",
@@ -4049,8 +4087,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
pr_attr("Asset Tag", "%s",
dmi_string(h, data[0x08]));
if (h->length < 0x0A) break;
- printf("\tFeatures:");
- dmi_base_board_features(data[0x09], "\t\t");
+ dmi_base_board_features(data[0x09]);
if (h->length < 0x0E) break;
pr_attr("Location In Chassis", "%s",
dmi_string(h, data[0x0A]));
@@ -4062,7 +4099,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
if (h->length < 0x0F) break;
if (h->length < 0x0F + data[0x0E] * sizeof(u16)) break;
if (!(opt.flags & FLAG_QUIET))
- dmi_base_board_handles(data[0x0E], data + 0x0F, "\t");
+ dmi_base_board_handles(data[0x0E], data + 0x0F);
break;
case 3: /* 7.4 Chassis Information */
@@ -4097,7 +4134,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
dmi_chassis_power_cords(data[0x12]);
if (h->length < 0x15) break;
if (h->length < 0x15 + data[0x13] * data[0x14]) break;
- dmi_chassis_elements(data[0x13], data[0x14], data + 0x15, "\t");
+ dmi_chassis_elements(data[0x13], data[0x14], data + 0x15);
if (h->length < 0x16 + data[0x13] * data[0x14]) break;
pr_attr("SKU Number", "%s",
dmi_string(h, data[0x15 + data[0x13] * data[0x14]]));
@@ -4114,7 +4151,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
dmi_processor_family(h, ver));
pr_attr("Manufacturer", "%s",
dmi_string(h, data[0x07]));
- dmi_processor_id(h, "\t");
+ dmi_processor_id(h);
pr_attr("Version", "%s",
dmi_string(h, data[0x10]));
dmi_processor_voltage("Voltage", data[0x11]);
@@ -4158,8 +4195,8 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
pr_attr("Thread Count", "%u",
h->length >= 0x30 && data[0x25] == 0xFF ?
WORD(data + 0x2E) : data[0x25]);
- printf("\tCharacteristics:");
- dmi_processor_characteristics(WORD(data + 0x26), "\t\t");
+ dmi_processor_characteristics("Characteristics",
+ WORD(data + 0x26));
break;
case 5: /* 7.6 Memory Controller Information */
@@ -4167,8 +4204,8 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
if (h->length < 0x0F) break;
pr_attr("Error Detecting Method", "%s",
dmi_memory_controller_ed_method(data[0x04]));
- printf("\tError Correcting Capabilities:");
- dmi_memory_controller_ec_capabilities(data[0x05], "\t\t");
+ dmi_memory_controller_ec_capabilities("Error Correcting Capabilities",
+ data[0x05]);
pr_attr("Supported Interleave", "%s",
dmi_memory_controller_interleave(data[0x06]));
pr_attr("Current Interleave", "%s",
@@ -4177,17 +4214,16 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
1 << data[0x08]);
pr_attr("Maximum Total Memory Size", "%u MB",
data[0x0E] * (1 << data[0x08]));
- printf("\tSupported Speeds:");
- dmi_memory_controller_speeds(WORD(data + 0x09), "\t\t");
- printf("\tSupported Memory Types:");
- dmi_memory_module_types(WORD(data + 0x0B), "\n\t\t");
- printf("\n");
+ dmi_memory_controller_speeds("Supported Speeds",
+ WORD(data + 0x09));
+ dmi_memory_module_types("Supported Memory Types",
+ WORD(data + 0x0B), 0);
dmi_processor_voltage("Memory Module Voltage", data[0x0D]);
if (h->length < 0x0F + data[0x0E] * sizeof(u16)) break;
- dmi_memory_controller_slots(data[0x0E], data + 0x0F, "\t");
+ dmi_memory_controller_slots(data[0x0E], data + 0x0F);
if (h->length < 0x10 + data[0x0E] * sizeof(u16)) break;
- printf("\tEnabled Error Correcting Capabilities:");
- dmi_memory_controller_ec_capabilities(data[0x0F + data[0x0E] * sizeof(u16)], "\t\t");
+ dmi_memory_controller_ec_capabilities("Enabled Error Correcting Capabilities",
+ data[0x0F + data[0x0E] * sizeof(u16)]);
break;
case 6: /* 7.7 Memory Module Information */
@@ -4197,9 +4233,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
dmi_string(h, data[0x04]));
dmi_memory_module_connections(data[0x05]);
dmi_memory_module_speed("Current Speed", data[0x06]);
- printf("\tType:");
- dmi_memory_module_types(WORD(data + 0x07), " ");
- printf("\n");
+ dmi_memory_module_types("Type", WORD(data + 0x07), 1);
dmi_memory_module_size("Installed Size", data[0x09]);
dmi_memory_module_size("Enabled Size", data[0x0A]);
dmi_memory_module_error(data[0x0B]);
@@ -4226,12 +4260,8 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
dmi_cache_size_2("Maximum Size", DWORD(data + 0x13));
else
dmi_cache_size("Maximum Size", WORD(data + 0x07));
- printf("\tSupported SRAM Types:");
- dmi_cache_types(WORD(data + 0x0B), "\n\t\t");
- printf("\n");
- printf("\tInstalled SRAM Type:");
- dmi_cache_types(WORD(data + 0x0D), " ");
- printf("\n");
+ dmi_cache_types("Supported SRAM Types", WORD(data + 0x0B), 0);
+ dmi_cache_types("Installed SRAM Type", WORD(data + 0x0D), 1);
if (h->length < 0x13) break;
dmi_memory_module_speed("Speed", data[0x0F]);
pr_attr("Error Correction Type", "%s",
@@ -4270,11 +4300,10 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
pr_attr("Length", "%s",
dmi_slot_length(data[0x08]));
dmi_slot_id(data[0x09], data[0x0A], data[0x05]);
- printf("\tCharacteristics:");
if (h->length < 0x0D)
- dmi_slot_characteristics(data[0x0B], 0x00, "\t\t");
+ dmi_slot_characteristics("Characteristics", data[0x0B], 0x00);
else
- dmi_slot_characteristics(data[0x0B], data[0x0C], "\t\t");
+ dmi_slot_characteristics("Characteristics", data[0x0B], data[0x0C]);
if (h->length < 0x11) break;
dmi_slot_segment_bus_func(WORD(data + 0x0D), data[0x0F], data[0x10]);
if (h->length < 0x13) break;
@@ -4308,8 +4337,9 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
pr_attr("Language Description Format", "%s",
dmi_bios_language_format(data[0x05]));
}
- printf("\tInstallable Languages: %u\n", data[0x04]);
- dmi_bios_languages(h, "\t\t");
+ pr_list_start("Installable Languages", "%u", data[0x04]);
+ dmi_bios_languages(h);
+ pr_list_end();
pr_attr("Currently Installed Language", "%s",
dmi_string(h, data[0x15]));
break;
@@ -4319,9 +4349,10 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
if (h->length < 0x05) break;
pr_attr("Name", "%s",
dmi_string(h, data[0x04]));
- printf("\tItems: %u\n",
+ pr_list_start("Items", "%u",
(h->length - 0x05) / 3);
- dmi_group_associations_items((h->length - 0x05) / 3, data + 0x05, "\t\t");
+ dmi_group_associations_items((h->length - 0x05) / 3, data + 0x05);
+ pr_list_end();
break;
case 15: /* 7.16 System Event Log */
@@ -5002,8 +5033,9 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
break;
}
pr_attr("Description", "%s", dmi_string(h, data[0x12]));
- printf("\tCharacteristics:\n");
- dmi_tpm_characteristics(QWORD(data + 0x13), "\t\t");
+ pr_list_start("Characteristics", NULL);
+ dmi_tpm_characteristics(QWORD(data + 0x13));
+ pr_list_end();
if (h->length < 0x1F) break;
pr_attr("OEM-specific Information", "0x%08X",
DWORD(data + 0x1B));
diff --git a/dmioutput.c b/dmioutput.c
index 2330b65755c9..4c8a32a3569a 100644
--- a/dmioutput.c
+++ b/dmioutput.c
@@ -71,3 +71,38 @@ void pr_attr(const char *name, const char *format, ...)
va_end(args);
printf("\n");
}
+
+void pr_list_start(const char *name, const char *format, ...)
+{
+ va_list args;
+
+ printf("\t%s:", name);
+
+ /* format is optional, skip value if not provided */
+ if (format)
+ {
+ printf(" ");
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+ }
+ printf("\n");
+
+}
+
+void pr_list_item(const char *format, ...)
+{
+ va_list args;
+
+ printf("\t\t");
+
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+ printf("\n");
+}
+
+void pr_list_end(void)
+{
+ /* a no-op for text output */
+}
diff --git a/dmioutput.h b/dmioutput.h
index 981dcb45f26a..33f09c4452bb 100644
--- a/dmioutput.h
+++ b/dmioutput.h
@@ -26,3 +26,6 @@ void pr_info(const char *format, ...);
void pr_handle(const struct dmi_header *h);
void pr_handle_name(const char *format, ...);
void pr_attr(const char *name, const char *format, ...);
+void pr_list_start(const char *name, const char *format, ...);
+void pr_list_item(const char *format, ...);
+void pr_list_end(void);
--
2.17.1

View File

@ -1,307 +0,0 @@
From 20d50c70b98d2a7013b604d575656a098d294f7f Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 10:00:27 +0200
Subject: [PATCH 16/23] dmidecode: Add helper function pr_subattr
Print all second-level attributes through a helper function pr_subattr.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 68 ++++++++++++++++++++++++++++-------------------------
dmioem.c | 12 +++++-----
dmioutput.c | 12 ++++++++++
dmioutput.h | 1 +
4 files changed, 55 insertions(+), 38 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 5a5299ed13ba..3d1da955bab8 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -431,7 +431,8 @@ static void dmi_bios_characteristics_x2(u8 code)
* 7.2 System Information (Type 1)
*/
-static void dmi_system_uuid(const char *attr, const u8 *p, u16 ver)
+static void dmi_system_uuid(void (*print_cb)(const char *name, const char *format, ...),
+ const char *attr, const u8 *p, u16 ver)
{
int only0xFF = 1, only0x00 = 1;
int i;
@@ -444,16 +445,16 @@ static void dmi_system_uuid(const char *attr, const u8 *p, u16 ver)
if (only0xFF)
{
- if (attr)
- pr_attr(attr, "Not Present");
+ if (print_cb)
+ print_cb(attr, "Not Present");
else
printf("Not Present\n");
return;
}
if (only0x00)
{
- if (attr)
- pr_attr(attr, "Not Settable");
+ if (print_cb)
+ print_cb(attr, "Not Settable");
else
printf("Not Settable\n");
return;
@@ -469,8 +470,8 @@ static void dmi_system_uuid(const char *attr, const u8 *p, u16 ver)
*/
if (ver >= 0x0206)
{
- if (attr)
- pr_attr(attr,
+ if (print_cb)
+ print_cb(attr,
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
p[3], p[2], p[1], p[0], p[5], p[4], p[7], p[6],
p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
@@ -481,8 +482,8 @@ static void dmi_system_uuid(const char *attr, const u8 *p, u16 ver)
}
else
{
- if (attr)
- pr_attr(attr,
+ if (print_cb)
+ print_cb(attr,
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
@@ -3655,7 +3656,7 @@ static const char *dmi_address_decode(u8 *data, char *storage, u8 addrtype)
/*
* DSP0270: 8.5: Parse the protocol record format
*/
-static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
+static void dmi_parse_protocol_record(u8 *rec)
{
u8 rid;
u8 rlen;
@@ -3666,6 +3667,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
u8 hlen;
const char *addrstr;
const char *hname;
+ char attr[38];
/* DSP0270: 8.5: Protocol Identifier */
rid = rec[0x0];
@@ -3674,7 +3676,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
/* DSP0270: 8.5: Protocol Record Data */
rdata = &rec[0x2];
- printf("%sProtocol ID: %02x (%s)\n", prefix, rid,
+ pr_attr("Protocol ID", "%02x (%s)", rid,
dmi_protocol_record_type(rid));
/*
@@ -3704,8 +3706,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
* endianess of the field is always little after version 2.6.0
* we can just pick a sufficiently recent version here.
*/
- printf("%s\tService UUID: ", prefix);
- dmi_system_uuid(NULL, &rdata[0], 0x311); /* FIXME */
+ dmi_system_uuid(pr_subattr, "Service UUID", &rdata[0], 0x311);
/*
* DSP0270: 8.6: Redfish Over IP Host IP Assignment Type
@@ -3713,13 +3714,13 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
* uses decimal, so as to make it more comparable
*/
assign_val = rdata[16];
- printf("%s\tHost IP Assignment Type: %s\n", prefix,
+ pr_subattr("Host IP Assignment Type", "%s",
dmi_protocol_assignment_type(assign_val));
/* DSP0270: 8.6: Redfish Over IP Host Address format */
addrtype = rdata[17];
addrstr = dmi_address_type(addrtype);
- printf("%s\tHost IP Address Format: %s\n", prefix,
+ pr_subattr("Host IP Address Format", "%s",
addrstr);
/* DSP0270: 8.6 IP Assignment types */
@@ -3727,24 +3728,26 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
if (assign_val == 0x1 || assign_val == 0x3)
{
/* DSP0270: 8.6: the Host IPv[4|6] Address */
- printf("%s\t%s Address: %s\n", prefix, addrstr,
+ sprintf(attr, "%s Address", addrstr);
+ pr_subattr(attr, "%s",
dmi_address_decode(&rdata[18], buf, addrtype));
/* DSP0270: 8.6: Prints the Host IPv[4|6] Mask */
- printf("%s\t%s Mask: %s\n", prefix, addrstr,
+ sprintf(attr, "%s Mask", addrstr);
+ pr_subattr(attr, "%s",
dmi_address_decode(&rdata[34], buf, addrtype));
}
/* DSP0270: 8.6: Get the Redfish Service IP Discovery Type */
assign_val = rdata[50];
/* Redfish Service IP Discovery type mirrors Host IP Assignment type */
- printf("%s\tRedfish Service IP Discovery Type: %s\n", prefix,
+ pr_subattr("Redfish Service IP Discovery Type", "%s",
dmi_protocol_assignment_type(assign_val));
/* DSP0270: 8.6: Get the Redfish Service IP Address Format */
addrtype = rdata[51];
addrstr = dmi_address_type(addrtype);
- printf("%s\tRedfish Service IP Address Format: %s\n", prefix,
+ pr_subattr("Redfish Service IP Address Format", "%s",
addrstr);
if (assign_val == 0x1 || assign_val == 0x3)
@@ -3753,20 +3756,22 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
u32 vlan;
/* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Address */
- printf("%s\t%s Redfish Service Address: %s\n", prefix,
- addrstr, dmi_address_decode(&rdata[52], buf,
+ sprintf(attr, "%s Redfish Service Address", addrstr);
+ pr_subattr(attr, "%s",
+ dmi_address_decode(&rdata[52], buf,
addrtype));
/* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Mask */
- printf("%s\t%s Redfish Service Mask: %s\n", prefix,
- addrstr, dmi_address_decode(&rdata[68], buf,
+ sprintf(attr, "%s Redfish Service Mask", addrstr);
+ pr_subattr(attr, "%s",
+ dmi_address_decode(&rdata[68], buf,
addrtype));
/* DSP0270: 8.6: Redfish vlan and port info */
port = WORD(&rdata[84]);
vlan = DWORD(&rdata[86]);
- printf("%s\tRedfish Service Port: %hu\n", prefix, port);
- printf("%s\tRedfish Service Vlan: %u\n", prefix, vlan);
+ pr_subattr("Redfish Service Port", "%hu", port);
+ pr_subattr("Redfish Service Vlan", "%u", vlan);
}
/* DSP0270: 8.6: Redfish host length and name */
@@ -3783,7 +3788,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
hname = out_of_spec;
hlen = strlen(out_of_spec);
}
- printf("%s\tRedfish Service Hostname: %.*s\n", prefix, hlen, hname);
+ pr_subattr("Redfish Service Hostname", "%.*s", hlen, hname);
}
/*
@@ -3803,8 +3808,7 @@ static const char *dmi_parse_device_type(u8 type)
return out_of_spec;
}
-static void dmi_parse_controller_structure(const struct dmi_header *h,
- const char *prefix)
+static void dmi_parse_controller_structure(const struct dmi_header *h)
{
int i;
u8 *data = h->data;
@@ -3936,7 +3940,7 @@ static void dmi_parse_controller_structure(const struct dmi_header *h,
return;
}
- dmi_parse_protocol_record(prefix, rec);
+ dmi_parse_protocol_record(rec);
/*
* DSP0270: 8.6
@@ -4062,7 +4066,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
pr_attr("Serial Number", "%s",
dmi_string(h, data[0x07]));
if (h->length < 0x19) break;
- dmi_system_uuid("UUID", data + 0x08, ver);
+ dmi_system_uuid(pr_attr, "UUID", data + 0x08, ver);
pr_attr("Wake-up Type", "%s",
dmi_system_wake_up_type(data[0x18]));
if (h->length < 0x1B) break;
@@ -5002,7 +5006,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
}
}
else
- dmi_parse_controller_structure(h, "\t");
+ dmi_parse_controller_structure(h);
break;
case 43: /* 7.44 TPM Device */
@@ -5104,7 +5108,7 @@ static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver
printf("%u.%u\n", data[key - 1], data[key]);
break;
case 0x108:
- dmi_system_uuid(NULL, data + offset, ver);
+ dmi_system_uuid(NULL, NULL, data + offset, ver);
break;
case 0x305:
printf("%s\n", dmi_chassis_type(data[offset]));
diff --git a/dmioem.c b/dmioem.c
index 873ec1068c16..9d6ec7520287 100644
--- a/dmioem.c
+++ b/dmioem.c
@@ -97,10 +97,10 @@ static int dmi_decode_acer(const struct dmi_header *h)
if (h->length < 0x0F) break;
cap = WORD(data + 0x04);
pr_attr("Function bitmap for Communication Button", "0x%04hx", cap);
- printf("\t\tWiFi: %s\n", cap & 0x0001 ? "Yes" : "No");
- printf("\t\t3G: %s\n", cap & 0x0040 ? "Yes" : "No");
- printf("\t\tWiMAX: %s\n", cap & 0x0080 ? "Yes" : "No");
- printf("\t\tBluetooth: %s\n", cap & 0x0800 ? "Yes" : "No");
+ pr_subattr("WiFi", "%s", cap & 0x0001 ? "Yes" : "No");
+ pr_subattr("3G", "%s", cap & 0x0040 ? "Yes" : "No");
+ pr_subattr("WiMAX", "%s", cap & 0x0080 ? "Yes" : "No");
+ pr_subattr("Bluetooth", "%s", cap & 0x0800 ? "Yes" : "No");
pr_attr("Function bitmap for Application Button", "0x%04hx", WORD(data + 0x06));
pr_attr("Function bitmap for Media Button", "0x%04hx", WORD(data + 0x08));
pr_attr("Function bitmap for Display Button", "0x%04hx", WORD(data + 0x0A));
@@ -278,8 +278,8 @@ static int dmi_decode_hp(const struct dmi_header *h)
if (h->length < 0x14) break;
feat = DWORD(data + 0x10);
pr_attr("Misc. Features", "0x%08x", feat);
- printf("\t\tiCRU: %s\n", feat & 0x0001 ? "Yes" : "No");
- printf("\t\tUEFI: %s\n", feat & 0x1400 ? "Yes" : "No");
+ pr_subattr("iCRU", "%s", feat & 0x0001 ? "Yes" : "No");
+ pr_subattr("UEFI", "%s", feat & 0x1400 ? "Yes" : "No");
break;
default:
diff --git a/dmioutput.c b/dmioutput.c
index 4c8a32a3569a..da04450494f7 100644
--- a/dmioutput.c
+++ b/dmioutput.c
@@ -72,6 +72,18 @@ void pr_attr(const char *name, const char *format, ...)
printf("\n");
}
+void pr_subattr(const char *name, const char *format, ...)
+{
+ va_list args;
+
+ printf("\t\t%s: ", name);
+
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+ printf("\n");
+}
+
void pr_list_start(const char *name, const char *format, ...)
{
va_list args;
diff --git a/dmioutput.h b/dmioutput.h
index 33f09c4452bb..58ca5a854a79 100644
--- a/dmioutput.h
+++ b/dmioutput.h
@@ -26,6 +26,7 @@ void pr_info(const char *format, ...);
void pr_handle(const struct dmi_header *h);
void pr_handle_name(const char *format, ...);
void pr_attr(const char *name, const char *format, ...);
+void pr_subattr(const char *name, const char *format, ...);
void pr_list_start(const char *name, const char *format, ...);
void pr_list_item(const char *format, ...);
void pr_list_end(void);
--
2.17.1

View File

@ -1,95 +0,0 @@
From da06888d08b9f1108fe89560c06d39675c10cd95 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 10:00:30 +0200
Subject: [PATCH 17/23] dmidecode: Use the print helpers in dump mode too
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 3d1da955bab8..5e9b9899ec1f 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -220,43 +220,49 @@ static int dmi_bcd_range(u8 value, u8 low, u8 high)
return 1;
}
-static void dmi_dump(const struct dmi_header *h, const char *prefix)
+static void dmi_dump(const struct dmi_header *h)
{
+ static char raw_data[48];
int row, i;
+ unsigned int off;
char *s;
- printf("%sHeader and Data:\n", prefix);
+ pr_list_start("Header and Data", NULL);
for (row = 0; row < ((h->length - 1) >> 4) + 1; row++)
{
- printf("%s\t", prefix);
+ off = 0;
for (i = 0; i < 16 && i < h->length - (row << 4); i++)
- printf("%s%02X", i ? " " : "",
+ off += sprintf(raw_data + off, i ? " %02X" : "%02X",
(h->data)[(row << 4) + i]);
- printf("\n");
+ pr_list_item(raw_data);
}
+ pr_list_end();
if ((h->data)[h->length] || (h->data)[h->length + 1])
{
- printf("%sStrings:\n", prefix);
+ pr_list_start("Strings", NULL);
i = 1;
while ((s = _dmi_string(h, i++, !(opt.flags & FLAG_DUMP))))
{
if (opt.flags & FLAG_DUMP)
{
int j, l = strlen(s) + 1;
+
+ off = 0;
for (row = 0; row < ((l - 1) >> 4) + 1; row++)
{
- printf("%s\t", prefix);
for (j = 0; j < 16 && j < l - (row << 4); j++)
- printf("%s%02X", j ? " " : "",
+ off += sprintf(raw_data + off,
+ j ? " %02X" : "%02X",
(unsigned char)s[(row << 4) + j]);
- printf("\n");
+ pr_list_item(raw_data);
}
/* String isn't filtered yet so do it now */
ascii_filter(s, l - 1);
}
- printf("%s\t%s\n", prefix, s);
+ pr_list_item("%s", s);
}
+ pr_list_end();
}
}
@@ -5060,7 +5066,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
return;
pr_handle_name("%s Type",
h->type >= 128 ? "OEM-specific" : "Unknown");
- dmi_dump(h, "\t");
+ dmi_dump(h);
}
printf("\n");
}
@@ -5206,7 +5212,7 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags)
{
if (opt.flags & FLAG_DUMP)
{
- dmi_dump(&h, "\t");
+ dmi_dump(&h);
printf("\n");
}
else
--
2.17.1

View File

@ -1,80 +0,0 @@
From 9c7db76f373a1d25e52177b81e97bb9e0f9c32b5 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 10:00:33 +0200
Subject: [PATCH 18/23] dmidecode: Add helper function for separators
A simple helper function to print a blank line between records.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 9 +++++----
dmioutput.c | 5 +++++
dmioutput.h | 1 +
3 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 5e9b9899ec1f..3551637e7b16 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -5068,7 +5068,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
h->type >= 128 ? "OEM-specific" : "Unknown");
dmi_dump(h);
}
- printf("\n");
+ pr_sep();
}
static void to_dmi_header(struct dmi_header *h, u8 *data)
@@ -5195,7 +5195,8 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags)
if ((unsigned long)(next - buf) > len)
{
if (display && !(opt.flags & FLAG_QUIET))
- printf("\t<TRUNCATED>\n\n");
+ printf("\t<TRUNCATED>\n");
+ pr_sep();
data = next;
break;
}
@@ -5213,7 +5214,7 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags)
if (opt.flags & FLAG_DUMP)
{
dmi_dump(&h);
- printf("\n");
+ pr_sep();
}
else
dmi_decode(&h, ver);
@@ -5271,7 +5272,7 @@ static void dmi_table(off_t base, u32 len, u16 num, u32 ver, const char *devmem,
pr_info("Table at 0x%08llX.",
(unsigned long long)base);
}
- printf("\n");
+ pr_sep();
}
if ((flags & FLAG_NO_FILE_OFFSET) || (opt.flags & FLAG_FROM_DUMP))
diff --git a/dmioutput.c b/dmioutput.c
index da04450494f7..ef1c41b2f94e 100644
--- a/dmioutput.c
+++ b/dmioutput.c
@@ -118,3 +118,8 @@ void pr_list_end(void)
{
/* a no-op for text output */
}
+
+void pr_sep(void)
+{
+ printf("\n");
+}
diff --git a/dmioutput.h b/dmioutput.h
index 58ca5a854a79..6b5f0e0e92c5 100644
--- a/dmioutput.h
+++ b/dmioutput.h
@@ -30,3 +30,4 @@ void pr_subattr(const char *name, const char *format, ...);
void pr_list_start(const char *name, const char *format, ...);
void pr_list_item(const char *format, ...);
void pr_list_end(void);
+void pr_sep(void);
--
2.17.1

View File

@ -1,60 +0,0 @@
From 25e63d7757f77a15704175c00193753be4176797 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 10:00:36 +0200
Subject: [PATCH 19/23] dmidecode: Add helper function for structure errors
Add a helper function to print structure errors, specifically for
structures which do not fit in the table.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
dmidecode.c | 2 +-
dmioutput.c | 12 ++++++++++++
dmioutput.h | 1 +
3 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/dmidecode.c b/dmidecode.c
index 3551637e7b16..59f4fe09e642 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -5195,7 +5195,7 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags)
if ((unsigned long)(next - buf) > len)
{
if (display && !(opt.flags & FLAG_QUIET))
- printf("\t<TRUNCATED>\n");
+ pr_struct_err("<TRUNCATED>");
pr_sep();
data = next;
break;
diff --git a/dmioutput.c b/dmioutput.c
index ef1c41b2f94e..42f8d3218c43 100644
--- a/dmioutput.c
+++ b/dmioutput.c
@@ -123,3 +123,15 @@ void pr_sep(void)
{
printf("\n");
}
+
+void pr_struct_err(const char *format, ...)
+{
+ va_list args;
+
+ printf("\t");
+
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+ printf("\n");
+}
diff --git a/dmioutput.h b/dmioutput.h
index 6b5f0e0e92c5..a492ec0eb4e7 100644
--- a/dmioutput.h
+++ b/dmioutput.h
@@ -31,3 +31,4 @@ void pr_list_start(const char *name, const char *format, ...);
void pr_list_item(const char *format, ...);
void pr_list_end(void);
void pr_sep(void);
+void pr_struct_err(const char *format, ...);
--
2.17.1

View File

@ -1,34 +0,0 @@
From e0d05fdeb0cd9b6be47fb7e9c11ae6b5794f3df3 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 10:02:04 +0200
Subject: [PATCH 20/23] dmidecode: White space fixes
---
dmidecode.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dmidecode.c b/dmidecode.c
index 59f4fe09e642..d0dc98467bdc 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -3312,7 +3312,7 @@ static void dmi_fixup_type_34(struct dmi_header *h, int display)
{
u8 *p = h->data;
- /* Make sure the hidden data is ASCII only */
+ /* Make sure the hidden data is ASCII only */
if (h->length == 0x10
&& is_printable(p + 0x0B, 0x10 - 0x0B))
{
@@ -3603,7 +3603,7 @@ static const char *dmi_protocol_record_type(u8 type)
"Reserved",
"IPMI",
"MCTP",
- "Redfish over IP", /* 0x4 */
+ "Redfish over IP", /* 0x4 */
};
if (type <= 0x4)
--
2.17.1

View File

@ -1,67 +0,0 @@
From fd4a87bffcf55db6c9c9d460b1b0b5e6fe9a0f03 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Wed, 1 Apr 2020 10:04:27 +0200
Subject: [PATCH 21/23] dmidecode: Update copyright year
---
Makefile | 2 +-
dmidecode.c | 2 +-
dmidecode.h | 2 +-
dmioem.c | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
index 5d58266ef2de..97a1782fde3f 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
# VPD Decode
#
# Copyright (C) 2000-2002 Alan Cox <alan@redhat.com>
-# Copyright (C) 2002-2015 Jean Delvare <jdelvare@suse.de>
+# Copyright (C) 2002-2020 Jean Delvare <jdelvare@suse.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/dmidecode.c b/dmidecode.c
index d0dc98467bdc..981fe9697458 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -2,7 +2,7 @@
* DMI Decode
*
* Copyright (C) 2000-2002 Alan Cox <alan@redhat.com>
- * Copyright (C) 2002-2019 Jean Delvare <jdelvare@suse.de>
+ * Copyright (C) 2002-2020 Jean Delvare <jdelvare@suse.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/dmidecode.h b/dmidecode.h
index 9ecc1791702d..1dc59a7e5536 100644
--- a/dmidecode.h
+++ b/dmidecode.h
@@ -1,7 +1,7 @@
/*
* This file is part of the dmidecode project.
*
- * Copyright (C) 2005-2008 Jean Delvare <jdelvare@suse.de>
+ * Copyright (C) 2005-2020 Jean Delvare <jdelvare@suse.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/dmioem.c b/dmioem.c
index 9d6ec7520287..60b667416563 100644
--- a/dmioem.c
+++ b/dmioem.c
@@ -2,7 +2,7 @@
* Decoding of OEM-specific entries
* This file is part of the dmidecode project.
*
- * Copyright (C) 2007-2008 Jean Delvare <jdelvare@suse.de>
+ * Copyright (C) 2007-2020 Jean Delvare <jdelvare@suse.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
--
2.17.1

View File

@ -1,37 +0,0 @@
From 51bfbe2d5e8728e47f38eb44464f58ad674c4289 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Tue, 7 Apr 2020 11:55:41 +0200
Subject: [PATCH 22/23] dmidecode: Add missing build dependencies on
dmioutput.h
dmidecode.c and dmioem.c both include dmioutput.h so they must be
rebuilt if that header file changes.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
index 97a1782fde3f..194a523bdb46 100644
--- a/Makefile
+++ b/Makefile
@@ -78,13 +78,13 @@ vpddecode : vpddecode.o vpdopt.o util.o
#
dmidecode.o : dmidecode.c version.h types.h util.h config.h dmidecode.h \
- dmiopt.h dmioem.h
+ dmiopt.h dmioem.h dmioutput.h
$(CC) $(CFLAGS) -c $< -o $@
dmiopt.o : dmiopt.c config.h types.h util.h dmidecode.h dmiopt.h
$(CC) $(CFLAGS) -c $< -o $@
-dmioem.o : dmioem.c types.h dmidecode.h dmioem.h
+dmioem.o : dmioem.c types.h dmidecode.h dmioem.h dmioutput.h
$(CC) $(CFLAGS) -c $< -o $@
dmioutput.o : dmioutput.c types.h dmioutput.h
--
2.17.1

View File

@ -1,55 +0,0 @@
From 5b3c8e9950262fc941bb5b3b3a1275720d47d62d Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Fri, 17 Apr 2020 17:14:15 +0200
Subject: [PATCH 23/23] Allow overriding build settings from the environment
Let packagers pass their own CC, CFLAGS and LDFLAGS settings. The
settings which are specific to dmidecode are appended later so that
they are applied no matter what.
This should fix bug #55805:
https://savannah.nongnu.org/bugs/?55805
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
Makefile | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/Makefile b/Makefile
index 194a523bdb46..7aa729d8ca01 100644
--- a/Makefile
+++ b/Makefile
@@ -12,8 +12,13 @@
# (at your option) any later version.
#
-CC = gcc
-CFLAGS = -W -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual \
+CC ?= gcc
+# Base CFLAGS can be overridden by environment
+CFLAGS ?= -O2
+# When debugging, disable -O2 and enable -g
+#CFLAGS ?= -g
+
+CFLAGS += -W -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual \
-Wcast-align -Wwrite-strings -Wmissing-prototypes -Winline -Wundef
# Let lseek and mmap support 64-bit wide offsets
@@ -22,12 +27,8 @@ CFLAGS += -D_FILE_OFFSET_BITS=64
#CFLAGS += -DBIGENDIAN
#CFLAGS += -DALIGNMENT_WORKAROUND
-# When debugging, disable -O2 and enable -g.
-CFLAGS += -O2
-#CFLAGS += -g
-
-# Pass linker flags here
-LDFLAGS =
+# Pass linker flags here (can be set from environment too)
+LDFLAGS ?=
DESTDIR =
prefix = /usr/local
--
2.17.1

View File

@ -1,57 +1,20 @@
Summary: Tool to analyse BIOS DMI data
Name: dmidecode
Version: 3.2
Release: 10%{?dist}
Version: 3.3
Release: 4%{?dist}
Epoch: 1
License: GPLv2+
Source0: http://download.savannah.gnu.org/releases/%{name}/%{name}-%{version}.tar.xz
URL: http://www.nongnu.org/dmidecode/
Patch0: 0001-dmidecode-Fix-Redfish-Hostname-print-length.patch
Patch1: 0002-dmidecode-Don-t-use-memcpy-on-dev-mem-on-arm64.patch
Patch2: 0003-dmidecode-Use-the-most-appropriate-unit-for-cache-si.patch
Patch3: 0004-dmidecode-Use-dmi_cache_size_2-in-dmi_cache_size.patch
Patch4: 0005-dmidecode-Add-Logical-non-volatile-device-to-the-mem.patch
Patch5: 0001-dmidecode-Reformat-the-FILES-section-of-the-manual-p.patch
Patch6: 0002-dmidecode-Document-how-the-UUID-fields-are-interpret.patch
Patch7: 0003-Use-comments-to-separate-sections-in-manual-pages.patch
Patch8: 0004-dmidecode-Add-missing-standard-include.patch
Patch9: 0005-dmidecode-Only-scan-dev-mem-for-entry-point-on-x86.patch
Patch10: 0006-Use-larger-units-for-memory-device-and-BIOS-size.patch
Patch11: 0007-Fix-formatting-of-TPM-table-output.patch
Patch12: 0008-dmidecode-Adding-bios-revision-to-s-option.patch
Patch13: 0009-dmidecode-Adding-firmware-revision-support-to-s-opti.patch
Patch14: 0010-dmidecode-Fix-System-Slot-Information-for-PCIe-SSD.patch
Patch15: 0011-Typo.patch
Patch16: 0001-dmidecode-Add-enumerated-values-from-SMBIOS-3.3.0.patch
Patch17: 0002-dmidecode-Decode-system-slot-base-bus-width-and-peer.patch
Patch18: 0001-dmidecode-Print-type-33-name-unconditionally.patch
Patch19: 0002-dmidecode-Don-t-choke-on-invalid-processor-voltage.patch
Patch20: 0003-dmidecode-Simplify-the-formatting-of-memory-error-st.patch
Patch21: 0004-dmidecode-Fix-the-alignment-of-type-25-name.patch
Patch22: 0005-dmidecode-Code-indentation-fixes.patch
Patch23: 0006-dmidecode-Reduce-the-indentation-of-type-42-structur.patch
Patch24: 0007-dmidecode-Move-type-42-warning-messages-to-stderr.patch
Patch25: 0008-dmidecode-Refactor-ASCII-filtering-of-DMI-strings.patch
Patch26: 0009-dmidecode-Add-helper-function-pr_comment.patch
Patch27: 0010-dmidecode-Add-helper-function-pr_info.patch
Patch28: 0011-dmidecode-Protect-dmidecode.h-against-double-inclusi.patch
Patch29: 0012-dmidecode-Add-helper-function-pr_handle.patch
Patch30: 0013-dmidecode-Add-helper-function-pr_handle_name.patch
Patch31: 0014-dmidecode-Add-helper-function-pr_attr.patch
Patch32: 0015-dmidecode-Add-helper-functions-pr_list_start-item-en.patch
Patch33: 0016-dmidecode-Add-helper-function-pr_subattr.patch
Patch34: 0017-dmidecode-Use-the-print-helpers-in-dump-mode-too.patch
Patch35: 0018-dmidecode-Add-helper-function-for-separators.patch
Patch36: 0019-dmidecode-Add-helper-function-for-structure-errors.patch
Patch37: 0020-dmidecode-White-space-fixes.patch
Patch38: 0021-dmidecode-Update-copyright-year.patch
Patch39: 0022-dmidecode-Add-missing-build-dependencies-on-dmioutpu.patch
Patch40: 0023-Allow-overriding-build-settings-from-the-environment.patch
Patch41: 0001-dmidecode-Add-new-system-slot-types-from-SMBIOS-spec.patch
Patch42: 0002-dmidecode-Skip-details-of-uninstalled-memory-modules.patch
Patch43: RHELonly-Missing-comma-in-the-dmi_slot_type.patch
Patch44: 0024-dmidecode-Fix-crash-with-u-option.patch
Patch0: 0001-dmidecode-Add-new-system-slot-types-from-SMBIOS-spec.patch
Patch1: 0002-dmidecode-Add-new-processor-characteristics-bits-from-SMBIOS-s.patch
Patch2: 0003-dmidecode-Missing-comma-in-the-dmi_slot_type.patch
Patch3: 0004-dmidecode-Skip-details-of-uninstalled-memory-modules.patch
Patch4: 0005-dmidecode-Add-new-processor-upgrades-from-SMBIOS-spec-3.4.0.patch
Patch5: 0006-dmidecode-Add-new-memory-device-types-from-SMBIOS-spec-3.4.0.patch
Patch6: 0007-dmidecode-Fix-crash-with-u-option.patch
BuildRequires: gcc make
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
@ -68,52 +31,7 @@ slots (e.g. AGP, PCI, ISA) and memory module slots, and the list of
I/O ports (e.g. serial, parallel, USB).
%prep
%setup -q
%patch0 -p1 -b .fix_Redfish_print
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch30 -p1
%patch31 -p1
%patch32 -p1
%patch33 -p1
%patch34 -p1
%patch35 -p1
%patch36 -p1
%patch37 -p1
%patch38 -p1
%patch39 -p1
%patch40 -p1
%patch41 -p1
%patch42 -p1
%patch43 -p1
%patch44 -p1
%autosetup
%build
make %{?_smp_mflags} CFLAGS="%{optflags}" LDFLAGS="%{__global_ldflags}"
@ -134,6 +52,19 @@ make %{?_smp_mflags} DESTDIR=%{buildroot} prefix=%{_prefix} install-bin install-
%{_mandir}/man8/*
%changelog
* Wed Jan 26 2022 Coiby Xu <coxu@redhat.com> - 1:3.3-4
- Resolves: rhbz#2042224
* Wed Jan 05 2022 Coiby Xu <coxu@redhat.com> - 1:3.3-3
- Resolves: rhbz#2027665
* Tue Nov 10 2021 Coiby Xu <coxu@redhat.com> - 1:3.3-2
- Resolves: rhbz#1996651
* Tue Nov 9 2021 Coiby Xu <coxu@redhat.com> - 1:3.3-1
- Rebase to upsteam 3.3
- Resolves: rhbz#1998772
* Fri Apr 9 2021 Coiby Xu <coxu@redhat.com> - 1:3.2-10
- Fix crash with -u option
- Resolves: rhbz#1885823