1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/generic/simple_pager.cc Fri Apr 02 01:27:50 2021 +0200
1.3 @@ -0,0 +1,62 @@
1.4 +#include <l4/re/c/dataspace.h>
1.5 +
1.6 +#include "dataspace_server.h"
1.7 +#include "memory_incremental.h"
1.8 +#include "ipc.h"
1.9 +#include "simple_pager.h"
1.10 +
1.11 +
1.12 +
1.13 +SimplePager::SimplePager(Memory *memory)
1.14 +{
1.15 + if (memory == NULL)
1.16 + _memory = new MemoryIncremental();
1.17 + else
1.18 + _memory = memory;
1.19 +
1.20 + _region = _memory->region();
1.21 +}
1.22 +
1.23 +void SimplePager::close()
1.24 +{
1.25 + if (_region != NULL)
1.26 + {
1.27 + _memory->release(_region);
1.28 + _region = NULL;
1.29 + }
1.30 +}
1.31 +
1.32 +/* Map a flexpage corresponding to the dataspace 'offset' involving a 'hot_spot'
1.33 + (flexpage offset). */
1.34 +
1.35 +long SimplePager::map(offset_t offset, l4_addr_t hot_spot, flags_t flags, l4_snd_fpage_t *region)
1.36 +{
1.37 + Flexpage flexpage(_region);
1.38 +
1.39 + flexpage.reset(offset);
1.40 + flexpage.upgrade(flags);
1.41 +
1.42 + /* Send the flexpage explicitly. */
1.43 +
1.44 + long err = ipc_prepare_flexpage(&flexpage, offset, _region->size(), hot_spot, region);
1.45 +
1.46 + if (err)
1.47 + return err;
1.48 +
1.49 + err = complete_Dataspace_map(*region);
1.50 +
1.51 + if (err)
1.52 + return err;
1.53 +
1.54 + return IPC_MESSAGE_SENT;
1.55 +}
1.56 +
1.57 +long SimplePager::info(offset_t *size, flags_t *flags)
1.58 +{
1.59 + *size = _region->size();
1.60 + *flags = L4_FPAGE_RW;
1.61 +
1.62 + return L4_EOK;
1.63 +}
1.64 +
1.65 +// vim: tabstop=4 expandtab shiftwidth=4