From f763e5ec2aee806d1a1871a9686be35b5354adc3 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Tue, 10 Sep 2013 14:33:14 +0200 Subject: [PATCH] Move main bootstrap to platform-specific object To prevent multiple execution of main-bootstrap, I moved the code to a statically initialized object. The reason for this change is that _main() is exeuted twice when starting dynamic binaries. Now, the object is part of the base-common library which is linked with ld.lib.so. --- base-codezero/lib/mk/base-common.mk | 9 +-- .../{_main_helper.h => main_bootstrap.cc} | 32 +++++---- base-fiasco/lib/mk/base-common.mk | 9 +-- .../{_main_helper.h => main_bootstrap.cc} | 7 +- base-foc/lib/mk/base-common.inc | 8 ++- .../{_main_helper.h => main_bootstrap.cc} | 29 ++++---- base-hw/lib/mk/base-common.mk | 6 +- .../{_main_helper.h => main_bootstrap.cc} | 18 ++--- base-linux/lib/mk/base-common.mk | 6 +- base-linux/src/platform/_main_helper.h | 59 --------------- base-linux/src/platform/lx_hybrid.cc | 2 +- base-linux/src/platform/main_bootstrap.cc | 71 +++++++++++++++++++ base-nova/lib/mk/base-common.inc | 8 ++- .../{_main_helper.h => main_bootstrap.cc} | 9 +-- base-okl4/lib/mk/base-common.mk | 9 +-- .../{_main_helper.h => main_bootstrap.cc} | 27 ++++--- base-pistachio/lib/mk/base-common.mk | 9 +-- .../{_main_helper.h => main_bootstrap.cc} | 19 ++--- base/src/platform/_main.cc | 9 ++- 19 files changed, 191 insertions(+), 155 deletions(-) rename base-codezero/src/platform/{_main_helper.h => main_bootstrap.cc} (72%) rename base-fiasco/src/platform/{_main_helper.h => main_bootstrap.cc} (67%) rename base-foc/src/platform/{_main_helper.h => main_bootstrap.cc} (52%) rename base-hw/src/platform/{_main_helper.h => main_bootstrap.cc} (61%) delete mode 100644 base-linux/src/platform/_main_helper.h create mode 100644 base-linux/src/platform/main_bootstrap.cc rename base-nova/src/platform/{_main_helper.h => main_bootstrap.cc} (65%) rename base-okl4/src/platform/{_main_helper.h => main_bootstrap.cc} (67%) rename base-pistachio/src/platform/{_main_helper.h => main_bootstrap.cc} (69%) diff --git a/base-codezero/lib/mk/base-common.mk b/base-codezero/lib/mk/base-common.mk index 3c9fabf93..6e1008e60 100644 --- a/base-codezero/lib/mk/base-common.mk +++ b/base-codezero/lib/mk/base-common.mk @@ -6,7 +6,7 @@ LIBS += cxx l4 startup -SRC_CC += cap_copy.cc +SRC_CC += cap_copy.cc main_bootstrap.cc SRC_CC += ipc/ipc.cc ipc/pager.cc ipc/ipc_marshal_cap.cc SRC_CC += pager/pager.cc SRC_CC += avl_tree/avl_tree.cc @@ -28,6 +28,7 @@ INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread INC_DIR += $(REP_DIR)/include/codezero/dummies -vpath cap_copy.cc $(BASE_DIR)/src/platform -vpath %.cc $(REP_DIR)/src/base -vpath %.cc $(BASE_DIR)/src/base +vpath main_bootstrap.cc $(REP_DIR)/src/platform +vpath cap_copy.cc $(BASE_DIR)/src/platform +vpath %.cc $(REP_DIR)/src/base +vpath %.cc $(BASE_DIR)/src/base diff --git a/base-codezero/src/platform/_main_helper.h b/base-codezero/src/platform/main_bootstrap.cc similarity index 72% rename from base-codezero/src/platform/_main_helper.h rename to base-codezero/src/platform/main_bootstrap.cc index a14c70212..aca3889f3 100644 --- a/base-codezero/src/platform/_main_helper.h +++ b/base-codezero/src/platform/main_bootstrap.cc @@ -1,6 +1,7 @@ /* * \brief Platform-specific helper functions for the _main() function * \author Norman Feske + * \author Christian Helmuth * \date 2009-10-02 */ @@ -11,14 +12,11 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _PLATFORM___MAIN_HELPER_H_ -#define _PLATFORM___MAIN_HELPER_H_ - +/* Genode includes */ +#include #include - -/* make Codezero includes happy */ -extern "C" char *strncpy(char *dest, const char *src, Genode::size_t n); -extern "C" void *memcpy(void *dest, const void *src, Genode::size_t n); +#include +#include /* Codezero includes */ #include @@ -59,19 +57,25 @@ extern "C" int printf(const char *format, ...) ** Startup-code helpers ** **************************/ +namespace Genode { void platform_main_bootstrap(); } + Genode::Native_thread_id main_thread_tid; Codezero::l4_mutex main_thread_running_lock; -static void main_thread_bootstrap() +void Genode::platform_main_bootstrap() { - Codezero::__l4_init(); + static struct Bootstrap + { + Bootstrap() + { + Codezero::__l4_init(); - main_thread_tid = Codezero::thread_myself(); + main_thread_tid = Codezero::thread_myself(); - Codezero::l4_mutex_init(&main_thread_running_lock); - Codezero::l4_mutex_lock(&main_thread_running_lock); /* block on first mutex lock */ + Codezero::l4_mutex_init(&main_thread_running_lock); + Codezero::l4_mutex_lock(&main_thread_running_lock); /* block on first mutex lock */ + } + } bootstrap; } - -#endif /* _PLATFORM___MAIN_HELPER_H_ */ diff --git a/base-fiasco/lib/mk/base-common.mk b/base-fiasco/lib/mk/base-common.mk index 35859aa5f..39f6e3162 100644 --- a/base-fiasco/lib/mk/base-common.mk +++ b/base-fiasco/lib/mk/base-common.mk @@ -6,7 +6,7 @@ LIBS += cxx startup -SRC_CC += cap_copy.cc +SRC_CC += cap_copy.cc main_bootstrap.cc SRC_CC += ipc/ipc.cc ipc/pager.cc ipc/ipc_marshal_cap.cc SRC_CC += pager/pager.cc SRC_CC += avl_tree/avl_tree.cc @@ -25,6 +25,7 @@ SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc thread/trace.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread -vpath cap_copy.cc $(BASE_DIR)/src/platform -vpath %.cc $(REP_DIR)/src/base -vpath %.cc $(BASE_DIR)/src/base +vpath main_bootstrap.cc $(REP_DIR)/src/platform +vpath cap_copy.cc $(BASE_DIR)/src/platform +vpath %.cc $(REP_DIR)/src/base +vpath %.cc $(BASE_DIR)/src/base diff --git a/base-fiasco/src/platform/_main_helper.h b/base-fiasco/src/platform/main_bootstrap.cc similarity index 67% rename from base-fiasco/src/platform/_main_helper.h rename to base-fiasco/src/platform/main_bootstrap.cc index 8c994f0e4..40d58d8b1 100644 --- a/base-fiasco/src/platform/_main_helper.h +++ b/base-fiasco/src/platform/main_bootstrap.cc @@ -11,9 +11,4 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _PLATFORM___MAIN_HELPER_H_ -#define _PLATFORM___MAIN_HELPER_H_ - -static void main_thread_bootstrap() { } - -#endif /* _PLATFORM___MAIN_HELPER_H_ */ +namespace Genode { void platform_main_bootstrap() { /* dummy */ } } diff --git a/base-foc/lib/mk/base-common.inc b/base-foc/lib/mk/base-common.inc index 87e12dbc2..97339de7f 100644 --- a/base-foc/lib/mk/base-common.inc +++ b/base-foc/lib/mk/base-common.inc @@ -6,6 +6,7 @@ LIBS += cxx syscall startup +SRC_CC += main_bootstrap.cc SRC_CC += ipc/ipc.cc ipc/pager.cc SRC_CC += pager/pager.cc SRC_CC += avl_tree/avl_tree.cc @@ -26,5 +27,8 @@ INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread -vpath %.cc $(REP_DIR)/src/base -vpath %.cc $(BASE_DIR)/src/base +vpath main_bootstrap.cc $(REP_DIR)/src/platform +vpath %.cc $(REP_DIR)/src/base +vpath %.cc $(BASE_DIR)/src/base + +# vi: set ft=make : diff --git a/base-foc/src/platform/_main_helper.h b/base-foc/src/platform/main_bootstrap.cc similarity index 52% rename from base-foc/src/platform/_main_helper.h rename to base-foc/src/platform/main_bootstrap.cc index a6a836f8c..0a4ac3afe 100644 --- a/base-foc/src/platform/_main_helper.h +++ b/base-foc/src/platform/main_bootstrap.cc @@ -1,6 +1,7 @@ /* * \brief Platform-specific helper functions for the _main() function * \author Christian Prochaska + * \author Christian Helmuth * \date 2009-08-05 */ @@ -11,9 +12,6 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _PLATFORM___MAIN_HELPER_H_ -#define _PLATFORM___MAIN_HELPER_H_ - /* Genode includes */ #include #include @@ -23,16 +21,21 @@ namespace Fiasco { #include } -enum { MAIN_THREAD_CAP_ID = 1 }; -static void main_thread_bootstrap() { - using namespace Genode; +namespace Genode { void platform_main_bootstrap(); } - Cap_index *i - = cap_map()->insert(MAIN_THREAD_CAP_ID, Fiasco::MAIN_THREAD_CAP); - Fiasco::l4_utcb_tcr()->user[Fiasco::UTCB_TCR_BADGE] = (unsigned long) i; - Fiasco::l4_utcb_tcr()->user[Fiasco::UTCB_TCR_THREAD_OBJ] = 0; + +void Genode::platform_main_bootstrap() +{ + static struct Bootstrap + { + enum { MAIN_THREAD_CAP_ID = 1 }; + + Bootstrap() + { + Cap_index *i(cap_map()->insert(MAIN_THREAD_CAP_ID, Fiasco::MAIN_THREAD_CAP)); + Fiasco::l4_utcb_tcr()->user[Fiasco::UTCB_TCR_BADGE] = (unsigned long) i; + Fiasco::l4_utcb_tcr()->user[Fiasco::UTCB_TCR_THREAD_OBJ] = 0; + } + } bootstrap; } - - -#endif /* _PLATFORM___MAIN_HELPER_H_ */ diff --git a/base-hw/lib/mk/base-common.mk b/base-hw/lib/mk/base-common.mk index 0c9b37f85..3acdbc877 100644 --- a/base-hw/lib/mk/base-common.mk +++ b/base-hw/lib/mk/base-common.mk @@ -6,6 +6,7 @@ LIBS += cxx syscall +SRC_CC += main_bootstrap.cc SRC_CC += ipc.cc ipc/ipc_marshal_cap.cc SRC_CC += avl_tree/avl_tree.cc SRC_CC += allocator/slab.cc @@ -24,5 +25,6 @@ INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread -vpath %.cc $(REP_DIR)/src/base -vpath %.cc $(BASE_DIR)/src/base +vpath main_bootstrap.cc $(REP_DIR)/src/platform +vpath %.cc $(REP_DIR)/src/base +vpath %.cc $(BASE_DIR)/src/base diff --git a/base-hw/src/platform/_main_helper.h b/base-hw/src/platform/main_bootstrap.cc similarity index 61% rename from base-hw/src/platform/_main_helper.h rename to base-hw/src/platform/main_bootstrap.cc index e161f008e..3b1328b8c 100644 --- a/base-hw/src/platform/_main_helper.h +++ b/base-hw/src/platform/main_bootstrap.cc @@ -1,6 +1,7 @@ /* * \brief Platform-specific helper functions for the _main() function * \author Martin Stein + * \author Christian Helmuth * \date 2010-09-13 */ @@ -11,19 +12,20 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _SRC__PLATFORM__MAIN_HELPER_H_ -#define _SRC__PLATFORM__MAIN_HELPER_H_ - +/* Genode includes */ #include +namespace Genode { void platform_main_bootstrap(); } + + Genode::Native_thread_id main_thread_tid; -static void main_thread_bootstrap() +void Genode::platform_main_bootstrap() { - main_thread_tid = Kernel::current_thread_id(); + static struct Bootstrap + { + Bootstrap() { main_thread_tid = Kernel::current_thread_id(); } + } bootstrap; } - -#endif /* _SRC__PLATFORM__MAIN_HELPER_H_ */ - diff --git a/base-linux/lib/mk/base-common.mk b/base-linux/lib/mk/base-common.mk index 1754058da..8bd39b991 100644 --- a/base-linux/lib/mk/base-common.mk +++ b/base-linux/lib/mk/base-common.mk @@ -6,6 +6,7 @@ LIBS += syscall +SRC_CC += main_bootstrap.cc SRC_CC += ipc/ipc.cc SRC_CC += avl_tree/avl_tree.cc SRC_CC += allocator/slab.cc @@ -27,5 +28,6 @@ INC_DIR += $(REP_DIR)/src/base/env INC_DIR += $(REP_DIR)/src/platform $(BASE_DIR)/src/platform INC_DIR += $(BASE_DIR)/src/base/thread -vpath %.cc $(REP_DIR)/src/base -vpath %.cc $(BASE_DIR)/src/base +vpath main_bootstrap.cc $(REP_DIR)/src/platform +vpath %.cc $(REP_DIR)/src/base +vpath %.cc $(BASE_DIR)/src/base diff --git a/base-linux/src/platform/_main_helper.h b/base-linux/src/platform/_main_helper.h deleted file mode 100644 index 7cdb5b60c..000000000 --- a/base-linux/src/platform/_main_helper.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * \brief Platform-specific helper functions for the _main() function - * \author Christian Prochaska - * \date 2009-08-05 - */ - -/* - * Copyright (C) 2009-2013 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU General Public License version 2. - */ - -#ifndef _PLATFORM___MAIN_HELPER_H_ -#define _PLATFORM___MAIN_HELPER_H_ - -#include - -#include - -/* - * Define 'lx_environ' pointer. - */ -char **lx_environ; - - -/** - * Natively aligned memory location used in the lock implementation - */ -int main_thread_futex_counter __attribute__((aligned(sizeof(Genode::addr_t)))); - - -static inline void main_thread_bootstrap() -{ - using namespace Genode; - - extern Genode::addr_t *__initial_sp; - - /* - * Initialize the 'lx_environ' pointer - * - * environ = &argv[argc + 1] - * __initial_sp[0] = argc (always 1 in Genode) - * __initial_sp[1] = argv[0] - * __initial_sp[2] = NULL - * __initial_sp[3] = environ - * - */ - lx_environ = (char**)&__initial_sp[3]; - - /* reserve context area */ - Genode::addr_t base = Native_config::context_area_virtual_base(); - Genode::size_t size = Native_config::context_area_virtual_size(); - if (lx_vm_reserve(base, size) != base) - PERR("reservation of context area [%lx,%lx) failed", - (unsigned long) base, (unsigned long) base + size); -} - -#endif /* _PLATFORM___MAIN_HELPER_H_ */ diff --git a/base-linux/src/platform/lx_hybrid.cc b/base-linux/src/platform/lx_hybrid.cc index d4563449b..4fb5cf476 100644 --- a/base-linux/src/platform/lx_hybrid.cc +++ b/base-linux/src/platform/lx_hybrid.cc @@ -13,7 +13,7 @@ #include #include -#include <_main_helper.h> +#include #include diff --git a/base-linux/src/platform/main_bootstrap.cc b/base-linux/src/platform/main_bootstrap.cc new file mode 100644 index 000000000..e6f4eb440 --- /dev/null +++ b/base-linux/src/platform/main_bootstrap.cc @@ -0,0 +1,71 @@ +/* + * \brief Platform-specific helper functions for the _main() function + * \author Christian Prochaska + * \author Christian Helmuth + * \date 2009-08-05 + */ + +/* + * Copyright (C) 2009-2013 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#include +#include + + +namespace Genode { void platform_main_bootstrap(); } + + +/* + * Define 'lx_environ' pointer. + */ +char **lx_environ; + + +/** + * Natively aligned memory location used in the lock implementation + */ +int main_thread_futex_counter __attribute__((aligned(sizeof(Genode::addr_t)))); + + +/** + * Initial value of SP register (in crt0) + */ +extern Genode::addr_t *__initial_sp; + + +/** + * Platform-specific bootstrap + */ +void Genode::platform_main_bootstrap() +{ + static struct Bootstrap + { + Bootstrap() + { + /* + * Initialize the 'lx_environ' pointer + * + * environ = &argv[argc + 1] + * __initial_sp[0] = argc (always 1 in Genode) + * __initial_sp[1] = argv[0] + * __initial_sp[2] = NULL + * __initial_sp[3] = environ + */ + lx_environ = (char**)&__initial_sp[3]; + + /* + * Free context area preserved in linker script + */ + addr_t base = Native_config::context_area_virtual_base(); + Genode::size_t size = Native_config::context_area_virtual_size(); + int ret; + if ((ret = lx_munmap((void *)base, size)) < 0) + PERR("flushing of context area [%lx,%lx) failed (ret=%d)", + (unsigned long) base, (unsigned long) base + size, ret); + } + } bootstrap; +} diff --git a/base-nova/lib/mk/base-common.inc b/base-nova/lib/mk/base-common.inc index d492d4511..94e8c0b6e 100644 --- a/base-nova/lib/mk/base-common.inc +++ b/base-nova/lib/mk/base-common.inc @@ -6,6 +6,7 @@ LIBS += cxx startup +SRC_CC += main_bootstrap.cc SRC_CC += ipc/ipc.cc ipc/pager.cc SRC_CC += avl_tree/avl_tree.cc SRC_CC += allocator/slab.cc @@ -24,5 +25,8 @@ INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread -vpath %.cc $(REP_DIR)/src/base -vpath %.cc $(BASE_DIR)/src/base +vpath main_bootstrap.cc $(REP_DIR)/src/platform +vpath %.cc $(REP_DIR)/src/base +vpath %.cc $(BASE_DIR)/src/base + +# vi: set ft=make : diff --git a/base-nova/src/platform/_main_helper.h b/base-nova/src/platform/main_bootstrap.cc similarity index 65% rename from base-nova/src/platform/_main_helper.h rename to base-nova/src/platform/main_bootstrap.cc index 6e6059ac8..fe716fe89 100644 --- a/base-nova/src/platform/_main_helper.h +++ b/base-nova/src/platform/main_bootstrap.cc @@ -12,11 +12,4 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _PLATFORM___MAIN_HELPER_H_ -#define _PLATFORM___MAIN_HELPER_H_ - -#include - -static void main_thread_bootstrap() {}; - -#endif /* _PLATFORM___MAIN_HELPER_H_ */ +namespace Genode { void platform_main_bootstrap() { /* dummy */ } } diff --git a/base-okl4/lib/mk/base-common.mk b/base-okl4/lib/mk/base-common.mk index c6a9ccc65..e6b8332d9 100644 --- a/base-okl4/lib/mk/base-common.mk +++ b/base-okl4/lib/mk/base-common.mk @@ -6,7 +6,7 @@ LIBS += cxx startup -SRC_CC += cap_copy.cc +SRC_CC += cap_copy.cc main_bootstrap.cc SRC_CC += ipc/ipc.cc ipc/pager.cc ipc/ipc_marshal_cap.cc SRC_CC += pager/pager.cc SRC_CC += avl_tree/avl_tree.cc @@ -25,6 +25,7 @@ SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread -vpath cap_copy.cc $(BASE_DIR)/src/platform -vpath %.cc $(REP_DIR)/src/base -vpath %.cc $(BASE_DIR)/src/base +vpath main_bootstrap.cc $(REP_DIR)/src/platform +vpath cap_copy.cc $(BASE_DIR)/src/platform +vpath %.cc $(REP_DIR)/src/base +vpath %.cc $(BASE_DIR)/src/base diff --git a/base-okl4/src/platform/_main_helper.h b/base-okl4/src/platform/main_bootstrap.cc similarity index 67% rename from base-okl4/src/platform/_main_helper.h rename to base-okl4/src/platform/main_bootstrap.cc index b74f42baa..b328ce4f8 100644 --- a/base-okl4/src/platform/_main_helper.h +++ b/base-okl4/src/platform/main_bootstrap.cc @@ -1,6 +1,7 @@ /* * \brief Platform-specific helper functions for the _main() function * \author Christian Prochaska + * \author Christian Helmuth * \date 2009-08-05 */ @@ -11,9 +12,8 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _PLATFORM___MAIN_HELPER_H_ -#define _PLATFORM___MAIN_HELPER_H_ - +/* Genode includes */ +#include /* OKL4-specific includes and definitions */ namespace Okl4 { extern "C" { @@ -40,16 +40,23 @@ namespace Okl4 { } +namespace Genode { void platform_main_bootstrap(); } + + Genode::Native_thread_id main_thread_tid; -static void main_thread_bootstrap() +void Genode::platform_main_bootstrap() { - /* copy thread ID to utcb */ - main_thread_tid.raw = Okl4::copy_uregister_to_utcb(); + static struct Bootstrap + { + Bootstrap() + { + /* copy thread ID to utcb */ + main_thread_tid.raw = Okl4::copy_uregister_to_utcb(); - if (main_thread_tid.raw == 0) /* core */ - main_thread_tid.raw = Okl4::L4_rootserver.raw; + if (main_thread_tid.raw == 0) /* core */ + main_thread_tid.raw = Okl4::L4_rootserver.raw; + } + } bootstrap; } - -#endif /* _PLATFORM___MAIN_HELPER_H_ */ diff --git a/base-pistachio/lib/mk/base-common.mk b/base-pistachio/lib/mk/base-common.mk index 38fe95088..a064d07db 100644 --- a/base-pistachio/lib/mk/base-common.mk +++ b/base-pistachio/lib/mk/base-common.mk @@ -6,7 +6,7 @@ LIBS += cxx startup -SRC_CC += cap_copy.cc +SRC_CC += cap_copy.cc main_bootstrap.cc SRC_CC += ipc/ipc.cc ipc/pager.cc ipc/ipc_marshal_cap.cc SRC_CC += pager/pager.cc SRC_CC += avl_tree/avl_tree.cc @@ -25,6 +25,7 @@ SRC_CC += thread/thread.cc thread/trace.cc thread/thread_bootstrap.cc INC_DIR += $(REP_DIR)/src/base/lock INC_DIR += $(BASE_DIR)/src/base/thread -vpath cap_copy.cc $(BASE_DIR)/src/platform -vpath %.cc $(REP_DIR)/src/base -vpath %.cc $(BASE_DIR)/src/base +vpath main_bootstrap.cc $(REP_DIR)/src/platform +vpath cap_copy.cc $(BASE_DIR)/src/platform +vpath %.cc $(REP_DIR)/src/base +vpath %.cc $(BASE_DIR)/src/base diff --git a/base-pistachio/src/platform/_main_helper.h b/base-pistachio/src/platform/main_bootstrap.cc similarity index 69% rename from base-pistachio/src/platform/_main_helper.h rename to base-pistachio/src/platform/main_bootstrap.cc index 1f73d8aef..5d14099b1 100644 --- a/base-pistachio/src/platform/_main_helper.h +++ b/base-pistachio/src/platform/main_bootstrap.cc @@ -1,6 +1,7 @@ /* * \brief Platform-specific helper functions for the _main() function * \author Christian Prochaska + * \author Christian Helmuth * \date 2009-08-05 */ @@ -11,25 +12,25 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _PLATFORM___MAIN_HELPER_H_ -#define _PLATFORM___MAIN_HELPER_H_ +/* Genode includes */ +#include /* Pistachio includes */ namespace Pistachio { #include } -/* Genode includes */ -#include + +namespace Genode { void platform_main_bootstrap(); } Genode::Native_thread_id main_thread_tid; -static void main_thread_bootstrap() +void Genode::platform_main_bootstrap() { - main_thread_tid = Pistachio::L4_Myself(); + static struct Bootstrap + { + Bootstrap() { main_thread_tid = Pistachio::L4_Myself(); } + } bootstrap; } - - -#endif /* _PLATFORM___MAIN_HELPER_H_ */ diff --git a/base/src/platform/_main.cc b/base/src/platform/_main.cc index a6120ef4e..7ff308ee6 100644 --- a/base/src/platform/_main.cc +++ b/base/src/platform/_main.cc @@ -25,7 +25,6 @@ #include /* platform-specific local helper functions */ -#include <_main_helper.h> #include <_main_parent_cap.h> @@ -35,7 +34,8 @@ extern int main(int argc, char **argv, char **envp); extern void init_exception_handling(); /* implemented in base/cxx */ namespace Genode { - extern Rm_session *env_context_area_rm_session(); + Rm_session *env_context_area_rm_session(); + void platform_main_bootstrap(); } @@ -225,10 +225,13 @@ namespace Genode { extern bool inhibit_tracing; } /** * C entry function called by the crt0 startup code + * + * Note, _main is executed twice when starting dynamic programs: in ld.lib.so + * and also in the loaded binary. */ extern "C" int _main() { - main_thread_bootstrap(); + platform_main_bootstrap(); /* call env() explicitly to setup the environment */ (void*)env();