]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/libsigma0/lib/src/kip.c
32645d708a67ef4f7e8ee41243763ad238d604ce
[l4.git] / l4 / pkg / libsigma0 / lib / src / kip.c
1 /**
2  * \file        sigma0/lib/src/kip.c
3  * \brief       map kernel info page using sigma0 protocol
4  *
5  * \date        02/2006
6  * \author      Adam Lackorzynski <adam@os.inf.tu-dresden.de>
7  *              Frank Mehnert <fm3@os.inf.tu-dresden.de> */
8
9 /*
10  * (c) 2006-2009 Technische Universität Dresden
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 /*
20  * \return kip address, 0 on error
21  */
22 l4_kernel_info_t *
23 l4sigma0_map_kip(l4_cap_idx_t pager, void *adr, unsigned log2_size)
24 {
25   l4_msgtag_t tag = l4_msgtag(L4_PROTO_SIGMA0, 1, 0, 0);
26   l4_utcb_t *utcb = l4_utcb();
27   l4_msg_regs_t *m = l4_utcb_mr_u(utcb);
28   l4_buf_regs_t *b = l4_utcb_br_u(utcb);
29
30   l4_addr_t addr = (l4_addr_t)adr & (~0ULL << log2_size);
31   m->mr[0] = SIGMA0_REQ_KIP;
32   b->bdr = 0;
33   b->br[0] = L4_ITEM_MAP;
34   b->br[1] = l4_fpage(addr, log2_size, L4_FPAGE_RX).raw;
35
36   tag = l4_ipc_call(pager, utcb, tag, L4_IPC_NEVER);
37   if (l4_ipc_error(tag, utcb))
38     return 0;
39
40   if (l4_msgtag_items(tag) != 1)
41     return 0;
42
43   l4_addr_t a = addr + (m->mr[0] & (~0UL << L4_PAGESHIFT) & ((1ULL << log2_size)-1));
44
45   return (l4_kernel_info_t*)a;
46 }
47