1 /*!
2 * \file
3 * \brief Kumem allocator helper
4 */
5 /*
6 * (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
7 * Alexander Warg <warg@os.inf.tu-dresden.de>
8 * economic rights: Technische Universität Dresden (Germany)
9 *
10 * This file is part of TUD:OS and distributed under the terms of the
11 * GNU General Public License 2.
12 * Please see the COPYING-GPL-2 file for details.
13 *
14 * As a special exception, you may use this file as part of a free software
15 * library without restriction. Specifically, if other files instantiate
16 * templates or use macros or inline functions from this file, or you compile
17 * this file and link it with other files to produce an executable, this
18 * file does not by itself cause the resulting executable to be covered by
19 * the GNU General Public License. This exception does not however
20 * invalidate any other reasons why the executable file might be covered by
21 * the GNU General Public License.
22 */
23
24 #include <l4/sys/task>
25 #include <l4/re/util/kumem_alloc>
26
27 namespace L4Re { namespace Util {
28
29 int
kumem_alloc(l4_addr_t * v,unsigned pages_order,L4::Cap<L4::Task> task,L4::Cap<L4Re::Rm> rm)30 kumem_alloc(l4_addr_t *v, unsigned pages_order,
31 L4::Cap<L4::Task> task,
32 L4::Cap<L4Re::Rm> rm) noexcept
33 {
34 int r;
35 unsigned long sz = (1 << pages_order) * L4_PAGESIZE;
36 unsigned sh = pages_order + L4_PAGESHIFT;
37
38 *v = 0;
39 if ((r = rm->reserve_area(v, sz,
40 L4Re::Rm::F::Reserved | L4Re::Rm::F::Search_addr,
41 sh)))
42 return r;
43
44 if ((r = l4_error(task->add_ku_mem(l4_fpage(*v, sh, L4_FPAGE_RW)))))
45 {
46 rm->free_area(*v);
47 return r;
48 }
49
50 return 0;
51 }
52
53 }}
54