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 /* Expose a region of the file. */ 19 20 long Pager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end) 21 { 22 _start = trunc(position, PAGE_SIZE); 23 _size = round(position + length, PAGE_SIZE) - _start; 24 25 *start_pos = _start; 26 *end_pos = _start + _size; 27 *data_end = 0; 28 29 return L4_EOK; 30 } 31 32 /* Map a flexpage corresponding to the dataspace 'offset' involving a 'hot_spot' 33 (flexpage offset). */ 34 35 long Pager::map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region) 36 { 37 offset_t file_offset = _start + offset; 38 offset_t max_offset = _start + _size; 39 Flexpage *flexpage = _mapper->get(file_offset, flags); 40 41 /* Issue the flexpage via the IPC system. */ 42 43 long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, region); 44 45 if (err) 46 return err; 47 48 err = complete_Dataspace_map(*region); 49 50 if (err) 51 return err; 52 53 /* After the flexpage is issued, it is queued for future reuse. */ 54 55 _mapper->queue(flexpage); 56 57 return IPC_MESSAGE_SENT; 58 } 59 60 /* Return the total size of the data. */ 61 62 offset_t Pager::get_data_size() 63 { 64 return _mapper->get_data_size(); 65 } 66 67 // vim: tabstop=4 expandtab shiftwidth=4