Skip to content

Commit

Permalink
base: hide internals of the Thread API
Browse files Browse the repository at this point in the history
This patch moves details about the stack allocation and organization
the base-internal headers. Thereby, I replaced the notion of "thread
contexts" by "stacks" as this term is much more intuitive. The fact that
we place thread-specific information at the bottom of the stack is not
worth introducing new terminology.

Issue genodelabs#1832
  • Loading branch information
nfeske authored and chelmuth committed Mar 1, 2016
1 parent 5f17343 commit 86ccfa0
Show file tree
Hide file tree
Showing 113 changed files with 999 additions and 787 deletions.
12 changes: 6 additions & 6 deletions repos/base-fiasco/include/base/native_types.h
Expand Up @@ -65,7 +65,7 @@ namespace Genode {
/**
* Empty UTCB type expected by the thread library
*
* On this kernel, UTCBs are not placed within the the context area. Each
* On this kernel, UTCBs are not placed within the the stack area. Each
* thread can request its own UTCB pointer using the kernel interface.
*/
typedef struct { } Native_utcb;
Expand All @@ -76,17 +76,17 @@ namespace Genode {
struct Native_config
{
/**
* Thread-context area configuration.
* Stack area configuration
*/
static constexpr addr_t context_area_virtual_base() {
static constexpr addr_t stack_area_virtual_base() {
return 0x40000000UL; }
static constexpr addr_t context_area_virtual_size() {
static constexpr addr_t stack_area_virtual_size() {
return 0x10000000UL; }

/**
* Size of virtual address region holding the context of one thread
* Size of virtual address region holding the stack of one thread
*/
static constexpr addr_t context_virtual_size() { return 0x00100000UL; }
static constexpr addr_t stack_virtual_size() { return 0x00100000UL; }
};

struct Native_pd_args { };
Expand Down
2 changes: 1 addition & 1 deletion repos/base-fiasco/lib/mk/base-common.mk
Expand Up @@ -21,7 +21,7 @@ SRC_CC += signal/signal.cc signal/common.cc signal/platform.cc
SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc
SRC_CC += thread/myself.cc
SRC_CC += thread/context_allocator.cc
SRC_CC += thread/stack_allocator.cc
SRC_CC += entrypoint/entrypoint.cc
SRC_CC += sleep.cc
SRC_CC += rm_session_client.cc
Expand Down
2 changes: 1 addition & 1 deletion repos/base-fiasco/lib/mk/base.mk
Expand Up @@ -8,7 +8,7 @@ LIBS += base-common

SRC_CC += console/log_console.cc
SRC_CC += cpu/cache.cc
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
SRC_CC += env/env.cc env/stack_area.cc env/reinitialize.cc
SRC_CC += thread/thread_start.cc
SRC_CC += irq/platform.cc
SRC_CC += server/rpc_cap_alloc.cc
Expand Down
10 changes: 5 additions & 5 deletions repos/base-fiasco/src/core/platform.cc
Expand Up @@ -306,8 +306,8 @@ void Platform::_setup_mem_alloc()
}

region.start = addr; region.end = addr + size;
if (!region.intersects(Native_config::context_area_virtual_base(),
Native_config::context_area_virtual_size())) {
if (!region.intersects(Native_config::stack_area_virtual_base(),
Native_config::stack_area_virtual_size())) {
add_region(region, _ram_alloc);
add_region(region, _core_address_ranges());
}
Expand Down Expand Up @@ -411,9 +411,9 @@ void Platform::_setup_basics()
_vm_start = _vm_start == 0 ? L4_PAGESIZE : _vm_start;
_region_alloc.add_range(_vm_start, _vm_size);

/* preserve context area in core's virtual address space */
_region_alloc.remove_range(Native_config::context_area_virtual_base(),
Native_config::context_area_virtual_size());
/* preserve stack area in core's virtual address space */
_region_alloc.remove_range(Native_config::stack_area_virtual_base(),
Native_config::stack_area_virtual_size());

/* I/O memory could be the whole user address space */
/* FIXME if the kernel helps to find out max address - use info here */
Expand Down
4 changes: 2 additions & 2 deletions repos/base-fiasco/src/core/target.inc
Expand Up @@ -2,7 +2,7 @@ TARGET = core

GEN_CORE_DIR = $(BASE_DIR)/src/core

SRC_CC += context_area.cc \
SRC_CC += stack_area.cc \
core_printf.cc \
core_rpc_cap_alloc.cc \
cpu_session_component.cc \
Expand Down Expand Up @@ -62,7 +62,7 @@ vpath signal_source_component.cc $(GEN_CORE_DIR)
vpath trace_session_component.cc $(GEN_CORE_DIR)
vpath dataspace_component.cc $(GEN_CORE_DIR)
vpath dump_alloc.cc $(GEN_CORE_DIR)
vpath context_area.cc $(GEN_CORE_DIR)
vpath stack_area.cc $(GEN_CORE_DIR)
vpath pager_object.cc $(GEN_CORE_DIR)
vpath pager_ep.cc $(GEN_CORE_DIR)
vpath core_printf.cc $(BASE_DIR)/src/base/console
Expand Down
5 changes: 4 additions & 1 deletion repos/base-fiasco/src/core/thread_start.cc
Expand Up @@ -15,6 +15,9 @@
#include <base/thread.h>
#include <base/sleep.h>

/* base-internal includes */
#include <base/internal/stack.h>

/* core includes */
#include <platform.h>
#include <core_env.h>
Expand All @@ -35,7 +38,7 @@ void Thread_base::start()
{
/* create and start platform thread */
_tid.pt = new(platform()->core_mem_alloc())
Platform_thread(0, _context->name);
Platform_thread(0, _stack->name().string());

platform_specific()->core_pd()->bind_thread(_tid.pt);

Expand Down
24 changes: 22 additions & 2 deletions repos/base-foc/include/base/native_types.h
Expand Up @@ -82,9 +82,29 @@ namespace Fiasco {
namespace Genode {

typedef Fiasco::l4_cap_idx_t Native_thread_id;
typedef Fiasco::l4_cap_idx_t Native_thread;


struct Native_thread
{
Fiasco::l4_cap_idx_t kcap = 0;

Native_thread() { }
explicit Native_thread(Fiasco::l4_cap_idx_t kcap) : kcap(kcap) { }
};


typedef Fiasco::l4_cap_idx_t Native_task;
typedef Fiasco::l4_utcb_t* Native_utcb;


struct Native_utcb
{
/*
* The 'Native_utcb' is located within the stack slot of the thread.
* We merely use it for remembering a pointer to the real UTCB, which
* resides somewhere in the kernel's address space.
*/
Fiasco::l4_utcb_t *foc_utcb = nullptr;
};


/**
Expand Down
4 changes: 2 additions & 2 deletions repos/base-foc/include/base/thread_state.h
Expand Up @@ -24,9 +24,9 @@ namespace Genode {

struct Thread_state : Thread_state_base
{
Native_thread kcap; /* thread's gate cap in its pd */
Fiasco::l4_cap_idx_t kcap; /* thread's gate cap in its pd */
int id; /* id of gate capability */
Native_utcb utcb; /* thread's utcb in its pd */
addr_t utcb; /* thread's utcb in its pd */
unsigned exceptions; /* counts exceptions raised by the thread */
bool paused; /* indicates whether thread is stopped */
bool in_exception; /* true if thread is in exception */
Expand Down
2 changes: 1 addition & 1 deletion repos/base-foc/include/signal_source/client.h
Expand Up @@ -53,7 +53,7 @@ namespace Genode {
_sem = call<Rpc_request_semaphore>();

l4_msgtag_t tag = l4_irq_attach(_sem.dst(), 0,
Thread_base::myself()->tid());
Thread_base::myself()->tid().kcap);
if (l4_error(tag))
PERR("l4_irq_attach failed with %ld!", l4_error(tag));
}
Expand Down
12 changes: 6 additions & 6 deletions repos/base-foc/include/spec/arm/base/native_config.h
@@ -1,5 +1,5 @@
/*
* \brief Platform-specific context area definitions
* \brief Platform-specific stack area definitions
* \author Stefan Kalkowski
* \date 2014-01-24
*/
Expand All @@ -21,17 +21,17 @@ namespace Genode {
struct Native_config
{
/**
* Thread-context area configuration
* Stack area configuration
*/
static constexpr addr_t context_area_virtual_base() {
static constexpr addr_t stack_area_virtual_base() {
return 0x20000000UL; }
static constexpr addr_t context_area_virtual_size() {
static constexpr addr_t stack_area_virtual_size() {
return 0x10000000UL; }

/**
* Size of virtual address region holding the context of one thread
* Size of virtual address region holding the stack of one thread
*/
static constexpr addr_t context_virtual_size() { return 0x00100000UL; }
static constexpr addr_t stack_virtual_size() { return 0x00100000UL; }
};
}

Expand Down
12 changes: 6 additions & 6 deletions repos/base-foc/include/spec/x86/base/native_config.h
@@ -1,5 +1,5 @@
/*
* \brief Platform-specific context area definitions
* \brief Platform-specific stack area definitions
* \author Stefan Kalkowski
* \date 2014-01-24
*/
Expand All @@ -21,17 +21,17 @@ namespace Genode {
struct Native_config
{
/**
* Thread-context area configuration
* Stack area configuration
*/
static constexpr addr_t context_area_virtual_base() {
static constexpr addr_t stack_area_virtual_base() {
return 0x40000000UL; }
static constexpr addr_t context_area_virtual_size() {
static constexpr addr_t stack_area_virtual_size() {
return 0x10000000UL; }

/**
* Size of virtual address region holding the context of one thread
* Size of virtual address region holding the stack of one thread
*/
static constexpr addr_t context_virtual_size() { return 0x00100000UL; }
static constexpr addr_t stack_virtual_size() { return 0x00100000UL; }
};
}

Expand Down
3 changes: 2 additions & 1 deletion repos/base-foc/lib/mk/base-common.mk
Expand Up @@ -21,7 +21,8 @@ SRC_CC += signal/signal.cc signal/common.cc signal/platform.cc
SRC_CC += server/server.cc server/common.cc
SRC_CC += thread/thread.cc thread/thread_bootstrap.cc thread/trace.cc
SRC_CC += thread/myself.cc
SRC_CC += thread/context_allocator.cc
SRC_CC += thread/stack_allocator.cc
SRC_CC += thread/thread_utcb.cc
SRC_CC += entrypoint/entrypoint.cc
SRC_CC += sleep.cc
SRC_CC += rm_session_client.cc
Expand Down
2 changes: 1 addition & 1 deletion repos/base-foc/lib/mk/base.mk
Expand Up @@ -8,7 +8,7 @@ LIBS += base-common

SRC_CC += console/log_console.cc
SRC_CC += cpu/cache.cc
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc \
SRC_CC += env/env.cc env/stack_area.cc env/reinitialize.cc \
env/cap_map_remove.cc env/cap_alloc.cc
SRC_CC += thread/thread_start.cc
SRC_CC += irq/platform.cc
Expand Down
23 changes: 15 additions & 8 deletions repos/base-foc/src/base/thread/thread_start.cc
Expand Up @@ -19,6 +19,9 @@
#include <base/sleep.h>
#include <base/env.h>

/* base-internal includes */
#include <base/internal/stack.h>

namespace Fiasco {
#include <l4/sys/utcb.h>
}
Expand All @@ -30,8 +33,8 @@ void Thread_base::_deinit_platform_thread()
{
using namespace Fiasco;

if (_context->utcb && _thread_cap.valid()) {
Cap_index *i = (Cap_index*)l4_utcb_tcr_u(_context->utcb)->user[UTCB_TCR_BADGE];
if (_tid.kcap && _thread_cap.valid()) {
Cap_index *i = (Cap_index*)l4_utcb_tcr_u(utcb()->foc_utcb)->user[UTCB_TCR_BADGE];
cap_map()->remove(i);
_cpu_session->kill_thread(_thread_cap);
env()->rm_session()->remove_client(_pager_cap);
Expand Down Expand Up @@ -59,7 +62,7 @@ void Thread_base::_init_platform_thread(size_t weight, Type type)
return;
}
/* adjust values whose computation differs for a main thread */
_tid = Fiasco::MAIN_THREAD_CAP;
_tid.kcap = Fiasco::MAIN_THREAD_CAP;
_thread_cap = env()->parent()->main_thread_cap();

if (!_thread_cap.valid())
Expand All @@ -83,15 +86,19 @@ void Thread_base::start()
Thread_state state;
try { state = _cpu_session->state(_thread_cap); }
catch (...) { throw Cpu_session::Thread_creation_failed(); }
_tid = state.kcap;
_context->utcb = state.utcb;

/* remember UTCB of the new thread */
Fiasco::l4_utcb_t * const foc_utcb = (Fiasco::l4_utcb_t *)state.utcb;
utcb()->foc_utcb = foc_utcb;

_tid = Native_thread(state.kcap);

Cap_index *i = cap_map()->insert(state.id, state.kcap);
l4_utcb_tcr_u(state.utcb)->user[UTCB_TCR_BADGE] = (unsigned long) i;
l4_utcb_tcr_u(state.utcb)->user[UTCB_TCR_THREAD_OBJ] = (addr_t)this;
l4_utcb_tcr_u(foc_utcb)->user[UTCB_TCR_BADGE] = (unsigned long) i;
l4_utcb_tcr_u(foc_utcb)->user[UTCB_TCR_THREAD_OBJ] = (addr_t)this;

/* register initial IP and SP at core */
_cpu_session->start(_thread_cap, (addr_t)_thread_start, _context->stack_top());
_cpu_session->start(_thread_cap, (addr_t)_thread_start, _stack->top());
}


Expand Down
4 changes: 2 additions & 2 deletions repos/base-foc/src/core/cpu_session_extension.cc
Expand Up @@ -43,7 +43,7 @@ void Genode::Cpu_session_component::enable_vcpu(Genode::Thread_capability thread
auto lambda = [&] (Cpu_thread_component *thread) {
if (!thread) return;

Native_thread tid = thread->platform_thread()->thread().local.dst();
l4_cap_idx_t tid = thread->platform_thread()->thread().local.dst();

l4_msgtag_t tag = l4_thread_vcpu_control(tid, vcpu_state);
if (l4_msgtag_has_error(tag))
Expand Down Expand Up @@ -103,7 +103,7 @@ void Genode::Cpu_session_component::single_step(Genode::Thread_capability thread
auto lambda = [&] (Cpu_thread_component *thread) {
if (!thread) return;

Native_thread tid = thread->platform_thread()->thread().local.dst();
Fiasco::l4_cap_idx_t tid = thread->platform_thread()->thread().local.dst();

enum { THREAD_SINGLE_STEP = 0x40000 };
int flags = enable ? THREAD_SINGLE_STEP : 0;
Expand Down
2 changes: 1 addition & 1 deletion repos/base-foc/src/core/include/irq_object.h
Expand Up @@ -38,7 +38,7 @@ class Genode::Irq_object

Signal_context_capability _sig_cap;

Native_thread _capability() const { return _cap->kcap(); }
Fiasco::l4_cap_idx_t _capability() const { return _cap->kcap(); }

public:

Expand Down
4 changes: 2 additions & 2 deletions repos/base-foc/src/core/include/platform_pd.h
Expand Up @@ -48,8 +48,8 @@ namespace Genode {

addr_t utcb_area_start()
{
return (Native_config::context_area_virtual_base() +
THREAD_MAX * Native_config::context_virtual_size());
return (Native_config::stack_area_virtual_base() +
THREAD_MAX * Native_config::stack_virtual_size());
}

Cap_mapping _task;
Expand Down
4 changes: 2 additions & 2 deletions repos/base-foc/src/core/include/platform_thread.h
Expand Up @@ -42,7 +42,7 @@ namespace Genode {
Cap_mapping _gate;
Cap_mapping _pager;
Cap_mapping _irq;
Native_utcb _utcb;
addr_t _utcb;
char _name[32]; /* thread name that will be
registered at the kernel
debugger */
Expand Down Expand Up @@ -185,7 +185,7 @@ namespace Genode {
Cap_mapping& gate() { return _gate; }
const char *name() const { return _name; }
bool core_thread() const { return _core_thread; }
Native_utcb utcb() const { return _utcb; }
addr_t utcb() const { return _utcb; }
};
}

Expand Down
6 changes: 3 additions & 3 deletions repos/base-foc/src/core/ipc_pager.cc
Expand Up @@ -106,7 +106,7 @@ void Ipc_pager::reply_and_wait_for_fault()
}
l4_utcb_mr()->mr[1] = _reply_mapping.fpage().raw;

_tag = l4_ipc_send_and_wait(_last, l4_utcb(), snd_tag,
_tag = l4_ipc_send_and_wait(_last.kcap, l4_utcb(), snd_tag,
&label, L4_IPC_SEND_TIMEOUT_0);
int err = l4_ipc_error(_tag, l4_utcb());
if (err) {
Expand All @@ -119,7 +119,7 @@ void Ipc_pager::reply_and_wait_for_fault()

void Ipc_pager::acknowledge_wakeup()
{
l4_cap_idx_t dst = Fiasco::Capability::valid(_last) ? _last : L4_SYSF_REPLY;
l4_cap_idx_t dst = Fiasco::Capability::valid(_last.kcap) ? _last.kcap : L4_SYSF_REPLY;

/* answer wakeup call from one of core's region-manager sessions */
l4_ipc_send(dst, l4_utcb(), l4_msgtag(0, 0, 0, 0), L4_IPC_SEND_TIMEOUT_0);
Expand All @@ -129,7 +129,7 @@ void Ipc_pager::acknowledge_wakeup()
void Ipc_pager::acknowledge_exception()
{
memcpy(l4_utcb_exc(), &_regs, sizeof(l4_exc_regs_t));
l4_cap_idx_t dst = Fiasco::Capability::valid(_last) ? _last : L4_SYSF_REPLY;
l4_cap_idx_t dst = Fiasco::Capability::valid(_last.kcap) ? _last.kcap : L4_SYSF_REPLY;
l4_ipc_send(dst, l4_utcb(), l4_msgtag(0, L4_UTCB_EXCEPTION_REGS_SIZE, 0, 0), L4_IPC_SEND_TIMEOUT_0);
}

Expand Down
2 changes: 1 addition & 1 deletion repos/base-foc/src/core/irq_session_component.cc
Expand Up @@ -53,7 +53,7 @@ class Genode::Interrupt_handler : public Thread<2048*sizeof(long)>

void entry();

static Native_thread handler_cap()
static Fiasco::l4_cap_idx_t handler_cap()
{
static Interrupt_handler handler;
return handler._thread_cap.dst();
Expand Down

0 comments on commit 86ccfa0

Please sign in to comment.