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.
7 #include <l4/re/util/item_alloc>
8 #include <l4/re/util/cap_alloc>
9 #include <l4/re/error_helper>
11 #include <l4/re/mem_alloc>
13 #include <l4/re/dataspace>
15 #include "slab_alloc.h"
18 using L4Re::Util::cap_alloc;
19 using L4Re::Dataspace;
24 class Single_page_alloc_static
27 enum { Num_pages = 1024 };
28 L4Re::Util::Item_alloc<Num_pages> _page_map;
33 Single_page_alloc_static()
35 //L4::cerr << "Hello from alloc\n";
36 Cap<Dataspace> _mem = cap_alloc.alloc<Dataspace>();
38 chksys(-L4_ENOMEM, "could not allocate capability");
40 unsigned long size = Num_pages * L4_PAGESIZE;
41 chksys(Env::env()->mem_alloc()->alloc(size, _mem),
42 "backend storage data space");
44 chksys(Env::env()->rm()->attach(&_blob, size, Rm::Search_addr, _mem, 0),
45 "attaching backend storage data space");
50 //L4::cerr << "PA:alloc...\n";
51 long p = _page_map.alloc();
55 //L4::cerr << "PA: ok\n";
56 return (void*)(_blob + (p * L4_PAGESIZE));
64 l4_addr_t offset = l4_addr_t(p) - _blob;
66 _mem->clear(offset, L4_PAGESIZE);
67 _page_map.free(offset / L4_PAGESIZE);
72 static Single_page_alloc_static _pa;
74 void *Single_page_alloc_base::_alloc() { return _pa.alloc(); }
75 void Single_page_alloc_base::_free(void *o) { _pa.free(o); }