1 #pragma once 2 3 #include "internal/sys.hpp" 4 5 #include <cstdint> 6 #include <string> 7 8 namespace host_tool 9 { 10 11 class HostIoInterface 12 { 13 public: 14 virtual ~HostIoInterface() = default; 15 16 /** 17 * 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 /** 30 * 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 42 class DevMemDevice : public HostIoInterface 43 { 44 public: 45 explicit DevMemDevice(const internal::Sys* sys = &internal::sys_impl) : 46 sys(sys) 47 { 48 } 49 50 ~DevMemDevice() = default; 51 52 /* Don't allow copying, assignment or move assignment, only moving. */ 53 DevMemDevice(const DevMemDevice&) = delete; 54 DevMemDevice& operator=(const DevMemDevice&) = delete; 55 DevMemDevice(DevMemDevice&&) = default; 56 DevMemDevice& operator=(DevMemDevice&&) = delete; 57 58 bool read(const std::size_t offset, const std::size_t length, 59 void* const destination) override; 60 61 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; 66 int devMemFd = -1; 67 void* devMemMapped = nullptr; 68 const internal::Sys* sys; 69 }; 70 71 class PpcMemDevice : public HostIoInterface 72 { 73 public: 74 explicit PpcMemDevice(const std::string& ppcMemPath, 75 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 101 } // namespace host_tool 102