1 #include "dataspace_server.h" 2 #include "ipc.h" 3 #include "pager.h" 4 5 6 7 Pager::Pager(PageMapper *mapper) 8 : _start(0), _size(0), _mapper(mapper) 9 { 10 _mapper->attach(); 11 } 12 13 void Pager::close() 14 { 15 _mapper->detach(); 16 } 17 18 PagerState Pager::mmap(offset_t start, offset_t size) 19 { 20 _start = trunc(start, PAGE_SIZE); 21 _size = round(start + size, PAGE_SIZE) - _start; 22 23 return PagerState(_start, _size, 0); 24 } 25 26 /* Map a flexpage corresponding to the dataspace 'offset' involving a 'hot_spot' 27 (flexpage offset). */ 28 29 long Pager::map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region) 30 { 31 offset_t file_offset = _start + offset; 32 offset_t max_offset = _start + _size; 33 Flexpage *flexpage = _mapper->get(file_offset); 34 35 /* Issue the flexpage via the IPC system. */ 36 37 long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, flags, region); 38 39 if (err) 40 return err; 41 42 err = complete_Dataspace_map(*region); 43 44 if (err) 45 return err; 46 47 /* After the flexpage is issued, it is queued for future reuse. */ 48 49 _mapper->queue(flexpage); 50 51 return IPC_MESSAGE_SENT; 52 } 53 54 /* Return the total size of the data. */ 55 56 offset_t Pager::get_data_size() 57 { 58 return _mapper->get_data_size(); 59 } 60 61 // vim: tabstop=4 expandtab shiftwidth=4