diff --git a/repos/base-fiasco/src/lib/base/thread_bootstrap.cc b/repos/base-fiasco/src/lib/base/thread_bootstrap.cc index 2044a3f627..7a4c9018d9 100644 --- a/repos/base-fiasco/src/lib/base/thread_bootstrap.cc +++ b/repos/base-fiasco/src/lib/base/thread_bootstrap.cc @@ -50,7 +50,7 @@ void Thread::_init_platform_thread(size_t, Type type) } -void Genode::init_thread_bootstrap(Thread_capability main_cap) +void Genode::init_thread_bootstrap(Cpu_session &, Thread_capability main_cap) { main_thread_cap(main_cap); } diff --git a/repos/base-foc/src/lib/base/thread_start.cc b/repos/base-foc/src/lib/base/thread_start.cc index f580106168..7831407d24 100644 --- a/repos/base-foc/src/lib/base/thread_start.cc +++ b/repos/base-foc/src/lib/base/thread_start.cc @@ -122,7 +122,7 @@ void Genode::init_thread_start(Capability pd_cap) } -void Genode::init_thread_bootstrap(Thread_capability main_cap) +void Genode::init_thread_bootstrap(Cpu_session &, Thread_capability main_cap) { main_thread_cap(main_cap); } diff --git a/repos/base-hw/src/lib/base/thread_start.cc b/repos/base-hw/src/lib/base/thread_start.cc index d04359c82a..29653bf3d4 100644 --- a/repos/base-hw/src/lib/base/thread_start.cc +++ b/repos/base-hw/src/lib/base/thread_start.cc @@ -122,7 +122,7 @@ void Genode::init_thread_start(Capability pd_cap) } -void Genode::init_thread_bootstrap(Thread_capability main_cap) +void Genode::init_thread_bootstrap(Cpu_session &, Thread_capability main_cap) { main_thread_cap(main_cap); } diff --git a/repos/base-linux/src/include/base/internal/platform.h b/repos/base-linux/src/include/base/internal/platform.h index 4e515a3145..4aa569ba94 100644 --- a/repos/base-linux/src/include/base/internal/platform.h +++ b/repos/base-linux/src/include/base/internal/platform.h @@ -19,6 +19,7 @@ #include /* base-internal includes */ +#include #include #include #include @@ -35,7 +36,9 @@ struct Genode::Platform { Region_map_mmap rm { false }; - Local_parent parent; + static Capability _obtain_parent_cap(); + + Local_parent parent { _obtain_parent_cap(), rm, heap }; Pd_session_capability pd_cap = static_cap_cast(parent.session_cap(Parent::Env::pd())); @@ -49,15 +52,7 @@ struct Genode::Platform Heap heap { pd, rm }; - Platform(Parent_capability cap) : parent(cap, rm, heap) - { - _attach_stack_area(); - } - - ~Platform() - { - parent.exit(0); - } + Platform() { _attach_stack_area(); } /** * Attach stack area to local address space (for non-hybrid components) diff --git a/repos/base-linux/src/lib/base/attach_stack_area.cc b/repos/base-linux/src/lib/base/attach_stack_area.cc index 29864ad2da..360a6b185d 100644 --- a/repos/base-linux/src/lib/base/attach_stack_area.cc +++ b/repos/base-linux/src/lib/base/attach_stack_area.cc @@ -26,4 +26,7 @@ void Platform::_attach_stack_area() pd._address_space.attach_at(pd._stack_area.dataspace(), stack_area_virtual_base(), stack_area_virtual_size()); + + env_stack_area_region_map = &pd._stack_area; + env_stack_area_ram_allocator = &pd; } diff --git a/repos/base-linux/src/lib/base/platform.cc b/repos/base-linux/src/lib/base/platform.cc index 949131b282..1e99133213 100644 --- a/repos/base-linux/src/lib/base/platform.cc +++ b/repos/base-linux/src/lib/base/platform.cc @@ -21,7 +21,6 @@ /* base-internal includes */ #include #include -#include #include #include @@ -153,10 +152,10 @@ Env_deprecated *Genode::env_deprecated() Parent *parent() override { return &_pf.parent; } Cpu_session *cpu_session() override { return &_pf.cpu; } - Cpu_session_capability cpu_session_cap() override { return _pf.cpu_cap; } + Cpu_session_capability cpu_session_cap() override { return _pf.cpu.rpc_cap(); } Region_map *rm_session() override { return &_pf.rm; } Pd_session *pd_session() override { return &_pf.pd; } - Pd_session_capability pd_session_cap() override { return _pf.pd_cap; } + Pd_session_capability pd_session_cap() override { return _pf.pd.rpc_cap(); } }; static Impl impl { *_platform_ptr }; @@ -165,7 +164,7 @@ Env_deprecated *Genode::env_deprecated() } -static Parent_capability obtain_parent_cap() +Capability Platform::_obtain_parent_cap() { long const local_name = get_env_ulong("parent_local_name"); @@ -190,27 +189,16 @@ void Genode::init_parent_resource_requests(Genode::Env & env) void Genode::init_platform() { - static Platform platform { obtain_parent_cap() }; - - /* allow use of deprecated_env */ - _platform_ptr = &platform; + static Genode::Platform platform; init_log(platform.parent); init_rpc_cap_alloc(platform.parent); + init_cap_slab(platform.pd, platform.parent); init_thread(platform.cpu, platform.rm); - init_thread_start(platform.pd_cap); - init_thread_bootstrap(platform.parent.main_thread_cap()); + init_thread_start(platform.pd.rpc_cap()); + init_thread_bootstrap(platform.cpu, platform.parent.main_thread_cap()); - env_stack_area_region_map = &platform.pd._stack_area; - env_stack_area_ram_allocator = &platform.pd; - - /* register TID and PID of the main thread at core */ - Linux_native_cpu_client native_cpu(platform.cpu.native_cpu()); - - native_cpu.thread_id(platform.parent.main_thread_cap(), - lx_getpid(), lx_gettid()); - - init_rpc_cap_alloc(platform.parent); + _platform_ptr = &platform; } diff --git a/repos/base-linux/src/lib/base/thread_linux.cc b/repos/base-linux/src/lib/base/thread_linux.cc index 3f0d50bca7..815fd952cd 100644 --- a/repos/base-linux/src/lib/base/thread_linux.cc +++ b/repos/base-linux/src/lib/base/thread_linux.cc @@ -190,7 +190,11 @@ void Genode::init_thread_start(Capability pd_cap) } -void Genode::init_thread_bootstrap(Thread_capability main_cap) +void Genode::init_thread_bootstrap(Cpu_session &cpu, Thread_capability main_cap) { main_thread_cap(main_cap); + + /* register TID and PID of the main thread at core */ + Linux_native_cpu_client native_cpu(cpu.native_cpu()); + native_cpu.thread_id(main_cap, lx_getpid(), lx_gettid()); } diff --git a/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc b/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc index 6cd6b08d04..6b26a5f707 100644 --- a/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc +++ b/repos/base-linux/src/lib/lx_hybrid/lx_hybrid.cc @@ -410,7 +410,14 @@ static void *thread_start(void *arg) void Genode::init_thread(Cpu_session &, Region_map &) { } void Genode::init_thread_start(Capability) { } -void Genode::init_thread_bootstrap(Thread_capability) { } + + +void Genode::init_thread_bootstrap(Cpu_session &cpu, Thread_capability main_cap) +{ + /* register TID and PID of the main thread at core */ + Linux_native_cpu_client native_cpu(cpu.native_cpu()); + native_cpu.thread_id(main_cap, lx_getpid(), lx_gettid()); +} extern "C" void *malloc(::size_t size); diff --git a/repos/base-nova/src/lib/base/thread_start.cc b/repos/base-nova/src/lib/base/thread_start.cc index 2dc04d0cf7..762ea6b915 100644 --- a/repos/base-nova/src/lib/base/thread_start.cc +++ b/repos/base-nova/src/lib/base/thread_start.cc @@ -212,7 +212,7 @@ void Genode::init_thread_start(Capability pd_cap) } -void Genode::init_thread_bootstrap(Thread_capability main_cap) +void Genode::init_thread_bootstrap(Cpu_session &, Thread_capability main_cap) { main_thread_cap(main_cap); } diff --git a/repos/base-okl4/src/lib/base/thread_bootstrap.cc b/repos/base-okl4/src/lib/base/thread_bootstrap.cc index b996771f89..cfe1b4ae0c 100644 --- a/repos/base-okl4/src/lib/base/thread_bootstrap.cc +++ b/repos/base-okl4/src/lib/base/thread_bootstrap.cc @@ -95,7 +95,7 @@ void Thread::_init_platform_thread(size_t, Type type) } -void Genode::init_thread_bootstrap(Thread_capability main_cap) +void Genode::init_thread_bootstrap(Cpu_session &, Thread_capability main_cap) { main_thread_cap(main_cap); } diff --git a/repos/base-pistachio/src/lib/base/thread_bootstrap.cc b/repos/base-pistachio/src/lib/base/thread_bootstrap.cc index f6502f2de1..f07a3b5fae 100644 --- a/repos/base-pistachio/src/lib/base/thread_bootstrap.cc +++ b/repos/base-pistachio/src/lib/base/thread_bootstrap.cc @@ -64,7 +64,7 @@ void Genode::Thread::_init_platform_thread(size_t, Type type) } -void Genode::init_thread_bootstrap(Thread_capability main_cap) +void Genode::init_thread_bootstrap(Cpu_session &, Thread_capability main_cap) { main_thread_cap(main_cap); } diff --git a/repos/base-sel4/src/lib/base/thread_bootstrap.cc b/repos/base-sel4/src/lib/base/thread_bootstrap.cc index 27e1bd99a3..aa4cbae320 100644 --- a/repos/base-sel4/src/lib/base/thread_bootstrap.cc +++ b/repos/base-sel4/src/lib/base/thread_bootstrap.cc @@ -40,4 +40,4 @@ void Genode::Thread::_thread_bootstrap() } -void Genode::init_thread_bootstrap(Thread_capability) { } +void Genode::init_thread_bootstrap(Cpu_session &, Thread_capability) { } diff --git a/repos/base/src/include/base/internal/globals.h b/repos/base/src/include/base/internal/globals.h index 0b8580a47b..a9a30add48 100644 --- a/repos/base/src/include/base/internal/globals.h +++ b/repos/base/src/include/base/internal/globals.h @@ -44,7 +44,7 @@ namespace Genode { void init_heartbeat_monitoring(Env &); void init_thread(Cpu_session &, Region_map &); void init_thread_start(Capability); - void init_thread_bootstrap(Thread_capability); + void init_thread_bootstrap(Cpu_session &, Thread_capability); void deinit_heartbeat_monitoring(); void exec_static_constructors(); diff --git a/repos/base/src/include/base/internal/platform.h b/repos/base/src/include/base/internal/platform.h index f39e636313..264284109e 100644 --- a/repos/base/src/include/base/internal/platform.h +++ b/repos/base/src/include/base/internal/platform.h @@ -17,6 +17,7 @@ /* base-internal includes */ #include +#include #include #include #include @@ -45,6 +46,12 @@ struct Genode::Platform : Noncopyable parent, pd.rpc_cap(), pd.address_space(), Parent::Env::pd() }; Attached_stack_area stack_area { parent, pd.rpc_cap() }; + + Platform() + { + env_stack_area_ram_allocator = &pd; + env_stack_area_region_map = &stack_area; + } }; #endif /* _INCLUDE__BASE__INTERNAL__PLATFORM_H_ */ diff --git a/repos/base/src/lib/base/platform.cc b/repos/base/src/lib/base/platform.cc index 5057da26ff..2d8e5c5499 100644 --- a/repos/base/src/lib/base/platform.cc +++ b/repos/base/src/lib/base/platform.cc @@ -14,7 +14,6 @@ #include #include -#include #include #include @@ -70,10 +69,7 @@ void Genode::init_platform() init_cap_slab(platform.pd, platform.parent); init_thread(platform.cpu, platform.rm); init_thread_start(platform.pd.rpc_cap()); - init_thread_bootstrap(platform.parent.main_thread_cap()); - - env_stack_area_ram_allocator = &platform.pd; - env_stack_area_region_map = &platform.stack_area; + init_thread_bootstrap(platform.cpu, platform.parent.main_thread_cap()); _platform_ptr = &platform; }