blob: 8760aec7ffd7185627c963405cdfee1296a489e2 [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
Brandon Kimcbf47402019-11-26 17:27:47 -080052 /* Don't allow copying, assignment or move assignment, only moving. */
Patrick Venture030b1a82019-01-18 08:33:02 -080053 DevMemDevice(const DevMemDevice&) = delete;
54 DevMemDevice& operator=(const DevMemDevice&) = delete;
55 DevMemDevice(DevMemDevice&&) = default;
Brandon Kimcbf47402019-11-26 17:27:47 -080056 DevMemDevice& operator=(DevMemDevice&&) = delete;
Patrick Venture030b1a82019-01-18 08:33:02 -080057
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
Brandon Kim286cc6a2019-11-05 16:39:47 -080071class PpcMemDevice : public HostIoInterface
72{
73 public:
Rui Zhangd8515a62020-03-24 16:46:44 -070074 explicit PpcMemDevice(const std::string& ppcMemPath,
Brandon Kim286cc6a2019-11-05 16:39:47 -080075 const internal::Sys* sys = &internal::sys_impl) :
76 ppcMemPath(ppcMemPath),
77 sys(sys)
78 {
79 }
80
81 ~PpcMemDevice() override;
82
83 /* Don't allow copying or assignment, only moving. */
84 PpcMemDevice(const PpcMemDevice&) = delete;
85 PpcMemDevice& operator=(const PpcMemDevice&) = delete;
86 PpcMemDevice(PpcMemDevice&&) = default;
87 PpcMemDevice& operator=(PpcMemDevice&&) = default;
88
89 bool read(const std::size_t offset, const std::size_t length,
90 void* const destination) override;
91
92 bool write(const std::size_t offset, const std::size_t length,
93 const void* const source) override;
94
95 private:
96 int ppcMemFd = -1;
97 const std::string ppcMemPath;
98 const internal::Sys* sys;
99};
100
Patrick Venture030b1a82019-01-18 08:33:02 -0800101} // namespace host_tool