]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/loader/server/src/slab_alloc.cc
Inital import
[l4.git] / l4 / pkg / loader / server / src / slab_alloc.cc
1 /*
2  * (c) 2008-2009 Technische Universität Dresden
3  * This file is part of TUD:OS and distributed under the terms of the
4  * GNU General Public License 2.
5  * Please see the COPYING-GPL-2 file for details.
6  */
7 #include <l4/re/util/item_alloc>
8 #include <l4/re/util/cap_alloc>
9 #include <l4/re/error_helper>
10 #include <l4/re/env>
11 #include <l4/re/mem_alloc>
12 #include <l4/re/rm>
13 #include <l4/re/dataspace>
14
15 #include "slab_alloc.h"
16
17 using L4::Cap;
18 using L4Re::Util::cap_alloc;
19 using L4Re::Dataspace;
20 using L4Re::chksys;
21 using L4Re::Env;
22 using L4Re::Rm;
23
24 class Single_page_alloc_static
25 {
26 private:
27   enum { Num_pages = 1024 };
28   L4Re::Util::Item_alloc<Num_pages> _page_map;
29   l4_addr_t _blob;
30   Cap<Dataspace> _mem;
31
32 public:
33   Single_page_alloc_static()
34   {
35     //L4::cerr << "Hello from alloc\n";
36     Cap<Dataspace> _mem = cap_alloc.alloc<Dataspace>();
37     if (!_mem.is_valid())
38       chksys(-L4_ENOMEM, "could not allocate capability");
39
40     unsigned long size = Num_pages * L4_PAGESIZE;
41     chksys(Env::env()->mem_alloc()->alloc(size, _mem),
42            "backend storage data space");
43
44     chksys(Env::env()->rm()->attach(&_blob, size, Rm::Search_addr, _mem, 0),
45            "attaching backend storage data space");
46   }
47
48   void *alloc()
49   {
50     //L4::cerr << "PA:alloc...\n";
51     long p = _page_map.alloc();
52     if (p < 0)
53       return 0;
54
55     //L4::cerr << "PA: ok\n";
56     return (void*)(_blob + (p * L4_PAGESIZE));
57   }
58
59   void free(void *p)
60   {
61     if (!p)
62       return;
63
64     l4_addr_t offset = l4_addr_t(p) - _blob;
65
66     _mem->clear(offset, L4_PAGESIZE);
67     _page_map.free(offset / L4_PAGESIZE);
68   }
69 };
70   
71
72 static Single_page_alloc_static _pa;
73
74 void *Single_page_alloc_base::_alloc() { return _pa.alloc(); }
75 void Single_page_alloc_base::_free(void *o) { _pa.free(o); }