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