3ea658
From 1bd45ec19f7a2d4cdc293b7a5e705c6ee793953e Mon Sep 17 00:00:00 2001
3ea658
From: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
3ea658
Date: Thu, 15 Jan 2015 03:01:37 +0200
3ea658
Subject: [PATCH 4/4] dmidecode: add dmi sysfs support
3ea658
3ea658
For working with newly introduced dmi sysfs the dmifs library
3ea658
was used. It's needed by the systems that cannot use /dev/mem to
3ea658
access hardware addresses and as result cannot read dmi table.
3ea658
So another, more correct approach, can be used, it's to read
3ea658
information from dmi sysfs.
3ea658
3ea658
Currently we can use libdmifs library for that.
3ea658
3ea658
Reported-by: Leif Lindholm <leif.lindholm@linaro.org>
3ea658
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
3ea658
---
3ea658
 Makefile    |  2 +-
3ea658
 dmidecode.c | 31 ++++++++++++++++++++++++++++++-
3ea658
 version.h   |  2 +-
3ea658
 3 files changed, 32 insertions(+), 3 deletions(-)
3ea658
3ea658
diff --git a/Makefile b/Makefile
3ea658
index 66c24d5..e3f5c49 100644
3ea658
--- a/Makefile
3ea658
+++ b/Makefile
3ea658
@@ -58,7 +58,7 @@ all : $(PROGRAMS)
3ea658
 #
3ea658
3ea658
 dmidecode : dmidecode.o dmiopt.o dmioem.o util.o
3ea658
-	$(CC) $(LDFLAGS) dmidecode.o dmiopt.o dmioem.o util.o -o $@
3ea658
+	$(CC) $(LDFLAGS) dmidecode.o dmiopt.o dmioem.o util.o -ldmifs -o $@
3ea658
3ea658
 biosdecode : biosdecode.o util.o
3ea658
	$(CC) $(LDFLAGS) biosdecode.o util.o -o $@
3ea658
diff --git a/dmidecode.c b/dmidecode.c
3ea658
index 2fedddc..7d3c133 100644
3ea658
--- a/dmidecode.c
3ea658
+++ b/dmidecode.c
3ea658
@@ -57,6 +57,7 @@
3ea658
 #include <strings.h>
3ea658
 #include <stdlib.h>
3ea658
 #include <unistd.h>
3ea658
+#include <libdmifs.h>
3ea658
3ea658
 #include "version.h"
3ea658
 #include "config.h"
3ea658
@@ -4524,6 +4525,28 @@ static int smbios_decode(u8 *buf, const char *devmem)
3ea658
	return 1;
3ea658
 }
3ea658
3ea658
+static void dmifs_smbios_decode(void)
3ea658
+{
3ea658
+	u16 ver;
3ea658
+	u8 *smbios;
3ea658
+	struct dmi_table *dt;
3ea658
+
3ea658
+	dt = dmi_get_table();
3ea658
+	if (!dt)
3ea658
+		return;
3ea658
+
3ea658
+	smbios = dt->smbios;
3ea658
+
3ea658
+	ver = get_smbios_version(dt->smbios);
3ea658
+	dmi_table(DWORD(smbios + 0x18), dmi_get_raw_data(dt->dmi_list),
3ea658
+		  WORD(smbios + 0x16), WORD(smbios + 0x1C), ver);
3ea658
+
3ea658
+	if (opt.flags & FLAG_DUMP_BIN)
3ea658
+		smbios_in_dumpfile(dt->smbios);
3ea658
+
3ea658
+	dmi_put_table(dt);
3ea658
+}
3ea658
+
3ea658
 static int legacy_decode(u8 *buf, const char *devmem)
3ea658
 {
3ea658
	u16 len;
3ea658
@@ -4679,7 +4702,13 @@ int main(int argc, char * const argv[])
3ea658
		goto done;
3ea658
	}
3ea658
3ea658
-	/* First try EFI (ia64, Intel-based Mac) */
3ea658
+	/* First try dmi sysfs */
3ea658
+	if (dmifs_is_exist()) {
3ea658
+		dmifs_smbios_decode();
3ea658
+		goto exit_free;
3ea658
+	}
3ea658
+
3ea658
+	/* Second try EFI (ia64, Intel-based Mac) */
3ea658
	efi = address_from_efi(&fp);
3ea658
	switch (efi)
3ea658
	{
3ea658
diff --git a/version.h b/version.h
3ea658
index 140d334..ce7ffaf 100644
3ea658
--- a/version.h
3ea658
+++ b/version.h
3ea658
@@ -1 +1 @@
3ea658
-#define VERSION "2.12"
3ea658
+#define VERSION "2.12-dmifs"
3ea658
--
3ea658
1.9.3