1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/generic/pager.cc Fri Apr 02 01:27:50 2021 +0200
1.3 @@ -0,0 +1,91 @@
1.4 +#include "dataspace_server.h"
1.5 +#include "ipc.h"
1.6 +#include "pager.h"
1.7 +
1.8 +
1.9 +
1.10 +Pager::Pager(PageMapper *mapper, flags_t flags)
1.11 +: _start(0), _size(0), _mapper(mapper), _flags(flags)
1.12 +{
1.13 + /* Some pagers may not be initialised with a mapper. */
1.14 +
1.15 + if (_mapper != NULL)
1.16 + _mapper->attach();
1.17 +}
1.18 +
1.19 +/* Close the pager. */
1.20 +
1.21 +void Pager::close()
1.22 +{
1.23 + if (_mapper != NULL)
1.24 + _mapper->detach();
1.25 +}
1.26 +
1.27 +/* Flush data to the file. */
1.28 +
1.29 +long Pager::flush(offset_t populated_size, offset_t *size)
1.30 +{
1.31 + _mapper->flush_all(_start, populated_size);
1.32 +
1.33 + *size = _mapper->get_data_size();
1.34 + return L4_EOK;
1.35 +}
1.36 +
1.37 +/* Resize the underlying file. */
1.38 +
1.39 +long Pager::resize(offset_t *size)
1.40 +{
1.41 + _mapper->set_data_size(*size);
1.42 +
1.43 + *size = _mapper->get_data_size();
1.44 + return L4_EOK;
1.45 +}
1.46 +
1.47 +/* Expose a region of the file. */
1.48 +
1.49 +long Pager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end)
1.50 +{
1.51 + _start = trunc(position, PAGE_SIZE);
1.52 + _size = round(position + length, PAGE_SIZE) - _start;
1.53 +
1.54 + *start_pos = _start;
1.55 + *end_pos = _start + _size;
1.56 + *data_end = 0;
1.57 +
1.58 + return L4_EOK;
1.59 +}
1.60 +
1.61 +/* Map a flexpage corresponding to the dataspace 'offset' involving a 'hot_spot'
1.62 + (flexpage offset). */
1.63 +
1.64 +long Pager::map(offset_t offset, l4_addr_t hot_spot, flags_t flags, l4_snd_fpage_t *region)
1.65 +{
1.66 + offset_t file_offset = _start + offset;
1.67 + offset_t max_offset = _start + _size;
1.68 + Flexpage *flexpage = _mapper->get(file_offset, flags);
1.69 +
1.70 + /* Issue the flexpage via the IPC system. */
1.71 +
1.72 + long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, region);
1.73 +
1.74 + if (!err)
1.75 + err = complete_Dataspace_map(*region);
1.76 +
1.77 + /* After the flexpage is issued, it is queued for future reuse. */
1.78 +
1.79 + _mapper->queue(flexpage);
1.80 +
1.81 + if (err)
1.82 + return err;
1.83 +
1.84 + return IPC_MESSAGE_SENT;
1.85 +}
1.86 +
1.87 +/* Return the total size of the data. */
1.88 +
1.89 +offset_t Pager::get_data_size()
1.90 +{
1.91 + return _mapper->get_data_size();
1.92 +}
1.93 +
1.94 +// vim: tabstop=4 expandtab shiftwidth=4