1111
1212#pragma once
1313
14+ #include < cstddef>
1415#include < filesystem>
1516#include < fstream>
1617#include < iostream>
@@ -117,7 +118,7 @@ class HwAccessor : public Logger, private boost::noncopyable {
117118template <typename max_access_width_t >
118119class HwAccessorMmap : public HwAccessor {
119120 public:
120- HwAccessorMmap (std::string dev_path, UioRegion region, uintptr_t mmap_offs)
121+ HwAccessorMmap (std::string dev_path, UioRegion region, uintptr_t mmap_offs, size_t access_offs )
121122 : HwAccessor(), _region{region} {
122123 BOOST_LOG_SEV (HwAccessor::_lg, bls::debug) << " dev name = " << dev_path;
123124
@@ -128,28 +129,34 @@ class HwAccessorMmap : public HwAccessor {
128129 BOOST_LOG_SEV (HwAccessor::_lg, bls::trace) << " fd = " << _fd << " , size = " << _region.size ;
129130
130131 // create memory mapping
131- _mem = mmap (NULL , _region.size , PROT_READ | PROT_WRITE, MAP_SHARED, _fd, mmap_offs);
132+ _mmap_mem = mmap (NULL , _region.size , PROT_READ | PROT_WRITE, MAP_SHARED, _fd, mmap_offs);
133+ _access_mem = static_cast <void *>(static_cast <char *>(_mmap_mem) + access_offs);
134+
132135 BOOST_LOG_SEV (HwAccessor::_lg, bls::trace)
133- << " mmap = 0x" << std::hex << mmap_offs << " -> 0x" << _mem << std::dec;
136+ << " mmap = 0x" << std::hex << mmap_offs << " -> 0x" << _mmap_mem << std::dec;
134137
135- if (_mem == MAP_FAILED) {
136- throw std::runtime_error (" mmap failed for uio " + dev_path);
138+ if (_mmap_mem == MAP_FAILED) {
139+ throw std::runtime_error (" mmap failed for uio " + dev_path + " : " + strerror (errno) );
137140 }
141+
142+ BOOST_LOG_SEV (HwAccessor::_lg, bls::trace)
143+ << " access offs = 0x" << std::hex << access_offs << " -> 0x" << _access_mem << std::dec;
138144 }
139145
140146 virtual ~HwAccessorMmap () {
141- munmap (_mem , _region.size );
147+ munmap (_mmap_mem , _region.size );
142148 ::close (_fd);
143149 }
144150
145151 protected:
146152 int _fd;
147- void * _mem;
153+ void * _mmap_mem;
154+ void * _access_mem;
148155 const UioRegion _region;
149156
150157 template <typename access_width_t >
151158 inline volatile access_width_t * _mem_ptr (uint32_t offs) const {
152- return reinterpret_cast <access_width_t *>(static_cast <uint8_t *>(_mem ) +
159+ return reinterpret_cast <access_width_t *>(static_cast <uint8_t *>(_access_mem ) +
153160 static_cast <ptrdiff_t >(offs));
154161 }
155162
@@ -217,8 +224,12 @@ class HwAccessorMmap : public HwAccessor {
217224 }
218225
219226 public:
220- UioRegion get_phys_region () const final override { return _region; }
221- void * get_virt_mem () const final override { return _mem; }
227+ UioRegion get_phys_region () const final override {
228+ const size_t access_offs =
229+ static_cast <uint8_t *>(_access_mem) - static_cast <uint8_t *>(_mmap_mem);
230+ return {_region.addr + access_offs, _region.size - access_offs};
231+ }
232+ void * get_virt_mem () const final override { return _access_mem; }
222233};
223234
224235// Hardware accessor for XDMA. Can support either 32 or 64 bit access
@@ -227,13 +238,15 @@ class HwAccessorXdma : public HwAccessorMmap<max_access_width_t> {
227238 int _fd_int;
228239
229240 public:
241+ // TODO: if we ever have to deal w/ unaligned mappings over XDMA (like on UIO), we'll have to pass an access_offs to HwAccessorMmap
230242 HwAccessorXdma (std::string xdma_path,
231243 std::string evt_dev,
232244 UioRegion region,
233245 uintptr_t pcie_offs)
234246 : HwAccessorMmap<max_access_width_t >(xdma_path + " /user" ,
235247 {region.addr | pcie_offs, region.size },
236- region.addr) {
248+ region.addr,
249+ 0 ) {
237250 if (!evt_dev.empty ()) {
238251 const auto evt_path = xdma_path + " /" + evt_dev;
239252 _fd_int = ::open (evt_path.c_str (), O_RDWR);
@@ -259,7 +272,7 @@ class HwAccessorXdma : public HwAccessorMmap<max_access_width_t> {
259272// Hardware accessor for AXI. Always supports 64 bit access
260273class HwAccessorAxi : public HwAccessorMmap <uint64_t > {
261274 public:
262- HwAccessorAxi (std::string dev_path, UioRegion region, uintptr_t mmap_offs);
275+ HwAccessorAxi (std::string dev_path, UioRegion region, uintptr_t mmap_offs, size_t access_offs );
263276 virtual ~HwAccessorAxi ();
264277
265278 int get_fd_int () const final override { return _fd; }
0 commit comments