blob: 44cd2cb9b5e2776e6726bb304cd9a9f3101d0ffa [file] [log] [blame]
Patrick Venture030b1a82019-01-18 08:33:02 -08001#pragma once
2
3#include "internal/sys.hpp"
4
5#include <cstdint>
6#include <string>
7
8namespace host_tool
9{
10
11class HostIoInterface
12{
13 public:
14 virtual ~HostIoInterface() = default;
15
16 /**
Patrick Ventureac4ff972019-05-03 17:35:00 -070017 * Attempt to read bytes from offset to the destination from the host
18 * memory device.
19 *
20 * @param[in] offset - offset into the host memory device.
21 * @param[in] length - the number of bytes to copy from source.
22 * @param[in] destination - where to write the bytes.
23 * @return true on success, false on failure (such as unable to initialize
24 * device).
25 */
26 virtual bool read(const std::size_t offset, const std::size_t length,
27 void* const destination) = 0;
28
29 /**
Patrick Venture030b1a82019-01-18 08:33:02 -080030 * Attempt to write bytes from source to offset into the host memory device.
31 *
32 * @param[in] offset - offset into the host memory device.
33 * @param[in] length - the number of bytes to copy from source.
34 * @param[in] source - the souce of the bytes to copy to the memory device.
35 * @return true on success, false on failure (such as unable to initialize
36 * device).
37 */
38 virtual bool write(const std::size_t offset, const std::size_t length,
39 const void* const source) = 0;
40};
41
42class DevMemDevice : public HostIoInterface
43{
44 public:
45 explicit DevMemDevice(const internal::Sys* sys = &internal::sys_impl) :
46 sys(sys)
47 {
48 }
49
Patrick Venture18bbe3c2019-05-14 11:40:57 -070050 ~DevMemDevice() = default;
Patrick Venture030b1a82019-01-18 08:33:02 -080051
52 /* Don't allow copying or assignment, only moving. */
53 DevMemDevice(const DevMemDevice&) = delete;
54 DevMemDevice& operator=(const DevMemDevice&) = delete;
55 DevMemDevice(DevMemDevice&&) = default;
56 DevMemDevice& operator=(DevMemDevice&&) = default;
57
Patrick Ventureac4ff972019-05-03 17:35:00 -070058 bool read(const std::size_t offset, const std::size_t length,
59 void* const destination) override;
60
Patrick Venture030b1a82019-01-18 08:33:02 -080061 bool write(const std::size_t offset, const std::size_t length,
62 const void* const source) override;
63
64 private:
65 static const std::string devMemPath;
Patrick Venture030b1a82019-01-18 08:33:02 -080066 int devMemFd = -1;
67 void* devMemMapped = nullptr;
68 const internal::Sys* sys;
69};
70
71} // namespace host_tool