1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/mapping/ipc.cc Fri Apr 02 01:27:50 2021 +0200
1.3 @@ -0,0 +1,46 @@
1.4 +#include <l4/re/c/dataspace.h>
1.5 +#include <l4/re/consts.h>
1.6 +#include <l4/sys/task.h>
1.7 +
1.8 +#include "ipc.h"
1.9 +#include "send_flexpage.h"
1.10 +
1.11 +
1.12 +
1.13 +/* Make an L4 representation of the given flexpage. */
1.14 +
1.15 +static l4_fpage_t ipc_get_fpage(SendFlexpage *send_flexpage)
1.16 +{
1.17 + return l4_fpage(send_flexpage->base_addr, send_flexpage->order,
1.18 + (send_flexpage->flags & L4RE_DS_MAP_FLAG_RW) ? L4_FPAGE_RW : L4_FPAGE_RO);
1.19 +}
1.20 +
1.21 +/* Make a representation of a flexpage for the IPC system. */
1.22 +
1.23 +long ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset,
1.24 + unsigned long max_offset, l4_addr_t hot_spot,
1.25 + l4_snd_fpage_t *region)
1.26 +{
1.27 + SendFlexpage send_flexpage = flexpage->to_send(offset, hot_spot, max_offset);
1.28 +
1.29 + /* NOTE: Consider l4_fpage_invalid() as the fpage here. */
1.30 +
1.31 + if (!send_flexpage.order)
1.32 + return -L4_ERANGE;
1.33 +
1.34 + region->fpage = ipc_get_fpage(&send_flexpage);
1.35 + region->snd_base = hot_spot;
1.36 +
1.37 + return L4_EOK;
1.38 +}
1.39 +
1.40 +/* Unmap the given flexpage. */
1.41 +
1.42 +void ipc_unmap_flexpage(Flexpage *flexpage)
1.43 +{
1.44 + SendFlexpage send_flexpage = flexpage->to_unmap();
1.45 +
1.46 + l4_task_unmap(L4RE_THIS_TASK_CAP, ipc_get_fpage(&send_flexpage), L4_FP_OTHER_SPACES);
1.47 +}
1.48 +
1.49 +// vim: tabstop=4 expandtab shiftwidth=4