xref: /openbmc/phosphor-ipmi-flash/tools/io.hpp (revision cf9b2195)
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 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 
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 } // namespace host_tool
72