/* * \brief OKLinux library specific thread data * \author Stefan Kalkowski * \date 2009-05-28 */ /* * Copyright (C) 2009-2012 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. */ #ifndef _OKLINUX_SUPPORT__INCLUDE__OKLX_THREADS_H_ #define _OKLINUX_SUPPORT__INCLUDE__OKLX_THREADS_H_ /* Genode includes */ #include #include #include #include #include #include #include #include namespace Okl4 { extern "C" { /* Iguana includes */ #include #include /* OKL4 includes */ #include #include } } namespace Genode { /** * This class represents a OKLinux kernel thread */ class Oklx_kernel_thread : public List::Element { private: /* * We only need a small stack for startup code, * afterwards OKLinux will rearrange the stack pointer * to another memory area */ enum { STACK_SIZE=1024 }; Thread_capability _cap; /* Genodes thread capability */ Okl4::L4_ThreadId_t _tid; char _stack[STACK_SIZE]; /* stack for startup code */ public: Oklx_kernel_thread(Thread_capability cap) : _cap(cap) {} Thread_capability cap() { return _cap; } void* stack_addr() { return (void*)&_stack[STACK_SIZE-1]; }; static void entry(); void set_tid(Okl4::L4_ThreadId_t tid) { _tid = tid; } Okl4::L4_ThreadId_t tid() { return _tid; } }; /** * An object of this class contains OKLinux kernel threads and * an own cpu_session to create them. */ class Oklx_thread_list { private: List _threads; Cpu_connection _cpu; public: Okl4::L4_ThreadId_t add(); Cpu_connection* cpu() { return &_cpu; } /** * Get the global list of OKLinux kernel threads */ static Oklx_thread_list *thread_list(); Oklx_kernel_thread * first() { return _threads.first(); } }; /** * This class represents an OKLinux process, and its threads. */ class Oklx_process : public List::Element { private: /** * A thread within an OKLinux process */ class Oklx_user_thread : public List::Element { private: friend class Oklx_process; Okl4::L4_ThreadId_t _tid; Thread_capability _cap; public: Oklx_user_thread() : _cap(env()->cpu_session()->create_thread("Oklx user thread")) {} ~Oklx_user_thread() { env()->cpu_session()->kill_thread(_cap); } Okl4::L4_ThreadId_t tid() { return _tid; } Thread_capability cap() { return _cap; } }; Pd_connection _pd; /* protection domain of the process */ Cpu_connection _cpu; /* cpu session to construct threads */ List _threads; /* list of all threads */ Rm_connection _rm; /* rm session to manage addr. space */ public: Oklx_process() { _pd.space_pager(pager_cap()); } ~Oklx_process(); Pd_connection* pd() { return &_pd; } Cpu_connection* cpu() { return &_cpu; } Rm_connection* rm() { return &_rm; } Okl4::L4_ThreadId_t add_thread(); bool kill_thread(Okl4::L4_ThreadId_t tid); bool empty() { return !_threads.first(); } /** * Get the global list of all OKLinux processes */ static List *processes(); /** * Get the capability of the pager thread, * that pages OKLinux user processes (kernel main thread) */ static Thread_capability pager_cap(); /** * Set the capability of the pager thread, * that pages OKLinux user processes (kernel main thread) */ static void set_pager(); }; } #endif //_OKLINUX_SUPPORT__INCLUDE__OKLX_THREADS_H_