Blame SOURCES/dmidecode-move-memory-map-function-from-dmi_decode.patch

4f8197
From 9967415630f6e58da27ebd33a32d1f1bb1f6ba78 Mon Sep 17 00:00:00 2001
4f8197
From: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
4f8197
Date: Thu, 15 Jan 2015 22:39:26 +0200
4f8197
Subject: [PATCH 3/4] dmidecode: move memory map function from dmi_decode
4f8197
4f8197
There is no reason to allocate/copy/free memory for dmi_table inside
4f8197
function. It's more convenient to do it outside. In this case we can
4f8197
use dmi_decode function with already allocated memory like in case
4f8197
with dmifs library. The same is for dmi_table_dump().
4f8197
4f8197
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
4f8197
---
4f8197
 dmidecode.c | 70 ++++++++++++++++++++++++++++++++++++-------------------------
4f8197
 1 file changed, 41 insertions(+), 29 deletions(-)
4f8197
4f8197
diff --git a/dmidecode.c b/dmidecode.c
4f8197
index 4e4a82f..2fedddc 100644
4f8197
--- a/dmidecode.c
4f8197
+++ b/dmidecode.c
4f8197
@@ -4351,25 +4351,15 @@ static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver
4f8197
 	}
4f8197
 }
4f8197
 
4f8197
-static void dmi_table_dump(u32 base, u16 len, const char *devmem)
4f8197
+static void dmi_table_dump(u8 *buf, u16 len)
4f8197
 {
4f8197
-	u8 *buf;
4f8197
-
4f8197
-	if ((buf = mem_chunk(base, len, devmem)) == NULL)
4f8197
-	{
4f8197
-		fprintf(stderr, "Failed to read table, sorry.\n");
4f8197
-		return;
4f8197
-	}
4f8197
-
4f8197
 	if (!(opt.flags & FLAG_QUIET))
4f8197
 		printf("# Writing %d bytes to %s.\n", len, opt.dumpfile);
4f8197
 	write_dump(32, len, buf, opt.dumpfile, 0);
4f8197
-	free(buf);
4f8197
 }
4f8197
 
4f8197
-static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem)
4f8197
+static void dmi_table(u32 base, u8 *buf, u16 len, u16 num, u16 ver)
4f8197
 {
4f8197
-	u8 *buf;
4f8197
 	u8 *data;
4f8197
 	int i = 0;
4f8197
 
4f8197
@@ -4382,7 +4372,7 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem)
4f8197
 
4f8197
 	if (opt.flags & FLAG_DUMP_BIN)
4f8197
 	{
4f8197
-		dmi_table_dump(base, len, devmem);
4f8197
+		dmi_table_dump(buf, len);
4f8197
 		return;
4f8197
 	}
4f8197
 
4f8197
@@ -4398,16 +4388,6 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem)
4f8197
 		printf("\n");
4f8197
 	}
4f8197
 
4f8197
-	if ((buf = mem_chunk(base, len, devmem)) == NULL)
4f8197
-	{
4f8197
-		fprintf(stderr, "Table is unreachable, sorry."
4f8197
-#ifndef USE_MMAP
4f8197
-			" Try compiling dmidecode with -DUSE_MMAP."
4f8197
-#endif
4f8197
-			"\n");
4f8197
-		return;
4f8197
-	}
4f8197
-
4f8197
 	data = buf;
4f8197
 	while (i < num && data+4 <= buf + len) /* 4 is the length of an SMBIOS structure header */
4f8197
 	{
4f8197
@@ -4485,8 +4465,6 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem)
4f8197
 				"announced, structures occupy %d bytes.\n",
4f8197
 				len, (unsigned int)(data - buf));
4f8197
 	}
4f8197
-
4f8197
-	free(buf);
4f8197
 }
4f8197
 
4f8197
 /*
4f8197
@@ -4524,6 +4502,9 @@ static void smbios_in_dumpfile(unsigned char *smbios)
4f8197
 static int smbios_decode(u8 *buf, const char *devmem)
4f8197
 {
4f8197
 	u16 ver;
4f8197
+	u16 len;
4f8197
+	u32 base;
4f8197
+	u8 *dmibuf;
4f8197
 
4f8197
 	if (!checksum(buf, buf[0x05])
4f8197
 	 || memcmp(buf + 0x10, "_DMI_", 5) != 0
4f8197
@@ -4532,8 +4513,21 @@ static int smbios_decode(u8 *buf, const char *devmem)
4f8197
 
4f8197
 	ver = get_smbios_version(buf);
4f8197
 
4f8197
-	dmi_table(DWORD(buf + 0x18), WORD(buf + 0x16), WORD(buf + 0x1C),
4f8197
-		ver, devmem);
4f8197
+	base = DWORD(buf + 0x18);
4f8197
+	len = WORD(buf + 0x16);
4f8197
+	dmibuf = mem_chunk(base, len, devmem);
4f8197
+	if (!dmibuf) {
4f8197
+		fprintf(stderr, "Table is unreachable, sorry."
4f8197
+#ifndef USE_MMAP
4f8197
+			" Try compiling dmidecode with -DUSE_MMAP."
4f8197
+#endif
4f8197
+			"\n");
4f8197
+		return 0;
4f8197
+	}
4f8197
+
4f8197
+	dmi_table(base, dmibuf, len, WORD(buf + 0x1C), ver);
4f8197
+
4f8197
+	free(dmibuf);
4f8197
 
4f8197
 	if (opt.flags & FLAG_DUMP_BIN)
4f8197
 		smbios_in_dumpfile(buf);
4f8197
@@ -4543,6 +4537,10 @@ static int smbios_decode(u8 *buf, const char *devmem)
4f8197
 
4f8197
 static int legacy_decode(u8 *buf, const char *devmem)
4f8197
 {
4f8197
+	u16 len;
4f8197
+	u32 base;
4f8197
+	u8 *dmibuf;
4f8197
+
4f8197
 	if (!checksum(buf, 0x0F))
4f8197
 		return 0;
4f8197
 
4f8197
@@ -4550,8 +4548,22 @@ static int legacy_decode(u8 *buf, const char *devmem)
4f8197
 		printf("Legacy DMI %u.%u present.\n",
4f8197
 			buf[0x0E] >> 4, buf[0x0E] & 0x0F);
4f8197
 
4f8197
-	dmi_table(DWORD(buf + 0x08), WORD(buf + 0x06), WORD(buf + 0x0C),
4f8197
-		((buf[0x0E] & 0xF0) << 4) + (buf[0x0E] & 0x0F), devmem);
4f8197
+	len = WORD(buf + 0x06);
4f8197
+	base = DWORD(buf + 0x08);
4f8197
+	dmibuf = mem_chunk(base, len, devmem);
4f8197
+	if (!dmibuf) {
4f8197
+		fprintf(stderr, "Table is unreachable, sorry."
4f8197
+#ifndef USE_MMAP
4f8197
+			" Try compiling dmidecode with -DUSE_MMAP."
4f8197
+#endif
4f8197
+			"\n");
4f8197
+		return 0;
4f8197
+	}
4f8197
+
4f8197
+	dmi_table(base, dmibuf, len, WORD(buf + 0x0C),
4f8197
+		  ((buf[0x0E] & 0xF0) << 4) + (buf[0x0E] & 0x0F));
4f8197
+
4f8197
+	free(dmibuf);
4f8197
 
4f8197
 	if (opt.flags & FLAG_DUMP_BIN)
4f8197
 	{
4f8197
-- 
4f8197
1.9.3
4f8197