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, unsigned long offset, 21 unsigned long max_offset, l4_addr_t hot_spot, 22 l4_snd_fpage_t *region) 23 { 24 SendFlexpage send_flexpage = flexpage->to_send(offset, hot_spot, max_offset); 25 26 /* NOTE: Consider l4_fpage_invalid() as the fpage here. */ 27 28 if (!send_flexpage.order) 29 return -L4_ERANGE; 30 31 region->fpage = ipc_get_fpage(&send_flexpage); 32 region->snd_base = hot_spot; 33 34 return L4_EOK; 35 } 36 37 /* Unmap the given flexpage. */ 38 39 void ipc_unmap_flexpage(Flexpage *flexpage) 40 { 41 SendFlexpage send_flexpage = flexpage->to_unmap(); 42 43 l4_task_unmap(L4RE_THIS_TASK_CAP, ipc_get_fpage(&send_flexpage), L4_FP_OTHER_SPACES); 44 } 45 46 // vim: tabstop=4 expandtab shiftwidth=4