3 * (c) 2008-2009 Technische Universität Dresden
4 * This file is part of TUD:OS and distributed under the terms of the
5 * GNU Lesser General Public License 2.1.
6 * Please see the COPYING-LGPL-2.1 file for details.
10 #include <l4/sys/types.h>
11 #include <l4/re/l4aux.h>
13 #include <l4/libloader/stack>
18 { void check_access(char *, size_t) {} };
20 template< typename Mem_check = Mem_check_ok>
21 class Remote_stack : public Ldr::Stack, public Mem_check
25 void access_ok(char *p, size_t sz)
27 // for downward growing stack first subtract the size
28 Mem_check::check_access(p - sz, sz);
31 explicit Remote_stack(char *p = 0) : _target_top(0), _top(p), _p(p) {}
32 char *ptr() const { return _p; }
33 void ptr(char *p) { _p = p; }
34 void set_ma_cnt(char const *before_vma);
35 void set_target_stack(l4_addr_t addr, l4_size_t size)
36 { _target_top = addr + size; _size = size; }
38 template < typename T >
39 T relocate(T src) const
40 { return (T)(l4_addr_t(src) + (_target_top - l4_addr_t(_top))); }
42 char const *push_str(char const *s, size_t len);
43 char *push_object(void const *o, unsigned long size);
45 template< typename T >
48 access_ok(_p, sizeof(T));
49 T *p = reinterpret_cast<T*>(_p);
51 _p = reinterpret_cast<char*>(p);
55 void align(unsigned long size)
57 l4_addr_t p = l4_addr_t(_p);
59 for (bits = 0; (1UL << bits) <= size; ++bits)
66 void const **push_local_ptr(void const *p)
68 void const *x = relocate(p);
72 l4_addr_t target_ptr() const { return relocate(l4_addr_t(_p)); }
73 l4_addr_t target_top() const { return _target_top; }
74 l4_addr_t target_addr() const { return _target_top - _size; }
75 l4_size_t stack_size() const { return _size; }
76 void set_local_top(char *top)
77 { _top = top; _p = top; }
80 l4_addr_t _target_top;
87 template<typename Mem_check>
89 Remote_stack<Mem_check>::set_ma_cnt(char const *before_vma)
91 push((l4_umword_t)((before_vma - _p) / sizeof(l4re_mem_area_t)));
95 template<typename Mem_check>
97 Remote_stack<Mem_check>::push_str(char const *s, size_t len)
99 access_ok(_p, len + 1);
101 __builtin_memcpy(_p, s, len);
107 template<typename Mem_check>
109 Remote_stack<Mem_check>::push_object(void const *o, unsigned long size)
113 __builtin_memcpy(_p, o, size);