1 /**
2 * \file sigma0/lib/src/iomem.c
3 * \brief map any page using sigma0 protocol
4 *
5 * \date 02/2006
6 * \author Frank Mehnert <fm3@os.inf.tu-dresden.de> */
7
8 /*
9 * (c) 2006-2009 Author(s)
10 * economic rights: Technische Universität Dresden (Germany)
11 * This file is part of TUD:OS and distributed under the terms of the
12 * GNU Lesser General Public License 2.1.
13 * Please see the COPYING-LGPL-2.1 file for details.
14 */
15
16 #include <l4/sys/ipc.h>
17 #include <l4/sigma0/sigma0.h>
18
19 L4_CV int
l4sigma0_map_anypage(l4_cap_idx_t pager,l4_addr_t map_area,unsigned log2_map_size,l4_addr_t * base,unsigned sz)20 l4sigma0_map_anypage(l4_cap_idx_t pager, l4_addr_t map_area,
21 unsigned log2_map_size, l4_addr_t *base, unsigned sz)
22 {
23 l4_msgtag_t tag = l4_msgtag(L4_PROTO_SIGMA0, 2, 0, 0);
24 l4_utcb_t *utcb = l4_utcb();
25 l4_msg_regs_t *m = l4_utcb_mr_u(utcb);
26 l4_buf_regs_t *b = l4_utcb_br_u(utcb);
27
28 m->mr[0] = SIGMA0_REQ_FPAGE_ANY;
29 m->mr[1] = l4_fpage(0, sz, 0).raw;
30
31 b->bdr = 0;
32 b->br[0] = L4_ITEM_MAP;
33 b->br[1] = l4_fpage(map_area, log2_map_size, L4_FPAGE_RWX).raw;
34
35 tag = l4_ipc_call(pager, utcb, tag, L4_IPC_NEVER);
36 if (l4_ipc_error(tag, utcb))
37 return -L4SIGMA0_IPCERROR;
38
39 if (l4_msgtag_items(tag) != 1)
40 return -L4SIGMA0_NOFPAGE;
41
42 *base = m->mr[0] & (~0UL << L4_PAGESHIFT);
43
44 return 0;
45 }
46