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