2 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3 * Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
10 #include <l4/re/namespace>
11 #include <l4/re/dataspace>
12 #include <l4/re/mem_alloc>
16 #include <l4/re/error_helper>
17 #include <l4/re/util/env_ns>
19 #include <l4/cxx/exceptions>
20 #include <l4/cxx/iostream>
21 #include <l4/cxx/l4iostream>
22 #include <l4/sys/debugger.h>
23 #include <l4/sys/scheduler>
24 #include <l4/sys/thread>
25 #include <l4/sys/cxx/ipc_server_loop>
33 #include "loader_elf.h"
35 #include "dispatcher.h"
37 #include <l4/re/elf_aux.h>
39 extern char const __executable_start[];
40 L4RE_ELF_AUX_ELEM_T(l4re_elf_aux_mword_t, __stack_addr,
41 L4RE_ELF_AUX_T_STACK_ADDR,
42 (l4_addr_t)__executable_start + 0x1000000);
45 using L4Re::Dataspace;
47 extern "C" int main(int argc, char const *argv[],
50 static Elf_loader loader;
51 L4::Cap<void> rcv_cap;
54 public L4::Ipc_svr::Ignore_errors,
55 public L4::Ipc_svr::Default_timeout,
56 public L4::Ipc_svr::Compound_reply
59 static void setup_wait(l4_utcb_t *utcb, bool)
61 l4_utcb_br_u(utcb)->br[0] = L4::Ipc::Small_buf(rcv_cap.cap(),
62 L4_RCV_ITEM_LOCAL_ID).raw();
63 l4_utcb_br_u(utcb)->br[1] = 0;
64 l4_utcb_br_u(utcb)->bdr = 0;
68 extern "C" void *__libc_alloc_initial_tls(unsigned long size);
70 void *__libc_alloc_initial_tls(unsigned long)
72 // __libc_alloc_initial_tls must not be called here, this is just
77 static L4::Server<Loop_hooks> server(l4_utcb());
79 static void insert_regions()
86 while ((n = L4Re::Env::env()->rm()->get_regions(addr, &rl)) > 0)
88 for (int i = 0; i < n; ++i)
90 Rm::Region const *r = &rl[i];
91 auto pager = L4::cap_reinterpret_cast<L4Re::Dataspace>(Env::env()->rm());
92 void *x = Global::local_rm
93 ->attach((void*)r->start, r->end - r->start +1,
94 Region_handler(pager, L4_INVALID_CAP, 0, Rm::Pager), 0);
97 L4::cerr << "l4re: error while initializing region mapper\n";
107 while ((n = L4Re::Env::env()->rm()->get_areas(addr, &al)) > 0)
109 for (int i = 0; i < n; ++i)
111 Rm::Area const *r = &al[i];
113 = Global::local_rm->attach_area(r->start, r->end - r->start + 1);
116 L4::cerr << "l4re: error while initializing region mapper\n";
125 static int run(int argc, char const *argv[], char const *envp[])
127 Dbg::set_level(Dbg::Info | Dbg::Warn);
136 L4::cout << "ARGC=" << argc << "\n"
137 << "ARGV=" << argv << "\n"
138 << "ENVP=" << envp << "\n";
140 for (int i = 0; i < argc; ++i)
141 L4::cout << " arg: '" << argv[i] << "'\n";
143 for (char const *const *e = Global::envp; *e; ++e)
144 L4::cout << " env: '" << *e << "'\n";
147 L4Re::Env *const env = const_cast<L4Re::Env*>(L4Re::Env::env());
150 L4::cout << "AUX=" << Global::l4re_aux << "\n"
151 << "ENV=" << env << "\n"
152 << "Binary: " << Global::l4re_aux->binary << " " << env << "\n";
154 if (!env || !Global::l4re_aux)
156 Err(Err::Fatal).printf("invalid AUX vectors...\n");
162 char *t = strstr(Global::l4re_aux->binary, "rom/");
164 strncpy(s + 1, t ? t + 4 : Global::l4re_aux->binary, sizeof(s)-1);
166 l4_debugger_set_object_name(L4_BASE_THREAD_CAP, s);
167 l4_debugger_set_object_name(L4_BASE_TASK_CAP, s + 1);
170 Dbg::set_level(Global::l4re_aux->dbg_lvl);
171 rcv_cap = Global::cap_alloc->alloc<void>();
172 boot.printf("adding regions from remote region mapper\n");
175 L4::Cap<Dataspace> file;
177 boot.printf("load binary '%s'\n", Global::l4re_aux->binary);
179 file = L4Re_app_model::open_file(Global::l4re_aux->binary);
181 loader.start(file, Global::local_rm, Global::l4re_aux);
183 // Raise RM prio to its MCP
184 env->scheduler()->run_thread(env->main_thread(),
185 l4_sched_param(L4_SCHED_MAX_PRIO));
187 boot.printf("Start server loop\n");
188 server.loop<L4::Runtime_error>(Dispatcher());
191 int main(int argc, char const *argv[], char const *envp[])
195 return run(argc, argv, envp);
197 catch (L4::Runtime_error const &e)
199 Err(Err::Fatal).printf("Exception %s: '%s'\n", e.str(), e.extra_str());
203 catch (L4::Base_exception const &e)
205 Err(Err::Fatal).printf("Exception %s\n", e.str());