From e7f869611c7f75c1f2e7fbcaeeb7a298a8bf4f57 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Mon, 11 May 2015 22:18:50 +0200 Subject: [PATCH] hw: static constexpr function when reinterpret cast is used Issue #1511 --- repos/base-hw/include/base/native_types.h | 5 ++++- repos/base-hw/src/base/thread/bootstrap.cc | 2 +- repos/base-hw/src/core/kernel/kernel.cc | 4 ++-- repos/base-hw/src/core/platform_thread.cc | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) 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;