]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/ned/server/src/remote_mem.h
update
[l4.git] / l4 / pkg / ned / server / src / remote_mem.h
1 /*
2  * (c) 2008-2010 Alexander Warg <warg@os.inf.tu-dresden.de>
3  *     economic rights: Technische Universität Dresden (Germany)
4  *
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.
8  */
9 #pragma once
10
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>
16 #include <l4/re/rm>
17 #include <l4/re/error_helper>
18
19 class Stack_base
20 {
21 protected:
22   L4Re::Util::Ref_cap<L4Re::Dataspace>::Cap _stack_ds;
23   L4Re::Rm::Auto_region<char*> _vma;
24
25   l4_addr_t _last_checked;
26
27   Stack_base() : _last_checked(0) {}
28
29   void check_access(char *addr, size_t sz)
30   {
31     if (_last_checked != l4_trunc_page(l4_addr_t(addr)))
32       {
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));
37       }
38
39   }
40 };
41
42 class Stack : public Ldr::Remote_stack<Stack_base>
43 {
44 public:
45   explicit Stack() : Ldr::Remote_stack<Stack_base>(0) {}
46   void set_stack(L4Re::Util::Ref_cap<L4Re::Dataspace>::Cap const &ds, unsigned size);
47 };