diff options
Diffstat (limited to 'biosdecode.c')
| -rw-r--r-- | biosdecode.c | 35 | 
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) | 
