# HG changeset patch # User Paul Boddie # Date 1611268717 -3600 # Node ID b1cea6e122d9ab7d1ea259f6552faab66091f21a # Parent 09653d071a38fbba09a9be4d63d9ded9809dfbd8 Expanded the IPC-related functions, propagating error conditions from flexpage preparation where the send flexpage has order 0, since this indicates that no mapping can be performed. diff -r 09653d071a38 -r b1cea6e122d9 ipc.cc --- a/ipc.cc Thu Jan 21 23:36:53 2021 +0100 +++ b/ipc.cc Thu Jan 21 23:38:37 2021 +0100 @@ -1,22 +1,48 @@ #include +#include +#include #include "ipc.h" #include "send_flexpage.h" -/* Make a representation of the flexpage for the IPC system. */ +/* Make an L4 representation of the given flexpage. */ + +static l4_fpage_t ipc_get_fpage(SendFlexpage *send_flexpage) +{ + // NOTE: To introduce flags properly in the flexpage abstractions. + + unsigned long flags = L4_FPAGE_RW; -void ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset, - l4_addr_t hot_spot, unsigned long flags, - l4_snd_fpage_t *region) + return l4_fpage(send_flexpage->base_addr, send_flexpage->order, + (flags & L4RE_DS_MAP_FLAG_RW) ? L4_FPAGE_RW : L4_FPAGE_RO); +} + +/* Make a representation of a flexpage for the IPC system. */ + +long ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset, + unsigned long max_offset, l4_addr_t hot_spot, + unsigned long flags, l4_snd_fpage_t *region) { - SendFlexpage send_flexpage = flexpage->to_send(offset, hot_spot); + SendFlexpage send_flexpage = flexpage->to_send(offset, hot_spot, max_offset); + + if (!send_flexpage.order) + return -L4_ERANGE; + + region->fpage = ipc_get_fpage(&send_flexpage); + region->snd_base = hot_spot; - region->fpage = l4_fpage(send_flexpage.base_addr, send_flexpage.order, - (flags & L4RE_DS_MAP_FLAG_RW) ? L4_FPAGE_RW - : L4_FPAGE_RO); - region->snd_base = hot_spot; + return L4_EOK; +} + +/* Unmap the given flexpage. */ + +void ipc_unmap_flexpage(Flexpage *flexpage) +{ + SendFlexpage send_flexpage = flexpage->to_unmap(); + + l4_task_unmap(L4RE_THIS_TASK_CAP, ipc_get_fpage(&send_flexpage), L4_FP_OTHER_SPACES); } // vim: tabstop=4 expandtab shiftwidth=4 diff -r 09653d071a38 -r b1cea6e122d9 ipc.h --- a/ipc.h Thu Jan 21 23:36:53 2021 +0100 +++ b/ipc.h Thu Jan 21 23:38:37 2021 +0100 @@ -6,8 +6,10 @@ -void ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset, - l4_addr_t hot_spot, unsigned long flags, - l4_snd_fpage_t *region); +long ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset, + unsigned long max_offset, l4_addr_t hot_spot, + unsigned long flags, l4_snd_fpage_t *region); + +void ipc_unmap_flexpage(Flexpage *flexpage); // vim: tabstop=4 expandtab shiftwidth=4 diff -r 09653d071a38 -r b1cea6e122d9 simple_pager.cc --- a/simple_pager.cc Thu Jan 21 23:36:53 2021 +0100 +++ b/simple_pager.cc Thu Jan 21 23:38:37 2021 +0100 @@ -36,9 +36,12 @@ /* Send the flexpage explicitly. */ - ipc_prepare_flexpage(&flexpage, offset, hot_spot, flags, region); + long err = ipc_prepare_flexpage(&flexpage, offset, PAGE_SIZE, hot_spot, flags, region); - long err = complete_Dataspace_map(*region); + if (err) + return err; + + err = complete_Dataspace_map(*region); if (err) return err;