This patch establishes the sole use of generic headers across all kernels. The common 'native_capability.h' is based on the version of base-sel4. All traditional L4 kernels and Linux use the same implementation of the capability-lifetime management. On base-hw, NOVA, Fiasco.OC, and seL4, custom implementations (based on their original mechanisms) are used, with the potential to unify them further in the future. This change achieves binary compatibility of dynamically linked programs across all kernels. Furthermore, the patch introduces a Native_capability::print method, which allows the easy output of the kernel-specific capability representation using the base/log.h API. Issue #1993
74 lines
1.8 KiB
C++
74 lines
1.8 KiB
C++
/*
|
|
* \brief Implementation of Thread API interface for core
|
|
* \author Stefan Kalkowski
|
|
* \author Martin Stein
|
|
* \date 2014-02-27
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2014 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.
|
|
*/
|
|
|
|
/* Genode includes */
|
|
#include <base/thread.h>
|
|
#include <base/sleep.h>
|
|
#include <base/env.h>
|
|
|
|
/* base-internal stack */
|
|
#include <base/internal/stack.h>
|
|
#include <base/internal/native_utcb.h>
|
|
|
|
/* core includes */
|
|
#include <map_local.h>
|
|
#include <kernel/kernel.h>
|
|
#include <platform.h>
|
|
#include <platform_thread.h>
|
|
|
|
using namespace Genode;
|
|
|
|
namespace Genode { Rm_session *env_stack_area_rm_session(); }
|
|
|
|
namespace Hw { extern Untyped_capability _main_thread_cap; }
|
|
|
|
|
|
void Thread::start()
|
|
{
|
|
/* start thread with stack pointer at the top of stack */
|
|
if (native_thread().platform_thread->start((void *)&_thread_start, stack_top()))
|
|
PERR("failed to start thread");
|
|
}
|
|
|
|
|
|
void Thread::cancel_blocking()
|
|
{
|
|
native_thread().platform_thread->cancel_blocking();
|
|
}
|
|
|
|
|
|
void Thread::_deinit_platform_thread()
|
|
{
|
|
/* destruct platform thread */
|
|
destroy(platform()->core_mem_alloc(), native_thread().platform_thread);
|
|
}
|
|
|
|
|
|
void Thread::_init_platform_thread(size_t, Type type)
|
|
{
|
|
if (type == NORMAL) {
|
|
native_thread().platform_thread = new (platform()->core_mem_alloc())
|
|
Platform_thread(_stack->name().string(), &_stack->utcb());
|
|
return;
|
|
}
|
|
|
|
/* remap initial main-thread UTCB according to stack-area spec */
|
|
Genode::map_local((addr_t)Kernel::Core_thread::singleton().utcb(),
|
|
(addr_t)&_stack->utcb(),
|
|
max(sizeof(Native_utcb) / get_page_size(), (size_t)1));
|
|
|
|
/* adjust initial object state in case of a main thread */
|
|
native_thread().cap = Hw::_main_thread_cap;
|
|
}
|