2 * (c) 2008-2009 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.
14 #include <l4/libloader/loader>
15 #include <l4/libloader/local_app_model>
17 #include <l4/re/l4aux.h>
28 void set_local_addr(l4_addr_t addr)
29 { sp = (char *)addr + _size; }
31 void set_target_stack(l4_addr_t addr, l4_size_t size)
32 { _addr = addr; _size = size; }
34 l4_size_t stack_size() const { return _size; }
35 l4_addr_t target_addr() const { return _addr; }
37 char *push_object(void const *src, unsigned long size)
40 memcpy(sp, src, size);
46 { return reinterpret_cast<T*>(push_object(&v, sizeof(T))); }
48 void const **push_local_ptr(void const *p)
51 void align(unsigned long size)
53 l4_addr_t p = l4_addr_t(sp);
55 for (bits = 0; (1UL << bits) <= size; ++bits)
62 char const *ptr() const { return sp; }
63 void ptr(char *p) { sp = p; }
66 struct L4Re_app_model : public Ldr::Base_app_model<L4Re_stack>
68 typedef L4::Cap<L4Re::Dataspace> Const_dataspace;
69 typedef L4::Cap<L4Re::Dataspace> Dataspace;
71 L4::Cap<L4Re::Rm> _rm;
73 L4Re_app_model(L4::Cap<L4Re::Rm> rm, void *) : _rm(rm) {}
75 Dataspace alloc_ds(unsigned long size) const;
77 static Const_dataspace open_file(char const *name);
79 void prog_attach_ds(l4_addr_t addr, unsigned long size,
80 Const_dataspace ds, unsigned long offset,
81 unsigned flags, char const *what);
83 static void copy_ds(Dataspace dst, unsigned long dst_offs,
84 Const_dataspace src, unsigned long src_offs,
87 static bool all_segs_cow();
89 l4_addr_t local_attach_ds(Const_dataspace ds, unsigned long size,
90 unsigned long offset) const;
92 void local_detach_ds(l4_addr_t addr, unsigned long size) const;
94 int prog_reserve_area(l4_addr_t *start, unsigned long size, unsigned flags, unsigned char align);
96 Dataspace alloc_app_stack();
101 static Const_dataspace reserved_area()
102 { return L4::Cap<L4Re::Dataspace>::Invalid; }
104 static Dataspace local_kip_ds()
106 return L4::Cap<L4Re::Dataspace>(Global::l4re_aux->kip_ds);
109 static L4::Cap<void> local_kip_cap()
110 { return local_kip_ds(); }
112 static L4::Cap<void> prog_kip_ds()
114 return L4::Cap<L4Re::Dataspace>(Global::l4re_aux->kip_ds);
117 void const *generate_l4aux(char const *, char const *) const
118 { return Global::l4re_aux; }
120 void extra_elf_auxv();
124 L4Re::Env *add_env();
125 void start_prog(L4Re::Env const *env);
128 typedef Ldr::Local_app_model<L4Re_app_model> L4Re_x_app_model;
133 bool start(L4::Cap<L4Re::Dataspace> bin, Region_map *rm, l4re_aux_t *aux);
134 bool __start(L4::Cap<L4Re::Dataspace> bin, Region_map *rm);
135 virtual bool launch(L4::Cap<L4Re::Dataspace> bin, L4::Cap<L4Re::Rm>) = 0;