blob: b3b2c7933f48f039d40d194b79185c6f743dc457 [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)
Patrick Venture9b37b092020-05-28 20:58:57 -070047 {}
Patrick Venture030b1a82019-01-18 08:33:02 -080048
Patrick Venture18bbe3c2019-05-14 11:40:57 -070049 ~DevMemDevice() = default;
Patrick Venture030b1a82019-01-18 08:33:02 -080050
Brandon Kimcbf47402019-11-26 17:27:47 -080051 /* Don't allow copying, assignment or move assignment, only moving. */
Patrick Venture030b1a82019-01-18 08:33:02 -080052 DevMemDevice(const DevMemDevice&) = delete;
53 DevMemDevice& operator=(const DevMemDevice&) = delete;
54 DevMemDevice(DevMemDevice&&) = default;
Brandon Kimcbf47402019-11-26 17:27:47 -080055 DevMemDevice& operator=(DevMemDevice&&) = delete;
Patrick Venture030b1a82019-01-18 08:33:02 -080056
Patrick Ventureac4ff972019-05-03 17:35:00 -070057 bool read(const std::size_t offset, const std::size_t length,
58 void* const destination) override;
59
Patrick Venture030b1a82019-01-18 08:33:02 -080060 bool write(const std::size_t offset, const std::size_t length,
61 const void* const source) override;
62
63 private:
64 static const std::string devMemPath;
Patrick Venture030b1a82019-01-18 08:33:02 -080065 int devMemFd = -1;
66 void* devMemMapped = nullptr;
67 const internal::Sys* sys;
68};
69
Brandon Kim286cc6a2019-11-05 16:39:47 -080070class PpcMemDevice : public HostIoInterface
71{
72 public:
Rui Zhangd8515a62020-03-24 16:46:44 -070073 explicit PpcMemDevice(const std::string& ppcMemPath,
Brandon Kim286cc6a2019-11-05 16:39:47 -080074 const internal::Sys* sys = &internal::sys_impl) :
75 ppcMemPath(ppcMemPath),
76 sys(sys)
Patrick Venture9b37b092020-05-28 20:58:57 -070077 {}
Brandon Kim286cc6a2019-11-05 16:39:47 -080078
79 ~PpcMemDevice() override;
80
81 /* Don't allow copying or assignment, only moving. */
82 PpcMemDevice(const PpcMemDevice&) = delete;
83 PpcMemDevice& operator=(const PpcMemDevice&) = delete;
84 PpcMemDevice(PpcMemDevice&&) = default;
85 PpcMemDevice& operator=(PpcMemDevice&&) = default;
86
87 bool read(const std::size_t offset, const std::size_t length,
88 void* const destination) override;
89
90 bool write(const std::size_t offset, const std::size_t length,
91 const void* const source) override;
92
93 private:
Patrick Ventureea0e4702020-10-05 12:22:59 -070094 void close();
95
Brandon Kim286cc6a2019-11-05 16:39:47 -080096 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