tools/pci: Replace memcpy on pci write with aligned copy
memcpy() does unaligned access. Using it for device memory causes
exception (SIGBUS).
Replace the memcpy in PciAccessBridge::write with aligned copy.
Signed-off-by: Vivekanand Veeracholan <vveerach@google.com>
Change-Id: I8e573715dc8971be547d882ce3cb6de31b2620e4
diff --git a/tools/helper.cpp b/tools/helper.cpp
index fbb0275..d3790de 100644
--- a/tools/helper.cpp
+++ b/tools/helper.cpp
@@ -110,4 +110,35 @@
return (result == ipmi_flash::ActionStatus::success);
}
+void* memcpyAligned(void* destination, const void* source, std::size_t size)
+{
+ std::size_t i = 0;
+ std::size_t bytesCopied = 0;
+
+ if ((alignof(destination) == alignof(std::uint64_t)) &&
+ (alignof(source) == alignof(std::uint64_t)))
+ {
+ auto src64 = reinterpret_cast<const volatile std::uint64_t*>(source);
+ auto dest64 = reinterpret_cast<volatile std::uint64_t*>(destination);
+
+ for (i = 0; i < size / sizeof(std::uint64_t); i++)
+ {
+ *dest64++ = *src64++;
+ bytesCopied += sizeof(std::uint64_t);
+ }
+ }
+
+ auto srcMem8 =
+ reinterpret_cast<const volatile std::uint8_t*>(source) + bytesCopied;
+ auto destMem8 =
+ reinterpret_cast<volatile std::uint8_t*>(destination) + bytesCopied;
+
+ for (i = bytesCopied; i < size; i++)
+ {
+ *destMem8++ = *srcMem8++;
+ }
+
+ return destination;
+}
+
} // namespace host_tool