diff --git a/repos/ports/src/lib/libc_noux/plugin.cc b/repos/ports/src/lib/libc_noux/plugin.cc index d27c8f810..bd27ae167 100644 --- a/repos/ports/src/lib/libc_noux/plugin.cc +++ b/repos/ports/src/lib/libc_noux/plugin.cc @@ -95,12 +95,11 @@ class Noux_connection /** * Return the capability of the local context-area RM session + * + * \param ptr some address within the context-area */ - Genode::Rm_session_capability context_area_rm_session() - { - int on_stack; - return _connection.lookup_rm_session((Genode::addr_t)&on_stack); - } + Genode::Rm_session_capability context_area_rm_session(void * const ptr) { + return _connection.lookup_rm_session((Genode::addr_t)ptr); } Noux::Session *session() { return &_connection; } Noux::Sysio *sysio() { return _sysio; } @@ -507,6 +506,7 @@ extern "C" int select(int nfds, fd_set *readfds, fd_set *writefds, #include +static void * stack_in_context_area; static jmp_buf fork_jmp_buf; static Genode::Capability::Raw new_parent; @@ -532,6 +532,10 @@ extern "C" void fork_trampoline() /* reinitialize noux connection */ construct_at(noux_connection()); + /* reinitialize main-thread object which implies reinit of context area */ + auto context_area_rm = noux_connection()->context_area_rm_session(stack_in_context_area); + Genode::env()->reinit_main_thread(context_area_rm); + /* apply processor state that the forker had when he did the fork */ longjmp(fork_jmp_buf, 1); } @@ -548,15 +552,17 @@ extern "C" pid_t fork(void) /* * We got here via longjmp from 'fork_trampoline'. */ - - /* reinitialize main-thread object which implies reinit of context area */ - auto context_area_rm = noux_connection()->context_area_rm_session(); - Genode::env()->reinit_main_thread(context_area_rm); - return 0; } else { + /* + * save the current stack address used for re-initializing + * the context-area during process bootstrap + */ + int dummy; + stack_in_context_area = &dummy; + /* got here during the normal control flow of the fork call */ sysio()->fork_in.ip = (Genode::addr_t)(&fork_trampoline); sysio()->fork_in.sp = (Genode::addr_t)(&stack[STACK_SIZE]);