1 #include <l4/re/c/dataspace.h> 2 #include <l4/re/consts.h> 3 #include <l4/sys/task.h> 4 5 #include "ipc.h" 6 #include "send_flexpage.h" 7 8 9 10 /* Make an L4 representation of the given flexpage. */ 11 12 static l4_fpage_t ipc_get_fpage(SendFlexpage *send_flexpage) 13 { 14 return l4_fpage(send_flexpage->base_addr, send_flexpage->order, 15 (send_flexpage->flags & L4RE_DS_MAP_FLAG_RW) ? L4_FPAGE_RW : L4_FPAGE_RO); 16 } 17 18 /* Make a representation of a flexpage for the IPC system. */ 19 20 long ipc_prepare_flexpage(Flexpage *flexpage, offset_t offset, 21 offset_t max_offset, address_t hot_spot, 22 flags_t flags, l4_snd_fpage_t *region) 23 { 24 SendFlexpage send_flexpage = flexpage->to_send(offset, hot_spot, flags, 25 max_offset); 26 27 /* NOTE: Consider l4_fpage_invalid() as the fpage here. */ 28 29 if (!send_flexpage.order) 30 return -L4_ERANGE; 31 32 region->fpage = ipc_get_fpage(&send_flexpage); 33 region->snd_base = hot_spot; 34 35 return L4_EOK; 36 } 37 38 /* Unmap the given flexpage. */ 39 40 void ipc_unmap_flexpage(Flexpage *flexpage) 41 { 42 SendFlexpage send_flexpage = flexpage->to_unmap(); 43 44 l4_task_unmap(L4RE_THIS_TASK_CAP, ipc_get_fpage(&send_flexpage), L4_FP_OTHER_SPACES); 45 } 46 47 // vim: tabstop=4 expandtab shiftwidth=4