1 #include "dataspace_server.h" 2 #include "ipc.h" 3 #include "pager.h" 4 5 6 7 Pager::Pager(PageMapper *mapper, flags_t flags) 8 : _start(0), _size(0), _mapper(mapper), _flags(flags) 9 { 10 /* Some pagers may not be initialised with a mapper. */ 11 12 if (_mapper != NULL) 13 _mapper->attach(); 14 } 15 16 /* Close the pager. */ 17 18 void Pager::close() 19 { 20 if (_mapper != NULL) 21 _mapper->detach(); 22 } 23 24 /* Flush data to the file. */ 25 26 long Pager::flush(offset_t populated_size, offset_t *size) 27 { 28 _mapper->flush_all(_start, populated_size); 29 30 *size = _mapper->get_data_size(); 31 return L4_EOK; 32 } 33 34 /* Resize the underlying file. */ 35 36 long Pager::resize(offset_t *size) 37 { 38 _mapper->set_data_size(*size); 39 40 *size = _mapper->get_data_size(); 41 return L4_EOK; 42 } 43 44 /* Expose a region of the file. */ 45 46 long Pager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end) 47 { 48 _start = trunc(position, PAGE_SIZE); 49 _size = round(position + length, PAGE_SIZE) - _start; 50 51 *start_pos = _start; 52 *end_pos = _start + _size; 53 *data_end = 0; 54 55 return L4_EOK; 56 } 57 58 /* Map a flexpage corresponding to the dataspace 'offset' involving a 'hot_spot' 59 (flexpage offset). */ 60 61 long Pager::map(offset_t offset, l4_addr_t hot_spot, flags_t flags, l4_snd_fpage_t *region) 62 { 63 offset_t file_offset = _start + offset; 64 offset_t max_offset = _start + _size; 65 Flexpage *flexpage = _mapper->get(file_offset, flags); 66 67 /* Issue the flexpage via the IPC system. */ 68 69 long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, region); 70 71 if (!err) 72 err = complete_Dataspace_map(*region); 73 74 /* After the flexpage is issued, it is queued for future reuse. */ 75 76 _mapper->queue(flexpage); 77 78 if (err) 79 return err; 80 81 return IPC_MESSAGE_SENT; 82 } 83 84 /* Return the total size of the data. */ 85 86 offset_t Pager::get_data_size() 87 { 88 return _mapper->get_data_size(); 89 } 90 91 // vim: tabstop=4 expandtab shiftwidth=4