diff options
-rw-r--r-- | .gitignore | 8 | ||||
-rw-r--r-- | CHANGELOG | 1614 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | NEWS | 142 | ||||
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | biosdecode.c | 67 | ||||
-rw-r--r-- | dmidecode.c | 653 | ||||
-rw-r--r-- | dmioem.c | 219 | ||||
-rw-r--r-- | dmiopt.c | 31 | ||||
-rw-r--r-- | dmiopt.h | 1 | ||||
-rw-r--r-- | man/biosdecode.8 | 3 | ||||
-rw-r--r-- | man/dmidecode.8 | 6 | ||||
-rw-r--r-- | types.h | 27 | ||||
-rw-r--r-- | util.c | 60 | ||||
-rw-r--r-- | version.h | 2 |
15 files changed, 1035 insertions, 1802 deletions
diff --git a/.gitignore b/.gitignore deleted file mode 100644 index bc01b14..0000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.bzr -.bzrignore -.pc -biosdecode -dmidecode -ownership -vpddecode -*.o diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 6f9123d..0000000 --- a/CHANGELOG +++ /dev/null @@ -1,1614 +0,0 @@ -2015-09-03 Jean Delvare <jdelvare@suse.de> - - * version.h: Set version to 3.1. - -2017-05-23 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c, dmiopt.c: Add a new option to extract OEM strings, like - we already have for many other strings. - * dmidecode.8: Document the new option. - -2017-04-27 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 3.1.1. - - * dmidecode.c: Add support for 3-digit versions. - * dmidecode.c: Add new enumerated values for processors (DMI type 4). - -2017-04-27 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 3.1.0. - - * dmidecode.c: Add support for extended BIOS ROM size (DMI type 0). - * dmidecode.c: Add new enumerated values for chassis types - (DMI type 3). - * dmidecode.c: Add new enumerated values for processors (DMI type 4). - * dmidecode.c: Don't assume 8-bit processor family in dmi_processor_id - (DMI type 4). - * dmidecode.c: Decode the MIDR register on ARM processors - (DMI type 4). - * dmidecode.c: Add support for large cache sizes (DMI type 7). - * dmidecode.c: Add Mini PCIe system slot enumerated values - (DMI type 9). - * dmidecode.c: Clarify the memory speed unit (DMI type 17). - * dmidecode.c: Add support for structure type 43 (TPM Device). - -2017-04-11 Jean Delvare <jdelvare@suse.de> - - * util.c: Don't leak a file descriptor in function read_file. - * util.c, util.c, dmidecode.c: Let callers pass an offset to function - read_file. - * dmidecode.c: Fix reading from SMBIOS 3 dump files using a 64-bit - entry point. - -2017-04-10 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Decode the processor ID of the Intel Core M, AMD - Athlon X4 and AMD Opteron X1000/X2000 processors (DMI type 4). - * dmidecode.c: Display the IPMI interrupt number as a decimal - number (DMI type 38). - -2017-01-20 Jean Delvare <jdelvare@suse.de> - - * biosdecode.c: Decode the entry point defined in the Intel - Multiprocessor specification. - -2017-01-20 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Only decode one DMI table. - This fixes Savannah bug #50022: - https://savannah.nongnu.org/bugs/?50022 - -2016-09-22 Jean Delvare <jdelvare@suse.de> - - * README: Explain that we can no longer support Cygwin. - -2016-06-30 Petr Oros <poros@redhat.com> - - * dmidecode.c: Unmask LRDIMM in memory type detail (DMI type 17). - -2015-11-02 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c, util.c, util.h: Let read_file return the actual data - size. - * dmidecode.c: Use read_file to read the DMI table from sysfs. - This fixes Savannah bug #46176: - https://savannah.nongnu.org/bugs/?46176 - * dmidecode.c: Check the sysfs entry point length. - -2015-10-21 Xie XiuQi <xiexiuqi@huawei.com> - - * dmidecode.c: Handle SMBIOS 3.0 entry points on EFI systems. - -2015-10-20 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Handle OEM-specific types in group associations - (DMI type 14). - -2015-10-14 Jean Delvare <jdelvare@suse.de> - - * util.c: Avoid SIGBUS on mmap failure. - This fixes Savannah bug #46066: - https://savannah.nongnu.org/bugs/?46066 - * util.c: Fix error paths in mem_chunk. - -2015-10-01 Roy Franz <roy.franz@linaro.org> - - * dmiopt.c: Add "--no-sysfs" option description to -h output. - -2015-09-03 Jean Delvare <jdelvare@suse.de> - - * version.h: Set version to 3.0. - -2015-08-04 Tyler Bell <tyler.bell@hp.com> - - * dmioem.c: Decode HP-specific DMI type 233 - * dmioem.c: Refactored HP-specific types 209 and 221 to use common code - * dmioem.c: Documented spec for HP-specific types 209, 221 and 233 - -2015-05-21 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix up invalid DMI type 34 structure length. - * dmioem.c: Decode HP-specific DMI types 212 and 219. - * dmioem.c: Move function is_printable to dmidecode.c. - -2015-05-13 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Add support for SMBIOS3 EFI table. - * dmidecode.c: Fix warnings about comparison between signed and - unsigned integers. - * util.c: Fix warnings about unused labels when building without - -DUSE_MMAP. - * dmioem.c: Strip spaces at the end of vendor names. - * dmioem.c: Decode Acer-specific DMI type 170. - -2015-05-12 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Remove extra blank line after hidden DMI type 40 - structure. - -2015-05-04 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Move table decoding to a separate function. - * dmidecode.c: Simplify function dmi_table_dump. - * dmidecode.c: Display types 41 and 42 in quiet mode too. - * dmidecode.c: Get OEM vendor from System Information (DMI type 1). - -2015-04-28 Jean Delvare <jdelvare@suse.de> - - * dmidecode.h, dmiopt.h: Fix sparse errors. - * biosdecode.c, dmiopt.c, ownership.c, vpdopt.c: Fix sparse warnings. - * util.c: Fix sparse warning. - -2015-04-27 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix --dump-bin when reading from sysfs. - -2015-04-27 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 3.0.0. - - * dmidecode.c: Add support for the new _SM3_ 64-bit entry point - defined in the SMBIOS specification version 3.0.0, including - support of 64-bit addresses and 32-bit table lengths. - * dmidecode.c: Add 3 new chassis types (DMI type 3). - * dmidecode.c: Add 4 new processor families (DMI type 4). - * dmidecode.c: Add 4 new Intel socket types (DMI type 4). - * dmidecode.c: Add 13 new slot types (DMI type 9). - * dmidecode.c: Add 4 new memory device types (DMI type 17). - * dmidecode.c: Add support for processors with more than 255 cores - or threads (DMI type 4). - * dmidecode.c: Stop decoding v3 tables at End-of-Table marker. - -2015-04-21 Roy Franz <roy.franz@linaro.org> - - * util.c, util.h: Add utility function read_file, which reads an - entire binary file into a buffer. - * dmidecode.c: Add passing of flags parameter to dmi_table. - * dmidecode.c: Add reading of SMBIOS tables from sysfs. - * dmidecode.c, dmiopt.c, dmiopt.h: Add --no-sysfs option to disable - use of sysfs. - * dmidecode.8: Document the changes above. - -2015-04-20 Jean Delvare <jdelvare@suse.de> - - * biosdecode.c: Add support for the _SM3_ entry point, as defined in - the SMBIOS 3.0.0 specification. - -2014-11-14 Jean Delvare <jdelvare@suse.de> - - * man/dmidecode.8: Add a note about DMI strings available from sysfs - on Linux. - -2014-10-13 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Add support for DDR4 (DMI type 17). Patch from Tomohiro - Kimura. The value was taken from preliminary SMBIOS specification - version 3.0.0d. - This fixes Savannah bug #43370: - https://savannah.nongnu.org/bugs/?43370 - -2014-07-11 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Decode the CPUID of recent AMD processors (DMI type 4). - -2014-03-20 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Let legacy_decode be quiet in dump mode too. - * dmidecode.c: Skip the SMBIOS version comparison in quiet mode. - Patch from Jens Rosenboom. - -2014-02-25 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix spacing of memory module voltage attributes - (DMI type 17). - -2014-01-13 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Decode ID of PCI Express 3 slots (DMI type 9). - This fixes Savannah bug #40178: - https://savannah.nongnu.org/bugs/?40178 - -2014-01-13 Jean Delvare <jdelvare@suse.de> - - * LICENSE: Update to the latest upstream version. Amongst other - things, this fixes the FSF address. - -2013-04-24 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Strip trailing zeroes from memory voltage values - (DMI type 17). - * dmidecode.c: Fix support for new processor upgrade types (DMI - type 4) and new memory device type (DMI type 17.) - -2013-04-17 Anton Arapov <anton@redhat.com> - - * version.h: Set version to 2.12. - -2013-04-17 Anton Arapov <anton@redhat.com> - - Update to support SMBIOS specification version 2.8.0. - - * dmidecode.c: Correct processor family name (DMI type 4). - * dmidecode.c: Correct typo in processor upgrade type (DMI type 4). - * dmidecode.c: Add 9 new processor families (DMI type 4). - * dmidecode.c: Add 2 new Intel socket types (DMI type 4). - * dmidecode.c: Add Min/Max/Configured memory voltages (DMI type 17). - * dmidecode.c: Add LRDIMM to memory device list (DMI type 17). - -2012-03-26 Anton Arapov <anton@redhat.com> - - * man/dmidecode.8: Add missing DMI type introduced with SMBIOS 2.7+, and - include the information about the extra output when dmidecode is run - on a hardware that has non-supported SMBIOS version. - -2012-03-12 Anton Arapov <anton@redhat.com> - - * dmioem.c: Add "PXE" to the HP OEM Type 209 output so it is similar to - the "iSCSI" description in HP OEM Type 221. Patch from Naga Chumbalkar. - -2011-11-18 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Properly print the hexadecimal value of invalid - string characters. - -2011-11-14 Anton Arapov <anton@redhat.com> - - * dmidecode.c: Make dmi_chassis_type aware of the lock bit. - Patch from Stefan Tauner. - * config.h: Haiku dropped the _BEOS_ definition in favor of its own - platform identification _HAIKU_. Patch from Francois Revol. - -2011-04-20 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 2.7.1. - - * dmidecode.c: Add 6 AMD processor families (DMI type 4). - * dmidecode.c: Add cache associativity value - "20-way Set-associative" (DMI type 7). - * dmidecode.c: Add PCI Express 3 slot types (DMI type 9). - -2011-01-25 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix boundary checks of memory array location codes - (DMI type 16). Reported by Andrey Matveyev. - -2011-01-19 Anton Arapov <anton@redhat.com> - - * version.h: Set version to 2.11. - -2010-11-24 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Assume that the max power capacity is expressed in - Watts, not milliWatts (DMI type 39). The specification isn't - clear about the actual unit, but the only implementation I've - seen (HP Proliant G7) clearly uses Watts. Also, using milliWatts - would limit the max value that can be stored to 32 W, which - doesn't make much sense. - * dmidecode.c: Fix offset of partition width (DMI type 19). - * dmidecode.c: Decode BIOS language information flags - (DMI type 13). - * dmidecode.c: Fix CPU flags mask (DMI type 4). - * dmidecode.c: Reword "PCI Express Gen 2" to just "PCI Express 2" - (DMI type 9). - * dmidecode.c: Decode the slot ID for all PCI Express and PCI - Express 2 slots (DMI type 9). - -2010-11-24 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 2.7.0. - - * dmidecode.c: Update all references to the SMBIOS specification - to match the new numbering. - * dmidecode.c: Add UEFI support and virtual machine flags to BIOS - characteristics (DMI type 0). - * dmideocde.c: Add SKU number field to system enclosure or chassis - (DMI type 3). - * dmidecode.c: Add many Intel, AMD and VIA CPU family names - (DMI type 4). - * dmidecode.c: Add many socket formats (DMI type 4). - * dmidecode.c: Add processor characteristics flags (DMI type 4). - * util.c, util.h: Add utility function u64_range, which computes - the range between two u64 values. - * dmidecode.c: Add support for memory arrays of 2 TB and more - (DMI types 16, 19 and 20). - * dmidecode.c: Add support for memory devices of 32 GB and more - (DMI type 17). - * dmidecode.c: Add description of cooling device (DMI type 27). - * dmidecode.c: Add limited support for new DMI type 42 (Management - Controller Host Interface). - -2010-11-16 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Handle ambiguous processor family value 0x30 - (DMI type 4). - * dmidecode.c: Prevent unlikely array overrun when decoding - processor family value 0xBE (DMI type 4). - * dmidecode.c: Handle DMI type 2 record of size 0x0E. - -2010-11-11 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix decoding of IPMI base address LSB. - -2010-11-09 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Drop redundant/obsolete references to - CIM_Processor.Family. - -2010-10-26 Jean Delvare <jdelvare@suse.de> - - Update to support Intel AP-485 (CPUID) revision 36 (was 32). - - * dmidecode.c: Update the link to the AP-485 document, the revision - and the table number. - * dmidecode.c: Update two CPU flag descriptions (FXSR and HTT). - Drop CPU flag IA64. - * dmidecode.c: Update the list of processors for which we decode the - CPUID flags. - -2010-10-11 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: One more SMBIOS version fix-up case. - * Makefile: Rework BSD make compatibility trick. The previous - trick would break GNU make 3.82. - -2010-09-29 Anton Arapov <anton@redhat.com> - - * util.c: makes dmidecode fall back to regular reads if the mmap - fails. Patch from Olof Johansson. - -2010-09-21 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix Xeon 7xxx entries in CPU name lookup table - (DMI type 4). Patch from Paul Flo Williams. - -2009-08-28 Jarod Wilson <jarod@redhat.com> - - Update to support SMBIOS specification version 2.6.1. - - * dmidecode.c: Add processor types "Dual-Core Xeon 5200", - "Dual-Core Xeon 7200", "Quad-Core Xeon 7300", "QuadCore Xeon 7400", - "Multi-Core Xeon 7400", "Core i7", "Dual-Core Celeron", - "Multi-Core Xeon", "Dual-Core Xeon 3xxx", "Quad-Core Xeon 3xxx", - "Dual-Core Xeon 5xxx", "Quad-Core Xeon 5xxx", "Dual-Core Xeon 7xxx", - "Quad-Core Xeon 7xxx" and "Multi-Core Xeon 7xxx" (DMI type 4). - * dmidecode.c: Add slot types "PCI Express Gen 2 x1", - "PCI Express Gen 2 x2", "PCI Express Gen 2 x4", - "PCI Express Gen 2 x8" and "PCI Express Gen 2 x16" (DMI type 9). - * dmidecode.c: Add memory device types "DDR3" and "FB-DIMM" - (DMI type 17). - * dmidecode.c: Add cache associativity types "12-way Set-associative", - "24-way Set-associative", "32-way Set-associative", - "48-way Set-associative" and "64-way Set-associative" (DMI type 7). - -2009-07-27 Jean Delvare <jdelvare@suse.de> - - * dmioem.c: Recognize "Hewlett-Packard" as a possible DMI vendor - string for HP. Orginal patch from Thomas Hiller (HP). - * dmidecode.c: Add processor upgrade type "Socket LGA1366" - (DMI type 4). - -2009-06-19 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix decoding of memory array capacity. A maximum - capacity of 128 GB would erroneously be reported as Unknown, - while a unknown capacity would be erroneously reported as 2048 - GB. Bug reported by Lin Li (HP). - -2009-04-30 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Warn if decoding an SMBIOS implementation which is - newer than what we support. - -2009-04-04 Jean Delvare <jdelvare@suse.de> - - * Makefile: Clarify license. - -2008-11-23 Jean Delvare <jdelvare@suse.de> - - * biosdecode.c: Stop using the inline keyword. It causes more - portability issues than is worth given how little we care about - performance in this tool, and recent versions of gcc know when - to inline functions anyway. - * version.h: Set version to 2.10. - -2008-11-14 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Handle chassis information records of size 19 - (DMI type 3). - -2008-11-10 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Claim to support revision 32 of Intel AP-485 - (CPUID). No relevant change since revision 31. - * dmidecode.c: Update reference to AMD CPUID document. - -2008-11-09 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Decode the CPUID of more Intel, VIA and AMD - processors (DMI type 4). - * dmidecode.c: More CPUID exceptions based on the version string - (DMI type 4). - * README: Drop reference to the Linux kernel. - * README: Drop "model-specific issues" common problem entry, it is - no longer relevant. - * README: Simplify "IA-64" common problem entry, most of the - issues are solved by now. - -2008-11-08 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Add many processor types taken from the CIM Schema. - * dmidecode.c: Drop all references to the DMTF Master MIF - document. This document hasn't been updated in years, so the - additions it may contain are no longer relevant. - -2008-11-07 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Handle base board information records of size 9 - (DMI type 2). - * dmidecode.c: Don't display access time equivalent of memory - device speed (DMI type 17). The access time didn't add much - value, and rounding effects made it look bad at times. - -2008-11-07 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 2.6, fourth round. - - * dmidecode.c: Initial support for additional information entries - (DMI type 40). Proper support of this new entry type would - require redesigning a large part of the code, so I am waiting - to see actual implementations of it to decide whether it's worth - the effort. - * dmidecode.c, dmidecode.8: Update reference SMBIOS document. - * dmiopt.c, dmidecode.8: Include entry type 41 in --type baseboard. - -2008-11-05 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 2.6, third round. - - * dmidecode.c: Decode the group number, bus number and - device/function number of system slots (DMI type 9). - Based on a preliminary patch by Matt Domsch. - * dmidecode.c: Decode onboard devices extended information - entries (DMI type 41). Based on a preliminary patch by Matt - Domsch. - * dmidecode.c: Add slot types "PCI Express x1", "PCI Express x2", - "PCI Express x4", "PCI Express x8" and "PCI Express x16" - (DMI type 9). - * dmidecode.c: Decode the memory device rank (DMI type 17). - -2008-11-02 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Use binary search for dmi_processor_family, it's - faster than linear search (DMI type 4). - * dmidecode.c: Decode boot integrity services entry point entries - (DMI type 31). - -2008-10-31 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: The compiler knows how to reuse strings, it doesn't - need our help, and actually it does a better job without it. So, - turn out_of_spec into a define. - * dmidecode.c: Optimize functions dmi_processor_status(), - dmi_cache_location(), dmi_system_reset_boot_option() and - dmi_ipmi_register_spacing(). - -2008-10-30 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c, dmiopt.c, dmidecode.8: Option --dump is only a - modifier as --quiet is, so it's not actually mutually exclusive - with the output format options. - * dmidecode.c: Make options --dump-bin and --quiet work together. - * dmidecode.c: Delay string filtering when option --dump is used. - * dmidecode.c: Refactor dmi_processor_family function to avoid - code duplication. - * dmidecode.c: Fix up invalid SMBIOS version 2.51. - -2008-10-29 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Handle special case of processor family code 0xBE, - which can be both Core 2 or K7. We use the processor - manufacturer string as a hint (DMI type 4). - -2008-10-28 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c, dmidecode.h, dmiopt.c, dmiopt.h: Don't use function - pointers for special string cases. Each special case is itself - special and needs to call a function with its own prototype, so - better have dedicated code to handle it all. - * dmidecode.c, dmidecode.h, dmioem.c, dmioem.h: Mark a few - pointers const. - * dmidecode.c, util.c, util.h: When dumping the DMI table to a - binary file, truncate the file first. - * dmidecode.c: Support Processor Family 2 field also when queried - with option --string. - -2008-10-27 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 2.6, second round. - - * dmidecode.c: Add support for Processor Family 2 field - (DMI type 4). - * dmidecode.c: Add processor types "Turion 64 X2", "Core Solo", - "Core 2 Duo", "ESA/390 G6", "z/Architectur", "C7-M", "C7-D", - "C7" and "Eden" (DMI type 4). - * dmidecode.c: Fix typo in processor type "AMD29000" (DMI type 4). - * dmidecode.c: Add processor upgrade types "Socket S1", - "Socket AM2" and "Socket F (1207)" (DMI type 4). - -2008-10-26 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 2.6, first round. - - * dmidecode.c: Byte-swap the first 3 fields of the UUID - (DMI type 1). - * dmidecode.c: Add chassis types "Blade" and "Blade Enclosure" - (DMI type 3). - -2008-10-26 Jean Delvare <jdelvare@suse.de> - - * dmiopt.c, dmidecode.8: Simplify the handling and documentation - of mutually exclusive output format options. - * dmidecode.8: Document the binary dump file format. - * dmidecode.c: Don't display the source dump file name in quiet - mode. - * biosdecode.c, dmidecode.c, dmioem.c, dmiopt.c, dmiopt.h, - ownership.c, types.h, util.c, vpddecode.c, vpdopt.c, vpdopt.h: - Mass coding-style change: add spaces around operators. - * vpddecode.c: Fix --quiet option. - * dmidecode.h, dmiopt.h: Pass version information to print - callback functions. - * dmidecode.c: Fix up invalid SMBIOS version. - * dmidecode.c: Handle base board information records of size 10 - (DMI type 2). - -2008-10-25 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Limit indentation in smbios_decode and - legacy_decode. - * dmidecode.c, dmiopt.c: Write binary dump to a compact file - rather than a sparse file. - * dmidecode.c, dmiopt.c, dmiopt.h: New option --from-dump, read - the DMI data from a binary file. - * dmidecode.8: Update the option --dump-bin, document the new - option --from-dump. - -2008-08-28 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Add missing colon to temperature probe label. - Patch from Alex Iribarren. - -2008-02-16 Jean Delvare <jdelvare@suse.de> - - * util.c, util.h: New helper function write_dump. - * dmidecode.c, dmiopt.c, dmiopt.h: New option --dump-bin, dump - the DMI data to a sparse binary file. - * dmidecode.8: Document the new option --dump-bin. - * Makefile, biosdecode.c, dmidecode.c, dmidecode.h, dmioem.c, - dmioem.h, dmiopt.c, dmiopt.h, ownership.c, util.c, util.h, - vpddecode.c, vpdopt.c, vpdopt.h: Update copyright statements. - * dmidecode.c: Adjust the error message which is displayed when - the table is unreachable. - -2007-06-30 Jean Delvare <jdelvare@suse.de> - - * config.h: Add support for Solaris (x86 only, of course). Based - on a patch by Sun's Dan Mick, brought to my knowledge by - Attila Nagy. - -2007-06-27 Jean Delvare <jdelvare@suse.de> - - * Makefile: Fix the uninstall-man target. - -2007-06-07 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: If the SMBIOS entry point decoding fails (for - example due to a bad checksum), still try decoding the - encapsulated DMI entry point. Suggested by Luke Suchocki. - * dmidecode.c: Replace all occurrences of "KB" by the more - correct "kB". - -2007-03-16 Jean Delvare <jdelvare@suse.de> - - * vpddecode.c: Stop asking the user to report bad checksums, - unaligned records and the like. Such machines exist, too bad, - we have to live with it. - -2007-02-27 Jean Delvare <jdelvare@suse.de> - - * biosdecode.c: Fix a compilation error with non-C99 compilers. - Patch from Francois Revol. - -2007-02-26 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix an array overrun while decoding the system - event log status (DMI type 15). - * biosdecode.c: Use printf instead of fwrite. - * dmidecode.8: Some OEM-specific types can be decoded now. - * biosdecode.8: List the FJKEYINF entry point type. - * vpddecode.8: The product name is no longer displayed. - * version.h: Set version to 2.9. - -2007-02-16 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Do not print the BIOS base address and runtime size - if the base address is 0. This happens on IA-64 because there's - no BIOS. - * Makefile, README: Do not build biosdecode, ownership and - vpddecode on IA-64, as IA-64 systems have no BIOS. This was - quite tricky to keep both GNU make and BSD make happy, but it - seems that I finally succeeded. - -2007-02-13 Jean Delvare <jdelvare@suse.de> - - Update to support SMBIOS specification version 2.5, second round. - - * dmidecode.c: Decode new processor characteristics (multi-core, - multi-thread, 64-bit) (DMI type 4). - * dmidecode.c: Decode slot ID of AGP 8x and PCI Express slots (DMI - type 9). - - * dmidecode.c: Fix the mask of 3 bitfield tests. This will let - the memory type of some systems be properly reported as SDRAM. - * dmidecode.c: Fix the AMD processors signature decoding. - * README: Minor edits. - -2007-02-12 Jens Elkner <elkner@linofee.org> - - Update to support SMBIOS specification version 2.5, first round. - - * dmidecode.c: Add chassis types "CompactPCI" and "AdvancedTCA" - (DMI type 3). - * dmidecode.c: Add processor types "Turion 64", - "Dual-Core Opteron", "Athlon 64 X2", "Celeron D", "Pentium D" - and "Pentium EE" (DMI type 4). - * dmidecode.c: Add processor upgrade types "Socket mPGA604", - "Socket LGA771" and "Socket LGA775" (DMI type 4). - * dmidecode.c: Add connector type "SAS/SATA Plug Receptacle" and - port types "SATA" and "SAS" (DMI type 8). - * dmidecode.c: Add on-board device types "PATA Controller", - "SATA Controller" and "SAS Controller" (DMI type 10). - * dmidecode.c: Add memory device form factor "FB-DIMM" and memory - device type "DDR2 FB-DIMM" (DMI type 17). - -2007-02-12 Jean Delvare <jdelvare@suse.de> - - * dmioem.c: Share the code between HP-specific types 209 and 221. - Both types are really the same, only the title is different. - * dmioem.c: Make the HP-specific types 209 and 221 output a bit - more verbose. - * dmidecode.c: Let --type decode OEM-specific entries when - possible. - * dmidecode.c: Include decoded OEM-specific entries in quiet mode - output (--quiet). - * dmidecode.c: Do not complain about truncated entries in quiet - mode. - * dmioem.c: Decode HP-specific type 204 entries in a safer way: - check the length before decoding, and don't assume that all - strings are provided in the same order as they are used. - - Update to support Intel AP-485 (CPUID) revision 31 (was 28). - - * dmidecode.c: New CPUID flag IA64. - * dmidecode.c: Fix the decoding of Intel extended family. - -2007-02-11 Jean Delvare <jdelvare@suse.de> - - * dmioem.c, dmioem.h: New. - * Makefile, dmidecode.c, dmidecode.h, dmioem.c, dmioem.h: Move the - decoding of OEM-specific entries to a separate source file. - * dmidecode.c: DMI type 38 is tested by now. - * dmioem.c: The PCI function is typically represented as a single - digit. - * Makefile, dmiopt.c, vpdopt.c, util.h: Define an ARRAY_SIZE macro - which computes the size of a static array, and use it where - relevant. - -2007-02-11 John Cagle <jcagle@kernel.org> - - * dmidecode.c: Add support for 3 HP-specific entries: system/rack - locator (type 204), NIC MAC information (type 209) and NIC iSCSI - MAC information (type 221). - -2007-01-14 Jean Delvare <jdelvare@suse.de> - - * vpddecode.c: Fix a rare warning. - * biosdecode.c: Add support for the FJKEYINF entry point, which - contains data related to the "application panel" on Fujitsu - laptops. - -2006-05-23 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Fix a recently introduced compilation error with - non-C99 compilers. - * dmidecode.c: Check for short entries (less than 4 bytes), stop - with an error when one is encountered. - -2006-05-13 Jean Delvare <jdelvare@suse.de> - - * vpddecode.c, README: Drop the product name lookup table. It - was reported to be unreliable too many times, and was also - difficult to maintain. - -2006-05-10 Jean Delvare <jdelvare@suse.de> - - * dmidecode.c: Don't cast from u8* to dmi_header*, else - architectures which do not support unaligned memory accesses - may break. Instead, copy the members individually. That's a - bit slower, but that's also safer and we only need to do it - once per DMI entry, so it's not time critical. So far, we - were using a trick to later work around the unaligned memory - access, but the compiler would still warn about the risk, - which is always confusing. - * config.h, types.h, README: Automatically enable the unaligned - memory access workaround on ia64. - * types.h: Inline U64. It makes sense per se and also lets us - get rid of a warning about U64 being unused. - * dmidecode.c: Detect EFI at run-time rather than compilation- - time. Based on an original patch from Matthew Garrett. This - will make x86 binaries work for both PC systems with BIOS and - Macintosh systems with EFI. Also prevent a possible, though - unlikely, NULL-pointer dereference in the EFI code. - -2006-02-25 Jean Delvare - - * dmidecode.c: Fix typo reported by David Wilson (DMI case 3). - -2006-02-04 Jean Delvare - - * vpddecode.c: Update lookup table from revision 2006-01-31 of IBM - reference document (add product ID "7B"). - * version.h: Set version to 2.8. - -2006-01-21 Jean Delvare - - * vpddecode.c: The mysterious last character of xSeries records - may be a BIOS revision. Display it as such when present and - non zero, and ask users to report. - * vpddecode.c: Adjust an error message. - * dmidecode.8: Update the sample entry to match the new output - format. - * README: Improve the IA-64 specific section and the vpddecode - tool description. - * vpdopt.h: Add missing system header file include. - -2006-01-20 Jean Delvare - - * vpddecode.c: Assume a constant length of 12 characters for the - "Default Flash Image File Name" entry. The 13th character never - contained anything useful, so it probably has a different - meaning (unknown for now). - -2005-12-24 Jean Delvare - - * vpddecode.c: Scan for VPD records on 4-byte boundaries instead - of 16-byte boundaries. This is needed for some eServer xSeries - 206. Still emit a warning if a VPD record is found not on a - 16-byte boundary. - -2005-10-26 Jean Delvare - - * vpddecode.c: Add product ID "NR". Reported by Klaus Muth. - * vpddecode.c: Update lookup table from revision 2005-10-06 of IBM - reference document (add product IDs "77" and "78"). - -2005-10-05 Jean Delvare - - Update to support IPMI specification version 2.0 (was 1.5). - - * dmidecode.c: Support IPMI interface type SSIF. Original patch - by Garry Belka. - -2005-10-04 Jean Delvare - - * vpdopt.c: Display the list of all valid string keywords when - --string is used without an argument. - * vpddecode.8: Document the new -s, --string option. - * dmidecode.8: List the four new string keywords. - * vpddecode.c: Keep quiet when --string is used, even when no VPD - record is found. - -2005-10-03 Jean Delvare - - * biosdecode.c: Fix a potential (but highly improbable) buffer - overrun in the VPD record decoding. - * biosdecode.c: Change the xSeries checksumming method to - accommodate a strange xSeries 440 VPD record, as was done in - vpddecode.c some weeks ago. Do not display the default flash - image file name anymore, it's not so useful and the field length - is now uncertain. - * vpdopt.c, vpdopt.h: New. - * Makefile, vpddecode.c, vpdopt.c, vpdopt.h: Move the command line - handling of vpddecode to a separate source file. - * vpddecode.c, vpdopt.c, vpdopt.h: Add option -s, --string. It - prints one selected VPD string instead of the regular output. - -2005-09-24 Jean Delvare - - * dmiopt.c: Fix incorrect header include. The strcasecmp function - is defined in <strings.h>, not <string.h>. Reported by Petter - Reinholdtsen. - -2005-09-14 Jean Delvare - - * dmidecode.h: New. - * dmidecode.c, dmidecode.h, Makefile: Export four specific - decoding functions, make them suitable for external call. - * dmidecode.c, dmiopt.c, dmiopt.h, Makefile: Make it possible - for --string to print decoded binary data rather than only - DMI strings. Add four such string keywords. - * dmidecode.c, dmiopt.c, dmiopt.h: Modify the opt structure - to handle the string option more efficiently. - -2005-09-13 Jean Delvare - - * vpddecode.c: Slightly change the xSeries checksumming method to - accommodate a strange xSeries 440 VPD record. Also tweak the - decoding of the "Default Flash Image File Name" entry. Thanks - to Torsten Seemann for providing a test VPD record. - -2005-09-05 Jean Delvare - - * Makefile: Use -Wundef. - -2005-08-31 Jean Delvare - - * dmidecode.c: Drop trailing dot from handle description line. - -2005-08-29 Jean Delvare - - * dmidecode.c: Reword a comment about CPUID. - * dmidecode.c: Claim to support revision 28 of Intel AP-485 - (CPUID). No relevant change since revision 27. - -2005-08-25 Jean Delvare - - * vpddecode.c: Add product ID "VI". Reported by Torsten Seemann. - * vpddecode.c: Update lookup table from revision 2005-06-24 of IBM - reference document (add product IDs "1U", "1X", "70", "74", "75" - and "76", update product ID "1Y"). - * dmiopt.c: Complain about unknown options again. - * biosdecode.c, ownership.c, vpddecode.c: getopt_long() will never - return ':'. - -2005-08-04 Jean Delvare - - * README: Manual pages document the command line interface. - A discussion list exists for developers. Mmap is used on - most systems, not just Linux. - * version.h: Set version to 2.7. - -2005-08-02 Jean Delvare - - * dmiopt.c, dmidecode.8: Options --dump and --quiet are mutually - exclusive. - -2005-06-23 Jean Delvare - - * dmiopt.c, dmidecode.8: Options --dump and --string are mutually - exclusive. - -2005-06-22 Jean Delvare - - * dmiopt.c: Display the list of all valid type or string keywords - when --type or --string, respectively, is used without an - argument or with an invalid one. - * dmidecode.8: Document the new -s, --string option. Update the - -t, --type option documentation. - * dmiopt.c, dmidecode.8: Add string keyword "bios-release-date", - the Linux kernel uses it. - * dmidecode.c, dmidecode.8: Fix typo ("Controler" becomes - "Controller"). - -2005-06-21 Jean Delvare - - * dmidecode.c, dmiopt.c, dmiopt.h: Add option -s, --string. It - prints one selected DMI string instead of the regular output. - -2005-06-18 Jean Delvare - - * dmidecode.c: Hide handle references and entries of unknown - type when --quiet is used. - * dmidecode.8: Document the new -q, --quiet option. - * dmidecode.c: Stop decoding at end of table entry when --quiet - is used. Also don't warn about incorrect table length or entries - count when --quiet is used. - -2005-06-17 Jean Delvare - - * dmidecode.c, dmiopt.c, dmiopt.h: Add option -q, --quiet. It - makes the output less verbose. - * dmidecode.c: Suppress one level of indentation in the output, - insert blank lines between records. This will hopefully make - the output easier to read. - * dmidecode.c: Hide table address and size when --type is used. - -2005-06-16 Jean Delvare - - * dmidecode.8: Document the new -t, --type option. - -2005-06-15 Jean Delvare - - * dmiopt.c, dmiopt.h: New. - * Makefile, dmidecode.c, dmiopt.c, dmiopt.h: Move the command line - handling of dmidecode to a separate source file. - * dmiopt.c: Define keywords to be used with --type (instead of - numeric values). - -2005-06-14 Jean Delvare - - * dmidecode.c: Centralize the main exit point. This allows fixing - a minor, recently introduced memory leak which was happening on - error conditions. - -2005-06-13 Jean Delvare - - * dmidecode.c: Add option -t, --type. It limits the output to - the given type(s) of DMI entries. - -2005-05-25 Jean Delvare - - * vpddecode.c: Add product IDs "KE", "NT" and "ZR". Reported by - Bernd Krumboeck. - -2005-05-15 Jean Delvare - - * dmidecode.8, vpddecode.8: Document the new -u, --dump option. - - Update to support SMBIOS specification version 2.4 (was 2.4 - preliminary). There is actually no difference between 2.4 - preliminary and 2.4 final. - - * dmidecode.c: Update the "System Management BIOS Reference - Specification" version. - -2005-04-26 Jean Delvare - - * vpddecode.c: Add product ID "M1". Reported by Myke Olson. - * vpddecode.c: Add option -u, --dump. It disables decoding of the - VPD records, a raw dump is displayed instead. This option is - mainly intended for debugging. - -2005-04-03 Jean Delvare - - * Makefile: Use variables for install and rm commands, so that these - can be overridden by the caller. - -2005-03-25 Jean Delvare - - * Makefile: Install some documentation files (README, CHANGELOG, - AUTHORS). - - Update to support SMBIOS specification version 2.4 preliminary - [11/18/2004] (was 2.3.4). - - * dmidecode.c: Add BIOS characteristics (DMI type 0). - * dmidecode.c: Display BIOS and firmware revisions where available - (DMI type 0). - * dmidecode.c: Display system SKU number and family where available - (DMI type 1). - * dmidecode.c: Add system slot types and widths (DMI type 9). - * dmidecode.c: Add memory device type "DDR2" (DMI type 17). - -2005-03-20 Jean Delvare - - * Makefile: Install manual pages under $(prefix)/share/man by - default, instead of $(prefix)/man, so as to comply with the FHS. - -2005-03-08 Jean Delvare - - * vpddecode.c: Update lookup table from revision 2005-03-08 of IBM - reference document (add product ID "1V", update product ID "1R"). - Thanks to Ingo van Lil for reporting about product ID "1V". - -2005-03-06 Jean Delvare - - * dmidecode.c: Add option -u, --dump. It disables decoding of the - entries, raw dumps are displayed instead. This option is mainly - intended for debugging. - * Makefile: Use -Winline. - * dmidecode.c: Make ASCII filtering of strings faster. - -2005-02-28 Jean Delvare - - * version.h: Set version to 2.6. - * Makefile: ownership.o depends on version.h. - -2005-02-24 Jean Delvare - - * vpddecode.c: Add product ID "2C". Reported by Tomek Mateja. - -2005-02-17 Jean Delvare - - * vpddecode.c: Add product IDs "OP" and "PN". Reported by Scott - Denham. - * vpddecode.c: Fix typo in one product name (560E improperly - spelled 650E). - * vpddecode.c: Add product IDs "IW" and "IY", as added recently - on IBM's reference web page. Update reference. - * config.h: Use mmap on all but BeOS, instead of only Linux. - -2005-02-12 Jean Delvare - - * util.c: Fix incorrect length in munmap call. - * Makefile: Use -Wmissing-prototypes. - * dmidecode.c: Fix maximum battery error value. - -2005-02-11 Jean Delvare - - * Makefile: Discard -pedantic, we don't really need this. - * util.c: Display an error message on memory shortage. Suggested - by Don Howard. - - Fix a bug causing dmidecode to crash on some systems with more than - 2 GB of memory. This is a signed vs unsigned issue, which existed - up to version 2.2, was fixed in 2.3 but reintroduced in a different - form in 2.5 as part of a code clean up and refactoring. - https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=112355 - Thanks to Petter Reinholdtsen for reporting. Thanks to Don Howard - for additional insight. - - * dmidecode.c, util.c, util.h: Use size_t instead of off_t when - handling memory addresses. - -2005-02-10 Jean Delvare - - * dmidecode.c: Add option -h, --help, display a usage summary. - * biosdecode.c, ownership.c, vpddecode.c: Copy command-line handling - from dmidecode.c. - * biosdecode.8, dmidecode.8, ownership.8, vpddecode.8: Document - the new command-line interface. - -2005-02-06 Jean Delvare - - * Makefile: Everything depends on config.h. - * dmidecode.c: Add basic command-line handling. This was suggested - a long time ago by Erwan Velu. - -2005-02-01 Jean Delvare - - * vpddecode.c: Add product IDs "AP", "KP" and "RD". Reported by - David Rosala. - -2005-01-17 Jean Delvare - - * README: Add a note about Cygwin. Thanks to Dominik Klein for - reporting success. - -2004-12-10 Jean Delvare - - Increase portability and configurability to in order to support BeOS. - - * config.h: New. - * config.h: Define a default memory device. - * biosdecode.c, dmidecode.c, ownership.c, vpddecide.c: Include - config.h and use the defined default memory device. - * Makefile, config.h, util.c, README: Move USE_MMAP to config.h, - use mmap on Linux only. - -2004-11-22 Jean Delvare - - * biosdecode.c: Avoid size_t in printf. Should remove a warning on - ia64. Thanks to Petter Reinholdtsen for reporting. - * util.c: Use sysconf(_SC_PAGESIZE) instead of getpagesize() where - available. This may remove a warning on ia64 as a side effect. - Thanks to Petter Reinholdtsen for reporting. - -2004-11-21 Jean Delvare - - * util.c, util.h: Function myread has no more user outside of util.c. - * biosdecode.c: Speed improvements. - -2004-11-20 Jean Delvare - - * biosdecode.c, ownership.c, vpddecode.c: Make use of the mem_chunk - function. - * vpddecode.c: Simplify the memory loop code a bit. - -2004-11-12 Jean Delvare - - * dmidecode.c: Hide bank connection type for non-installed memory - modules. - * dmidecode.c: Reference comment fix. - * dmidecode.c: Hide watchdog timer details when no watchdog is - present. Change label for no watchdog. - * README: Match case change for PREFIX (now prefix) in the Makefile - file. Reported by Raul Nunez de Arenas Coronado. - -2004-11-12 Jean Delvare - - Update to support DMTF Master MIF version 040707 (was 030621). - - * dmidecode.c: One additional processor type (Sempron). - * dmidecode.c: One additional processor type (Efficeon TM8800). - * dmidecode.c: One additional processor upgrade type (Socket 939). - * dmidecode.c: Add the AMD Sempron to the list of x86-class - processors. - - Update to support Intel AP-485 (CPUID) revision 27 (was 25). - - * dmidecode.c: Rename SBF flag to PBE. - -2004-11-11 Jean Delvare - - * util.c: More helpful error messages. - * util.c: Use MAP_SHARED instead of MAP_PRIVATE in mmap. - * version.h: Set version to 2.5. - -2004-11-10 Jean Delvare - - * README: Update dmidecode presentation (copied from the web page). - Move the list of supported systems from the documentation section - to the installation section. - -2004-11-09 Jean Delvare - - * vpddecode.c: Update product ID "1R". Reported by Marco Wertejuk. - -2004-10-24 Jean Delvare - - * util.c: Workaround missing MAP_FAILED definition, needed on - old systems. Original patch from Durval Menezes. - -2004-10-14 Jean Delvare - - * dmidecode.c: Search for EFI systab at /sys/firmware/efi/systab. - Original patch from Alex Williamson. - * dmidecode.c: Remove warning about legacy_decode not being used - when USE_EFI is defined. - * dmidecode.c: Detect missing SMBIOS entry point in efi/systab. - * dmidecode.c: Fix fatal typo in USE_EFI-specific code. - -2004-10-01 Roberto Nibali <ratz@tac.ch> - - * Makefile: Be LDFLAGS aware. - -2004-07-24 Jean Delvare - - * util.c: Add missing header include. - -2004-06-11 Jean Delvare - - * vpddecode.c: Add product IDs "GE" and "T2". Reported by Doug Brenner. - -2004-05-02 Jean Delvare - - * dmidecode.c: Move legacy DMI entry point decoding to a separate - function. - * dmidecode.c: Use a 64 kB buffer for searching entry points, - instead of repeated 16-byte reads. - * util.c, util.h: New mem_chunk function. It returns a buffer - containing a copy of a given chunk of the physical memory. - * dmidecode.c: Make use of the new mem_chunk function. - -2004-04-30 Jean Delvare - - * vpddecode.c: Add product ID "JP". Reported by Bernd Krumboeck. - -2004-04-22 Jean Delvare - - * dmidecode.c, biosdecode.c, ownership.c, types.h: Move common - WORD-like macros to types.h. - -2004-04-21 Jean Delvare - - * dmidecode.c, biosdecode.c: Fix my contact information. - * dmidecode.c: Update copyright year. - -2004-04-20 Jean Delvare - - * README: Correct Chad Smith's name. Reported by Martin Pool. - -2004-04-15 Jean Delvare - - * vpddecode.c: Add product ID "PL". Reported by Mark Syms. - -2004-04-14 Jean Delvare - - * vpddecode.c: Add product ID "PD". Reported by Roger Koot. - -2004-04-11 Jean Delvare - - * dmidecode.c, Makefile, README: Drop TABLE_LITTLEENDIAN. - * README: Update manual pages information. - -2004-04-02 Jean Delvare - - * vpddecode.c: Add product ID "NV". Reported by Shawn Starr. - -2004-03-27 Jean Delvare - - * vpddecode.c: Add product ID "24". Reported by Paul Sturm. - * dmidecode.c: Fix two missing comas in string enumerations. Thanks to - Joshua Goldenhar for reporting the first one. - -2004-03-24 Jean Delvare - - * vpddecode.c: Add product ID "PJ". Reported by Roger Koot. - * vpddecode.c: Rename two Netvista systems to use their real name - instead of machine type. - -2004-03-20 Petter Reinholdtsen <pere@hungry.com> - - * Makefile: Make it easier to select where to install the binaries - and manual pages, and to use different paths when building and - installing. - -2004-03-19 Jean Delvare - - * vpddecode.c: Add product ID "2A". Reported by Rafael Avila - de Espindola. - * version.h: Set version to 2.4. - -2004-03-07 Jean Delvare - - * biosdecode.c, vpddecode.c: Add a third checksumming method for - VPD records. - * vpddecode.c: Add product ID "PI", update "20". Reported by - Zing Zing Shishak. - -2004-03-05 Jean Delvare - - * README: Update. - -2004-02-25 Jean Delvare - - * dmidecode.c: Support CPUID document revision 25 (no change). - * dmidecode.c: Shorten the EOF error message. - -2004-02-23 Jean Delvare - - * man/biosdecode.8, man/dmidecode.8, man/ownership.8, - man/vpddecode.8: New. - * Makefile: Handle new manual pages. - -2003-12-28 Jean Delvare - - * vpddecode.c: Add product ID "PT". Reported by Ramiro Barreiro. - -2003-12-17 Jean Delvare - - * vpddecode.c: Add product ID "RE". Reported by Josef Moellers. - * vpddecode.c, biosdecode.c: Handle longer VPD records as seen on - xSeries. These have a different checksumming method. - -2003-12-03 Jean Delvare - - * vpddecode.c: Add product ID "TT". Reported by Hugues Lepesant. - * vpddecode.c, biosdecode.c: Fix typo ("Bios" becomes "BIOS"). - * dmidecode.c: Add another exception to the CPUID-supporting CPU list - ("Pentium III MMX"). - * dmidecode.c: Number devices in multi-device on board device - information structures (DMI case 10). - -2003-11-13 Jean Delvare - - * dmidecode.c: Automatically detect architectures on which to use EFI - (ia64 for now). Suggested by Jeff Moyer. - -2003-11-11 Jean Delvare - - * vpddecode.c: Add product ID "KX". Reported by Klaus Ade Johnstad, - confirmed by Pamela Huntley. - * dmidecode.c: Display CPUID values as decimal, not hexadecimal. - This is a reversal of the 2003-07-18 change to be consistent with - /proc/cpuinfo under Linux. - * dmidecode.c: Fix processor ID decoding for older 80486. Not very - important since such systems are unlikely to support SMBIOS. - * dmidecode.c: Modify CPU signature display for AMD processors. - * vpddecode.c, biosdecode.c: Fix incorrect VPD checksumming. - -2003-10-24 Jean Delvare - - * dmidecode.c: Add another exception to the CPUID-supporting CPU list. - -2003-10-19 Jean Delvare - - * README: Clarify why mmap is used. Fix typo. - * Makefile: Add deleting core to the clean target. - * version.h: Set version to 2.3. - -2003-10-17 Jean Delvare - - * biosdecode.c: Use (void) instead of __attribute__ ((unused)) to - declare that a function parameter isn't used. According to Alexandre - Duret-Lutz, this is the portable way do to it. Fix typo in comment. - * dmidecode.c: Fix typo. - -2003-10-16 Jean Delvare - - * dmidecode.c: Remove useless comparison in dmi_system_boot_status. - Thanks to Alexandre Duret-Lutz for pointing this out. - * biosdecode.c: Add a missing length check in acpi_decode. Found - using Valgrind. - * biosdecode.c: Fix buffer overrun in main. Found using Valgrind. - -2003-10-14 Jean Delvare - - * dmidecode.c: Update DMTF reference addresses. - * dmidecode.c: List two more processors (Athlon64 and Pentium M) - as x86-class (i.e. supporting CPUID). - -2003-10-11 Jean Delvare - - Update to support DMTF Master MIF version 030621 (was 021205). - - * dmidecode.c: Handle unknown processor voltage. - * dmidecode.c: Fix typo in event log method. - * dmidecode.c: One additional processor type (Pentium M). - * dmidecode.c: Add the AMD Opteron to the list of x86-class - processors. Thanks to Mike Cooper for providing information. - * vpddecode.c: New program for decoding a machine's VPD structure - (only found in IBM machines). - * Makefile: Update accordingly. - * Makefile: Fix dependencies for ownership. Add strip target. Various - cleanups (reordering, comments, optimization and debug flags). - * README: Update to reflect the addition of the strip target and the - vpddecode program. Some additional changes and fixes. - -2003-10-10 Jean Delvare - - * dmidecode.c: Change mmap options to prevent dmidecode from being - killed by the Linux kernel in some rare cases. Reported by - Mike Cooper. - * dmidecode.c: Various code cleanups and optimizations. - -2003-10-09 Jean Delvare - - * dmidecode.c: Fix a bug that prevented dmidecode to reach DMI tables - beyond the 2GB memory limit. Reported by Mike Cooper. - * ownership.c: Add one reference. Code cleanups. - * CHANGELOG: Fix typo. - -2003-10-08 Jean Delvare - - * biosdecode.c: Fix potentially wrong checksum on Sony-specific entry. - * biosdecode.c: Unimportant changes (comment, typo...) in - Compaq-specific section. - * biosdecode.c: Add support for VPD (vital product data, IBM-specific). - * CHANGELOG: Various updates. - -2003-10-07 Jean Delvare - - * ownership.c: Fix a harmless warning on x86_64. Reported by Mike - Cooper. - -2003-09-19 Jean Delvare - - * dmidecode.c: Explicitly say when no SMBIOS nor DMI entry point - was found. Implicitly suggested by Sergey Leonovich. - -2003-09-11 Jean Delvare - - * Makefile: Don't use $^ since it isn't supported by BSD make. - Reported by Hugues Lepesant. - -2003-09-05 Jean Delvare - - * Makefile: Fix missing ownership dependency for install target. - Reported by Mario Lang. - -2003-08-08 Jean Delvare - - * dmidecode.c: Update the README file (mainly the now solved laptop - and IA-64 issues, and add a section for biosdecode and ownership). - * version.h: Set version to 2.2. - -2003-07-18 Jean Delvare - - * dmidecode.c: Display CPUID values as hexadecimal, not decimal. - * dmidecode.c: Shift the I2C slave address by one bit to the right - (DMI case 38). - -2003-06-27 Jean Delvare - - * biosdecode.c: Better display of Compaq-specific entries (thank to - some documentation). - -2003-06-25 Jean Delvare - - * dmidecode.c: Remove fp_last (not useful anymore). Reworded the "table - is unreachable" message to mention the -DUSE_MMAP solution. - -2003-06-19 Jean Delvare - - * dmidecode.c: Add support for IA-64. - * Makefile: Add new option CFLAGS modifier lines for IA-64. - -2003-06-17 Jean Delvare - - * dmidecode.c, biosdecode.c: Move common "util" functions to util.c. - * util.c, util.h: New. - * types.h: New. - * Makefile: Update accordingly. - * biosdecode.c: Add detection of Compaq-specific entries. - * ownership.c: New program for finding a machine's ownership tag - (only found in Compaq machines). Requested by Luc Van de Velde. - * Makefile: Update again. - -2003-06-10 Jean Delvare - - * dmidecode.c: Fix typo in IPMI register spacing table. - * version.h: Set version to 2.1. - -2003-06-04 Jean Delvare - - * Makefile: Restore optional CFLAGS modifier lines. - * README: New. - -2003-05-30 Jean Delvare - - * dmidecode.c: Cleaner handling of unreachable table. - -2003-05-27 Jean Delvare - - Update to support Intel AP-485 specification (CPUID) revision 023 - (was 021). - - * dmidecode.c: Add SBF flag to processor ID (DMI case 4). Add comment - about new flags returned in ECX. - -2003-05-26 Jean Delvare - - Update to support SMBIOS specification version 2.3.4 (was 2.3.3). - - * dmidecode.c: Add processor and processor upgrade names (DMI case 4). - * dmidecode.c: Add slot names (DMI case 9). - -2003-05-22 Jean Delvare - - * dmidecode.c: Fix typo reported by David Wilson (DMI case 6). - -2003-03-08 Jean Delvare - - * dmidecode.c: Decode more fields according to the IPMI specification - (DMI case 38). - -2003-03-07 Jean Delvare - - Fixed IPMI device information (DMI case 38). Thanks to Richard Sharpe - for pointing the bugs out. - - * dmidecode.c: Fix IPMI interface type being shifted by one. - * dmidecode.c: Fix NV storage device being improperly displayed. - * dmidecode.c: Reword IPMI specification revision into specification - version, as suggested in the IPMI specification itself. - * dmidecode.c: Add a reference to the IPMI specification. - * dmidecode.c: Show I2C address as hexadecimal. - * dmidecode.c: Base address is a QWORD, not DWORD. - * dmidecode.c: Decode some extra fields according to the IPMI - specification. - -2003-03-06 Jean Delvare - - * dmidecode.c, biosdecode.c: Move all changelog entries to CHANGELOG. - * CHANGELOG: New. Format inspired by Heroes' ChangeLog file. - * dmidecode.c, biosdecode.c, Makefile: Update copyright years. - * dmidecode.c, biosdecode.c, Makefile: Move version definition to - version.h. Update dependencies accordingly. - * version.h: New. - -2002-10-21 Jean Delvare - - * dmidecode.c: Change supported log type descriptors display. - * dmidecode.c: Code optimization in event log status. - * dmidecode.c: Remove extra newline in voltage probe accuracy. - * dmidecode.c: Display "OEM-specific" if type is 128 or more. - * dmidecode.c: Do not display Strings on dump if there are no strings. - * dmidecode.c: Add ASCII-filtering to dmi_string. - * dmidecode.c: Convert all dates to ISO 8601. - -2002-10-18 Jean Delvare - - * dmidecode.c: Complete rewrite. - * dmidecode.c: Now complies with SMBIOS specification 2.3.3. - * dmidecode.c: Move all non-DMI stuff to biosdecode.c. - * biosdecode.c: New. - -2002-10-15 Jean Delvare - - * dmidecode.c: Fix bad index in DMI case 27 (cooling device). - -2002-10-14 Jean Delvare - - * dmidecode.c: Fix typo in dmi_memory_array_location. - * dmidecode.c: Replace Kbyte by kB in DMI case 16. - * dmidecode.c: Add DDR entry in dmi_memory_device_type. - * dmidecode.c: Fix extra s in SYSID. - -2002-10-12 Jean Delvare - - * dmidecode.c: Fix maximum cache size and installed size being - inverted. - * dmidecode.c: Fix typos in port types. - -2002-10-10 Jean Delvare - - * dmidecode.c: Remove extra semicolon at the end of - dmi_memory_array_use. - * dmidecode.c: Fix compilation warnings. - * dmidecode.c: Add missing backslash in DMI case 37. - * dmidecode.c: Fix BIOS ROM size (DMI case 0). - -2002-10-05 Jean Delvare - - * dmidecode.c: More ACPI decoded. - * dmidecode.c: More PNP decoded. - * dmidecode.c: More SYSID decoded. - * dmidecode.c: PCI Interrupt Routing decoded. - * dmidecode.c: BIOS32 Service Directory decoded. - * dmidecode.c: Sony system detection (unconfirmed). - * dmidecode.c: Checksums verified whenever possible. - * dmidecode.c: Better checks on file read and close. - * dmidecode.c: Define VERSION and display version at beginning. - * dmidecode.c: More secure decoding (won't run off the table in any - case). - * dmidecode.c: Do not try to decode more structures than announced. - * dmidecode.c: Fix an off-by-one error that caused the last address - being scanned to be 0x100000, not 0xFFFF0 as it should. - -2002-09-28 Jean Delvare - - * dmidecode.c: Fix missing coma in dmi_bus_name. - * dmidecode.c: Remove unwanted bitmaskings in dmi_mgmt_dev_type, - dmi_mgmt_addr_type, dmi_fan_type, dmi_volt_loc, dmi_temp_loc and - dmi_status. - * dmidecode.c: Fix DMI table read bug ("dmi: read: Success"). - * dmidecode.c: Make the code pass -W again. - * dmidecode.c: Fix return value of dmi_card_size. - -2002-09-20 Dave Johnson <ddj@cascv.brown.edu> - - * dmidecode.c: Fix comparisons in dmi_bus_name. - * dmidecode.c: Fix comparison in dmi_processor_type. - * dmidecode.c: Fix bitmasking in dmi_onboard_type. - * dmidecode.c: Fix return value of dmi_temp_loc. - -2002-09-17 Larry Lile <llile@dreamworks.com> - - * dmidecode.c: Type 16 & 17 structures displayed per SMBIOS 2.3.1 spec. - -2002-08-23 Alan Cox <alan@redhat.com> - - * dmidecode.c: Make the code pass -Wall -pedantic by fixing a few - harmless sign of pointer mismatches. - * dmidecode.c: Correct main() prototype. - * dmidecode.c: Check for compilers with wrong type sizes. - -2002-08-09 Jean Delvare - - * dmidecode.c: Better DMI struct count/size error display. - * dmidecode.c: More careful memory access in dmi_table. - * dmidecode.c: DMI case 13 (Language) decoded. - * dmidecode.c: C++ style comments removed. Commented out code removed. - * dmidecode.c: DMI 0.0 case handled. - * dmideocde.c: Fix return value of dmi_port_type and - dmi_port_connector_type. - -2002-08-06 Jean Delvare - - * dmidecode.c: Reposition file pointer after DMI table display. - * dmidecode.c: Disable first RSD PTR checksum (was not correct anyway). - * dmidecode.c: Show actual DMI struct count and occupied size. - * dmidecode.c: Check for NULL after malloc. - * dmidecode.c: Use SEEK_* constants instead of numeric values. - * dmidecode.c: Code optimization (and warning fix) in DMI cases 10 and - 14. - * dmidecode.c: Add else's to avoid unneeded cascaded if's in main loop. - * dmidecode.c: Code optimization in DMI information display. - * dmidecode.c: Fix all compilation warnings. - -2002-08-03 Mark D. Studebaker <mds@paradyne.com> - - * dmidecode.c: Better indent in dump_raw_data. - * dmidecode.c: Fix return value of dmi_bus_name. - * dmidecode.c: Additional sensor fields decoded. - * dmidecode.c: Fix compilation warnings. - -2001-12-13 Arjan van de Ven <arjanv@redhat.com> - - * dmidecode.c: Fix memory bank type (DMI case 6). - -2001-07-02 Matt Domsch <Matt_Domsch@dell.com> - - * dmidecode.c: Additional structures displayed per SMBIOS 2.3.1 spec. @@ -134,7 +134,7 @@ uninstall-man : install-doc : $(INSTALL_DIR) $(DESTDIR)$(docdir) $(INSTALL_DATA) README $(DESTDIR)$(docdir) - $(INSTALL_DATA) CHANGELOG $(DESTDIR)$(docdir) + $(INSTALL_DATA) NEWS $(DESTDIR)$(docdir) $(INSTALL_DATA) AUTHORS $(DESTDIR)$(docdir) uninstall-doc : @@ -0,0 +1,142 @@ +Version 3.2 (Wed Sep 14 2018) + - [COMPATIBILITY] The UUID is now displayed using lowercase letters, per + RFC 4122 (#53569). You must ensure that any code parsing it is + case-insensitive. + - Support for SMBIOS 3.2.0. This includes new processor names, new socket + and port connector types, new system slot state and property, and support + for non-volatile memory (NVDIMM). + - Support for Redfish management controllers. + - A new command line option to query a specific structure by its handle. + - A new command line option to query the system family string. + - Support for 3 ThinkPad-specific structures (patch #9642). + - Support for HPE's new company name. + - Support UEFI on FreeBSD. + - Important bug fixes: + Fix firmware version of TPM device + Fix the HPE UEFI feature flag check + - (biosdecode) A new command line option to fully decode PIR information + (support request #109339). + +Version 3.1 (Tue May 23 2017) + - Support for SMBIOS 3.1.0 and 3.1.1. This includes new chassis types, new + processor family names, new processor family upgrade names, and new slot + types, as well as support of larger BIOS ROM sizes and cache sizes, and a + new structure type (43, TPM Device.) + - A new command line option to query OEM strings. + - All error messages are now printed on stderr (#47274, #48158.) + - Several bug fixes related to 64-bit entry points (#50037 and more.) + - Important bug fixes: + #46176 (Unexpected end of file error) + #46066 (Crash with SIGBUS) + - Various minor fixes, improvements and cleanups. + +Version 3.0 (Thu Sep 03 2015) + - Support for SMBIOS 3.0. This includes new chassis types, new + processor family names, new processor family upgrade names, new slot + types, and new memory device types. + - Support for the new 64-bit entry point (_SM3_) defined in SMBIOS 3.0. + - Support for the new kernel interface (as of Linux v4.2) as an + alternative to relying /dev/mem to access the entry point and DMI + table. + - Decoding of Acer-specific DMI type 170. + - Decoding of HP-specific DMI types 212, 219 and 233. + - Various minor fixes and output format cleanups. + +Version 2.12 (Wed Apr 17 2013) + - Support of the SMBIOS 2.8.0 specification. + +Version 2.11 (Wed Jan 19 2011) + - Support of the SMBIOS 2.7.0 specification: + - UEFI support + - Virtual machine flags in BIOS characteristics + - Limited support for the Management Controller Host Interface + - Various fixes that address stability. + +Version 2.10 (Sun Nov 23 2008) + - Support for Solaris (x86 only, of course). + - Possibility to dump the SMBIOS/DMI table to a small binary file + (option --dump-bin). + - Possibility to read the SMBIOS/DMI table from such binary files + (option --from-dump). + - Support for SMBIOS 2.6. This includes new chassis types, new + processor family names, new processor family upgrade names, bus + address for system slots, and a new entry type for on-board devices, + amongst many other minor changes. + - Support for DMI entry type 31 (Boot integrity services). + - Many processor family names taken from the CIM Schema document. + - (vpddecode) No longer ask users to report broken records. + - (vpddecode) Fix --quiet option. + +Version 2.9 (Mon Feb 26 2007) + - Support of the SMBIOS 2.5 specification. It adds many enumerated + values for recent hardware, as well as CPU core and thread count + reporting. + - Decoding of 3 HP-specific entries. More vendor-specific entries can + be supported later if vendors contribute code or documentation. + - Run-time detection of EFI, so that a single binary can support + Intel-based Macintosh machines and regular x86 machines. + - Better IA-64 support. + - Fixes to the decoding of individual fields, including the CPU + signature of recent CPU models. + - (biosdecode) Support of the FJKEYINF entry point type (for Fujitsu laptops). + - (vpddecode) The product name look-up table was dropped. It was unreliable + and a burden to maintain. + - biosdecode, ownership and vpddecode are no longer built on IA-64. + +Version 2.8 (Sat Feb 04 2006) + - Option --string has four additional keywords available: + system-uuid, chassis-type, processor-family and processor-frequency. + These needed additional work because, technically speaking, they are + not DMI strings. + - IPMI interface type SSIF was added. This is a new interface type + defined by IPMI 2.0. + - (vpddecode) New --string option, much similar in spirit to + dmidecode's. Available keywords are bios-build-id, box-serial-number, + motherboard-serial-number, machine-type-model and bios-release-date. + - (vpddecode) 9 product names were added to the lookup table. + - A few bug fixes, cleanups and minor improvements all around the place. + +Version 2.7 (Thu Aug 04 2005) + - New command line interface. For example, it is now possible to limit + the output of dmidecode to a given DMI type, or to extract a single + string from the DMI table. The documentation has been updated + accordingly. + - The default output of dmidecode was slightly modified to be more + easily readable by humans. This might break tools parsing its output. + Such tools may benefit from the new command line interface, although + this interface shouldn't be considered stable until version 2.8. + - (vpddecode) New command line interface. + - (vpddecode) 6 product names were added. + +Version 2.6 (Mon Feb 28 2005) + - Fixes a 2 GB memory limit regression. + - Basic command-line handling. + - BeOS and Cygwin support. + +Version 2.5 (Thu Nov 11 2004) + - Code cleanups. + - Compatibility fixes. + - Documentation updates. + +Version 2.4 (Fri Mar 19 2004) + - Manual pages added. + - (vpddecode) Many improvements. + - A few fixes and minor improvements. + +Version 2.3 (Sun Oct 19 2003) + - Support of x86_64 systems. + - Support of systems with 2 GB and more memory. + - Loads of bug fixes and corrections. + - New tool "vpddecode" added. + +Version 2.2 (Fri Aug 08 2003) + - Support of IA-64 systems. + - Support of IBM and Fujitsu-Siemens laptops. + - Many minor bug fixes. + - New tool "ownership" added. + +Version 2.1 (Tue Jun 10 2003) + - Support of the SMBIOS 2.3.4 specification. + - Better support of IPMI. + - Minor bugs fixed. + - Documentation added. @@ -56,7 +56,7 @@ Each tool has a manual page, found in the "man" subdirectory. Manual pages are installed by "make install". See these manual pages for command line interface details and tool specific information. -For an history of the changes made to dmidecode, see the CHANGELOG file. +For an history of the changes made to dmidecode, see the NEWS file. If you need help, your best chances are to visit the web page (see the INSTALLATION section above) or to get in touch with the developers directly. diff --git a/biosdecode.c b/biosdecode.c index ad3d4bc..99a27fe 100644 --- a/biosdecode.c +++ b/biosdecode.c @@ -73,12 +73,16 @@ struct opt { const char *devmem; unsigned int flags; + unsigned char pir; }; static struct opt opt; #define FLAG_VERSION (1 << 0) #define FLAG_HELP (1 << 1) +#define PIR_SHORT 0 +#define PIR_FULL 1 + struct bios_entry { const char *anchor; size_t anchor_len; /* computed */ @@ -351,7 +355,7 @@ static void pir_slot_number(u8 code) if (code == 0) printf(" on-board"); else - printf(" slot number %u", code); + printf(" slot %u", code); } static size_t pir_length(const u8 *p) @@ -359,16 +363,26 @@ static size_t pir_length(const u8 *p) return WORD(p + 6); } +static void pir_link_bitmap(char letter, const u8 *p) +{ + if (p[0] == 0) /* Not connected */ + return; + + printf("\t\tINT%c#: Link 0x%02x, IRQ Bitmap", letter, p[0]); + pir_irqs(WORD(p + 1)); + printf("\n"); +} + static int pir_decode(const u8 *p, size_t len) { - int i; + int i, n; if (len < 32 || !checksum(p, WORD(p + 6))) return 0; printf("PCI Interrupt Routing %u.%u present.\n", p[5], p[4]); - printf("\tRouter ID: %02x:%02x.%1x\n", + printf("\tRouter Device: %02x:%02x.%1x\n", p[8], p[9]>>3, p[9] & 0x07); printf("\tExclusive IRQs:"); pir_irqs(WORD(p + 10)); @@ -380,38 +394,19 @@ static int pir_decode(const u8 *p, size_t len) printf("\tMiniport Data: 0x%08X\n", DWORD(p + 16)); - for (i = 1; i <= (WORD(p + 6) - 32) / 16; i++) + n = (len - 32) / 16; + for (i = 1, p += 32; i <= n; i++, p += 16) { - printf("\tSlot Entry %u: ID %02x:%02x,", - i, p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3); - pir_slot_number(p[(i + 1) * 16 + 14]); + printf("\tDevice: %02x:%02x,", p[0], p[1] >> 3); + pir_slot_number(p[14]); printf("\n"); -/* printf("\tSlot Entry %u\n", i); - printf("\t\tID: %02x:%02x\n", - p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3); - printf("\t\tLink Value for INTA#: %u\n", - p[(i + 1) * 16 + 2]); - printf("\t\tIRQ Bitmap for INTA#:"); - pir_irqs(WORD(p + (i + 1) * 16 + 3)); - printf("\n"); - printf("\t\tLink Value for INTB#: %u\n", - p[(i + 1) * 16 + 5]); - printf("\t\tIRQ Bitmap for INTB#:"); - pir_irqs(WORD(p + (i + 1) * 16 + 6)); - printf("\n"); - printf("\t\tLink Value for INTC#: %u\n", - p[(i + 1) * 16 + 8]); - printf("\t\tIRQ Bitmap for INTC#:"); - pir_irqs(WORD(p + (i + 1) * 16 + 9)); - printf("\n"); - printf("\t\tLink Value for INTD#: %u\n", - p[(i + 1) * 16 + 11]); - printf("\t\tIRQ Bitmap for INTD#:"); - pir_irqs(WORD(p + (i + 1) * 16 + 12)); - printf("\n"); - printf("\t\tSlot Number:"); - pir_slot_number(p[(i + 1) * 16 + 14]); - printf("\n");*/ + if (opt.pir == PIR_FULL) + { + pir_link_bitmap('A', p + 2); + pir_link_bitmap('B', p + 5); + pir_link_bitmap('C', p + 8); + pir_link_bitmap('D', p + 11); + } } return 1; @@ -616,6 +611,7 @@ static int parse_command_line(int argc, char * const argv[]) const char *optstring = "d:hV"; struct option longopts[] = { { "dev-mem", required_argument, NULL, 'd' }, + { "pir", required_argument, NULL, 'P' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, { NULL, 0, NULL, 0 } @@ -627,6 +623,10 @@ static int parse_command_line(int argc, char * const argv[]) case 'd': opt.devmem = optarg; break; + case 'P': + if (strcmp(optarg, "full") == 0) + opt.pir = PIR_FULL; + break; case 'h': opt.flags |= FLAG_HELP; break; @@ -646,6 +646,7 @@ static void print_help(void) "Usage: biosdecode [OPTIONS]\n" "Options are:\n" " -d, --dev-mem FILE Read memory from device FILE (default: " DEFAULT_MEM_DEV ")\n" + " --pir full Decode the details of the PCI IRQ routing table\n" " -h, --help Display this help text and exit\n" " -V, --version Display the version and exit\n"; diff --git a/dmidecode.c b/dmidecode.c index 6559567..a3e9d6c 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-2017 Jean Delvare <jdelvare@suse.de> + * Copyright (C) 2002-2018 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 @@ -25,7 +25,7 @@ * are deemed to be part of the source code. * * Unless specified otherwise, all references are aimed at the "System - * Management BIOS Reference Specification, Version 3.1.1" document, + * Management BIOS Reference Specification, Version 3.2.0" document, * available from http://www.dmtf.org/standards/smbios. * * Note to contributors: @@ -56,6 +56,8 @@ * - "PC Client Platform TPM Profile (PTP) Specification" * Family "2.0", Level 00, Revision 00.43, January 26, 2015 * https://trustedcomputinggroup.org/pc-client-platform-tpm-profile-ptp-specification/ + * - "RedFish Host Interface Specification" (DMTF DSP0270) + * https://www.dmtf.org/sites/default/files/DSP0270_1.0.1.pdf */ #include <stdio.h> @@ -63,6 +65,12 @@ #include <strings.h> #include <stdlib.h> #include <unistd.h> +#include <arpa/inet.h> + +#ifdef __FreeBSD__ +#include <errno.h> +#include <kenv.h> +#endif #include "version.h" #include "config.h" @@ -75,7 +83,7 @@ #define out_of_spec "<OUT OF SPEC>" static const char *bad_index = "<BAD INDEX>"; -#define SUPPORTED_SMBIOS_VER 0x030101 +#define SUPPORTED_SMBIOS_VER 0x030200 #define FLAG_NO_FILE_OFFSET (1 << 0) #define FLAG_STOP_AT_EOT (1 << 1) @@ -440,11 +448,11 @@ static void dmi_system_uuid(const u8 *p, u16 ver) * for older versions. */ if (ver >= 0x0206) - printf("%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", + printf("%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]); else - printf("%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", + printf("%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]); } @@ -878,6 +886,7 @@ static const char *dmi_processor_family(const struct dmi_header *h, u16 ver) { 0xCC, "z/Architecture" }, { 0xCD, "Core i5" }, { 0xCE, "Core i3" }, + { 0xCF, "Core i9" }, { 0xD2, "C7-M" }, { 0xD3, "C7-D" }, @@ -1085,7 +1094,7 @@ static void dmi_processor_id(const struct dmi_header *h, const char *prefix) || (type >= 0xA1 && type <= 0xB3) /* Intel */ || type == 0xB5 /* Intel */ || (type >= 0xB9 && type <= 0xC7) /* Intel */ - || (type >= 0xCD && type <= 0xCE) /* Intel */ + || (type >= 0xCD && type <= 0xCF) /* Intel */ || (type >= 0xD2 && type <= 0xDB) /* VIA, Intel */ || (type >= 0xDD && type <= 0xE0)) /* Intel */ sig = 1; @@ -1269,10 +1278,14 @@ static const char *dmi_processor_upgrade(u8 code) "Socket BGA1515", "Socket LGA3647-1", "Socket SP3", - "Socket SP3r2" /* 0x38 */ + "Socket SP3r2", + "Socket LGA2066", + "Socket BGA1392", + "Socket BGA1510", + "Socket BGA1528" /* 0x3C */ }; - if (code >= 0x01 && code <= 0x38) + if (code >= 0x01 && code <= 0x3C) return upgrade[code - 0x01]; return out_of_spec; } @@ -1685,7 +1698,8 @@ static const char *dmi_port_connector_type(u8 code) "Mini Jack (headphones)", "BNC", "IEEE 1394", - "SAS/SATA Plug Receptacle" /* 0x22 */ + "SAS/SATA Plug Receptacle", + "USB Type-C Receptacle" /* 0x23 */ }; static const char *type_0xA0[] = { "PC-98", /* 0xA0 */ @@ -1695,7 +1709,7 @@ static const char *dmi_port_connector_type(u8 code) "PC-98 Full" /* 0xA4 */ }; - if (code <= 0x22) + if (code <= 0x23) return type[code]; if (code >= 0xA0 && code <= 0xA4) return type_0xA0[code - 0xA0]; @@ -1870,10 +1884,11 @@ static const char *dmi_slot_current_usage(u8 code) "Other", /* 0x01 */ "Unknown", "Available", - "In Use" /* 0x04 */ + "In Use", + "Unavailable" /* 0x05 */ }; - if (code >= 0x01 && code <= 0x04) + if (code >= 0x01 && code <= 0x05) return usage[code - 0x01]; return out_of_spec; } @@ -1958,7 +1973,8 @@ static void dmi_slot_characteristics(u8 code1, u8 code2, const char *prefix) static const char *characteristics2[] = { "PME signal is supported", /* 0 */ "Hot-plug devices are supported", - "SMBus signal is supported" /* 2 */ + "SMBus signal is supported", + "PCIe slot bifurcation is supported" /* 3 */ }; if (code1 & (1 << 0)) @@ -1973,7 +1989,7 @@ static void dmi_slot_characteristics(u8 code1, u8 code2, const char *prefix) for (i = 1; i <= 7; i++) if (code1 & (1 << i)) printf("%s%s\n", prefix, characteristics1[i - 1]); - for (i = 0; i <= 2; i++) + for (i = 0; i <= 3; i++) if (code2 & (1 << i)) printf("%s%s\n", prefix, characteristics2[i]); } @@ -2502,6 +2518,79 @@ static void dmi_memory_device_speed(u16 code) printf(" %u MT/s", code); } +static void dmi_memory_technology(u8 code) +{ + /* 7.18.6 */ + static const char * const technology[] = { + "Other", /* 0x01 */ + "Unknown", + "DRAM", + "NVDIMM-N", + "NVDIMM-F", + "NVDIMM-P", + "Intel persistent memory" /* 0x07 */ + }; + if (code >= 0x01 && code <= 0x07) + printf(" %s", technology[code - 0x01]); + else + printf(" %s", out_of_spec); +} + +static void dmi_memory_operating_mode_capability(u16 code) +{ + /* 7.18.7 */ + static const char * const mode[] = { + "Other", /* 1 */ + "Unknown", + "Volatile memory", + "Byte-accessible persistent memory", + "Block-accessible persistent memory" /* 5 */ + }; + + if ((code & 0xFFFE) == 0) + printf(" None"); + else { + int i; + + for (i = 1; i <= 5; i++) + if (code & (1 << i)) + printf(" %s", mode[i - 1]); + } +} + +static void dmi_memory_manufacturer_id(u16 code) +{ + /* 7.18.8 */ + /* 7.18.10 */ + /* LSB is 7-bit Odd Parity number of continuation codes */ + if (code == 0) + printf(" Unknown"); + else + printf(" Bank %d, Hex 0x%02X", (code & 0x7F) + 1, code >> 8); +} + +static void dmi_memory_product_id(u16 code) +{ + /* 7.18.9 */ + /* 7.18.11 */ + if (code == 0) + printf(" Unknown"); + else + printf(" 0x%04X", code); +} + +static void dmi_memory_size(u64 code) +{ + /* 7.18.12 */ + /* 7.18.13 */ + if (code.h == 0xFFFFFFFF && code.l == 0xFFFFFFFF) + printf(" Unknown"); + else if (code.h == 0x0 && code.l == 0x0) + printf(" None"); + else + dmi_print_memory_size(code, 0); +} + /* * 7.19 32-bit Memory Error Information (Type 18) */ @@ -3313,12 +3402,380 @@ static const char *dmi_management_controller_host_type(u8 code) if (code >= 0x02 && code <= 0x08) return type[code - 0x02]; + if (code <= 0x3F) + return "MCTP"; + if (code == 0x40) + return "Network"; if (code == 0xF0) return "OEM"; return out_of_spec; } /* + * 7.43.2: Protocol Record Types + */ +static const char *dmi_protocol_record_type(u8 type) +{ + const char *protocol[] = { + "Reserved", /* 0x0 */ + "Reserved", + "IPMI", + "MCTP", + "Redfish over IP", /* 0x4 */ + }; + + if (type <= 0x4) + return protocol[type]; + if (type == 0xF0) + return "OEM"; + return out_of_spec; +} + +/* + * DSP0270: 8.6: Protocol IP Assignment types + */ +static const char *dmi_protocol_assignment_type(u8 type) +{ + const char *assignment[] = { + "Unknown", /* 0x0 */ + "Static", + "DHCP", + "AutoConf", + "Host Selected", /* 0x4 */ + }; + + if (type <= 0x4) + return assignment[type]; + return out_of_spec; +} + +/* + * DSP0270: 8.6: Protocol IP Address type + */ +static const char *dmi_address_type(u8 type) +{ + const char *addressformat[] = { + "Unknown", /* 0x0 */ + "IPv4", + "IPv6", /* 0x2 */ + }; + + if (type <= 0x2) + return addressformat[type]; + return out_of_spec; +} + +/* + * DSP0270: 8.6 Protocol Address decode + */ +static const char *dmi_address_decode(u8 *data, char *storage, u8 addrtype) +{ + if (addrtype == 0x1) /* IPv4 */ + return inet_ntop(AF_INET, data, storage, 64); + if (addrtype == 0x2) /* IPv6 */ + return inet_ntop(AF_INET6, data, storage, 64); + return out_of_spec; +} + +/* + * DSP0270: 8.5: Parse the protocol record format + */ +static void dmi_parse_protocol_record(const char *prefix, u8 *rec) +{ + u8 rid; + u8 rlen; + u8 *rdata; + char buf[64]; + u8 assign_val; + u8 addrtype; + u8 hlen; + const char *addrstr; + const char *hname; + + /* DSP0270: 8.5: Protocol Identifier */ + rid = rec[0x0]; + /* DSP0270: 8.5: Protocol Record Length */ + rlen = rec[0x1]; + /* DSP0270: 8.5: Protocol Record Data */ + rdata = &rec[0x2]; + + printf("%s\tProtocol ID: %02x (%s)\n", prefix, rid, + dmi_protocol_record_type(rid)); + + /* + * Don't decode anything other than Redfish for now + * Note 0x4 is Redfish over IP in 7.43.2 + * and DSP0270: 8.5 + */ + if (rid != 0x4) + return; + + /* + * Ensure that the protocol record is of sufficient length + * For RedFish that means rlen must be at least 91 bytes + * other protcols will need different length checks + */ + if (rlen < 91) + return; + + /* + * DSP0270: 8.6: Redfish Over IP Service UUID + * Note: ver is hardcoded to 0x311 here just for + * convenience. It could get passed from the SMBIOS + * header, but that's a lot of passing of pointers just + * to get that info, and the only thing it is used for is + * to determine the endianess of the field. Since we only + * do this parsing on versions of SMBIOS after 3.1.1, and the + * 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); + dmi_system_uuid(&rdata[0], 0x311); + printf("\n"); + + /* + * DSP0270: 8.6: Redfish Over IP Host IP Assignment Type + * Note, using decimal indicies here, as the DSP0270 + * uses decimal, so as to make it more comparable + */ + assign_val = rdata[16]; + 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 */ + addrtype = rdata[17]; + addrstr = dmi_address_type(addrtype); + printf("%s\t\tHost IP Address Format: %s\n", prefix, + addrstr); + + /* DSP0270: 8.6 IP Assignment types */ + /* We only use the Host IP Address and Mask if the assignment type is static */ + 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, + 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, + 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, + 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, + addrstr); + + if (assign_val == 0x1 || assign_val == 0x3) + { + u16 port; + u32 vlan; + + /* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Address */ + printf("%s\t\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, + 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); + } + + /* DSP0270: 8.6: Redfish host length and name */ + hlen = rdata[90]; + + /* + * DSP0270: 8.6: The length of the host string + 91 (the minimum + * size of a protocol record) cannot exceed the record length + * (rec[0x1]) + */ + hname = (const char *)&rdata[91]; + if (hlen + 91 > rlen) + { + hname = out_of_spec; + hlen = strlen(out_of_spec); + } + printf("%s\t\tRedfish Service Hostname: %*s\n", prefix, hlen, hname); +} + +/* + * DSP0270: 8.3: Device type ennumeration + */ +static const char *dmi_parse_device_type(u8 type) +{ + const char *devname[] = { + "USB", /* 0x2 */ + "PCI/PCIe", /* 0x3 */ + }; + + if (type >= 0x2 && type <= 0x3) + return devname[type - 0x2]; + if (type >= 0x80) + return "OEM"; + return out_of_spec; +} + +static void dmi_parse_controller_structure(const struct dmi_header *h, + const char *prefix) +{ + int i; + u8 *data = h->data; + /* Host interface type */ + u8 type; + /* Host Interface specific data length */ + u8 len; + u8 count; + u32 total_read; + + /* + * Minimum length of this struct is 0xB bytes + */ + if (h->length < 0xB) + return; + + /* + * Also need to ensure that the interface specific data length + * plus the size of the structure to that point don't exceed + * the defined length of the structure, or we will overrun its + * bounds + */ + len = data[0x5]; + total_read = len + 0x6; + + if (total_read > h->length) + return; + + type = data[0x4]; + printf("%sHost Interface Type: %s\n", prefix, + dmi_management_controller_host_type(type)); + + /* + * The following decodes are code for Network interface host types only + * As defined in DSP0270 + */ + if (type != 0x40) + return; + + if (len != 0) + { + /* DSP0270: 8.3 Table 2: Device Type */ + type = data[0x6]; + + printf("%sDevice Type: %s\n", prefix, + dmi_parse_device_type(type)); + if (type == 0x2 && len >= 5) + { + /* USB Device Type - need at least 6 bytes */ + u8 *usbdata = &data[0x7]; + /* USB Device Descriptor: idVendor */ + printf("%s\tidVendor: 0x%04x\n", prefix, + WORD(&usbdata[0x0])); + /* USB Device Descriptor: idProduct */ + printf("%s\tidProduct: 0x%04x\n", prefix, + WORD(&usbdata[0x2])); + /* + * USB Serial number is here, but its useless, don't + * bother decoding it + */ + } + else if (type == 0x3 && len >= 9) + { + /* PCI Device Type - Need at least 8 bytes */ + u8 *pcidata = &data[0x7]; + /* PCI Device Descriptor: VendorID */ + printf("%s\tVendorID: 0x%04x\n", prefix, + WORD(&pcidata[0x0])); + /* PCI Device Descriptor: DeviceID */ + printf("%s\tDeviceID: 0x%04x\n", prefix, + WORD(&pcidata[0x2])); + /* PCI Device Descriptor: PCI SubvendorID */ + printf("%s\tSubVendorID: 0x%04x\n", prefix, + WORD(&pcidata[0x4])); + /* PCI Device Descriptor: PCI SubdeviceID */ + printf("%s\tSubDeviceID: 0x%04x\n", prefix, + WORD(&pcidata[0x6])); + } + else if (type == 0x4 && len >= 5) + { + /* 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", + prefix, oemdata[0x0], oemdata[0x1], + oemdata[0x2], oemdata[0x3]); + } + /* Don't mess with unknown types for now */ + } + + /* + * DSP0270: 8.2 and 8.5: Protocol record count and protocol records + * Move to the Protocol Count. + */ + data = &data[total_read]; + + /* + * We've validated up to 0x6 + len bytes, but we need to validate + * the next byte below, the count value. + */ + 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); + return; + } + + /* Get the protocol records count */ + count = data[0x0]; + if (count) + { + u8 *rec = &data[0x1]; + for (i = 0; i < count; i++) + { + /* + * Need to ensure that this record doesn't overrun + * the total length of the type 42 struct. Note the +2 + * is added for the two leading bytes of a protocol + * record representing the type and length bytes. + */ + 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); + return; + } + + dmi_parse_protocol_record(prefix, rec); + + /* + * DSP0270: 8.6 + * Each record is rec[1] bytes long, starting at the + * data byte immediately following the length field. + * That means we need to add the byte for the rec id, + * the byte for the length field, and the value of the + * length field itself. + */ + rec += rec[1] + 2; + } + } +} + +/* * 7.44 TPM Device (Type 43) */ @@ -3889,7 +4346,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver) printf("%u", data[0x1B] & 0x0F); printf("\n"); if (h->length < 0x22) break; - printf("\tConfigured Clock Speed:"); + printf("\tConfigured Memory Speed:"); dmi_memory_device_speed(WORD(data + 0x20)); printf("\n"); if (h->length < 0x28) break; @@ -3902,6 +4359,43 @@ static void dmi_decode(const struct dmi_header *h, u16 ver) printf("\tConfigured Voltage:"); dmi_memory_voltage_value(WORD(data + 0x26)); printf("\n"); + if (h->length < 0x34) break; + printf("\tMemory Technology:"); + dmi_memory_technology(data[0x28]); + printf("\n"); + printf("\tMemory Operating Mode Capability:"); + dmi_memory_operating_mode_capability(WORD(data + 0x29)); + printf("\n"); + printf("\tFirmware Version: %s\n", + dmi_string(h, data[0x2B])); + printf("\tModule Manufacturer ID:"); + dmi_memory_manufacturer_id(WORD(data + 0x2C)); + printf("\n"); + printf("\tModule Product ID:"); + dmi_memory_product_id(WORD(data + 0x2E)); + printf("\n"); + printf("\tMemory Subsystem Controller Manufacturer ID:"); + dmi_memory_manufacturer_id(WORD(data + 0x30)); + printf("\n"); + printf("\tMemory Subsystem Controller Product ID:"); + dmi_memory_product_id(WORD(data + 0x32)); + printf("\n"); + if (h->length < 0x3C) break; + printf("\tNon-Volatile Size:"); + dmi_memory_size(QWORD(data + 0x34)); + printf("\n"); + if (h->length < 0x44) break; + printf("\tVolatile Size:"); + dmi_memory_size(QWORD(data + 0x3C)); + printf("\n"); + if (h->length < 0x4C) break; + printf("\tCache Size:"); + dmi_memory_size(QWORD(data + 0x44)); + printf("\n"); + if (h->length < 0x54) break; + printf("\tLogical Size:"); + dmi_memory_size(QWORD(data + 0x4C)); + printf("\n"); break; case 18: /* 7.19 32-bit Memory Error Information */ @@ -4467,22 +4961,27 @@ static void dmi_decode(const struct dmi_header *h, u16 ver) case 42: /* 7.43 Management Controller Host Interface */ printf("Management Controller Host Interface\n"); - if (h->length < 0x05) break; - printf("\tInterface Type: %s\n", - dmi_management_controller_host_type(data[0x04])); - /* - * There you have a type-dependent, variable-length - * part in the middle of the structure, with no - * length specifier, so no easy way to decode the - * common, final part of the structure. What a pity. - */ - if (h->length < 0x09) break; - if (data[0x04] == 0xF0) /* OEM */ + if (ver < 0x0302) { - printf("\tVendor ID: 0x%02X%02X%02X%02X\n", - data[0x05], data[0x06], data[0x07], - data[0x08]); + if (h->length < 0x05) break; + printf("\tInterface Type: %s\n", + dmi_management_controller_host_type(data[0x04])); + /* + * There you have a type-dependent, variable-length + * part in the middle of the structure, with no + * length specifier, so no easy way to decode the + * common, final part of the structure. What a pity. + */ + if (h->length < 0x09) break; + if (data[0x04] == 0xF0) /* OEM */ + { + printf("\tVendor ID: 0x%02X%02X%02X%02X\n", + data[0x05], data[0x06], data[0x07], + data[0x08]); + } } + else + dmi_parse_controller_structure(h, "\t"); break; case 43: /* 7.44 TPM Device */ @@ -4506,7 +5005,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver) case 0x02: printf("\tFirmware Revision: %u.%u\n", DWORD(data + 0x0A) >> 16, - DWORD(data + 0x0A) && 0xFF); + DWORD(data + 0x0A) & 0xFFFF); /* * We skip the next 4 bytes, as their * format is not standardized and their @@ -4617,6 +5116,7 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags) to_dmi_header(&h, data); display = ((opt.type == NULL || opt.type[h.type]) + && (opt.handle == ~0U || opt.handle == h.handle) && !((opt.flags & FLAG_QUIET) && (h.type == 126 || h.type == 127)) && !opt.string); @@ -4638,6 +5138,7 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags) } break; } + i++; /* In quiet mode, stop decoding at end of table marker */ if ((opt.flags & FLAG_QUIET) && h.type == 127) @@ -4648,6 +5149,22 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags) printf("Handle 0x%04X, DMI type %d, %d bytes\n", h.handle, h.type, h.length); + /* Look for the next handle */ + next = data + h.length; + while ((unsigned long)(next - buf + 1) < len + && (next[0] != 0 || next[1] != 0)) + next++; + next += 2; + + /* Make sure the whole structure fits in the table */ + if ((unsigned long)(next - buf) > len) + { + if (display && !(opt.flags & FLAG_QUIET)) + printf("\t<TRUNCATED>\n\n"); + data = next; + break; + } + /* assign vendor for vendor-specific decodes later */ if (h.type == 1 && h.length >= 5) dmi_set_vendor(dmi_string(&h, data[0x04])); @@ -4656,33 +5173,21 @@ static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags) if (h.type == 34) dmi_fixup_type_34(&h, display); - /* look for the next handle */ - next = data + h.length; - while ((unsigned long)(next - buf + 1) < len - && (next[0] != 0 || next[1] != 0)) - next++; - next += 2; if (display) { - if ((unsigned long)(next - buf) <= len) + if (opt.flags & FLAG_DUMP) { - if (opt.flags & FLAG_DUMP) - { - dmi_dump(&h, "\t"); - printf("\n"); - } - else - dmi_decode(&h, ver); + dmi_dump(&h, "\t"); + printf("\n"); } - else if (!(opt.flags & FLAG_QUIET)) - printf("\t<TRUNCATED>\n\n"); + else + dmi_decode(&h, ver); } else if (opt.string != NULL && opt.string->type == h.type) dmi_table_string(&h, data, ver); data = next; - i++; /* SMBIOS v3 requires stopping at this marker */ if (h.type == 127 && (flags & FLAG_STOP_AT_EOT)) @@ -4812,6 +5317,15 @@ static int smbios3_decode(u8 *buf, const char *devmem, u32 flags) u32 ver; u64 offset; + /* Don't let checksum run beyond the buffer */ + if (buf[0x06] > 0x20) + { + fprintf(stderr, + "Entry point length too large (%u bytes, expected %u).\n", + (unsigned int)buf[0x06], 0x18U); + return 0; + } + if (!checksum(buf, buf[0x06])) return 0; @@ -4850,6 +5364,15 @@ static int smbios_decode(u8 *buf, const char *devmem, u32 flags) { u16 ver; + /* Don't let checksum run beyond the buffer */ + if (buf[0x05] > 0x20) + { + fprintf(stderr, + "Entry point length too large (%u bytes, expected %u).\n", + (unsigned int)buf[0x05], 0x1FU); + return 0; + } + if (!checksum(buf, buf[0x05]) || memcmp(buf + 0x10, "_DMI_", 5) != 0 || !checksum(buf + 0x10, 0x0F)) @@ -4934,13 +5457,19 @@ static int legacy_decode(u8 *buf, const char *devmem, u32 flags) #define EFI_NO_SMBIOS (-2) static int address_from_efi(off_t *address) { +#if defined(__linux__) FILE *efi_systab; const char *filename; char linebuf[64]; +#elif defined(__FreeBSD__) + char addrstr[KENV_MVALLEN + 1]; +#endif + const char *eptype; int ret; *address = 0; /* Prevent compiler warning */ +#if defined(__linux__) /* * Linux up to 2.6.6: /proc/efi/systab * Linux 2.6.7 and up: /sys/firmware/efi/systab @@ -4960,9 +5489,7 @@ static int address_from_efi(off_t *address) || strcmp(linebuf, "SMBIOS") == 0) { *address = strtoull(addrp, NULL, 0); - if (!(opt.flags & FLAG_QUIET)) - printf("# %s entry point at 0x%08llx\n", - linebuf, (unsigned long long)*address); + eptype = linebuf; ret = 0; break; } @@ -4972,6 +5499,31 @@ static int address_from_efi(off_t *address) if (ret == EFI_NO_SMBIOS) fprintf(stderr, "%s: SMBIOS entry point missing\n", filename); +#elif defined(__FreeBSD__) + /* + * On FreeBSD, SMBIOS anchor base address in UEFI mode is exposed + * via kernel environment: + * https://svnweb.freebsd.org/base?view=revision&revision=307326 + */ + ret = kenv(KENV_GET, "hint.smbios.0.mem", addrstr, sizeof(addrstr)); + if (ret == -1) + { + if (errno != ENOENT) + perror("kenv"); + return EFI_NOT_FOUND; + } + + *address = strtoull(addrstr, NULL, 0); + eptype = "SMBIOS"; + ret = 0; +#else + ret = EFI_NOT_FOUND; +#endif + + if (ret == 0 && !(opt.flags & FLAG_QUIET)) + printf("# %s entry point at 0x%08llx\n", + eptype, (unsigned long long)*address); + return ret; } @@ -5000,6 +5552,7 @@ int main(int argc, char * const argv[]) /* Set default option values */ opt.devmem = DEFAULT_MEM_DEV; opt.flags = 0; + opt.handle = ~0U; if (parse_command_line(argc, argv)<0) { @@ -33,8 +33,11 @@ enum DMI_VENDORS { VENDOR_UNKNOWN, - VENDOR_HP, VENDOR_ACER, + VENDOR_HP, + VENDOR_HPE, + VENDOR_IBM, + VENDOR_LENOVO, }; static enum DMI_VENDORS dmi_vendor = VENDOR_UNKNOWN; @@ -56,14 +59,62 @@ void dmi_set_vendor(const char *s) while (len && s[len - 1] == ' ') len--; - if (strncmp(s, "HP", len) == 0 || strncmp(s, "Hewlett-Packard", len) == 0) - dmi_vendor = VENDOR_HP; - else if (strncmp(s, "Acer", len) == 0) + if (strncmp(s, "Acer", len) == 0) dmi_vendor = VENDOR_ACER; + else if (strncmp(s, "HP", len) == 0 || strncmp(s, "Hewlett-Packard", len) == 0) + dmi_vendor = VENDOR_HP; + else if (strncmp(s, "HPE", len) == 0 || strncmp(s, "Hewlett Packard Enterprise", len) == 0) + dmi_vendor = VENDOR_HPE; + else if (strncmp(s, "IBM", len) == 0) + dmi_vendor = VENDOR_IBM; + else if (strncmp(s, "LENOVO", len) == 0) + dmi_vendor = VENDOR_LENOVO; } /* - * HP-specific data structures are decoded here. + * Acer-specific data structures are decoded here. + */ + +static int dmi_decode_acer(const struct dmi_header *h) +{ + u8 *data = h->data; + u16 cap; + + switch (h->type) + { + case 170: + /* + * Vendor Specific: Acer Hotkey Function + * + * Source: acer-wmi kernel driver + * + * Probably applies to some laptop models of other + * brands, including Fujitsu-Siemens, Medion, Lenovo, + * and eMachines. + */ + printf("Acer Hotkey Function\n"); + if (h->length < 0x0F) break; + cap = WORD(data + 0x04); + printf("\tFunction bitmap for Communication Button: 0x%04hx\n", 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"); + printf("\tFunction bitmap for Application Button: 0x%04hx\n", WORD(data + 0x06)); + printf("\tFunction bitmap for Media Button: 0x%04hx\n", WORD(data + 0x08)); + printf("\tFunction bitmap for Display Button: 0x%04hx\n", WORD(data + 0x0A)); + printf("\tFunction bitmap for Others Button: 0x%04hx\n", WORD(data + 0x0C)); + printf("\tCommunication Function Key Number: %d\n", data[0x0E]); + break; + + default: + return 0; + } + return 1; +} + +/* + * HPE-specific data structures are decoded here. * * Code contributed by John Cagle and Tyler Bell. */ @@ -98,14 +149,15 @@ static int dmi_decode_hp(const struct dmi_header *h) u8 *data = h->data; int nic, ptr; u32 feat; + const char *company = (dmi_vendor == VENDOR_HP) ? "HP" : "HPE"; switch (h->type) { case 204: /* - * Vendor Specific: HP ProLiant System/Rack Locator + * Vendor Specific: HPE ProLiant System/Rack Locator */ - printf("HP ProLiant System/Rack Locator\n"); + printf("%s ProLiant System/Rack Locator\n", 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])); @@ -119,7 +171,7 @@ static int dmi_decode_hp(const struct dmi_header *h) case 209: case 221: /* - * Vendor Specific: HP ProLiant NIC MAC Information + * Vendor Specific: HPE ProLiant NIC MAC Information * * This prints the BIOS NIC number, * PCI bus/device/function, and MAC address @@ -137,9 +189,10 @@ static int dmi_decode_hp(const struct dmi_header *h) * * Type 221: is deprecated in the latest docs */ - printf(h->type == 221 ? - "HP BIOS iSCSI NIC PCI and MAC Information\n" : - "HP BIOS PXE NIC PCI and MAC Information\n"); + printf("%s %s\n", 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) @@ -155,7 +208,7 @@ static int dmi_decode_hp(const struct dmi_header *h) case 233: /* - * Vendor Specific: HP ProLiant NIC MAC Information + * Vendor Specific: HPE ProLiant NIC MAC Information * * This prints the BIOS NIC number, * PCI bus/device/function, and MAC address @@ -171,7 +224,7 @@ 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("HP BIOS PXE NIC PCI and MAC Information\n"); + printf("%s BIOS PXE NIC PCI and MAC Information\n", 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. @@ -183,11 +236,11 @@ static int dmi_decode_hp(const struct dmi_header *h) case 212: /* - * Vendor Specific: HP 64-bit CRU Information + * Vendor Specific: HPE 64-bit CRU Information * * Source: hpwdt kernel driver */ - printf("HP 64-bit CRU Information\n"); + printf("%s 64-bit CRU Information\n", company); if (h->length < 0x18) break; printf("\tSignature: 0x%08x", DWORD(data + 0x04)); if (is_printable(data + 0x04, 4)) @@ -208,11 +261,11 @@ static int dmi_decode_hp(const struct dmi_header *h) case 219: /* - * Vendor Specific: HP ProLiant Information + * Vendor Specific: HPE ProLiant Information * * Source: hpwdt kernel driver */ - printf("HP ProLiant Information\n"); + printf("%s ProLiant Information\n", company); if (h->length < 0x08) break; printf("\tPower Features: 0x%08x\n", DWORD(data + 0x04)); if (h->length < 0x0C) break; @@ -221,7 +274,7 @@ static int dmi_decode_hp(const struct dmi_header *h) feat = DWORD(data + 0x10); printf("\tMisc. Features: 0x%08x\n", feat); printf("\t\tiCRU: %s\n", feat & 0x0001 ? "Yes" : "No"); - printf("\t\tUEFI: %s\n", feat & 0x0408 ? "Yes" : "No"); + printf("\t\tUEFI: %s\n", feat & 0x1400 ? "Yes" : "No"); break; default: @@ -230,40 +283,116 @@ static int dmi_decode_hp(const struct dmi_header *h) return 1; } -/* - * Acer-specific data structures are decoded here. - */ - -static int dmi_decode_acer(const struct dmi_header *h) +static int dmi_decode_ibm_lenovo(const struct dmi_header *h) { u8 *data = h->data; - u16 cap; switch (h->type) { - case 170: + case 131: /* - * Vendor Specific: Acer Hotkey Function + * Vendor Specific: ThinkVantage Technologies feature bits * - * Source: acer-wmi kernel driver + * Source: Compal hel81 Service Manual Software Specification, + * documented under "System Management BIOS(SM BIOS) + * version 2.4 or greater" * - * Probably applies to some laptop models of other - * brands, including Fujitsu-Siemens, Medion, Lenovo, - * and eMachines. + * Offset | Name | Width | Description + * ---------------------------------------------- + * 0x00 | Type | BYTE | 0x83 + * 0x01 | Length | BYTE | 0x16 + * 0x02 | Handle | WORD | Varies + * 0x04 | Version | BYTE | 0x01 + * 0x05 | TVT Structure | BYTEx16 | Each of the 128 bits represents a TVT feature: + * | | | - bit 127 means diagnostics (PC Doctor) is available + * | | | (http://www.pc-doctor.com/company/pr-articles/45-lenovo-introduces-thinkvantage-toolbox) + * | | | - the rest (126-0) are reserved/unknown + * + * It must also be followed by a string containing + * "TVT-Enablement". There exist other type 131 records + * with different length and a different string, for + * other purposes. */ - printf("Acer Hotkey Function\n"); - if (h->length < 0x0F) break; - cap = WORD(data + 0x04); - printf("\tFunction bitmap for Communication Button: 0x%04hx\n", 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"); - printf("\tFunction bitmap for Application Button: 0x%04hx\n", WORD(data + 0x06)); - printf("\tFunction bitmap for Media Button: 0x%04hx\n", WORD(data + 0x08)); - printf("\tFunction bitmap for Display Button: 0x%04hx\n", WORD(data + 0x0A)); - printf("\tFunction bitmap for Others Button: 0x%04hx\n", WORD(data + 0x0C)); - printf("\tCommunication Function Key Number: %d\n", data[0x0E]); + + if (h->length != 0x16 + || strcmp(dmi_string(h, 1), "TVT-Enablement") != 0) + return 0; + + printf("ThinkVantage Technologies\n"); + printf("\tVersion: %u\n", data[0x04]); + printf("\tDiagnostics: %s\n", + data[0x14] & 0x80 ? "Available" : "No"); + break; + + case 135: + /* + * Vendor Specific: Device Presence Detection bits + * + * Source: Compal hel81 Service Manual Software Specification, + * documented as "SMBIOS Type 135: Bulk for Lenovo + * Mobile PC Unique OEM Data" under appendix D. + * + * Offset | Name | Width | Description + * --------------------------------------------------- + * 0x00 | Type | BYTE | 0x87 + * 0x01 | Length | BYTE | 0x0A + * 0x02 | Handle | WORD | Varies + * 0x04 | Signature | WORD | 0x5054 (ASCII for "TP") + * 0x06 | OEM struct offset | BYTE | 0x07 + * 0x07 | OEM struct number | BYTE | 0x03, for this structure + * 0x08 | OEM struct revision | BYTE | 0x01, for this format + * 0x09 | Device presence bits | BYTE | Each of the 8 bits indicates device presence: + * | | | - bit 0 indicates the presence of a fingerprint reader + * | | | - the rest (7-1) are reserved/unknown + * + * Other OEM struct number+rev combinations have been + * seen in the wild but we don't know how to decode + * them. + */ + + if (h->length < 0x0A || data[0x04] != 'T' || data[0x05] != 'P') + return 0; + + /* Bail out if not the expected format */ + if (data[0x06] != 0x07 || data[0x07] != 0x03 || data[0x08] != 0x01) + return 0; + + printf("ThinkPad Device Presence Detection\n"); + printf("\tFingerprint Reader: %s\n", + data[0x09] & 0x01 ? "Present" : "No"); + break; + + case 140: + /* + * Vendor Specific: ThinkPad Embedded Controller Program + * + * Source: some guesswork, and publicly available information; + * Lenovo's BIOS update READMEs often contain the ECP IDs + * which match the first string in this type. + * + * Offset | Name | Width | Description + * ---------------------------------------------------- + * 0x00 | Type | BYTE | 0x8C + * 0x01 | Length | BYTE | + * 0x02 | Handle | WORD | Varies + * 0x04 | Signature | BYTEx6 | ASCII for "LENOVO" + * 0x0A | OEM struct offset | BYTE | 0x0B + * 0x0B | OEM struct number | BYTE | 0x07, for this structure + * 0x0C | OEM struct revision | BYTE | 0x01, for this format + * 0x0D | ECP version ID | STRING | + * 0x0E | ECP release date | STRING | + */ + + if (h->length < 0x0F || memcmp(data + 4, "LENOVO", 6) != 0) + return 0; + + /* Bail out if not the expected format */ + if (data[0x0A] != 0x0B || data[0x0B] != 0x07 || data[0x0C] != 0x01) + return 0; + + printf("ThinkPad Embedded Controller Program\n"); + printf("\tVersion ID: %s\n", dmi_string(h, 1)); + printf("\tRelease Date: %s\n", dmi_string(h, 2)); break; default: @@ -281,9 +410,13 @@ int dmi_decode_oem(const struct dmi_header *h) switch (dmi_vendor) { case VENDOR_HP: + case VENDOR_HPE: return dmi_decode_hp(h); case VENDOR_ACER: return dmi_decode_acer(h); + case VENDOR_IBM: + case VENDOR_LENOVO: + return dmi_decode_ibm_lenovo(h); default: return 0; } @@ -113,7 +113,7 @@ static u8 *parse_opt_type(u8 *p, const char *arg) char *next; val = strtoul(arg, &next, 0); - if (next == arg) + if (next == arg || (*next != '\0' && *next != ',' && *next != ' ')) { fprintf(stderr, "Invalid type keyword: %s\n", arg); print_opt_type_list(); @@ -156,6 +156,7 @@ static const struct string_keyword opt_string_keyword[] = { { "system-version", 1, 0x06 }, { "system-serial-number", 1, 0x07 }, { "system-uuid", 1, 0x08 }, /* dmi_system_uuid() */ + { "system-family", 1, 0x1a }, { "baseboard-manufacturer", 2, 0x04 }, { "baseboard-product-name", 2, 0x05 }, { "baseboard-version", 2, 0x06 }, @@ -227,7 +228,7 @@ static int parse_opt_oem_string(const char *arg) goto done; val = strtoul(arg, &next, 10); - if (next == arg || val == 0x00 || val > 0xff) + if (next == arg || *next != '\0' || val == 0x00 || val > 0xff) { fprintf(stderr, "Invalid OEM string number: %s\n", arg); return -1; @@ -239,6 +240,19 @@ done: return 0; } +static u32 parse_opt_handle(const char *arg) +{ + u32 val; + char *next; + + val = strtoul(arg, &next, 0); + if (next == arg || *next != '\0' || val > 0xffff) + { + fprintf(stderr, "Invalid handle number: %s\n", arg); + return ~0; + } + return val; +} /* * Command line options handling @@ -248,7 +262,7 @@ done: int parse_command_line(int argc, char * const argv[]) { int option; - const char *optstring = "d:hqs:t:uV"; + const char *optstring = "d:hqs:t:uH:V"; struct option longopts[] = { { "dev-mem", required_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, @@ -258,6 +272,7 @@ int parse_command_line(int argc, char * const argv[]) { "dump", no_argument, NULL, 'u' }, { "dump-bin", required_argument, NULL, 'B' }, { "from-dump", required_argument, NULL, 'F' }, + { "handle", required_argument, NULL, 'H' }, { "oem-string", required_argument, NULL, 'O' }, { "no-sysfs", no_argument, NULL, 'S' }, { "version", no_argument, NULL, 'V' }, @@ -299,6 +314,11 @@ int parse_command_line(int argc, char * const argv[]) if (opt.type == NULL) return -1; break; + case 'H': + opt.handle = parse_opt_handle(optarg); + if (opt.handle == ~0U) + return -1; + break; case 'u': opt.flags |= FLAG_DUMP; break; @@ -325,9 +345,9 @@ int parse_command_line(int argc, char * const argv[]) /* Check for mutually exclusive output format options */ if ((opt.string != NULL) + (opt.type != NULL) - + !!(opt.flags & FLAG_DUMP_BIN) > 1) + + !!(opt.flags & FLAG_DUMP_BIN) + (opt.handle != ~0U) > 1) { - fprintf(stderr, "Options --string, --type and --dump-bin are mutually exclusive\n"); + fprintf(stderr, "Options --string, --type, --handle and --dump-bin are mutually exclusive\n"); return -1; } @@ -350,6 +370,7 @@ void print_help(void) " -q, --quiet Less verbose output\n" " -s, --string KEYWORD Only display the value of the given DMI string\n" " -t, --type TYPE Only display the entries of given type\n" + " -H, --handle HANDLE Only display the entry of given handle\n" " -u, --dump Do not decode the entries\n" " --dump-bin FILE Dump the DMI data to a binary file\n" " --from-dump FILE Read the DMI data from a binary file\n" @@ -35,6 +35,7 @@ struct opt u8 *type; const struct string_keyword *string; char *dumpfile; + u32 handle; }; extern struct opt opt; diff --git a/man/biosdecode.8 b/man/biosdecode.8 index c39d6a0..a96eb68 100644 --- a/man/biosdecode.8 +++ b/man/biosdecode.8 @@ -60,6 +60,9 @@ program. .BR "-d" ", " "--dev-mem FILE" Read memory from device \fBFILE\fR (default: \fB/dev/mem\fR) .TP +.BR " " " " "--pir full" +Decode the details of the PCI IRQ routing table +.TP .BR "-h" ", " "--help" Display usage information and exit .TP diff --git a/man/dmidecode.8 b/man/dmidecode.8 index bef204e..df861e1 100644 --- a/man/dmidecode.8 +++ b/man/dmidecode.8 @@ -74,7 +74,7 @@ Only display the value of the \s-1DMI\s0 string identified by \fBKEYWORD\fR. \fBbios-version\fR, \fBbios-release-date\fR, \fBsystem-manufacturer\fR, \fBsystem-product-name\fR, \fBsystem-version\fR, \fBsystem-serial-number\fR, -\fBsystem-uuid\fR, +\fBsystem-uuid\fR, \fBsystem-family\fR, \fBbaseboard-manufacturer\fR, \fBbaseboard-product-name\fR, \fBbaseboard-version\fR, \fBbaseboard-serial-number\fR, \fBbaseboard-asset-tag\fR, \fBchassis-manufacturer\fR, @@ -115,6 +115,10 @@ is printed and .B dmidecode exits with an error. .TP +.BR "-H" ", " "--handle HANDLE" +Only display the entry whose handle matches \fBHANDLE\fR. \fBHANDLE\fR +is a 16-bit integer. +.TP .BR "-u" ", " "--dump" Do not decode the entries, dump their contents as hexadecimal instead. Note that this is still a text output, no binary data will be thrown upon @@ -11,8 +11,7 @@ typedef unsigned int u32; /* * You may use the following defines to adjust the type definitions * depending on the architecture: - * - Define BIGENDIAN on big-endian systems. Untested, as all target - * systems to date are little-endian. + * - Define BIGENDIAN on big-endian systems. * - Define ALIGNMENT_WORKAROUND if your system doesn't support * non-aligned memory access. In this case, we use a slower, but safer, * memory access method. This should be done automatically in config.h @@ -31,7 +30,7 @@ typedef struct { } u64; #endif -#ifdef ALIGNMENT_WORKAROUND +#if defined(ALIGNMENT_WORKAROUND) || defined(BIGENDIAN) static inline u64 U64(u32 low, u32 high) { u64 self; @@ -43,20 +42,18 @@ static inline u64 U64(u32 low, u32 high) } #endif -#ifdef ALIGNMENT_WORKAROUND -# ifdef BIGENDIAN -# define WORD(x) (u16)((x)[1] + ((x)[0] << 8)) -# define DWORD(x) (u32)((x)[3] + ((x)[2] << 8) + ((x)[1] << 16) + ((x)[0] << 24)) -# define QWORD(x) (U64(DWORD(x + 4), DWORD(x))) -# else /* BIGENDIAN */ -# define WORD(x) (u16)((x)[0] + ((x)[1] << 8)) -# define DWORD(x) (u32)((x)[0] + ((x)[1] << 8) + ((x)[2] << 16) + ((x)[3] << 24)) -# define QWORD(x) (U64(DWORD(x), DWORD(x + 4))) -# endif /* BIGENDIAN */ -#else /* ALIGNMENT_WORKAROUND */ +/* + * Per SMBIOS v2.8.0 and later, all structures assume a little-endian + * ordering convention. + */ +#if defined(ALIGNMENT_WORKAROUND) || defined(BIGENDIAN) +#define WORD(x) (u16)((x)[0] + ((x)[1] << 8)) +#define DWORD(x) (u32)((x)[0] + ((x)[1] << 8) + ((x)[2] << 16) + ((x)[3] << 24)) +#define QWORD(x) (U64(DWORD(x), DWORD(x + 4))) +#else /* ALIGNMENT_WORKAROUND || BIGENDIAN */ #define WORD(x) (u16)(*(const u16 *)(x)) #define DWORD(x) (u32)(*(const u32 *)(x)) #define QWORD(x) (*(const u64 *)(x)) -#endif /* ALIGNMENT_WORKAROUND */ +#endif /* ALIGNMENT_WORKAROUND || BIGENDIAN */ #endif @@ -2,7 +2,7 @@ * Common "util" functions * This file is part of the dmidecode project. * - * Copyright (C) 2002-2017 Jean Delvare <jdelvare@suse.de> + * Copyright (C) 2002-2018 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 @@ -59,7 +59,6 @@ static int myread(int fd, u8 *buf, size_t count, const char *prefix) { if (errno != EINTR) { - close(fd); perror(prefix); return -1; } @@ -70,7 +69,6 @@ static int myread(int fd, u8 *buf, size_t count, const char *prefix) if (r2 != count) { - close(fd); fprintf(stderr, "%s: Unexpected end of file\n", prefix); return -1; } @@ -90,19 +88,17 @@ int checksum(const u8 *buf, size_t len) /* * Reads all of file from given offset, up to max_len bytes. - * A buffer of max_len bytes is allocated by this function, and + * A buffer of at most max_len bytes is allocated by this function, and * needs to be freed by the caller. * This provides a similar usage model to mem_chunk() * - * Returns pointer to buffer of max_len bytes, or NULL on error, and + * Returns a pointer to the allocated buffer, or NULL on error, and * sets max_len to the length actually read. - * */ void *read_file(off_t base, size_t *max_len, const char *filename) { + struct stat statbuf; int fd; - size_t r2 = 0; - ssize_t r; u8 *p; /* @@ -116,12 +112,20 @@ void *read_file(off_t base, size_t *max_len, const char *filename) return NULL; } - if (lseek(fd, base, SEEK_SET) == -1) + /* + * Check file size, don't allocate more than can be read. + */ + if (fstat(fd, &statbuf) == 0) { - fprintf(stderr, "%s: ", filename); - perror("lseek"); - p = NULL; - goto out; + if (base >= statbuf.st_size) + { + fprintf(stderr, "%s: Can't read data beyond EOF\n", + filename); + p = NULL; + goto out; + } + if (*max_len > (size_t)statbuf.st_size - base) + *max_len = statbuf.st_size - base; } if ((p = malloc(*max_len)) == NULL) @@ -130,27 +134,23 @@ void *read_file(off_t base, size_t *max_len, const char *filename) goto out; } - do + if (lseek(fd, base, SEEK_SET) == -1) { - r = read(fd, p + r2, *max_len - r2); - if (r == -1) - { - if (errno != EINTR) - { - perror(filename); - free(p); - p = NULL; - goto out; - } - } - else - r2 += r; + fprintf(stderr, "%s: ", filename); + perror("lseek"); + goto err_free; } - while (r != 0); - *max_len = r2; + if (myread(fd, p, *max_len, filename) == 0) + goto out; + +err_free: + free(p); + p = NULL; + out: - close(fd); + if (close(fd) == -1) + perror(filename); return p; } @@ -1 +1 @@ -#define VERSION "3.1" +#define VERSION "3.2" |