25class Inout_memory : 
public cxx::Ref_obj
 
   28  using Device_type = DEV;
 
   30  Inout_memory() : _paddr(0) {}
 
   31  Inout_memory(
l4_uint32_t num_sectors, Device_type *dev,
 
   33  : _device(dev), _paddr(0), _dir(dir), _num_sectors(num_sectors)
 
   36                             "Allocate dataspace capability for IO memory.");
 
   39    long sz = num_sectors * _device->sector_size();
 
   43                 "Allocate pinned memory.");
 
   52      cxx::make_unique<Block_device::Mem_region>(0, sz, 0, cxx::move(lcap));
 
   53    L4Re::chksys(_device->dma_map(_mem_region.get(), 0, _num_sectors, dir,
 
   55                 "Lock memory region for DMA.");
 
   58  Inout_memory(Inout_memory 
const &) = 
delete;
 
   59  Inout_memory(Inout_memory &&) = 
delete;
 
   61  Inout_memory &operator=(Inout_memory &&rhs)
 
   65        _device = rhs._device;
 
   66        _mem_region = cxx::move(rhs._mem_region);
 
   67        _region = cxx::move(rhs._region);
 
   70        _num_sectors = rhs._num_sectors;
 
   86    L4Re::chksys(_device->dma_unmap(_paddr, _num_sectors, _dir));
 
   94    blk.dma_addr = _paddr;
 
   95    blk.virt_addr = _region.get();
 
   96    blk.num_sectors = _num_sectors;
 
  103  T *get(
unsigned offset)
 const 
  104  { 
return reinterpret_cast<T *
>(_region.get() + offset); }
 
  107  Device_type *_device;
 
  108  cxx::unique_ptr<Block_device::Mem_region> _mem_region;