2 * (c) 2008-2010 Alexander Warg <warg@os.inf.tu-dresden.de>
3 * economic rights: Technische Universität Dresden (Germany)
5 * This file is part of TUD:OS and distributed under the terms of the
6 * GNU General Public License 2.
7 * Please see the COPYING-GPL-2 file for details.
11 #include <l4/re/util/cap_alloc>
12 #include <l4/sys/capability>
13 #include <l4/re/dataspace>
14 #include <l4/sys/types.h>
15 #include <l4/libloader/remote_mem>
17 #include <l4/re/error_helper>
22 L4Re::Util::Ref_cap<L4Re::Dataspace>::Cap _stack_ds;
23 L4Re::Rm::Auto_region<char*> _vma;
25 l4_addr_t _last_checked;
27 Stack_base() : _last_checked(0) {}
29 void check_access(char *addr, size_t sz)
31 if (_last_checked != l4_trunc_page(l4_addr_t(addr)))
33 l4_addr_t offs = l4_trunc_page(addr - _vma.get());
34 l4_addr_t end = l4_round_page(addr + sz - _vma.get());
35 L4Re::chksys(_stack_ds->allocate(offs, end - offs));
36 _last_checked = l4_trunc_page(l4_addr_t(addr));
42 class Stack : public Ldr::Remote_stack<Stack_base>
45 explicit Stack() : Ldr::Remote_stack<Stack_base>(0) {}
46 void set_stack(L4Re::Util::Ref_cap<L4Re::Dataspace>::Cap const &ds, unsigned size);