Blob Blame History Raw
From adbd050d70b6173dd6880b21fd6f995af5ea79d2 Mon Sep 17 00:00:00 2001
From: Jean Delvare <jdelvare@suse.de>
Date: Fri, 20 Jan 2017 17:26:02 +0100
Subject: [PATCH 9/9] biosdecode: Decode Intel Multiprocessor entry point

Decode the entry point defined in the Intel Multiprocessor
specification.
---
 CHANGELOG    |  5 +++++
 biosdecode.c | 34 +++++++++++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG b/CHANGELOG
index 67aef99..26a8f35 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,10 @@
 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
diff --git a/biosdecode.c b/biosdecode.c
index 3bbfe28..ad3d4bc 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-2015 Jean Delvare <jdelvare@suse.de>
+ *   Copyright (C) 2002-2017 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
@@ -52,6 +52,9 @@
  *  - Fujitsu application panel technical details
  *    As of July 23rd, 2004
  *    http://apanel.sourceforge.net/tech.php
+ *  - Intel Multiprocessor Specification
+ *    Version 1.4
+ *    http://www.intel.com/design/archives/processors/pro/docs/242016.htm
  */

 #include <stdio.h>
@@ -546,6 +549,34 @@ static int fjkeyinf_decode(const u8 *p, size_t len)
 }

 /*
+ * Intel Multiprocessor
+ */
+
+static size_t mp_length(const u8 *p)
+{
+	return 16 * p[8];
+}
+
+static int mp_decode(const u8 *p, size_t len)
+{
+	if (!checksum(p, len))
+		return 0;
+
+	printf("Intel Multiprocessor present.\n");
+	printf("\tSpecification Revision: %s\n",
+		p[9] == 0x01 ? "1.1" : p[9] == 0x04 ? "1.4" : "Invalid");
+	if (p[11])
+		printf("\tDefault Configuration: #%d\n", p[11]);
+	else
+		printf("\tConfiguration Table Address: 0x%08X\n",
+			DWORD(p + 4));
+	printf("\tMode: %s\n", p[12] & (1 << 7) ?
+		"IMCR and PIC" : "Virtual Wire");
+
+	return 1;
+}
+
+/*
  * Main
  */

@@ -562,6 +593,7 @@ static struct bios_entry bios_entries[] = {
	{ "32OS", 0, 0xE0000, 0xFFFFF, compaq_length, compaq_decode },
	{ "\252\125VPD", 0, 0xF0000, 0xFFFFF, vpd_length, vpd_decode },
	{ "FJKEYINF", 0, 0xF0000, 0xFFFFF, fjkeyinf_length, fjkeyinf_decode },
+	{ "_MP_", 0, 0xE0000, 0xFFFFF, mp_length, mp_decode },
	{ NULL, 0, 0, 0, NULL, NULL }
 };

--
2.10.2