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