tools: add io interface for mmio, etc
Add an IO interface for host-side memory access. This is done as an
interface to allow platform specific implementations.
Change-Id: Id8e35d5beb21f7db544e27d6592bbeac58748dcb
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/tools/io.cpp b/tools/io.cpp
new file mode 100644
index 0000000..e25216e
--- /dev/null
+++ b/tools/io.cpp
@@ -0,0 +1,47 @@
+#include "io.hpp"
+
+#include "internal/sys.hpp"
+
+#include <fcntl.h>
+
+#include <cstdint>
+#include <cstring>
+#include <string>
+
+namespace host_tool
+{
+
+const std::string DevMemDevice::devMemPath = "/dev/mem";
+
+bool DevMemDevice::write(const std::size_t offset, const std::size_t length,
+ const void* const source)
+{
+ if (!opened)
+ {
+ devMemFd = sys->open(devMemPath.c_str(), O_RDWR);
+ if (devMemFd < 0)
+ {
+ return false;
+ }
+
+ opened = true;
+ }
+
+ // addr, length, prot, flags, fd, offset
+ devMemMapped =
+ sys->mmap(0, length, PROT_WRITE, MAP_SHARED, devMemFd, offset);
+ if (devMemMapped == MAP_FAILED)
+ {
+ return false; /* but leave the file open. */
+ }
+
+ /* Copy the bytes. */
+ std::memcpy(devMemMapped, source, length);
+
+ /* Close the map between writes for now. */
+ sys->munmap(devMemMapped, length);
+
+ return true;
+}
+
+} // namespace host_tool