diff --git a/repos/base-hw/include/base/native_types.h b/repos/base-hw/include/base/native_types.h index 69902e332f..55de43fe88 100644 --- a/repos/base-hw/include/base/native_types.h +++ b/repos/base-hw/include/base/native_types.h @@ -315,9 +315,12 @@ namespace Genode static constexpr addr_t VIRT_ADDR_SPACE_START = 0x1000; static constexpr size_t VIRT_ADDR_SPACE_SIZE = 0xfffef000; - static constexpr Native_utcb * UTCB_MAIN_THREAD = (Native_utcb *) + static constexpr Native_utcb * utcb_main_thread() + { + return (Native_utcb *) ((VIRT_ADDR_SPACE_START + VIRT_ADDR_SPACE_SIZE - sizeof(Native_utcb)) & ~((1 << MIN_MAPPING_SIZE_LOG2) - 1)); + } } #endif /* _BASE__NATIVE_TYPES_H_ */ diff --git a/repos/base-hw/src/base/thread/bootstrap.cc b/repos/base-hw/src/base/thread/bootstrap.cc index 9ecd09ed7e..842e64d710 100644 --- a/repos/base-hw/src/base/thread/bootstrap.cc +++ b/repos/base-hw/src/base/thread/bootstrap.cc @@ -66,7 +66,7 @@ void prepare_reinit_main_thread() { prepare_init_main_thread(); } Native_utcb * Thread_base::utcb() { if (this) { return &_context->utcb; } - return UTCB_MAIN_THREAD; + return utcb_main_thread(); } diff --git a/repos/base-hw/src/core/kernel/kernel.cc b/repos/base-hw/src/core/kernel/kernel.cc index ef4e4f5f8c..b04c003b49 100644 --- a/repos/base-hw/src/core/kernel/kernel.cc +++ b/repos/base-hw/src/core/kernel/kernel.cc @@ -239,7 +239,7 @@ void init_kernel_mp_primary() /* initialize UTCB and map it */ Native_utcb * utcb = Kernel::core_main_thread_utcb_phys_addr(); - Genode::map_local((addr_t)utcb, (addr_t)UTCB_MAIN_THREAD, + Genode::map_local((addr_t)utcb, (addr_t)utcb_main_thread(), sizeof(Native_utcb) / get_page_size()); static Kernel::Thread t(Cpu_priority::max, 0, "core"); @@ -249,7 +249,7 @@ void init_kernel_mp_primary() t.ip = (addr_t)&_core_start; t.sp = (addr_t)s + STACK_SIZE; t.init(cpu_pool()->primary_cpu(), core_pd(), - (Native_utcb*)Genode::UTCB_MAIN_THREAD, 1); + Genode::utcb_main_thread(), 1); /* kernel initialization finished */ Genode::printf("kernel initialized\n"); diff --git a/repos/base-hw/src/core/platform_thread.cc b/repos/base-hw/src/core/platform_thread.cc index f219f13ee1..1efb9e4584 100644 --- a/repos/base-hw/src/core/platform_thread.cc +++ b/repos/base-hw/src/core/platform_thread.cc @@ -182,7 +182,7 @@ int Platform_thread::start(void * const ip, void * const sp) { /* attach UTCB in case of a main thread */ if (_main_thread) { - _utcb_pd_addr = UTCB_MAIN_THREAD; + _utcb_pd_addr = utcb_main_thread(); if (!_rm_client) { PERR("invalid RM client"); return -1;