summaryrefslogtreecommitdiff
path: root/biosdecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'biosdecode.c')
-rw-r--r--biosdecode.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/biosdecode.c b/biosdecode.c
index 09acb43..3bbfe28 100644
--- a/biosdecode.c
+++ b/biosdecode.c
@@ -2,7 +2,7 @@
* BIOS Decode
*
* Copyright (C) 2000-2002 Alan Cox <alan@redhat.com>
- * Copyright (C) 2002-2008 Jean Delvare <khali@linux-fr.org>
+ * Copyright (C) 2002-2015 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,10 +25,10 @@
* are deemed to be part of the source code.
*
* References:
- * - DMTF "System Management BIOS Reference Specification"
- * Version 2.3.4
+ * - DMTF "System Management BIOS (SMBIOS) Reference Specification"
+ * Version 3.0.0
* http://www.dmtf.org/standards/smbios
- * - Intel "Preboot Execution Environment (PXE) Specification"
+ * - Intel "Preboot Execution Environment (PXE) Specification"
* Version 2.1
* http://www.intel.com/labs/manage/wfm/wfmspecs.htm
* - ACPI "Advanced Configuration and Power Interface Specification"
@@ -90,6 +90,26 @@ struct bios_entry {
* SMBIOS
*/
+static size_t smbios3_length(const u8 *p)
+{
+ return p[0x06];
+}
+
+static int smbios3_decode(const u8 *p, size_t len)
+{
+ if (len < 0x18 || !checksum(p, p[0x06]))
+ return 0;
+
+ printf("SMBIOS %u.%u.%u present.\n",
+ p[0x07], p[0x08], p[0x09]);
+ printf("\tStructure Table Maximum Length: %u bytes\n",
+ DWORD(p + 0x0C));
+ printf("\tStructure Table 64-bit Address: 0x%08X%08X\n",
+ QWORD(p + 0x10).h, QWORD(p + 0x10).l);
+
+ return 1;
+}
+
static size_t smbios_length(const u8 *p)
{
return p[0x05] == 0x1E ? 0x1F : p[0x05];
@@ -105,7 +125,7 @@ static int smbios_decode(const u8 *p, size_t len)
printf("SMBIOS %u.%u present.\n",
p[0x06], p[0x07]);
printf("\tStructure Table Length: %u bytes\n",
- WORD(p+0x16));
+ WORD(p + 0x16));
printf("\tStructure Table Address: 0x%08X\n",
DWORD(p + 0x18));
printf("\tNumber Of Structures: %u\n",
@@ -516,7 +536,7 @@ static int fjkeyinf_decode(const u8 *p, size_t len)
return 1;
printf("\tDevice %d: type %u, chip %u", i + 1,
*(p + 8 + i * 4), *(p + 8 + i * 4 + 2));
- if (*(p+8+i*4+1)) /* Access method */
+ if (*(p + 8 + i * 4 + 1)) /* Access method */
printf(", SMBus address 0x%x",
*(p + 8 + i * 4 + 3) >> 1);
printf("\n");
@@ -530,6 +550,7 @@ static int fjkeyinf_decode(const u8 *p, size_t len)
*/
static struct bios_entry bios_entries[] = {
+ { "_SM3_", 0, 0xF0000, 0xFFFFF, smbios3_length, smbios3_decode },
{ "_SM_", 0, 0xF0000, 0xFFFFF, smbios_length, smbios_decode },
{ "_DMI_", 0, 0xF0000, 0xFFFFF, dmi_length, dmi_decode },
{ "_SYSID_", 0, 0xE0000, 0xFFFFF, sysid_length, sysid_decode },
@@ -565,7 +586,7 @@ static int parse_command_line(int argc, char * const argv[])
{ "dev-mem", required_argument, NULL, 'd' },
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, 'V' },
- { 0, 0, 0, 0 }
+ { NULL, 0, NULL, 0 }
};
while ((option = getopt_long(argc, argv, optstring, longopts, NULL)) != -1)