1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/simple_pager.cc Wed Jan 20 01:37:12 2021 +0100
1.3 @@ -0,0 +1,55 @@
1.4 +#include <l4/re/c/dataspace.h>
1.5 +
1.6 +#include "dataspace_server.h"
1.7 +#include "simple_pager.h"
1.8 +
1.9 +
1.10 +
1.11 +SimplePager::SimplePager(Memory *memory)
1.12 +{
1.13 + if (memory == NULL)
1.14 + _memory = new Memory();
1.15 + else
1.16 + _memory = memory;
1.17 +
1.18 + _region = _memory->region();
1.19 +}
1.20 +
1.21 +void SimplePager::close()
1.22 +{
1.23 + if (_region != NULL)
1.24 + {
1.25 + _memory->release(_region);
1.26 + _region = NULL;
1.27 + }
1.28 +}
1.29 +
1.30 +/* Map a flexpage corresponding to the dataspace 'offset' involving a 'hot_spot'
1.31 + (flexpage offset). */
1.32 +
1.33 +long SimplePager::map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region)
1.34 +{
1.35 + Flexpage flexpage(_region);
1.36 +
1.37 + flexpage.reset(offset);
1.38 +
1.39 + /* Issue the flexpage via the IPC system. */
1.40 +
1.41 + SendFlexpage send_flexpage = flexpage.to_send(offset, hot_spot);
1.42 +
1.43 + /* Send the flexpage explicitly. */
1.44 +
1.45 + region->fpage = l4_fpage(send_flexpage.base_addr, send_flexpage.order,
1.46 + (flags & L4RE_DS_MAP_FLAG_RW) ? L4_FPAGE_RW
1.47 + : L4_FPAGE_RO);
1.48 + region->snd_base = hot_spot;
1.49 +
1.50 + long err = complete_Dataspace_map(*region);
1.51 +
1.52 + if (err)
1.53 + return err;
1.54 +
1.55 + return IPC_MESSAGE_SENT;
1.56 +}
1.57 +
1.58 +// vim: tabstop=4 expandtab shiftwidth=4