Blame 0002-dmidecode-Don-t-use-memcpy-on-dev-mem-on-arm64.patch

Anton Arapov 48d35d
From 82497fa02d60757c2cfa645cf89a79abb1435273 Mon Sep 17 00:00:00 2001
Anton Arapov 48d35d
From: Jean Delvare <jdelvare@suse.de>
Anton Arapov 48d35d
Date: Fri, 16 Nov 2018 11:18:25 +0100
Anton Arapov 48d35d
Subject: [PATCH 02/18] dmidecode: Don't use memcpy on /dev/mem on arm64
Anton Arapov 48d35d
Anton Arapov 48d35d
On arm64, calling memcpy on /dev/mem will cause a bus error if the
Anton Arapov 48d35d
start and the end of the buffer are not aligned on a 64-bit boundary.
Anton Arapov 48d35d
Using option --no-sysfs triggers this.
Anton Arapov 48d35d
Anton Arapov 48d35d
Use a slow manual byte-by-byte copy in that case, to prevent the bus
Anton Arapov 48d35d
error. This is only a fallback path (at least on Linux) and not
Anton Arapov 48d35d
performance-critical anyway, as it is a one-time operation and DMI
Anton Arapov 48d35d
tables are usually not too large.
Anton Arapov 48d35d
Anton Arapov 48d35d
This fixes bug #55026:
Anton Arapov 48d35d
https://savannah.nongnu.org/bugs/index.php?55026
Anton Arapov 48d35d
Anton Arapov 48d35d
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Anton Arapov 48d35d
---
Anton Arapov 48d35d
 config.h |  5 +++++
Anton Arapov 48d35d
 util.c   | 14 +++++++++++++-
Anton Arapov 48d35d
 2 files changed, 18 insertions(+), 1 deletion(-)
Anton Arapov 48d35d
Anton Arapov 48d35d
diff --git a/config.h b/config.h
Anton Arapov 48d35d
index e39091f..4237355 100644
Anton Arapov 48d35d
--- a/config.h
Anton Arapov 48d35d
+++ b/config.h
Anton Arapov 48d35d
@@ -26,4 +26,9 @@
Anton Arapov 48d35d
 #define ALIGNMENT_WORKAROUND
Anton Arapov 48d35d
 #endif
Anton Arapov 48d35d
 
Anton Arapov 48d35d
+/* Avoid unaligned memcpy on /dev/mem */
Anton Arapov 48d35d
+#ifdef __aarch64__
Anton Arapov 48d35d
+#define USE_SLOW_MEMCPY
Anton Arapov 48d35d
+#endif
Anton Arapov 48d35d
+
Anton Arapov 48d35d
 #endif
Anton Arapov 48d35d
diff --git a/util.c b/util.c
Anton Arapov 48d35d
index eeffdae..04aaadd 100644
Anton Arapov 48d35d
--- a/util.c
Anton Arapov 48d35d
+++ b/util.c
Anton Arapov 48d35d
@@ -155,6 +155,18 @@ void *read_file(off_t base, size_t *max_len, const char *filename)
Anton Arapov 48d35d
 	return p;
Anton Arapov 48d35d
 }
Anton Arapov 48d35d
 
Anton Arapov 48d35d
+static void safe_memcpy(void *dest, const void *src, size_t n)
Anton Arapov 48d35d
+{
Anton Arapov 48d35d
+#ifdef USE_SLOW_MEMCPY
Anton Arapov 48d35d
+	size_t i;
Anton Arapov 48d35d
+
Anton Arapov 48d35d
+	for (i = 0; i < n; i++)
Anton Arapov 48d35d
+		*((u8 *)dest + i) = *((const u8 *)src + i);
Anton Arapov 48d35d
+#else
Anton Arapov 48d35d
+	memcpy(dest, src, n);
Anton Arapov 48d35d
+#endif
Anton Arapov 48d35d
+}
Anton Arapov 48d35d
+
Anton Arapov 48d35d
 /*
Anton Arapov 48d35d
  * Copy a physical memory chunk into a memory buffer.
Anton Arapov 48d35d
  * This function allocates memory.
Anton Arapov 48d35d
@@ -214,7 +226,7 @@ void *mem_chunk(off_t base, size_t len, const char *devmem)
Anton Arapov 48d35d
 	if (mmp == MAP_FAILED)
Anton Arapov 48d35d
 		goto try_read;
Anton Arapov 48d35d
 
Anton Arapov 48d35d
-	memcpy(p, (u8 *)mmp + mmoffset, len);
Anton Arapov 48d35d
+	safe_memcpy(p, (u8 *)mmp + mmoffset, len);
Anton Arapov 48d35d
 
Anton Arapov 48d35d
 	if (munmap(mmp, mmoffset + len) == -1)
Anton Arapov 48d35d
 	{
Anton Arapov 48d35d
-- 
Anton Arapov 48d35d
2.24.0
Anton Arapov 48d35d